Repository: mozilla/send Branch: master Commit: ade10e496c06 Files: 319 Total size: 1.1 MB Directory structure: gitextract_4or1ul2c/ ├── .circleci/ │ └── config.yml ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.yml ├── .gitattributes ├── .gitignore ├── .htmllintrc ├── .prettierignore ├── .stylelintrc ├── .vscode/ │ └── settings.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTORS ├── Dockerfile ├── LICENSE ├── README.md ├── android/ │ ├── .eslintrc.yaml │ ├── .gitignore │ ├── README.md │ ├── android.js │ ├── app/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── buildAssets.sh │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── org/ │ │ │ └── mozilla/ │ │ │ └── firefoxsend/ │ │ │ └── MainActivity.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── gradlew │ ├── gradlew.bat │ ├── pages/ │ │ ├── .eslintrc.yaml │ │ ├── error.js │ │ ├── home.js │ │ ├── preferences.js │ │ ├── share.js │ │ └── upload.js │ ├── settings.gradle │ ├── stores/ │ │ ├── intents.js │ │ └── state.js │ └── user.js ├── app/ │ ├── .eslintrc.yml │ ├── api.js │ ├── archive.js │ ├── capabilities.js │ ├── controller.js │ ├── crc32.js │ ├── dragManager.js │ ├── ece.js │ ├── experiments.js │ ├── fileReceiver.js │ ├── fileSender.js │ ├── fxa.js │ ├── keychain.js │ ├── locale.js │ ├── main.css │ ├── main.js │ ├── metrics.js │ ├── ownedFile.js │ ├── pasteManager.js │ ├── readme.md │ ├── routes.js │ ├── serviceWorker.js │ ├── storage.js │ ├── streams.js │ ├── ui/ │ │ ├── account.js │ │ ├── archiveTile.js │ │ ├── blank.js │ │ ├── body.js │ │ ├── copyDialog.js │ │ ├── download.js │ │ ├── downloadCompleted.js │ │ ├── downloadDialog.js │ │ ├── downloadPassword.js │ │ ├── error.js │ │ ├── expiryOptions.js │ │ ├── footer.js │ │ ├── header.js │ │ ├── home.js │ │ ├── intro.js │ │ ├── modal.js │ │ ├── noStreams.js │ │ ├── notFound.js │ │ ├── okDialog.js │ │ ├── report.js │ │ ├── selectbox.js │ │ ├── shareDialog.js │ │ └── unsupported.js │ ├── user.js │ ├── utils.js │ └── zip.js ├── browserslist ├── build/ │ ├── android_index_plugin.js │ ├── readme.md │ └── version_plugin.js ├── common/ │ ├── assets.js │ ├── generate_asset_map.js │ └── readme.md ├── docker-compose.yml ├── docs/ │ ├── CODEOWNERS │ ├── acceptance-mobile.md │ ├── acceptance-web.md │ ├── build.md │ ├── deployment.md │ ├── docker.md │ ├── encryption.md │ ├── experiments.md │ ├── faq.md │ ├── localization.md │ ├── metrics.md │ ├── notes/ │ │ └── streams.md │ └── takedowns.md ├── ios/ │ ├── generate-bundle.js │ ├── ios.js │ ├── send-ios/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── ViewController.swift │ │ ├── assets/ │ │ │ ├── index.css │ │ │ └── index.html │ │ └── help.html │ ├── send-ios-action-extension/ │ │ ├── ActionViewController.swift │ │ ├── Base.lproj/ │ │ │ └── MainInterface.storyboard │ │ └── Info.plist │ └── send-ios.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── l10n.toml ├── package.json ├── postcss.config.js ├── public/ │ ├── contribute.json │ ├── inter.css │ └── locales/ │ ├── an/ │ │ └── send.ftl │ ├── ar/ │ │ └── send.ftl │ ├── ast/ │ │ └── send.ftl │ ├── az/ │ │ └── send.ftl │ ├── azz/ │ │ └── send.ftl │ ├── be/ │ │ └── send.ftl │ ├── bn/ │ │ └── send.ftl │ ├── br/ │ │ └── send.ftl │ ├── bs/ │ │ └── send.ftl │ ├── ca/ │ │ └── send.ftl │ ├── cak/ │ │ └── send.ftl │ ├── ckb/ │ │ └── send.ftl │ ├── cs/ │ │ └── send.ftl │ ├── cy/ │ │ └── send.ftl │ ├── da/ │ │ └── send.ftl │ ├── de/ │ │ └── send.ftl │ ├── dsb/ │ │ └── send.ftl │ ├── el/ │ │ └── send.ftl │ ├── en-CA/ │ │ └── send.ftl │ ├── en-GB/ │ │ └── send.ftl │ ├── en-US/ │ │ └── send.ftl │ ├── es-AR/ │ │ └── send.ftl │ ├── es-CL/ │ │ └── send.ftl │ ├── es-ES/ │ │ └── send.ftl │ ├── es-MX/ │ │ └── send.ftl │ ├── et/ │ │ └── send.ftl │ ├── eu/ │ │ └── send.ftl │ ├── fa/ │ │ └── send.ftl │ ├── fi/ │ │ └── send.ftl │ ├── fr/ │ │ └── send.ftl │ ├── fy-NL/ │ │ └── send.ftl │ ├── gn/ │ │ └── send.ftl │ ├── gor/ │ │ └── send.ftl │ ├── he/ │ │ └── send.ftl │ ├── hr/ │ │ └── send.ftl │ ├── hsb/ │ │ └── send.ftl │ ├── hu/ │ │ └── send.ftl │ ├── hus/ │ │ └── send.ftl │ ├── hy-AM/ │ │ └── send.ftl │ ├── ia/ │ │ └── send.ftl │ ├── id/ │ │ └── send.ftl │ ├── ig/ │ │ └── send.ftl │ ├── it/ │ │ └── send.ftl │ ├── ixl/ │ │ └── send.ftl │ ├── ja/ │ │ └── send.ftl │ ├── ka/ │ │ └── send.ftl │ ├── kab/ │ │ └── send.ftl │ ├── ko/ │ │ └── send.ftl │ ├── lt/ │ │ └── send.ftl │ ├── lus/ │ │ └── send.ftl │ ├── meh/ │ │ └── send.ftl │ ├── mix/ │ │ └── send.ftl │ ├── ml/ │ │ └── send.ftl │ ├── ms/ │ │ └── send.ftl │ ├── nb-NO/ │ │ └── send.ftl │ ├── nl/ │ │ └── send.ftl │ ├── nn-NO/ │ │ └── send.ftl │ ├── oc/ │ │ └── send.ftl │ ├── pa-IN/ │ │ └── send.ftl │ ├── pai/ │ │ └── send.ftl │ ├── pl/ │ │ └── send.ftl │ ├── ppl/ │ │ └── send.ftl │ ├── pt-BR/ │ │ └── send.ftl │ ├── pt-PT/ │ │ └── send.ftl │ ├── quc/ │ │ └── send.ftl │ ├── ro/ │ │ └── send.ftl │ ├── ru/ │ │ └── send.ftl │ ├── sk/ │ │ └── send.ftl │ ├── sl/ │ │ └── send.ftl │ ├── sn/ │ │ └── send.ftl │ ├── sq/ │ │ └── send.ftl │ ├── sr/ │ │ └── send.ftl │ ├── su/ │ │ └── send.ftl │ ├── sv-SE/ │ │ └── send.ftl │ ├── te/ │ │ └── send.ftl │ ├── th/ │ │ └── send.ftl │ ├── tl/ │ │ └── send.ftl │ ├── tr/ │ │ └── send.ftl │ ├── trs/ │ │ └── send.ftl │ ├── uk/ │ │ └── send.ftl │ ├── vi/ │ │ └── send.ftl │ ├── yo/ │ │ └── send.ftl │ ├── yua/ │ │ └── send.ftl │ ├── zgh/ │ │ └── send.ftl │ ├── zh-CN/ │ │ └── send.ftl │ └── zh-TW/ │ └── send.ftl ├── scripts/ │ ├── .eslintrc.yml │ ├── bin/ │ │ └── run-integration-test-circleci.sh │ ├── get-prod-locales.js │ ├── lint-locales.js │ └── sync-npm-dependencies.sh ├── server/ │ ├── amplitude.js │ ├── bin/ │ │ ├── dev.js │ │ ├── prod.js │ │ └── test.js │ ├── clientConstants.js │ ├── config.js │ ├── fxa.js │ ├── initScript.js │ ├── keychain.js │ ├── layout.js │ ├── limiter.js │ ├── locale.js │ ├── log.js │ ├── metadata.js │ ├── middleware/ │ │ ├── auth.js │ │ └── language.js │ ├── readme.md │ ├── routes/ │ │ ├── delete.js │ │ ├── done.js │ │ ├── download.js │ │ ├── exists.js │ │ ├── filelist.js │ │ ├── index.js │ │ ├── info.js │ │ ├── metadata.js │ │ ├── metrics.js │ │ ├── pages.js │ │ ├── params.js │ │ ├── password.js │ │ ├── report.js │ │ ├── token.js │ │ ├── upload.js │ │ ├── webmanifest.js │ │ └── ws.js │ ├── state.js │ └── storage/ │ ├── fs.js │ ├── gcs.js │ ├── index.js │ ├── redis.js │ └── s3.js ├── tailwind.config.js ├── test/ │ ├── .eslintrc.yml │ ├── backend/ │ │ ├── auth-tests.js │ │ ├── delete-tests.js │ │ ├── info-tests.js │ │ ├── language-tests.js │ │ ├── metadata-tests.js │ │ ├── owner-tests.js │ │ ├── params-tests.js │ │ ├── password-tests.js │ │ ├── s3-tests.js │ │ └── storage-tests.js │ ├── frontend/ │ │ ├── .eslintrc.yml │ │ ├── index.js │ │ ├── routes.js │ │ ├── runner.js │ │ └── tests/ │ │ ├── api-tests.js │ │ ├── auth-tests.js │ │ ├── crypto-tests.js │ │ ├── fileSender-tests.js │ │ ├── keychain-tests.js │ │ ├── streaming-tests.js │ │ └── workflow-tests.js │ ├── integration/ │ │ ├── README.md │ │ ├── download-tests.js │ │ ├── fixtures/ │ │ │ ├── txt-larger-testfile.txt │ │ │ └── txt-small-testfile.txt │ │ ├── homepage-tests.js │ │ ├── pages/ │ │ │ └── desktop/ │ │ │ ├── download_page.js │ │ │ ├── home_page.js │ │ │ └── page.js │ │ ├── progress-tests.js │ │ └── send-test.html │ ├── readme.md │ ├── testServer.js │ ├── wdio.circleci.conf.js │ ├── wdio.common.conf.js │ ├── wdio.docker.conf.js │ ├── wdio.local.conf.js │ ├── wdio.remote.config.js │ └── wdio.saucelabs.config.js └── webpack.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/config.yml ================================================ version: 2.0 jobs: test: docker: - image: circleci/node:12-browsers steps: - checkout - run: npm ci - run: npm run lint - run: npm test - store_artifacts: path: coverage integration_tests: docker: - image: circleci/node:12-browsers steps: - checkout - run: npm ci - run: name: Run integration test command: ./scripts/bin/run-integration-test-circleci.sh deploy_dev: docker: - image: circleci/node:12 steps: - checkout - setup_remote_docker - run: docker login -u $DOCKER_USER -p $DOCKER_PASS - run: docker build -t mozilla/send:latest . - run: docker push mozilla/send:latest deploy_vnext: docker: - image: circleci/node:12 steps: - checkout - setup_remote_docker - run: docker login -u $DOCKER_USER -p $DOCKER_PASS - run: docker build -t mozilla/send:vnext . - run: docker push mozilla/send:vnext deploy_stage: docker: - image: circleci/node:12 steps: - checkout - setup_remote_docker - run: docker login -u $DOCKER_USER -p $DOCKER_PASS - run: docker build -t mozilla/send:$CIRCLE_TAG . - run: docker push mozilla/send:$CIRCLE_TAG workflows: version: 2 test_pr: jobs: - test: filters: branches: ignore: - master - vnext - integration_tests: filters: branches: ignore: master build_and_deploy_dev: jobs: - deploy_dev: filters: branches: only: master tags: ignore: /^v.*/ - deploy_vnext: filters: branches: only: vnext tags: ignore: /^v.*/ build_and_deploy_stage: jobs: - test: filters: branches: ignore: /.*/ tags: only: /^v.*/ - integration_tests: filters: branches: ignore: /.*/ tags: only: /^v.*/ - deploy_stage: requires: - test - integration_tests filters: branches: ignore: /.*/ tags: only: /^v.*/ ================================================ FILE: .dockerignore ================================================ .circleci .nyc_output .vscode .DS_Store coverage docs firefox node_modules ================================================ FILE: .editorconfig ================================================ root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true [*.{js,html,yml,json,handlebars}] indent_style = space indent_size = 2 [*.toml] indent_style = space indent_size = 4 ================================================ FILE: .eslintignore ================================================ dist assets firefox coverage android/app/build app/locale.js app/capabilities.js ================================================ FILE: .eslintrc.yml ================================================ env: es6: true node: true extends: - eslint:recommended - prettier - plugin:node/recommended - plugin:security/recommended plugins: - node - security root: true rules: node/no-deprecated-api: off node/no-unsupported-features/es-syntax: off node/no-unsupported-features/node-builtins: off node/no-unpublished-require: off node/no-unpublished-import: off security/detect-non-literal-fs-filename: off security/detect-object-injection: off no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}] require-atomic-updates: warn ================================================ FILE: .gitattributes ================================================ public/locales/* linguist-documentation docs/* linguist-documentation ================================================ FILE: .gitignore ================================================ node_modules coverage dist .idea .DS_Store .nyc_output .tox .pytest_cache *.iml android/app/src/main/assets ios/send-ios/assets/ios.js ios/send-ios/assets/vendor.js ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/* ios/send-ios.xcodeproj/xcuserdata/* test/integration/downloads ================================================ FILE: .htmllintrc ================================================ { "attr-name-style": "dash", "id-class-style": "dash", "indent-width": 2 } ================================================ FILE: .prettierignore ================================================ dist android/app/src/main/assets android/app/build coverage ================================================ FILE: .stylelintrc ================================================ extends: stylelint-config-standard plugins: - stylelint-no-unsupported-browser-features rules: plugin/no-unsupported-browser-features: [true, {severity: warning}] color-hex-case: lower declaration-colon-newline-after: null selector-list-comma-newline-after: null value-list-comma-newline-after: null at-rule-no-unknown: null ================================================ FILE: .vscode/settings.json ================================================ { } ================================================ FILE: CHANGELOG.md ================================================ ## Change Log ### v2.5.1 (2018/03/12 19:26 +00:00) - [#789](https://github.com/mozilla/send/pull/789) Fixed #775 : Made text not-selectable (@RCMainak) ### v2.5.0 (2018/03/08 19:31 +00:00) - [#782](https://github.com/mozilla/send/pull/782) updated docs (@dannycoates) - [#781](https://github.com/mozilla/send/pull/781) Don't translate URL-safe chars, b64 is doing it for us (@timvisee) - [#779](https://github.com/mozilla/send/pull/779) implemented crypto polyfills for ms edge (@dannycoates) ### v2.4.1 (2018/02/28 17:05 +00:00) - [#777](https://github.com/mozilla/send/pull/777) use a separate circle in the progress svg for indefinite progress (@dannycoates) ### v2.4.0 (2018/02/27 01:55 +00:00) - [#769](https://github.com/mozilla/send/pull/769) removed unsafe-inline styles via svgo-loader (@dannycoates) - [#767](https://github.com/mozilla/send/pull/767) added coverage artifact to circleci (@dannycoates) - [#766](https://github.com/mozilla/send/pull/766) Some frontend unit tests [WIP] (@dannycoates) - [#761](https://github.com/mozilla/send/pull/761) added maxPasswordLength and passwordError messages (@dannycoates) - [#764](https://github.com/mozilla/send/pull/764) added indefinite progress mode (@dannycoates) - [#760](https://github.com/mozilla/send/pull/760) refactored css: phase 1 (@dannycoates) - [#759](https://github.com/mozilla/send/pull/759) Switch en-US FTL file to new syntax (@flodolo) - [#758](https://github.com/mozilla/send/pull/758) refactored server (@dannycoates) - [#757](https://github.com/mozilla/send/pull/757) Update to fluent 0.4.3 (@stasm) ### v2.3.0 (2018/02/01 23:27 +00:00) - [#536](https://github.com/mozilla/send/pull/536) use redis expire event to delete stored data immediately (@ehuggett) - [#744](https://github.com/mozilla/send/pull/744) Gradient experiment (@dannycoates) - [#739](https://github.com/mozilla/send/pull/739) added /api/info/:id route (@dannycoates) - [#737](https://github.com/mozilla/send/pull/737) big refactor (@dannycoates) - [#722](https://github.com/mozilla/send/pull/722) Add localization note to 'Time' and 'Downloads' string (@flodolo) - [#721](https://github.com/mozilla/send/pull/721) show download Limits on page; Fixes #661 (@shikhar-scs) - [#694](https://github.com/mozilla/send/pull/694) Passwords can now be changed (#687) (@himanish-star) - [#702](https://github.com/mozilla/send/pull/702) Restricted the banner from showing on unsupported browsers (@himanish-star) - [#701](https://github.com/mozilla/send/pull/701) improved popup for mobile display; Fixes #699 (@shikhar-scs) - [#683](https://github.com/mozilla/send/pull/683) API changes to accommodate 3rd party clients (@ehuggett) - [#698](https://github.com/mozilla/send/pull/698) Popup for delete button attached (@himanish-star) - [#695](https://github.com/mozilla/send/pull/695) Show Warning, Cancel and Redirect on size > 2GB ; fixes #578 (@shikhar-scs) - [#684](https://github.com/mozilla/send/pull/684) delete btn popup attached (@himanish-star) - [#686](https://github.com/mozilla/send/pull/686) Hide password while Typing and after Entering: Fixes #670 (@shikhar-scs) - [#679](https://github.com/mozilla/send/pull/679) changed font to sans sherif: Solves #676 (@shikhar-scs) - [#693](https://github.com/mozilla/send/pull/693) README: Fix query link for "good first bugs" (@jspam) - [#685](https://github.com/mozilla/send/pull/685) checkbox now has a hover effect: fixes #635 (@himanish-star) - [#668](https://github.com/mozilla/send/pull/668) Add possibility to bind to a specific IP address (@TwizzyDizzy) - [#682](https://github.com/mozilla/send/pull/682) [Docs] - README.md - minor spelling fixes (@tmm2018) - [#672](https://github.com/mozilla/send/pull/672) Use EXPIRE_SECONDS to calculate file ttl for static content (@derektamsen) - [#680](https://github.com/mozilla/send/pull/680) adjusted line height of label : fixes #609 (@himanish-star) ### v2.2.2 (2017/12/19 18:06 +00:00) - [#667](https://github.com/mozilla/send/pull/667) Make develop the default NODE_ENV (@claudijd) ### v2.2.1 (2017/12/08 18:00 +00:00) - [#665](https://github.com/mozilla/send/pull/665) stop drag target from flickering when dragging over children (@ericawright) ### v2.2.0 (2017/12/06 23:57 +00:00) - [#654](https://github.com/mozilla/send/pull/654) Multiple download UI (@dannycoates) - [#650](https://github.com/mozilla/send/pull/650) #634: overwrite appearance of password submit input (@ovlb) - [#649](https://github.com/mozilla/send/pull/649) #609 share interface: align text in input and button (@ovlb) ### v2.1.2 (2017/11/16 19:03 +00:00) - [#645](https://github.com/mozilla/send/pull/645) Remove the leak of the password into the console (@laurentj) ### v2.1.0 (2017/11/15 03:07 +00:00) - [#641](https://github.com/mozilla/send/pull/641) Added experiment for firefox download promo (@dannycoates) - [#640](https://github.com/mozilla/send/pull/640) use fluent-langneg for subtag support (@dannycoates) - [#639](https://github.com/mozilla/send/pull/639) wrap number localization in try/catch (@dannycoates) ### v2.0.0 (2017/11/08 05:31 +00:00) - [#633](https://github.com/mozilla/send/pull/633) Keyboard navigation/visual feedback regression (@ehuggett) - [#632](https://github.com/mozilla/send/pull/632) display the 'add password' button only when the input field isn't empty (@dannycoates) - [#626](https://github.com/mozilla/send/pull/626) Partial fix for #623 (@ehuggett) - [#624](https://github.com/mozilla/send/pull/624) set a default MIME type in file metadata (@ehuggett) - [#612](https://github.com/mozilla/send/pull/612) Password UI nits (@dannycoates, @ericawright) - [#617](https://github.com/mozilla/send/pull/617) allow drag and drop if navigating from shared page (@ericawright) - [#608](https://github.com/mozilla/send/pull/608) disable copying link when password not completed (@ericawright) - [#605](https://github.com/mozilla/send/pull/605) align the "Password" and "Copy to clipboard" fields. (@ericawright) - [#582](https://github.com/mozilla/send/pull/582) Add optional password to the download url (@dannycoates) ### v1.2.4 (2017/10/10 17:34 +00:00) - [#583](https://github.com/mozilla/send/pull/583) Promote the beefy UI to default (@dannycoates) - [#581](https://github.com/mozilla/send/pull/581) introducing ToC to README.md (@tmm2018) - [#579](https://github.com/mozilla/send/pull/579) Hide cancel button when upload reaches 100% (@ericawright) - [#580](https://github.com/mozilla/send/pull/580) Change Favicon in to look better in a variety of cases (@ericawright) - [#571](https://github.com/mozilla/send/pull/571) Centre logo (@ehuggett) - [#574](https://github.com/mozilla/send/pull/574) Make upload button focusable (accessibility/tab navigation) (@ehuggett) ### v1.2.0 (2017/09/12 22:42 +00:00) - [#559](https://github.com/mozilla/send/pull/559) added first A/B experiment (@dannycoates) - [#542](https://github.com/mozilla/send/pull/542) fix docker link typo (@ehuggett) - [#541](https://github.com/mozilla/send/pull/541) removed .title and .alt attributes from ftl (@dannycoates) - [#537](https://github.com/mozilla/send/pull/537) a few changes to make A/B testing easier (@dannycoates) - [#533](https://github.com/mozilla/send/pull/533) minor UI fixes (@youwenliang) - [#531](https://github.com/mozilla/send/pull/531) Add CHANGELOG script (@pdehaan) - [#535](https://github.com/mozilla/send/pull/535) Fixed minimum NodeJS version in README (@LuFlo) - [#528](https://github.com/mozilla/send/pull/528) adding separators to README (@tmm2018) ### 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 `; } return html` `; } } module.exports = Account; ================================================ FILE: app/ui/archiveTile.js ================================================ /* global Android */ const html = require('choo/html'); const raw = require('choo/html/raw'); const assets = require('../../common/assets'); const { bytes, copyToClipboard, list, percent, platform, timeLeft } = require('../utils'); const expiryOptions = require('./expiryOptions'); function expiryInfo(translate, archive) { const l10n = timeLeft(archive.expiresAt - Date.now()); return raw( translate('archiveExpiryInfo', { downloadCount: translate('downloadCount', { num: archive.dlimit - archive.dtotal }), timespan: translate(l10n.id, l10n) }) ); } function password(state) { const MAX_LENGTH = 32; return html`
`; function togglePasswordInput(event) { event.stopPropagation(); const checked = event.target.checked; const input = document.getElementById('password-input'); if (checked) { input.classList.remove('invisible'); input.focus(); } else { input.classList.add('invisible'); input.value = ''; document.getElementById('password-msg').textContent = ''; state.archive.password = null; } } function inputChanged() { const passwordInput = document.getElementById('password-input'); const pwdmsg = document.getElementById('password-msg'); const password = passwordInput.value; const length = password.length; if (length === MAX_LENGTH) { pwdmsg.textContent = state.translate('maxPasswordLength', { length: MAX_LENGTH }); } else { pwdmsg.textContent = ''; } state.archive.password = password; } function focused(event) { event.preventDefault(); const el = document.getElementById('password-input'); if (el.placeholder !== state.translate('unlockInputPlaceholder')) { el.placeholder = ''; } } } function fileInfo(file, action) { return html`

${file.name}

${bytes( file.size )}

${action}
`; } function archiveInfo(archive, action) { return html`

${archive.name}

${bytes( archive.size )}

${action}

`; } function archiveDetails(translate, archive) { if (archive.manifest.files.length > 1) { return html`
${translate('fileCount', { num: archive.manifest.files.length })} ${list(archive.manifest.files.map(f => fileInfo(f)))}
`; } function toggled(event) { event.stopPropagation(); archive.open = event.target.open; } } module.exports = function(state, emit, archive) { const copyOrShare = state.capabilities.share || platform() === 'android' ? html` ` : html` `; const dl = platform() === 'web' ? html` ${state.translate('downloadButtonLabel')} ` : html`
`; return html` ${archiveInfo( archive, html` ` )}
${expiryInfo(state.translate, archive)}
${archiveDetails(state.translate, archive)}
${dl} ${copyOrShare}
`; function copy(event) { event.stopPropagation(); copyToClipboard(archive.url); const text = event.target.lastChild; text.textContent = state.translate('copiedUrl'); setTimeout( () => (text.textContent = state.translate('copyLinkButton')), 1000 ); } function del(event) { event.stopPropagation(); emit('delete', archive); } async function share(event) { event.stopPropagation(); if (platform() === 'android') { Android.shareUrl(archive.url); } else { try { await navigator.share({ title: state.translate('-send-brand'), text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`, //state.translate('shareMessage', { name }), url: archive.url }); } catch (e) { // ignore } } } }; module.exports.wip = function(state, emit) { return html` ${list( Array.from(state.archive.files) .reverse() .map(f => fileInfo(f, remove(f, state.translate('deleteButtonHover'))) ), 'flex-shrink bg-grey-10 rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen dark:bg-black', 'bg-white px-2 my-2 shadow-light rounded dark:bg-grey-90 dark:border dark:border-grey-80' )}
${state.translate('totalSize', { size: bytes(state.archive.size) })}
${expiryOptions(state, emit)} ${password(state, emit)}
`; function focus(event) { event.target.nextElementSibling.firstElementChild.classList.add('outline'); } function blur(event) { event.target.nextElementSibling.firstElementChild.classList.remove( 'outline' ); } function upload(event) { window.scrollTo(0, 0); event.preventDefault(); event.target.disabled = true; if (!state.uploading) { emit('upload'); } } function add(event) { event.preventDefault(); const newFiles = Array.from(event.target.files); emit('addFiles', { files: newFiles }); setTimeout(() => { document .querySelector('#wip > ul > li:first-child') .scrollIntoView({ block: 'center' }); }); } function remove(file, desc) { return html` `; function del(event) { event.stopPropagation(); emit('removeUpload', file); } } }; module.exports.uploading = function(state, emit) { const progress = state.transfer.progressRatio; const progressPercent = percent(progress); const archive = state.archive; return html` ${archiveInfo(archive)}
${expiryInfo(state.translate, { dlimit: state.archive.dlimit, dtotal: 0, expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000 })}
${progressPercent}
`; function cancel(event) { event.stopPropagation(); event.target.disabled = true; emit('cancel'); } }; module.exports.empty = function(state, emit) { const upsell = state.user.loggedIn || !state.capabilities.account ? '' : html` `; return html`
${state.translate('dragAndDropFiles')}
${state.translate('orClickWithSize', { size: bytes(state.user.maxSize) })}

${state.translate('trustWarningMessage')}

${upsell}
`; function focus(event) { event.target.nextElementSibling.classList.add('bg-blue-70', 'outline'); } function blur(event) { event.target.nextElementSibling.classList.remove('bg-blue-70', 'outline'); } function add(event) { event.preventDefault(); const newFiles = Array.from(event.target.files); emit('addFiles', { files: newFiles }); } }; module.exports.preview = function(state, emit) { const archive = state.fileInfo; if (archive.open === undefined) { archive.open = true; } const single = archive.manifest.files.length === 1; const details = single ? '' : html`
${archiveDetails(state.translate, archive)}
`; return html`
${archiveInfo(archive)} ${details}
`; function toggleDownloadEnabled(event) { event.stopPropagation(); const checked = event.target.checked; const btn = document.getElementById('download-btn'); btn.disabled = !checked; } function download(event) { event.preventDefault(); event.target.disabled = true; emit('download', archive); } }; module.exports.downloading = function(state) { const archive = state.fileInfo; const progress = state.transfer.progressRatio; const progressPercent = percent(progress); return html` ${archiveInfo(archive)} ${progressPercent} `; }; ================================================ FILE: app/ui/blank.js ================================================ const html = require('choo/html'); module.exports = function() { return html`
`; }; ================================================ FILE: app/ui/body.js ================================================ const html = require('choo/html'); const Header = require('./header'); const Footer = require('./footer'); module.exports = function body(main) { return function(state, emit) { const b = html` ${state.cache(Header, 'header').render()} ${main(state, emit)} ${state.cache(Footer, 'footer').render()} `; if (state.layout) { // server side only return state.layout(state, b); } return b; }; }; ================================================ FILE: app/ui/copyDialog.js ================================================ const html = require('choo/html'); const { copyToClipboard } = require('../utils'); module.exports = function(name, url) { const dialog = function(state, emit, close) { return html`

${state.translate('notifyUploadEncryptDone')}

${state.translate('copyLinkDescription')}
${name}

`; function copy(event) { event.stopPropagation(); copyToClipboard(url); event.target.textContent = state.translate('copiedUrl'); setTimeout(close, 1000); } }; dialog.type = 'copy'; return dialog; }; ================================================ FILE: app/ui/download.js ================================================ /* global downloadMetadata */ const html = require('choo/html'); const assets = require('../../common/assets'); const archiveTile = require('./archiveTile'); const modal = require('./modal'); const noStreams = require('./noStreams'); const notFound = require('./notFound'); const downloadPassword = require('./downloadPassword'); const downloadCompleted = require('./downloadCompleted'); const BIG_SIZE = 1024 * 1024 * 256; function createFileInfo(state) { return { id: state.params.id, secretKey: state.params.key, nonce: downloadMetadata.nonce, requiresPassword: downloadMetadata.pwd }; } function downloading(state, emit) { return html`

${state.translate('downloadingTitle')}

${archiveTile.downloading(state, emit)}
`; } function preview(state, emit) { if (state.fileInfo.flagged) { return html`

${state.translate('downloadFlagged')}

`; } if (!state.capabilities.streamDownload && state.fileInfo.size > BIG_SIZE) { return noStreams(state, emit); } return html`

${state.translate('downloadTitle')}

${state.translate('downloadDescription')}

${state.translate('downloadConfirmDescription')}

${archiveTile.preview(state, emit)} ${state.translate('reportFile', { count: state.fileInfo.manifest.files.length })}
`; } module.exports = function(state, emit) { let content = ''; if (!state.fileInfo) { state.fileInfo = createFileInfo(state); if (downloadMetadata.status === 404) { return notFound(state); } if (!state.fileInfo.nonce) { // coming from something like the browser back button return location.reload(); } } if (state.fileInfo.dead) { return notFound(state); } if (!state.transfer && !state.fileInfo.requiresPassword) { emit('getMetadata'); } if (state.transfer) { switch (state.transfer.state) { case 'downloading': case 'decrypting': content = downloading(state, emit); break; case 'complete': content = downloadCompleted(state); break; default: content = preview(state, emit); } } else if (state.fileInfo.requiresPassword && !state.fileInfo.password) { content = downloadPassword(state, emit); } return html`
${state.modal && modal(state, emit)}
${content}
`; }; ================================================ FILE: app/ui/downloadCompleted.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); module.exports = function(state) { const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; return html`

${state.translate('downloadFinish')}

${state.translate('trySendDescription')}

${state.translate(btnText)}

${state.translate('reportFile')}

`; }; ================================================ FILE: app/ui/downloadDialog.js ================================================ const html = require('choo/html'); module.exports = function() { return function(state, emit, close) { const archive = state.fileInfo; return html`

${state.translate('downloadConfirmTitle')}

${state.translate('downloadConfirmDescription')}

${state.translate('reportFile')}
`; function toggleDownloadEnabled(event) { event.stopPropagation(); const checked = event.target.checked; const btn = document.getElementById('download-btn'); btn.disabled = !checked; } function download(event) { event.preventDefault(); close(); event.target.disabled = true; emit('download', archive); } }; }; ================================================ FILE: app/ui/downloadPassword.js ================================================ const html = require('choo/html'); module.exports = function(state, emit) { const fileInfo = state.fileInfo; const invalid = fileInfo.password === null; const div = html`

${state.translate('downloadTitle')}

${state.translate('downloadDescription')}

`; if (!(div instanceof String)) { setTimeout(() => document.getElementById('password-input').focus()); } function inputChanged(event) { event.stopPropagation(); event.preventDefault(); const label = document.getElementById('password-error'); const input = document.getElementById('password-input'); const btn = document.getElementById('password-btn'); label.classList.add('invisible'); input.classList.remove('border-red', 'dark:border-red-40'); btn.classList.remove( 'bg-red', 'hover:bg-red', 'focus:bg-red', 'dark:bg-red-40' ); } function checkPassword(event) { event.stopPropagation(); event.preventDefault(); const el = document.getElementById('password-input'); const password = el.value; if (password.length > 0) { document.getElementById('password-btn').disabled = true; // Strip any url parameters between fileId and secretKey const fileInfoUrl = window.location.href.replace(/\?.+#/, '#'); state.fileInfo.url = fileInfoUrl; state.fileInfo.password = password; emit('getMetadata'); } return false; } return div; }; ================================================ FILE: app/ui/error.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); const modal = require('./modal'); module.exports = function(state, emit) { const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; return html`
${state.modal && modal(state, emit)}

${state.translate('errorPageHeader')}

${state.translate('trySendDescription')}

${state.translate(btnText)}

`; }; ================================================ FILE: app/ui/expiryOptions.js ================================================ const html = require('choo/html'); const raw = require('choo/html/raw'); const { secondsToL10nId } = require('../utils'); const selectbox = require('./selectbox'); module.exports = function(state, emit) { const el = html`
${raw( state.translate('archiveExpiryInfo', { downloadCount: '', timespan: '' }) )}
`; if (el.__encoded) { // we're rendering on the server return el; } const counts = state.DEFAULTS.DOWNLOAD_COUNTS.filter( i => state.capabilities.account || i <= state.user.maxDownloads ); const dlCountSelect = el.querySelector('#dlCount'); el.replaceChild( selectbox( state.archive.dlimit, counts, num => state.translate('downloadCount', { num }), value => { const max = state.user.maxDownloads; state.archive.dlimit = Math.min(value, max); if (value > max) { emit('signup-cta', 'count'); } else { emit('render'); } }, 'expire-after-dl-count-select' ), dlCountSelect ); const expires = state.DEFAULTS.EXPIRE_TIMES_SECONDS.filter( i => state.capabilities.account || i <= state.user.maxExpireSeconds ); const timeSelect = el.querySelector('#timespan'); el.replaceChild( selectbox( state.archive.timeLimit, expires, num => { const l10n = secondsToL10nId(num); return state.translate(l10n.id, l10n); }, value => { const max = state.user.maxExpireSeconds; state.archive.timeLimit = Math.min(value, max); if (value > max) { emit('signup-cta', 'time'); } else { emit('render'); } }, 'expire-after-time-select' ), timeSelect ); return el; }; ================================================ FILE: app/ui/footer.js ================================================ const html = require('choo/html'); const Component = require('choo/component'); class Footer extends Component { constructor(name, state) { super(name); this.state = state; } update() { return false; } createElement() { return html` `; } } module.exports = Footer; ================================================ FILE: app/ui/header.js ================================================ const html = require('choo/html'); const Component = require('choo/component'); const Account = require('./account'); const assets = require('../../common/assets'); const { platform } = require('../utils'); class Header extends Component { constructor(name, state, emit) { super(name); this.state = state; this.emit = emit; this.account = state.cache(Account, 'account'); } update() { this.account.render(); return false; } createElement() { const title = platform() === 'android' ? html` ` : html` ${this.state.translate('title')} `; return html`
${title} ${this.account.render()}
`; } } module.exports = Header; ================================================ FILE: app/ui/home.js ================================================ const html = require('choo/html'); const { list } = require('../utils'); const archiveTile = require('./archiveTile'); const modal = require('./modal'); const intro = require('./intro'); module.exports = function(state, emit) { if (state.user.loginRequired && !state.user.loggedIn) { emit('signup-cta', 'required'); } const archives = state.storage.files .filter(archive => !archive.expired) .map(archive => archiveTile(state, emit, archive)); let left = ''; if (state.uploading) { left = archiveTile.uploading(state, emit); } else if (state.archive.numFiles > 0) { left = archiveTile.wip(state, emit); } else { left = archiveTile.empty(state, emit); } archives.reverse(); const right = archives.length === 0 ? intro(state) : list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full'); return html`
${state.modal && modal(state, emit)}
${left}
${right}
`; }; ================================================ FILE: app/ui/intro.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); module.exports = function intro(state) { return html`

${state.translate('introTitle')}

${state.translate('introDescription')}

`; }; ================================================ FILE: app/ui/modal.js ================================================ const html = require('choo/html'); module.exports = function(state, emit) { return html`
${state.modal(state, emit, close)}
`; function close(event) { if (event) { event.preventDefault(); event.stopPropagation(); } emit('closeModal'); } }; ================================================ FILE: app/ui/noStreams.js ================================================ const html = require('choo/html'); const { bytes } = require('../utils'); const assets = require('../../common/assets'); module.exports = function(state, emit) { const archive = state.fileInfo; return html`

${state.translate( 'downloadTitle' )}

⚠️ ${state.translate('noStreamsWarning')} ⚠️

${ archive.name }

${bytes( archive.size )}

${state.translate('downloadConfirmDescription')}

`; function optionChanged(event) { event.stopPropagation(); const choice = event.target.value; const button = event.currentTarget.nextElementSibling; let title = button.title; console.error(choice, title); switch (choice) { case 'copy': title = state.translate('copyLinkButton'); break; case 'firefox': title = state.translate('downloadFirefox'); break; case 'download': title = state.translate('downloadButtonLabel'); break; } button.title = title; button.value = title; } function submit(event) { const action = document.querySelector('input[type="radio"]:checked').value; switch (action) { case 'copy': emit('copy', { url: window.location.href }); document.querySelector('input[type="submit"]').value = state.translate( 'copiedUrl' ); break; case 'firefox': window.open( 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com' ); break; case 'download': emit('download', archive); break; } return false; } }; ================================================ FILE: app/ui/notFound.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); const modal = require('./modal'); module.exports = function(state, emit) { const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; return html`
${state.modal && modal(state, emit)}

${state.translate('expiredTitle')}

${state.translate('trySendDescription')}

${state.translate(btnText)}

${state.translate('reportFile')}

`; }; ================================================ FILE: app/ui/okDialog.js ================================================ const html = require('choo/html'); module.exports = function(message) { return function(state, emit, close) { return html`

${message}

`; }; }; ================================================ FILE: app/ui/report.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); const REPORTABLES = ['Malware', 'Pii', 'Abuse']; module.exports = function(state, emit) { let submitting = false; const file = state.fileInfo; if (!file) { return html`

${state.translate('reportUnknownDescription')}

`; } if (file.reported) { return html`

${state.translate('reportedTitle')}

${state.translate('reportedDescription')}

${state.translate('okButton')}

`; } return html`

${state.translate('reportFile')}

${state.translate('reportDescription')}

    ${REPORTABLES.map( reportable => html`
  • ` )}
`; function optionChanged(event) { event.stopPropagation(); const button = event.currentTarget.nextElementSibling; button.disabled = false; } function report(event) { event.stopPropagation(); event.preventDefault(); if (submitting) { return; } submitting = true; state.fileInfo.reported = true; const form = event.target; emit('report', { reason: form.reason.value }); } }; ================================================ FILE: app/ui/selectbox.js ================================================ const html = require('choo/html'); module.exports = function(selected, options, translate, changed, htmlId) { let x = selected; return html` `; function choose(event) { const target = event.target; const value = +target.value; if (x !== value) { x = value; changed(value); } } }; ================================================ FILE: app/ui/shareDialog.js ================================================ const html = require('choo/html'); module.exports = function(name, url) { const dialog = function(state, emit, close) { return html`

${state.translate('notifyUploadEncryptDone')}

${state.translate('shareLinkDescription')}
${name}

`; async function share(event) { event.stopPropagation(); try { await navigator.share({ title: state.translate('-send-brand'), text: state.translate('shareMessage', { name }), url }); } catch (e) { if (e.code === e.ABORT_ERR) { return; } console.error(e); } close(); } }; dialog.type = 'share'; return dialog; }; ================================================ FILE: app/ui/unsupported.js ================================================ const html = require('choo/html'); const modal = require('./modal'); module.exports = function(state, emit) { let strings = {}; let why = ''; let url = ''; if (state.params.reason !== 'outdated') { strings = unsupportedStrings(state); why = html` ${state.translate('notSupportedLink')} `; url = 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com'; } else { strings = outdatedStrings(state); url = 'https://support.mozilla.org/kb/update-firefox-latest-version'; } return html`
${state.modal && modal(state, emit)}

${strings.header}

${strings.description}

${why} ${strings.button}
`; }; function outdatedStrings(state) { return { header: state.translate('notSupportedHeader'), description: state.translate('notSupportedOutdatedDetail'), button: state.translate('updateFirefox') }; } function unsupportedStrings(state) { return { header: state.translate('notSupportedHeader'), description: state.translate('notSupportedDescription'), button: state.translate('downloadFirefox') }; } ================================================ FILE: app/user.js ================================================ import assets from '../common/assets'; import { getFileList, setFileList } from './api'; import { encryptStream, decryptStream } from './ece'; import { arrayToB64, b64ToArray, streamToArrayBuffer } from './utils'; import { blobStream } from './streams'; import { getFileListKey, prepareScopedBundleKey, preparePkce } from './fxa'; import storage from './storage'; const textEncoder = new TextEncoder(); const textDecoder = new TextDecoder(); const anonId = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); async function hashId(id) { const d = new Date(); const month = d.getUTCMonth(); const year = d.getUTCFullYear(); const encoded = textEncoder.encode(`${id}:${year}:${month}`); const hash = await crypto.subtle.digest('SHA-256', encoded); return arrayToB64(new Uint8Array(hash.slice(16))); } export default class User { constructor(storage, limits, authConfig) { this.authConfig = authConfig; this.limits = limits; this.storage = storage; this.data = storage.user || {}; } get info() { return this.data || this.storage.user || {}; } set info(data) { this.data = data; this.storage.user = data; } get firstAction() { return this.storage.get('firstAction'); } set firstAction(action) { this.storage.set('firstAction', action); } get surveyed() { return this.storage.get('surveyed'); } set surveyed(yes) { this.storage.set('surveyed', yes); } get avatar() { const defaultAvatar = assets.get('user.svg'); if (this.info.avatarDefault) { return defaultAvatar; } return this.info.avatar || defaultAvatar; } get name() { return this.info.displayName; } get email() { return this.info.email; } get loggedIn() { return !!this.info.access_token; } get bearerToken() { return this.info.access_token; } get refreshToken() { return this.info.refresh_token; } get maxSize() { return this.loggedIn ? this.limits.MAX_FILE_SIZE : this.limits.ANON.MAX_FILE_SIZE; } get maxExpireSeconds() { return this.loggedIn ? this.limits.MAX_EXPIRE_SECONDS : this.limits.ANON.MAX_EXPIRE_SECONDS; } get maxDownloads() { return this.loggedIn ? this.limits.MAX_DOWNLOADS : this.limits.ANON.MAX_DOWNLOADS; } get loginRequired() { return this.authConfig && this.authConfig.fxa_required; } async metricId() { return this.loggedIn ? hashId(this.info.uid) : undefined; } async deviceId() { return this.loggedIn ? hashId(this.storage.id) : hashId(anonId); } async startAuthFlow(trigger, utms = {}) { this.utms = utms; this.trigger = trigger; try { const params = new URLSearchParams({ entrypoint: `send-${trigger}`, form_type: 'email', utm_source: utms.source || 'send', utm_campaign: utms.campaign || 'none' }); const res = await fetch( `${this.authConfig.issuer}/metrics-flow?${params.toString()}`, { mode: 'cors' } ); const { flowId, flowBeginTime } = await res.json(); this.flowId = flowId; this.flowBeginTime = flowBeginTime; } catch (e) { console.error(e); this.flowId = null; this.flowBeginTime = null; } } async login(email) { const state = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); storage.set('oauthState', state); const keys_jwk = await prepareScopedBundleKey(this.storage); const code_challenge = await preparePkce(this.storage); const options = { action: 'email', access_type: 'offline', client_id: this.authConfig.client_id, code_challenge, code_challenge_method: 'S256', response_type: 'code', scope: `profile ${this.authConfig.key_scope}`, state, keys_jwk }; if (email) { options.email = email; } if (this.flowId && this.flowBeginTime) { options.flow_id = this.flowId; options.flow_begin_time = this.flowBeginTime; } if (this.trigger) { options.entrypoint = `send-${this.trigger}`; } if (this.utms) { options.utm_campaign = this.utms.campaign || 'none'; options.utm_content = this.utms.content || 'none'; options.utm_medium = this.utms.medium || 'none'; options.utm_source = this.utms.source || 'send'; options.utm_term = this.utms.term || 'none'; } const params = new URLSearchParams(options); location.assign( `${this.authConfig.authorization_endpoint}?${params.toString()}` ); } async finishLogin(code, state) { const localState = storage.get('oauthState'); storage.remove('oauthState'); if (state !== localState) { throw new Error('state mismatch'); } const tokenResponse = await fetch(this.authConfig.token_endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code, client_id: this.authConfig.client_id, code_verifier: this.storage.get('pkceVerifier') }) }); const auth = await tokenResponse.json(); const infoResponse = await fetch(this.authConfig.userinfo_endpoint, { method: 'GET', headers: { Authorization: `Bearer ${auth.access_token}` } }); const userInfo = await infoResponse.json(); userInfo.access_token = auth.access_token; userInfo.refresh_token = auth.refresh_token; userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe); this.info = userInfo; this.storage.remove('pkceVerifier'); } async refresh() { if (!this.refreshToken) { return false; } try { const tokenResponse = await fetch(this.authConfig.token_endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ client_id: this.authConfig.client_id, grant_type: 'refresh_token', refresh_token: this.refreshToken }) }); if (tokenResponse.ok) { const auth = await tokenResponse.json(); const info = { ...this.info, access_token: auth.access_token }; this.info = info; return true; } } catch (e) { console.error(e); } await this.logout(); return false; } async logout() { try { if (this.refreshToken) { await fetch(this.authConfig.revocation_endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ refresh_token: this.refreshToken }) }); } if (this.bearerToken) { await fetch(this.authConfig.revocation_endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: this.bearerToken }) }); } } catch (e) { console.error(e); // oh well, we tried } this.storage.clearLocalFiles(); this.info = {}; } async syncFileList() { let changes = { incoming: false, outgoing: false, downloadCount: false }; if (!this.loggedIn) { return this.storage.merge(); } let list = []; const key = b64ToArray(this.info.fileListKey); const sha = await crypto.subtle.digest('SHA-256', key); const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16); const retry = async () => { const refreshed = await this.refresh(); if (refreshed) { return await this.syncFileList(); } else { return { incoming: true }; } }; try { const encrypted = await getFileList(this.bearerToken, kid); const decrypted = await streamToArrayBuffer( decryptStream(blobStream(encrypted), key) ); list = JSON.parse(textDecoder.decode(decrypted)); } catch (e) { if (e.message === '401') { return retry(e); } } changes = await this.storage.merge(list); if (!changes.outgoing) { return changes; } try { const blob = new Blob([ textEncoder.encode(JSON.stringify(this.storage.files)) ]); const encrypted = await streamToArrayBuffer( encryptStream(blobStream(blob), key) ); await setFileList(this.bearerToken, kid, encrypted); } catch (e) { if (e.message === '401') { return retry(e); } } return changes; } toJSON() { return this.info; } } ================================================ FILE: app/utils.js ================================================ /* global Android */ let html; try { html = require('choo/html'); } catch (e) { // running in the service worker } const b64 = require('base64-js'); function arrayToB64(array) { return b64 .fromByteArray(array) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=/g, ''); } function b64ToArray(str) { return b64.toByteArray(str + '==='.slice((str.length + 3) % 4)); } function locale() { return document.querySelector('html').lang; } 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); }); } function isFile(id) { return /^[0-9a-fA-F]{10,16}$/.test(id); } function copyToClipboard(str) { const aux = document.createElement('input'); aux.setAttribute('value', str); aux.contentEditable = true; aux.readOnly = true; document.body.appendChild(aux); if (navigator.userAgent.match(/iphone|ipad|ipod/i)) { const range = document.createRange(); range.selectNodeContents(aux); const sel = getSelection(); sel.removeAllRanges(); sel.addRange(range); aux.setSelectionRange(0, str.length); } else { aux.select(); } const result = document.execCommand('copy'); document.body.removeChild(aux); return result; } const LOCALIZE_NUMBERS = !!( typeof Intl === 'object' && Intl && typeof Intl.NumberFormat === 'function' && typeof navigator === 'object' ); const UNITS = ['bytes', 'kb', 'mb', 'gb']; function bytes(num) { if (num < 1) { return '0B'; } const exponent = Math.min(Math.floor(Math.log10(num) / 3), UNITS.length - 1); const n = Number(num / Math.pow(1024, exponent)); const decimalDigits = Math.floor(n) === n ? 0 : 1; let nStr = n.toFixed(decimalDigits); if (LOCALIZE_NUMBERS) { try { nStr = n.toLocaleString(locale(), { minimumFractionDigits: decimalDigits, maximumFractionDigits: decimalDigits }); } catch (e) { // fall through } } return translate('fileSize', { num: nStr, units: translate(UNITS[exponent]) }); } function percent(ratio) { if (LOCALIZE_NUMBERS) { try { return ratio.toLocaleString(locale(), { style: 'percent' }); } catch (e) { // fall through } } return `${Math.floor(ratio * 100)}%`; } function number(n) { if (LOCALIZE_NUMBERS) { return n.toLocaleString(locale()); } return n.toString(); } function allowedCopy() { const support = !!document.queryCommandSupported; return support ? document.queryCommandSupported('copy') : false; } function delay(delay = 100) { return new Promise(resolve => setTimeout(resolve, delay)); } function fadeOut(selector) { const classes = document.querySelector(selector).classList; classes.remove('effect--fadeIn'); classes.add('effect--fadeOut'); return delay(300); } 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 browserName() { try { // order of these matters if (/firefox/i.test(navigator.userAgent)) { return 'firefox'; } if (/edge/i.test(navigator.userAgent)) { return 'edge'; } if (/edg/i.test(navigator.userAgent)) { return 'edgium'; } if (/trident/i.test(navigator.userAgent)) { return 'ie'; } if (/chrome/i.test(navigator.userAgent)) { return 'chrome'; } if (/safari/i.test(navigator.userAgent)) { return 'safari'; } if (/send android/i.test(navigator.userAgent)) { return 'android-app'; } return 'other'; } catch (e) { return 'unknown'; } } async function streamToArrayBuffer(stream, size) { const reader = stream.getReader(); let state = await reader.read(); if (size) { const result = new Uint8Array(size); let offset = 0; while (!state.done) { result.set(state.value, offset); offset += state.value.length; state = await reader.read(); } return result.buffer; } const parts = []; let len = 0; while (!state.done) { parts.push(state.value); len += state.value.length; state = await reader.read(); } let offset = 0; const result = new Uint8Array(len); for (const part of parts) { result.set(part, offset); offset += part.length; } return result.buffer; } function list(items, ulStyle = '', liStyle = '') { const lis = items.map( i => html`
  • ${i}
  • ` ); return html` `; } function secondsToL10nId(seconds) { if (seconds < 3600) { return { id: 'timespanMinutes', num: Math.floor(seconds / 60) }; } else if (seconds < 86400) { return { id: 'timespanHours', num: Math.floor(seconds / 3600) }; } else { return { id: 'timespanDays', num: Math.floor(seconds / 86400) }; } } function timeLeft(milliseconds) { if (milliseconds < 1) { return { id: 'linkExpiredAlt' }; } const minutes = Math.floor(milliseconds / 1000 / 60); const hours = Math.floor(minutes / 60); const days = Math.floor(hours / 24); if (days >= 1) { return { id: 'expiresDaysHoursMinutes', days, hours: hours % 24, minutes: minutes % 60 }; } if (hours >= 1) { return { id: 'expiresHoursMinutes', hours, minutes: minutes % 60 }; } else if (hours === 0) { if (minutes === 0) { return { id: 'expiresMinutes', minutes: '< 1' }; } return { id: 'expiresMinutes', minutes }; } return null; } function platform() { if (typeof Android === 'object') { return 'android'; } return 'web'; } const ECE_RECORD_SIZE = 1024 * 64; const TAG_LENGTH = 16; function encryptedSize(size, rs = ECE_RECORD_SIZE, tagLength = TAG_LENGTH) { const chunk_meta = tagLength + 1; // Chunk metadata, tag and delimiter return 21 + size + chunk_meta * Math.ceil(size / (rs - chunk_meta)); } let translate = function() { throw new Error('uninitialized translate function. call setTranslate first'); }; function setTranslate(t) { translate = t; } function concat(b1, b2) { const result = new Uint8Array(b1.length + b2.length); result.set(b1, 0); result.set(b2, b1.length); return result; } module.exports = { concat, locale, fadeOut, delay, allowedCopy, bytes, percent, number, copyToClipboard, arrayToB64, b64ToArray, loadShim, isFile, openLinksInNewTab, browserName, streamToArrayBuffer, list, secondsToL10nId, timeLeft, platform, encryptedSize, setTranslate }; ================================================ FILE: app/zip.js ================================================ import crc32 from './crc32'; const encoder = new TextEncoder(); function dosDateTime(dateTime = new Date()) { const year = (dateTime.getFullYear() - 1980) << 9; const month = (dateTime.getMonth() + 1) << 5; const day = dateTime.getDate(); const date = year | month | day; const hour = dateTime.getHours() << 11; const minute = dateTime.getMinutes() << 5; const second = Math.floor(dateTime.getSeconds() / 2); const time = hour | minute | second; return { date, time }; } class File { constructor(info) { this.name = encoder.encode(info.name); this.size = info.size; this.bytesRead = 0; this.crc = null; this.dateTime = dosDateTime(); } get header() { const h = new ArrayBuffer(30 + this.name.byteLength); const v = new DataView(h); v.setUint32(0, 0x04034b50, true); // sig v.setUint16(4, 20, true); // version v.setUint16(6, 8, true); // bit flags (8 = use data descriptor) v.setUint16(8, 0, true); // compression v.setUint16(10, this.dateTime.time, true); // modified time v.setUint16(12, this.dateTime.date, true); // modified date v.setUint32(14, 0, true); // crc32 (in descriptor) v.setUint32(18, 0, true); // compressed size (in descriptor) v.setUint32(22, 0, true); // uncompressed size (in descriptor) v.setUint16(26, this.name.byteLength, true); // name length v.setUint16(28, 0, true); // extra field length for (let i = 0; i < this.name.byteLength; i++) { v.setUint8(30 + i, this.name[i]); } return new Uint8Array(h); } get dataDescriptor() { const dd = new ArrayBuffer(16); const v = new DataView(dd); v.setUint32(0, 0x08074b50, true); // sig v.setUint32(4, this.crc, true); // crc32 v.setUint32(8, this.size, true); // compressed size v.setUint32(12, this.size, true); // uncompressed size return new Uint8Array(dd); } directoryRecord(offset) { const dr = new ArrayBuffer(46 + this.name.byteLength); const v = new DataView(dr); v.setUint32(0, 0x02014b50, true); // sig v.setUint16(4, 20, true); // version made v.setUint16(6, 20, true); // version required v.setUint16(8, 8, true); // bit flags (8 = use data descriptor) v.setUint16(10, 0, true); // compression v.setUint16(12, this.dateTime.time, true); // modified time v.setUint16(14, this.dateTime.date, true); // modified date v.setUint32(16, this.crc, true); // crc v.setUint32(20, this.size, true); // compressed size v.setUint32(24, this.size, true); // uncompressed size v.setUint16(28, this.name.byteLength, true); // name length v.setUint16(30, 0, true); // extra length v.setUint16(32, 0, true); // comment length v.setUint16(34, 0, true); // disk number v.setUint16(36, 0, true); // internal file attrs v.setUint32(38, 0, true); // external file attrs v.setUint32(42, offset, true); // file offset for (let i = 0; i < this.name.byteLength; i++) { v.setUint8(46 + i, this.name[i]); } return new Uint8Array(dr); } get byteLength() { return this.size + this.name.byteLength + 30 + 16; } append(data, controller) { this.bytesRead += data.byteLength; const endIndex = data.byteLength - Math.max(this.bytesRead - this.size, 0); const buf = data.slice(0, endIndex); this.crc = crc32(buf, this.crc); controller.enqueue(buf); if (endIndex < data.byteLength) { return data.slice(endIndex, data.byteLength); } } } function centralDirectory(files, controller) { let directoryOffset = 0; let directorySize = 0; for (let i = 0; i < files.length; i++) { const file = files[i]; const record = file.directoryRecord(directoryOffset); directoryOffset += file.byteLength; controller.enqueue(record); directorySize += record.byteLength; } controller.enqueue(eod(files.length, directorySize, directoryOffset)); } function eod(fileCount, directorySize, directoryOffset) { const e = new ArrayBuffer(22); const v = new DataView(e); v.setUint32(0, 0x06054b50, true); // sig v.setUint16(4, 0, true); // disk number v.setUint16(6, 0, true); // directory disk v.setUint16(8, fileCount, true); // number of records v.setUint16(10, fileCount, true); // total records v.setUint32(12, directorySize, true); // size of directory v.setUint32(16, directoryOffset, true); // offset of directory v.setUint16(20, 0, true); // comment length return new Uint8Array(e); } class ZipStreamController { constructor(files, source) { this.files = files; this.fileIndex = 0; this.file = null; this.reader = source.getReader(); this.nextFile(); this.extra = null; } nextFile() { this.file = this.files[this.fileIndex++]; } async pull(controller) { if (!this.file) { // end of archive centralDirectory(this.files, controller); return controller.close(); } if (this.file.bytesRead === 0) { // beginning of file controller.enqueue(this.file.header); if (this.extra) { this.extra = this.file.append(this.extra, controller); } } if (this.file.bytesRead >= this.file.size) { // end of file controller.enqueue(this.file.dataDescriptor); this.nextFile(); return this.pull(controller); } const data = await this.reader.read(); if (data.done) { this.nextFile(); return this.pull(controller); } this.extra = this.file.append(data.value, controller); } } export default class Zip { constructor(manifest, source) { this.files = manifest.files.map(info => new File(info)); this.source = source; } get stream() { return new ReadableStream(new ZipStreamController(this.files, this.source)); } get size() { const entries = this.files.reduce( (total, file) => total + file.byteLength * 2 - file.size, 0 ); const eod = 22; return entries + eod; } } ================================================ FILE: browserslist ================================================ last 2 chrome versions last 2 firefox versions last 2 safari versions last 2 edge versions edge 18 firefox esr ================================================ FILE: build/android_index_plugin.js ================================================ const path = require('path'); const html = require('choo/html'); const NAME = 'AndroidIndexPlugin'; function chunkFileNames(compilation) { const names = {}; for (const chunk of compilation.chunks) { for (const file of chunk.files) { if (!/\.map$/.test(file)) { names[`${chunk.name}${path.extname(file)}`] = file; } } } return names; } class AndroidIndexPlugin { apply(compiler) { compiler.hooks.emit.tap(NAME, compilation => { const files = chunkFileNames(compilation); const page = html` Send ` .toString() .replace(/\n\s{6}/g, '\n'); compilation.assets['android.html'] = { source() { return page; }, size() { return page.length; } }; }); } } module.exports = AndroidIndexPlugin; ================================================ FILE: build/readme.md ================================================ # Custom Loaders ## Android Index Plugin Generates the `index.html` page for the native android client ## Version Plugin Creates a `version.json` file that gets exposed by the `/__version__` route from the `package.json` file and current git commit hash. # See Also - [docs/build.md](../docs/build.md) - [webpack.config.js](../webpack.config.js) ================================================ FILE: build/version_plugin.js ================================================ const gitRevSync = require('git-rev-sync'); const pkg = require('../package.json'); let commit = 'unknown'; try { commit = gitRevSync.short(); } catch (e) { console.warn('Error fetching current git commit: ' + e); } const version = JSON.stringify({ commit, source: pkg.homepage, version: process.env.CIRCLE_TAG || `v${pkg.version}` }); class VersionPlugin { apply(compiler) { compiler.hooks.emit.tap('VersionPlugin', compilation => { compilation.assets['version.json'] = { source() { return version; }, size() { return version.length; } }; }); } } module.exports = VersionPlugin; ================================================ FILE: common/assets.js ================================================ const genmap = require('./generate_asset_map'); const isServer = typeof genmap === 'function'; let prefix = ''; 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]; } function setPrefix(name) { prefix = name; } function getMatches(match) { return Object.keys(assets) .filter(k => match.test(k)) .map(getAsset); } const instance = { setPrefix: setPrefix, get: getAsset, match: getMatches, setMiddleware: function(middleware) { function getManifest() { return JSON.parse( middleware.fileSystem.readFileSync( middleware.getFilenameFromUrl('/manifest.json') ) ); } if (middleware) { instance.get = function getAssetWithMiddleware(name) { const m = getManifest(); return prefix + m[name]; }; instance.match = function matchAssetWithMiddleware(match) { const m = getManifest(); return Object.keys(m) .filter(k => match.test(k)) .map(k => prefix + m[k]); }; } } }; module.exports = instance; ================================================ FILE: common/generate_asset_map.js ================================================ /* This code is included by both the server and frontend via common/assets.js When included from the server the export will be the function. When included from the frontend (via webpack) the export will be an object mapping file names to hashed file names. Example: "send_logo.svg": "send_logo.5fcfdf0e.svg" */ 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 = { ${files.map(kv).join(',\n')} };`; return { code, dependencies: files.map(f => require.resolve('../assets/' + f)), cacheable: true }; }; ================================================ FILE: common/readme.md ================================================ # Common Code This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`). ## Generate Asset Map This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site. ================================================ FILE: docker-compose.yml ================================================ version: "3" services: web: build: . links: - redis ports: - "1443:1443" environment: - REDIS_HOST=redis redis: image: redis:alpine selenium-firefox: image: b4handjr/selenium-firefox ports: - "${VNC_PORT:-5900}:5900" shm_size: 2g volumes: - .:/code ================================================ FILE: docs/CODEOWNERS ================================================ # flod as main contact for string changes public/locales/en-US/*.ftl @flodolo ================================================ FILE: docs/acceptance-mobile.md ================================================ # Send V2 UX Mobile Acceptance and Spec Annotations `Date Created: 8/20/2018` ## Acceptance Criteria Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp) - [ ] It should look and feel of an Android App - [ ] It should look and feel like the Firefox Send Web Client ### Main Screen - [ ] It should clearly Indicate the name of the product - [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) - [ ] It should allow users to access the file picker to create Send links - [ ] If the user has existing Sends, it should display a card-based list view of each [see Cards section below] ### Non-Authenticated Users - [ ] It should make clear the benefits of a Firefox Account - [ ] It should allow users to log into or create a Firefox account - [ ] It should allow users to select and send multiple files in one URL - [ ] It should limit the sendable file size to 1GB - [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours - [ ] It should allow users to set a download count of 1 downloads ### Authenticated Users - [ ] It should indicate that the user is signed in via Firefox Account - [ ] It should allow the user to sign out - [ ] It should allow users to select and send multiple files in one URL - [ ] It should limit users to sending 2.5GB per Send - [ ] It should allow users to extend Send times up to 1 Week - [ ] It should allow users to extend Send download counts up to 100 times ### Cards - [ ] It should display the name of the sent file/files - [ ] It should display the time remaining before expiration - [ ] It should display the number of downloads remaining before expiration - [ ] It should have a button that lets the user copy the send link to their clipboard - [ ] It should show a preview icon (not a thumbnail) that has some relationship to the file types or content being sent* (see 5.1 in spec) - [ ] It should have an overflow (meatball) menu that when triggered, gives the user share or delete buttons - [ ] While encrypting / pushing to server, it should display a progress meter and a cancel button - [ ] For authenticated users, it should be expandable to display all files in a send (5.1.1) - [ ] If user cancels Send, or Upload fails, it should display a warning in the card - [ ] It should display expired Sends below current sends with their UI greyed out and an expiration warning for 24 hours after expiration - [ ] It should remove expired cards from display after 24 hours - [ ] It should let users permanently delete records expired sends - [ ] It should display a visual indicator when a Send is password protected - [ ] It should allow the user to share via a native Android share sheet - [ ] It should allow me to create Send links through intents from other apps ### General/other - [ ] It should allow users to set passwords to protect their Sends - [ ] It should warn users when they are trying to upload files larger than their share limit ### Stretch - [ ] It should allow users to use the photo gallery to create Send links - [ ] It should allow users to use their camera to create Send links - [ ] It should allow users to opt into notification when a share link expires - [ ] It should allow users to opt into notifications when their link is downloaded ## Annotations on Mobile Spec This document tracks differences between the UX spec for Firefox Send and the intended MVP. [Spec Link](https://mozilla.invisionapp.com/share/GNN6KKOQ5XS) * 1.1: Spec describes toolbar which may not be possible given the application framework we're using. In particular, issues with the spec include the color, logo and different font weights may be an issue. * 1.2: Spec's treatment of FxA UI may be difficult to match. We should use the default OAuth implementation and re-evaluate UX once we see an implementation demo. Also, the landing page UI should display a log-in CTA directly and not require users click into the hamburger menu. * 2.1: MVP will only include file picker. Signed in users will be able to select multiple files. File selection flow will be Android-native. Probably don't have the ability to add notifications as in the last screen on this page. * 2.1: @fzzzy will provide screenshots of this flow for UX evaluation and comment. * 3.1.4: The spec shows deleting the last item in an unshared set returning the user to the picker menu. Instead, it should return to the app home page. * 3.1.5: Same as 3.1.5 notes. Both cases should show the warning dialog. * 4.1: We may not be able to do a thumbnail here. Instead we should specify a set of icons to be displayed. * 6.3: We're not going to allow cards to be edited. This page is deprecated. * 6.4: Swiping cards to delete is stretched. * 6.5: We're not 100% sure what happens on network connectivity errors, we should test this and adapt UX as necessary. * 7.1: The last screen on this page depicts a network error notification on the selection screen. Instead the user should hit the send button, be taken back to the cards and display the card as in 5.1.2 * 7.3: May not be necessary...we can ask for permissions on install. * 8.1: Notifications do not block launch ================================================ FILE: docs/acceptance-web.md ================================================ # Send V2 UX Web Acceptance Criteria ## General - [ ] It should match the spec provided. - [ ] It should have a feedback button - [ ] It should provide links to relevant legal documentation ### Non-Authenticated Users - [ ] It should make clear the benefits of a Firefox Account - [ ] It should allow users to log into or create a Firefox account - [ ] It should allow users to select and send multiple files in one URL - [ ] It should limit the sendable file size to 1GB - [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours - [ ] It should allow users to set an download count of 1 downloads ### Authenticated Users - [ ] It should indicate that the user is signed in via Firefox Account - [ ] It should allow the user to sign out - [ ] It should allow users to select and send multiple files in one URL - [ ] It should limit users to sending 2.5GB per Send - [ ] It should allow users to extend Send times up to 1 Week - [ ] It should allow users to extend Send download counts up to 100 times ### Main Screen - [ ] It should clearly indicate the name of the product - [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) - [ ] It should allow users to access the file picker to create Send links - [ ] It should allow users to drag and drop files - [ ] It should provide affordances to sign in to Send - [ ] If the user has existing Sends, it should display a card-based list view of each ### Upload UI - [ ] It should allow users to continue to add files to their upload up to a set limit - [ ] It should allow users to set a password - [ ] It should let users delete items from their upload bundle ### Uploading UI - [ ] It should display an affordance to demonstrate the status of an upload ### Share UI - [ ] It should provide a copiable URL to the bundle ### Download UI - [ ] It should prompt the user for a password if one is required - [ ] It should provide feedback for incorrect passwords - [ ] It should provide a description of Send to make clear what this service is - [ ] It should let the user see the files they are downloading - [ ] It should let the user download their files ### Download Complete UI - [ ] It should indicate that a download is complete - [ ] It should provide a description of the Send service - [ ] It should provide a link back to the upload UI ### Expiry UI - [ ] It should provide a generic message indicating a share has expired - [ ] It should allow the user to navigate back to the upload page ### In Memory DL Page - [ ] It should show in case a user tries to download a large file on a suboptimal client - [ ] It should suggest the user use Firefox - [ ] It should let the user copy the download url ================================================ FILE: docs/build.md ================================================ Send has two build configurations, development and production. Both can be run via `npm` scripts, `npm start` for development and `npm run build` for production. Webpack is our only build tool and all configuration lives in [webpack.config.js](../webpack.config.js). # Development `npm start` launches a `webpack-dev-server` on port 8080 that compiles the assets and watches files for changes. It also serves the backend API and frontend unit tests via the `server/bin/dev.js` entrypoint. The frontend tests can be run in the browser by navigating to http://localhost:8080/test and will rerun automatically as the watched files are saved with changes. # Production `npm run build` compiles the assets and writes the files to the `dist/` directory. `npm run prod` launches an Express server on port 1443 that serves the backend API and frontend static assets from `dist/` via the `server/bin/prod.js` entrypoint. # Notable differences - Development compiles assets in memory, so no `dist/` directory is generated - Development does not enable CSP headers - Development frontend source is instrumented for code coverage - Only development includes sourcemaps - Only development exposes the `/test` route - Production sets Cache-Control immutable headers on the hashed static assets # Custom Loaders The `build/` directory contains custom webpack loaders specific to Send. See [build/readme.md](../build/readme.md) for details on each loader. ================================================ FILE: docs/deployment.md ================================================ ## Requirements This document describes how to do a full deployment of Firefox Send on your own Linux server. You will need: * A working (and ideally somewhat recent) installation of NodeJS and NPM * GIT * An Apache webserver * Optionally telnet, to be able to quickly check your installation For Debian/Ubuntu systems this probably just means something like this: * apt install git apache2 nodejs npm telnet ## Building * We assume an already configured virtual-host on your webserver with an existing empty htdocs folder * First, remove that htdocs folder - we will replace it with Firefox Send's version now * git clone https://github.com/mozilla/send.git htdocs * Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is) * npm install * npm run build ## Running To have a permanently running version of Firefox Send as a background process: * Create a file "run.sh" with: ``` #!/bin/bash nohup su www-data -c "npm run prod" 2>/dev/null & ``` * chmod +x run.sh * ./run.sh Now the Firefox Send backend should be running on port 1443. You can check with: * telnet localhost 1443 ## Reverse Proxy Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Firefox send ("Reverse proxy"). # Apache webserver * a2enmod proxy * a2enmod proxy_http * a2enmod proxy_wstunnel In your Apache virtual host configuration file, insert this: ``` # Enable rewrite engine RewriteEngine on # Make sure the original domain name is forwarded to Send # Otherwise the generated URLs will be wrong ProxyPreserveHost on # Make sure the generated URL is https:// RequestHeader set X-Forwarded-Proto https # If it's a normal file (e.g. PNG, CSS) just return it RewriteCond %{REQUEST_FILENAME} -f RewriteRule .* - [L] # If it's a websocket connection, redirect it to a Send WS connection RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L] # Otherwise redirect it to a normal HTTP connection RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA] ProxyPassReverse "/" "http://127.0.0.1:1443" ``` ================================================ FILE: docs/docker.md ================================================ ## Setup Run `docker build -t send:latest .` to create an image or `docker-compose up` to run a full testable stack. *We don't recommend using docker-compose for production.* ## Environment variables: | Name | Description |------------------|-------------| | `PORT` | Port the server will listen on (defaults to 1443). | `S3_BUCKET` | The S3 bucket name. | `REDIS_HOST` | Host name of the Redis server. | `SENTRY_CLIENT` | Sentry Client ID | `SENTRY_DSN` | Sentry DSN | `MAX_FILE_SIZE` | in bytes (defaults to 2147483648) | `NODE_ENV` | "production" | `BASE_URL` | The HTTPS URL where traffic will be served (e.g. `https://send.firefox.com`) ## Example: ```sh $ docker run --net=host -e 'NODE_ENV=production' \ -e 'S3_BUCKET=testpilot-p2p-dev' \ -e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \ -e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \ -e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \ -e 'BASE_URL=https://send.firefox.com' \ mozilla/send:latest ``` ================================================ FILE: docs/encryption.md ================================================ # File Encryption Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js). ## Steps ### Uploading 1. A new secret key is generated with `crypto.getRandomValues` 2. The secret key is used to derive more keys via HKDF SHA-256 - a series of encryption keys for the file, via [ECE](https://tools.ietf.org/html/rfc8188) (AES-GCM) - an encryption key for the file metadata (AES-GCM) - a signing key for request authentication (HMAC SHA-256) 3. The file and metadata are encrypted with their corresponding keys 4. The encrypted data and signing key are uploaded to the server 5. An owner token and the share url are returned by the server and stored in local storage 6. The secret key is appended to the share url as a [#fragment](https://en.wikipedia.org/wiki/Fragment_identifier) and presented to the UI ### Downloading 1. The browser loads the share url page, which includes an authentication nonce 2. The browser imports the secret key from the url fragment 3. The same 3 keys as above are derived 4. The browser signs the nonce with its signing key and requests the metadata 5. The encrypted metadata is decrypted and presented on the page 6. The browser makes another authenticated request to download the encrypted file 7. The browser downloads and decrypts the file 8. The file prompts the save dialog or automatically saves depending on the browser settings ### Passwords A password may optionally be set to authenticate the download request. When a password is set the following steps occur. #### Sender 1. The original signing key derived from the secret key is discarded 2. A new signing key is generated via PBKDF2 from the user entered password and the full share url (including secret key fragment) 3. The new key is sent to the server, authenticated by the owner token 4. The server stores the new key and marks the record as needing a password #### Downloader 1. The browser loads the share url page, which includes an authentication nonce and indicator that the file requires a password 2. The user is prompted for the password and the signing key is derived 3. The browser requests the metadata using the key to sign the nonce 4. If the password was correct the metadata is returned, otherwise a 401 ================================================ FILE: docs/experiments.md ================================================ # A/B experiment testing We're using Google Analytics Experiments for A/B testing. ## Creating an experiment Navigate to the Behavior > Experiments section of Google Analytics and click the "Create experiment" button. The "Objective for this experiment" is the most complicated part. See the "Promo click (Goal ID 4 / Goal Set 1)" for an example. In step 2 add as many variants as you plan to test. The urls are not important since we aren't using their js library to choose the variants. The name will show up in the report so choose good ones. "Original page" becomes variant 0 and each variant increments by one. We'll use the numbers in our `app/experiments.js` code. Step 3 contains some script that we'll ignore. The important thing here is the **Experiment ID**. This is the value we need to name our experiment in `app/experiments.js`. Save the changes so far and wait until the code containing the experiment has been deployed to production **before** starting the experiment. ## Experiment code Code for experiments live in [app/experiments.js](../app/experiments.js). There's an `experiments` object that contains the logic for deciding whether an experiment should run, which variant to use, and what to do. Each object needs to have these functions: ### `eligible` function This function returns a boolean of whether this experiment should be active for this session. Any data available to the page can be used determine the result. ### `variant` function This function returns which experimental group this session is placed in. The variant values need to match the values set up in Google Analytics, usually 0 thru N-1. This value is usually picked at random based on what percentage of each variant is desired. ### `run` function This function gets the `variant` value chosen by the variant function and the `state` and `emitter` objects from the app. This function can do anything needed to change the app based on the experiment. A common pattern is to set or change a value on `state` that will be picked up by other parts of the app, like ui templates, to change how it looks or behaves. ### Example Here's a full example of the experiment object: ```js const experiments = { S9wqVl2SQ4ab2yZtqDI3Dw: { // The Experiment ID from Google Analytics id: 'S9wqVl2SQ4ab2yZtqDI3Dw', run: function(variant, state, emitter) { switch (variant) { case 1: state.promo = 'blue'; break; case 2: state.promo = 'pink'; break; default: state.promo = 'grey'; } emitter.emit('render'); }, eligible: function() { return ( !/firefox|fxios/i.test(navigator.userAgent) && document.querySelector('html').lang === 'en-US' ); }, variant: function(state) { const n = this.luckyNumber(state); if (n < 0.33) { return 0; } return n < 0.66 ? 1 : 2; }, luckyNumber: function(state) { return luckyNumber( `${this.id}:${state.storage.get('testpilot_ga__cid')}` ); } } }; ``` ## Reporting results All metrics pings will include the variant and experiment id, but it's usually important to trigger a specific event to be counted as the experiment goal (the "Objective for this experiment" part from setup). Use an 'experiment' event to do this. For example: ```js emit('experiment', { cd3: 'promo' }); ``` where `emit` is the app emitter function passed to the [route handler](https://github.com/choojs/choo#approuteroutename-handlerstate-emit) The second argument can be an object with any additional parameters. It usually includes a custom dimension that we chose to filter on while creating the experiment in Google Analytics. ================================================ FILE: docs/faq.md ================================================ ## How big of a file can I transfer with Firefox Send? There is a 2.5GB file size limit built in to Send(1GB for non-signed in users), however, in practice you may be unable to send files that large. Send encrypts and decrypts the files in the browser which is great for security but will tax your system resources. In particular you can expect to see your memory usage go up by at least the size of the file when the transfer is processing. You can see [the results of some testing](https://github.com/mozilla/send/issues/170#issuecomment-314107793). For the most reliable operation on common computers, it’s probably best to stay under a few hundred megabytes. ## Why is my browser not supported? We’re using the [Web Cryptography JavaScript API with the AES-GCM algorithm](https://www.w3.org/TR/WebCryptoAPI/#aes-gcm) for our encryption. Many browsers support this standard and should work fine, but some have not implemented it yet (mobile browsers lag behind on this, in particular). ## Why does Firefox Send require JavaScript? Firefox Send uses JavaScript to: - Encrypt and decrypt files locally on the client instead of the server. - Render the user interface. - Manage translations on the website into [various different languages](https://github.com/mozilla/send#localization). - Collect data to help us improve Send in accordance with our [Terms & Privacy](https://send.firefox.com/legal). Since Send is an open source project, you can see all of the cool ways we use JavaScript by [examining our code](https://github.com/mozilla/send/). ## How long are files available for? Files are available to be downloaded for 24 hours, after which they are removed from the server. They are also removed immediately once the download limit is reached. ## Can a file be downloaded more than once? Yes, once a file is submitted to Send you can select the download limit. *Disclaimer: Send is an experiment and under active development. The answers here may change as we get feedback from you and the project matures.* ================================================ FILE: docs/localization.md ================================================ # Localization Send is localized in over 50 languages. We use the [fluent](http://projectfluent.org/) library and store our translations in [FTL](http://projectfluent.org/fluent/guide/) files in `public/locales/`. `en-US` is our base language, and other languages are managed by [pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/). ## Process Strings are added or removed from [public/locales/en-US/send.ftl] as needed. Strings **MUST NOT** be *changed* after they've been commited and pushed to master. Changing a string requires creating a new ID with a new name (preferably descriptive instead of incremented) and deletion of the obsolete ID. It's often useful to add a comment above the string with info about how and where the string is used. Once new strings are commited to master they are available for translators in Pontoon. All languages other than `en-US` should be edited via Pontoon. Translations get automatically commited to the github master branch. ### Activation The development environment includes all locales in `public/locales` via the `L10N_DEV` environment variable. Production uses `package.json` as the list of locales to use. Once a locale has enough string coverage it should be added to `package.json`. ## Code In `app/` we use the `state.translate()` function to translate strings to the best matching language base on the user's `Accept-Language` header. It's a wrapper around fluent's [FluentBundle.format](http://projectfluent.org/fluent.js/fluent/FluentBundle.html). It works the same for both server and client side rendering. ### Examples ```js // simple string const finishedString = state.translate('downloadFinish') // with parameters const progressString = state.translate('downloadingPageProgress', { filename: state.fileInfo.name, size: bytes(state.fileInfo.size) }) ``` ================================================ FILE: docs/metrics.md ================================================ # Send V2 Metrics Definitions ## Key Value Prop Quickly and privately transfer large files from any device to any device. ## Key Business Question to Answer Is the value proposition of a large encrypted file transfer service enough to drive Firefox Account relationships for non-Firefox users. ## Hypotheses to Test ### Primary - In support of Relationships KPI We believe that a privacy-respecting file transfer service can drive Firefox Accounts beyond the Firefox Browser. We will know this to be true when we see 250k Firefox Account creations from non-Firefox contexts w/in six months of launch. ### Secondary - In support of Revenue KPI We believe that a privacy respecting service accessible beyond the reach of Firefox will provide a valuable platform to research, communicate with, and market to conscious choosers we have traditionally found hard to reach. We will know this to be true when we can conduct six research tasks (surveys, A/B tests, fake doors, etc) in support of premium services KPIs in the first six months after launch. ## Overview of Key Measures * Number of people using the service to send and receive files * Why: measure of service size. Important for understanding addressable market size * Percent of users who have or create an FxAccount via Send * Why: representation of % of any service users who might be amenable to an upsell * % of downloaders who convert into uploaders * Why: represents a measure of our key growth-loop potential * Count of uploads and size * Why: Represents cost of service on a running basis ## Key Funnels * App Open or Visit `--- DESIRED OUTCOME --->` Successful Upload * Download UI Visit `--- DESIRED OUTCOME --->` Successful Download * FxA UI Engagement `--- DESIRED OUTCOME --->` Authenticate * **STRETCH** App Open or Visit `--- DESIRED OUTCOME --->` Successful Download ## Amplitude Schema Please see, **See Amplitude HTTP API**(https://amplitude.zendesk.com/hc/en-us/articles/204771828) for HTTP API reference. ## Metric Events In support of our KPIs we collect events from two separate contexts, server and client. The events are designed to have minimal correlation between contexts. Server events collect lifecycle information about individual uploads but no user information; also time precision is truncated to hour increments. Client events collect information about how users interact with the UI but no upload identifiers. ### Server Events Server events allow us to aggregate data about file lifecycle without collecting data about individual users. In this context `user_id` and `user_properties` describe the uploaded archive. * `session_id` -1 (not part of a session) * `user_id` hash of (archive_id + owner_id) * `app_version` package.json version * `time` timestamp truncated to hour precision * `country` * `region` * `event_type` [server_upload | server_download | server_delete] * `user_properties` * `download_limit` set number of downloads * `time_limit` set expiry duration * `size` approximate size (log10) * `anonymous` true if anonymous, false if fxa * `event_properties` * `download_count` downloads completed * `ttl` time remaining before expiry truncated to hour * `agent` the browser name or first 6 characters of the user agent that made the request ### Client Events Client events allow us to aggregate data about how the user interface is being used without tracking the lifecycle of individual files. In this context `user_id` and `user_properties` describe the user. The `user_id` and `device_id` change for all users at the beginning of each month. * `session_id` timestamp * `user_id` hash of (fxa_id + Date.year + Date.month) * `device_id` hash of (localStorage random id + Date.year + Date.month) * `platform` [web | android] * `country` * `region` * `language` * `time` timestamp * `os_name` * `event_type` [client_visit | client_upload | client_download | client_delete | client_login | client_logout] * `event_properties` * `browser` * `browser_version` * `status` [ ok | error | cancel ] * Event specific properties (see below) * `user_properties` * `active_count` number of active uploads * `anonymous` true if anonymous, false if fxa * `experiments` list of experiment ids the user is participating in * `first_action` how this use came to Send the first time [ upload | download ] #### Visit Event * `entrypoint` [ upload | download ] #### Upload Event * `download_limit` download limit * `file_count` number of files * `password_protected` boolean * `size` approximate size (log10) * `time_limit` time limit * `duration` approximate transfer duration (log10) #### Download Event * `password_protected` boolean * `size` approximate size (log10) * `duration` approximate transfer duration (log10) #### Delete Event * `age` hours since uploaded * `downloaded` downloaded at least once #### Login Event * `trigger` [button | time | count | size] #### Logout Event * `trigger` [button | timeout] ================================================ FILE: docs/notes/streams.md ================================================ # Web Streams - API - https://developer.mozilla.org/en-US/docs/Web/API/Streams_API - Reference Implementation - https://github.com/whatwg/streams/tree/master/reference-implementation - Examples - https://github.com/mdn/dom-examples/tree/master/streams - Polyfill - https://github.com/MattiasBuelens/web-streams-polyfill # Encrypted Content Encoding - Spec - https://trac.tools.ietf.org/html/rfc8188 - node.js implementation - https://github.com/web-push-libs/encrypted-content-encoding/tree/master/nodejs # Other APIs - Blobs - https://developer.mozilla.org/en-US/docs/Web/API/Blob - ArrayBuffers, etc - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array - FileReader - https://developer.mozilla.org/en-US/docs/Web/API/FileReader # Other - node.js Buffer browser library - https://github.com/feross/buffer - StreamSaver - https://github.com/jimmywarting/StreamSaver.js ================================================ FILE: docs/takedowns.md ================================================ ## Take-down process In cases of a DMCA notice, or other abuse yet to be determined, a file has to be removed from the service. Files can be delisted and made inaccessible by removing their record from Redis. Send share links contain the `id` of the file, for example `https://send.firefox.com/download/3d9d2bb9a1` From a host with access to the Redis server run a `DEL` command with the file id. For example: ```sh redis-cli DEL 3d9d2bb9a1 ``` Other redis-cli parameters like `-h` may also be required. See [redis-cli docs](https://redis.io/topics/rediscli) for more info. The encrypted file resides on S3 as the same `id` under the bucket that the app was configured with as `S3_BUCKET`. The file can be managed if it has not already expired with the [AWS cli](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) or AWS web console. ================================================ FILE: ios/generate-bundle.js ================================================ const child_process = require('child_process'); const fs = require('fs'); const path = require('path'); child_process.execSync('npm run build'); const prefix = path.join('..', 'dist'); const json_string = fs.readFileSync(path.join(prefix, 'manifest.json')); const manifest = JSON.parse(json_string); const ios_filename = manifest['ios.js']; fs.writeFileSync( 'send-ios/assets/ios.js', fs.readFileSync(`${prefix}${ios_filename}`) ); const vendor_filename = manifest['vendor.js']; fs.writeFileSync( 'send-ios/assets/vendor.js', fs.readFileSync(`${prefix}${vendor_filename}`) ); ================================================ FILE: ios/ios.js ================================================ /* global window, document, fetch */ const MAXFILESIZE = 1024 * 1024 * 1024 * 2; const EventEmitter = require('events'); const emitter = new EventEmitter(); function dom(tagName, attributes, children = []) { const node = document.createElement(tagName); for (const name in attributes) { if (name.indexOf('on') === 0) { node[name] = attributes[name]; } else if (name === 'htmlFor') { node.htmlFor = attributes.htmlFor; } else if (name === 'className') { node.className = attributes.className; } else { node.setAttribute(name, attributes[name]); } } if (!(children instanceof Array)) { children = [children]; } for (let child of children) { if (typeof child === 'string') { child = document.createTextNode(child); } node.appendChild(child); } return node; } function uploadComplete(file) { document.body.innerHTML = ''; const input = dom('input', { id: 'url', value: file.url }); const copy = dom( 'button', { id: 'copy-button', className: 'button', onclick: () => { window.webkit.messageHandlers['copy'].postMessage(input.value); copy.textContent = 'Copied!'; setTimeout(function() { copy.textContent = 'Copy to clipboard'; }, 2000); } }, 'Copy to clipboard' ); const node = dom( 'div', { id: 'striped' }, dom('div', { id: 'white' }, [ input, copy, dom( 'button', { id: 'send-another', className: 'button', onclick: render }, 'Send another file' ) ]) ); document.body.appendChild(node); } const state = { storage: { files: [], remove: function(fileId) { console.log('REMOVE FILEID', fileId); }, writeFile: function(file) { console.log('WRITEFILE', file); }, addFile: uploadComplete, totalUploads: 0 }, transfer: null, uploading: false, settingPassword: false, passwordSetError: null, route: '/' }; function upload(event) { console.log('UPLOAD'); event.preventDefault(); const target = event.target; const file = target.files[0]; if (file.size === 0) { return; } if (file.size > MAXFILESIZE) { console.log('file too big (no bigger than ' + MAXFILESIZE + ')'); return; } emitter.emit('upload', { file: file, type: 'click' }); } function render() { document.body.innerHTML = ''; const striped = dom( 'div', { id: 'striped' }, dom('div', { id: 'white' }, [ dom('label', { id: 'label', htmlFor: 'input' }, 'Choose file'), dom('input', { id: 'input', type: 'file', name: 'input', onchange: upload }) ]) ); document.body.appendChild(striped); } emitter.on('render', function() { document.body.innerHTML = ''; const percent = (state.transfer.progress[0] / state.transfer.progress[1]) * 100; const node = dom( 'div', { style: 'background-color: white; width: 100%' }, dom('span', { style: `display: inline-block; width: ${percent}%; background-color: blue` }) ); document.body.appendChild(node); }); emitter.on('pushState', function(path) { console.log('pushState ' + path + ' ' + JSON.stringify(state)); }); const controller = require('../app/controller').default; try { controller(state, emitter); } catch (e) { console.error('error' + e); console.error(e); } function sendBase64EncodedFromSwift(encoded) { fetch(encoded) .then(res => res.blob()) .then(blob => { emitter.emit('upload', { file: blob, type: 'share' }); }); } window.sendBase64EncodedFromSwift = sendBase64EncodedFromSwift; render(); window.webkit.messageHandlers['loaded'].postMessage(''); ================================================ FILE: ios/send-ios/AppDelegate.swift ================================================ // // AppDelegate.swift // send-ios // // Created by Donovan Preston on 7/19/18. // import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } } ================================================ FILE: ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", "size" : "20x20", "scale" : "3x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" }, { "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" }, { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: ios/send-ios/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: ios/send-ios/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: ios/send-ios/Base.lproj/Main.storyboard ================================================ ================================================ FILE: ios/send-ios/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: ios/send-ios/ViewController.swift ================================================ // // ViewController.swift // send-ios // // Created by Donovan Preston on 7/19/18. // import UIKit import WebKit class ViewController: UIViewController, WKScriptMessageHandler { @IBOutlet var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() self.webView.frame = self.view.bounds self.webView?.configuration.userContentController.add(self, name: "loaded") self.webView?.configuration.userContentController.add(self, name: "copy") if let url = Bundle.main.url( forResource: "index", withExtension: "html", subdirectory: "assets") { webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) } } public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { print("Message received: \(message.name) with body: \(message.body)") UIPasteboard.general.string = "\(message.body)" } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: ios/send-ios/assets/index.css ================================================ body { background: url('background_1.jpg'); display: flex; flex-direction: row; flex: auto; justify-content: center; align-items: center; padding: 0 20px; box-sizing: border-box; position: fixed; top: 0; left: 0; right: 0; bottom: 0; } #striped { background-image: repeating-linear-gradient( 45deg, white, white 5px, #ea000e 5px, #ea000e 25px, white 25px, white 30px, #0083ff 30px, #0083ff 50px ); height: 350px; width: 480px; } #white { display: flex; justify-content: center; align-items: center; flex-direction: column; height: 100%; background-color: white; margin: 0 10px; padding: 1px 10px 0 10px; } #label { background: #0297f8; border: 1px solid #0297f8; color: white; font-size: 24px; font-weight: 500; height: 60px; width: 200px; display: flex; justify-content: center; align-items: center; } #input { display: none; } #url { flex: 1; width: 100%; height: 32px; font-size: 24px; margin-top: 1em; } .button { flex: 1; display: block; background: #0297f8; border: 1px solid #0297f8; color: white; font-size: 24px; font-weight: 500; width: 95%; height: 32px; margin-top: 1em; } #send-another { margin-bottom: 1em; } ================================================ FILE: ios/send-ios/assets/index.html ================================================ Send ================================================ FILE: ios/send-ios/help.html ================================================ HELLO WORLD ================================================ FILE: ios/send-ios-action-extension/ActionViewController.swift ================================================ // // ActionViewController.swift // send-ios-action-extension // // Created by Donovan Preston on 7/26/18. // import UIKit import WebKit import MobileCoreServices var typesToLoad = [("com.adobe.pdf", "application/pdf"), ("public.png", "image/png"), ("public.jpeg", "image/jpeg"), ("public.jpeg-2000", "image/jp2"), ("com.compuserve.gif", "image/gif"), ("com.microsoft.bmp", "image/bmp"), ("public.plain-text", "text/plain")] class ActionViewController: UIViewController, WKScriptMessageHandler { @IBOutlet var webView: WKWebView! var typeToSend: String? var dataToSend: Data? override func viewDidLoad() { super.viewDidLoad() self.webView.frame = self.view.bounds self.webView?.configuration.userContentController.add(self, name: "loaded") self.webView?.configuration.userContentController.add(self, name: "copy") if let url = Bundle.main.url( forResource: "index", withExtension: "html", subdirectory: "assets") { self.webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) } // Get the item[s] we're handling from the extension context. for item in self.extensionContext!.inputItems as! [NSExtensionItem] { for provider in item.attachments! as! [NSItemProvider] { for (type, mimeType) in typesToLoad { if provider.hasItemConformingToTypeIdentifier(type) { provider.loadDataRepresentation(forTypeIdentifier: type, completionHandler: { (data, error) in OperationQueue.main.addOperation { self.typeToSend = mimeType self.dataToSend = data } }) return } } } } } public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { print("Message received: \(message.name) with body: \(message.body)") if (message.name == "loaded") { let stringToSend = "window.sendBase64EncodedFromSwift('data:\(self.typeToSend ?? "application/octet-stream");base64,\(self.dataToSend?.base64EncodedString() ?? "")')"; self.webView.evaluateJavaScript(stringToSend) { (object: Any?, error: Error?) -> Void in print("completed") } } else if (message.name == "copy") { UIPasteboard.general.string = "\(message.body)" } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func done() { // Return any edited content to the host app. // This template doesn't do anything, so we just echo the passed in items. self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil) } } ================================================ FILE: ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard ================================================ ================================================ FILE: ios/send-ios-action-extension/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName send-ios-action-extension CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType XPC! CFBundleShortVersionString 1.0 CFBundleVersion 1 NSExtension NSExtensionAttributes NSExtensionActivationRule SUBQUERY ( extensionItems, $extensionItem, SUBQUERY ( $extensionItem.attachments, $attachment, ( ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" ) ).@count == 1 ).@count == 1 NSExtensionMainStoryboard MainInterface NSExtensionPointIdentifier com.apple.ui-services ================================================ FILE: ios/send-ios.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ E34149C621017A3A00930775 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C521017A3A00930775 /* AppDelegate.swift */; }; E34149C821017A3A00930775 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C721017A3A00930775 /* ViewController.swift */; }; E34149CB21017A3A00930775 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149C921017A3A00930775 /* Main.storyboard */; }; E34149CD21017A3D00930775 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E34149CC21017A3D00930775 /* Assets.xcassets */; }; E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149CE21017A3D00930775 /* LaunchScreen.storyboard */; }; E355478521028193009D206E /* help.html in Resources */ = {isa = PBXBuildFile; fileRef = E355478421028193009D206E /* help.html */; }; E355478921092E22009D206E /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E355478821092E22009D206E /* assets */; }; E355478C210A534F009D206E /* ios.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478B210A534F009D206E /* ios.js */; }; E355478E210A5357009D206E /* generate-bundle.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478D210A5357009D206E /* generate-bundle.js */; }; E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E397A0B1210A641C00A978D4 /* ActionViewController.swift */; }; E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E397A0B3210A641C00A978D4 /* MainInterface.storyboard */; }; E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; E397A0BF210A6B5500A978D4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E397A0BE210A6B5500A978D4 /* assets */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = E34149BA21017A3900930775 /* Project object */; proxyType = 1; remoteGlobalIDString = E397A0AE210A641C00A978D4; remoteInfo = "send-ios-action-extension"; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ E397A0BD210A641C00A978D4 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ E34149C221017A3900930775 /* send-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "send-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; E34149C521017A3A00930775 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; E34149C721017A3A00930775 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; E34149CA21017A3A00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; E34149CC21017A3D00930775 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; E34149CF21017A3D00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; E34149D121017A3D00930775 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E355478421028193009D206E /* help.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = help.html; sourceTree = ""; }; E355478821092E22009D206E /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; E355478B210A534F009D206E /* ios.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ios.js; sourceTree = SOURCE_ROOT; }; E355478D210A5357009D206E /* generate-bundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "generate-bundle.js"; sourceTree = SOURCE_ROOT; }; E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "send-ios-action-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; E397A0B1210A641C00A978D4 /* ActionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionViewController.swift; sourceTree = ""; }; E397A0B4210A641C00A978D4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; E397A0B6210A641C00A978D4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E397A0BE210A6B5500A978D4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = "send-ios/assets"; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ E34149BF21017A3900930775 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; E397A0AC210A641C00A978D4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ E34149B921017A3900930775 = { isa = PBXGroup; children = ( E34149C421017A3900930775 /* send-ios */, E397A0B0210A641C00A978D4 /* send-ios-action-extension */, E34149C321017A3900930775 /* Products */, ); sourceTree = ""; }; E34149C321017A3900930775 /* Products */ = { isa = PBXGroup; children = ( E34149C221017A3900930775 /* send-ios.app */, E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */, ); name = Products; sourceTree = ""; }; E34149C421017A3900930775 /* send-ios */ = { isa = PBXGroup; children = ( E355478D210A5357009D206E /* generate-bundle.js */, E355478B210A534F009D206E /* ios.js */, E34149C521017A3A00930775 /* AppDelegate.swift */, E34149C721017A3A00930775 /* ViewController.swift */, E34149C921017A3A00930775 /* Main.storyboard */, E34149CC21017A3D00930775 /* Assets.xcassets */, E34149CE21017A3D00930775 /* LaunchScreen.storyboard */, E34149D121017A3D00930775 /* Info.plist */, E355478421028193009D206E /* help.html */, E355478821092E22009D206E /* assets */, ); path = "send-ios"; sourceTree = ""; }; E397A0B0210A641C00A978D4 /* send-ios-action-extension */ = { isa = PBXGroup; children = ( E397A0BE210A6B5500A978D4 /* assets */, E397A0B1210A641C00A978D4 /* ActionViewController.swift */, E397A0B3210A641C00A978D4 /* MainInterface.storyboard */, E397A0B6210A641C00A978D4 /* Info.plist */, ); path = "send-ios-action-extension"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ E34149C121017A3900930775 /* send-ios */ = { isa = PBXNativeTarget; buildConfigurationList = E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */; buildPhases = ( E355478A210A4C43009D206E /* ShellScript */, E34149BE21017A3900930775 /* Sources */, E34149BF21017A3900930775 /* Frameworks */, E34149C021017A3900930775 /* Resources */, E397A0BD210A641C00A978D4 /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( E397A0B8210A641C00A978D4 /* PBXTargetDependency */, ); name = "send-ios"; productName = "send-ios"; productReference = E34149C221017A3900930775 /* send-ios.app */; productType = "com.apple.product-type.application"; }; E397A0AE210A641C00A978D4 /* send-ios-action-extension */ = { isa = PBXNativeTarget; buildConfigurationList = E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */; buildPhases = ( E397A0AB210A641C00A978D4 /* Sources */, E397A0AC210A641C00A978D4 /* Frameworks */, E397A0AD210A641C00A978D4 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = "send-ios-action-extension"; productName = "send-ios-action-extension"; productReference = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; productType = "com.apple.product-type.app-extension"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ E34149BA21017A3900930775 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0940; LastUpgradeCheck = 0940; ORGANIZATIONNAME = "Donovan Preston"; TargetAttributes = { E34149C121017A3900930775 = { CreatedOnToolsVersion = 9.4.1; }; E397A0AE210A641C00A978D4 = { CreatedOnToolsVersion = 9.4.1; }; }; }; buildConfigurationList = E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = E34149B921017A3900930775; productRefGroup = E34149C321017A3900930775 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( E34149C121017A3900930775 /* send-ios */, E397A0AE210A641C00A978D4 /* send-ios-action-extension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ E34149C021017A3900930775 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( E355478C210A534F009D206E /* ios.js in Resources */, E355478921092E22009D206E /* assets in Resources */, E355478E210A5357009D206E /* generate-bundle.js in Resources */, E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */, E355478521028193009D206E /* help.html in Resources */, E34149CD21017A3D00930775 /* Assets.xcassets in Resources */, E34149CB21017A3A00930775 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; E397A0AD210A641C00A978D4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */, E397A0BF210A6B5500A978D4 /* assets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ E355478A210A4C43009D206E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "node generate-bundle.js\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ E34149BE21017A3900930775 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( E34149C821017A3A00930775 /* ViewController.swift in Sources */, E34149C621017A3A00930775 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; E397A0AB210A641C00A978D4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ E397A0B8210A641C00A978D4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = E397A0AE210A641C00A978D4 /* send-ios-action-extension */; targetProxy = E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ E34149C921017A3A00930775 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( E34149CA21017A3A00930775 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; E34149CE21017A3D00930775 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( E34149CF21017A3D00930775 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; E397A0B3210A641C00A978D4 /* MainInterface.storyboard */ = { isa = PBXVariantGroup; children = ( E397A0B4210A641C00A978D4 /* Base */, ); name = MainInterface.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ E34149D221017A3D00930775 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.4; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; E34149D321017A3D00930775 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.4; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; }; E34149D521017A3D00930775 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = "send-ios/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; E34149D621017A3D00930775 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = "send-ios/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; E397A0BA210A641C00A978D4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; E397A0BB210A641C00A978D4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( E34149D221017A3D00930775 /* Debug */, E34149D321017A3D00930775 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( E34149D521017A3D00930775 /* Debug */, E34149D621017A3D00930775 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */ = { isa = XCConfigurationList; buildConfigurations = ( E397A0BA210A641C00A978D4 /* Debug */, E397A0BB210A641C00A978D4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = E34149BA21017A3900930775 /* Project object */; } ================================================ FILE: ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: l10n.toml ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. basepath = "." [env] l = "{l10n_base}/public/locales/{locale}/" [[paths]] reference = "public/locales/en-US/**" l10n = "{l}**" ================================================ FILE: package.json ================================================ { "name": "firefox-send", "description": "File Sharing Experiment", "version": "3.0.22", "author": "Mozilla (https://mozilla.org)", "repository": "mozilla/send", "homepage": "https://github.com/mozilla/send/", "license": "MPL-2.0", "private": true, "scripts": { "clean": "rimraf dist", "build": "npm run clean && webpack", "lint": "npm-run-all lint:*", "lint:css": "stylelint app/*.css app/**/*.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", "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", "release": "npm-run-all contributors changelog", "test": "npm-run-all test:*", "test:backend": "nyc --reporter=lcovonly mocha --reporter=min test/backend", "test:frontend": "cross-env NODE_ENV=development FXA_REQUIRED=false node test/frontend/runner.js", "test:report": "nyc report --reporter=html", "test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js", "circleci-test-integration": "echo 'webdriverio tests need to be updated to node 12'", "start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:1337 webpack-dev-server --port=1337 --mode=development", "android": "cross-env ANDROID=1 npm start", "prod": "node server/bin/prod.js" }, "husky": { "hooks": { "pre-commit": "lint-staged", "pre-push": "npm test", "post-merge": "npm install", "post-checkout": "scripts/sync-npm-dependencies.sh" } }, "lint-staged": { "*.js": [ "prettier --single-quote --write", "eslint", "git add" ], "*.css": [ "prettier --single-quote --write", "stylelint", "git add" ] }, "nyc": { "reporter": [ "text" ], "cache": true }, "engines": { "node": "^12.16.3" }, "devDependencies": { "@babel/core": "^7.10.5", "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/preset-env": "^7.10.4", "@dannycoates/webcrypto-liner": "^0.1.37", "@fullhuman/postcss-purgecss": "^1.3.0", "@mattiasbuelens/web-streams-polyfill": "0.2.1", "@sentry/browser": "^5.20.1", "asmcrypto.js": "^0.22.0", "babel-loader": "^8.0.6", "babel-plugin-istanbul": "^5.2.0", "base64-js": "^1.3.1", "content-disposition": "^0.5.3", "copy-webpack-plugin": "^5.0.5", "core-js": "^3.4.0", "cross-env": "^6.0.3", "css-loader": "^3.2.0", "css-mqpacker": "^7.0.0", "cssnano": "^4.1.10", "eslint": "^6.6.0", "eslint-config-prettier": "^6.5.0", "eslint-plugin-mocha": "^6.2.1", "eslint-plugin-node": "^10.0.0", "eslint-plugin-security": "^1.4.0", "expose-loader": "^0.7.5", "extract-loader": "^3.1.0", "extract-text-webpack-plugin": "^4.0.0-beta.0", "fast-text-encoding": "^1.0.3", "file-loader": "^4.2.0", "git-rev-sync": "^1.12.0", "html-loader": "^0.5.5", "http_ece": "^1.1.0", "husky": "^3.0.9", "intl-pluralrules": "^1.1.1", "lint-staged": "^9.4.2", "mocha": "^6.2.2", "morgan": "^1.9.1", "nanobus": "^4.4.0", "nanohtml": "^1.9.0", "nanotiming": "^7.3.1", "npm-run-all": "^4.1.5", "nyc": "^14.1.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "prettier": "^1.19.1", "proxyquire": "^2.1.3", "puppeteer": "^2.0.0", "raw-loader": "^3.1.0", "redis-mock": "^0.47.0", "rimraf": "^3.0.0", "script-loader": "^0.7.2", "sinon": "^7.5.0", "string-hash": "^1.1.3", "stylelint": "^11.1.1", "stylelint-config-standard": "^19.0.0", "stylelint-no-unsupported-browser-features": "^3.0.2", "svgo": "^1.3.2", "svgo-loader": "^2.2.1", "tailwindcss": "^1.1.3", "val-loader": "^1.1.1", "webpack": "4.38.0", "webpack-cli": "^3.3.12", "webpack-dev-middleware": "^3.7.2", "webpack-dev-server": "^3.11.0", "webpack-manifest-plugin": "^2.2.0", "webpack-unassert-loader": "^1.2.0" }, "dependencies": { "@dannycoates/express-ws": "^5.0.3", "@fluent/bundle": "^0.13.0", "@fluent/langneg": "^0.3.0", "@google-cloud/storage": "^5.1.2", "@peculiar/webcrypto": "^1.1.1", "@sentry/node": "^5.20.1", "aws-sdk": "^2.568.0", "body-parser": "^1.19.0", "choo": "^7.0.0", "cldr-core": "^35.1.0", "configstore": "github:dannycoates/configstore#master", "convict": "^5.2.0", "express": "^4.17.1", "helmet": "^3.23.3", "mkdirp": "^0.5.1", "mozlog": "^2.2.0", "node-fetch": "^2.6.0", "redis": "^3.0.2", "selenium-standalone": "^6.15.6", "ua-parser-js": "^0.7.21" }, "availableLanguages": [ "en-US", "an", "ar", "ast", "azz", "be", "bn", "br", "ca", "cak", "cs", "cy", "da", "de", "dsb", "el", "en-CA", "en-GB", "es-AR", "es-CL", "es-ES", "es-MX", "et", "eu", "fa", "fi", "fr", "fy-NL", "gn", "he", "hr", "hsb", "hu", "hus", "hy-AM", "ia", "id", "it", "ja", "ka", "kab", "ko", "lt", "meh", "mix", "ml", "nb-NO", "nl", "nn-NO", "oc", "pa-IN", "pl", "ppl", "pt-BR", "pt-PT", "quc", "ro", "ru", "sk", "sl", "sq", "sr", "su", "sv-SE", "te", "th", "tr", "uk", "vi", "zgh", "zh-CN", "zh-TW" ] } ================================================ FILE: postcss.config.js ================================================ class TailwindExtractor { static extract(content) { return content.match(/[A-Za-z0-9-_:/]+/g) || []; } } const options = { plugins: [ require('tailwindcss')('./tailwind.config.js'), require('postcss-preset-env') ] }; if (process.env.NODE_ENV === 'development') { options.map = { inline: true }; } else { options.plugins.push( require('@fullhuman/postcss-purgecss')({ content: [ './app/*.js', './app/ui/*.js', './android/*.js', './android/pages/*.js' ], extractors: [ { extractor: TailwindExtractor, extensions: ['js'] } ] }) ); options.plugins.push( require('cssnano')({ preset: 'default' }) ); } module.exports = options; ================================================ FILE: public/contribute.json ================================================ { "name": "firefox-send", "description": "File Sharing Experiment", "repository": { "url": "https://github.com/mozilla/send/", "license": "MPL-2.0" }, "participate": { "home": "https://github.com/mozilla/send/blob/master/README.md", "docs": "https://github.com/mozilla/send/blob/master/README.md" }, "bugs": { "list": "https://github.com/mozilla/send/issues", "report": "https://github.com/mozilla/send/issues/new" }, "urls": { "prod": "https://send.firefox.com/", "stage": "https://stage.send.nonprod.cloudops.mozgcp.net/", "dev": "https://send2.dev.lcip.org/" }, "keywords": [ "JavaScript", "jQuery", "Node", "Redis" ] } ================================================ FILE: public/inter.css ================================================ @font-face { font-family: 'Inter'; font-style: normal; font-weight: 100; font-display: optional; src: url('Inter-Thin.woff2') format('woff2'), url('Inter-Thin.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 100; font-display: optional; src: url('Inter-ThinItalic.woff2') format('woff2'), url('Inter-ThinItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 200; font-display: optional; src: url('Inter-ExtraLight.woff2') format('woff2'), url('Inter-ExtraLight.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 200; font-display: optional; src: url('Inter-ExtraLightItalic.woff2') format('woff2'), url('Inter-ExtraLightItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: optional; src: url('Inter-Light.woff2') format('woff2'), url('Inter-Light.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 300; font-display: optional; src: url('Inter-LightItalic.woff2') format('woff2'), url('Inter-LightItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: optional; src: url('Inter-Regular.woff2') format('woff2'), url('Inter-Regular.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 400; font-display: optional; src: url('Inter-Italic.woff2') format('woff2'), url('Inter-Italic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: optional; src: url('Inter-Medium.woff2') format('woff2'), url('Inter-Medium.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 500; font-display: optional; src: url('Inter-MediumItalic.woff2') format('woff2'), url('Inter-MediumItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: optional; src: url('Inter-SemiBold.woff2') format('woff2'), url('Inter-SemiBold.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 600; font-display: optional; src: url('Inter-SemiBoldItalic.woff2') format('woff2'), url('Inter-SemiBoldItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: optional; src: url('Inter-Bold.woff2') format('woff2'), url('Inter-Bold.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 700; font-display: optional; src: url('Inter-BoldItalic.woff2') format('woff2'), url('Inter-BoldItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 800; font-display: optional; src: url('Inter-ExtraBold.woff2') format('woff2'), url('Inter-ExtraBold.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 800; font-display: optional; src: url('Inter-ExtraBoldItalic.woff2') format('woff2'), url('Inter-ExtraBoldItalic.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 900; font-display: optional; src: url('Inter-Black.woff2') format('woff2'), url('Inter-Black.woff') format('woff'); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 900; font-display: optional; src: url('Inter-BlackItalic.woff2') format('woff2'), url('Inter-BlackItalic.woff') format('woff'); } ================================================ FILE: public/locales/an/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Se ye importando… encryptingFile = Se ye cifrando… decryptingFile = Se ye descifrando… downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargas } timespanHours = { $num -> [one] hora *[other] { $num } horas } copiedUrl = Copiau! unlockInputPlaceholder = Clau unlockButtonLabel = Desblocar downloadButtonLabel = Descargar downloadFinish = Descarga completa fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Preba Send errorPageHeader = I ha habiu bell problema! fileTooBig = Ixe fichero ye masiau gran pa cargar-lo. Ha de tener menos de { $size } linkExpiredAlt = Lo vinclo ye caducau notSupportedHeader = Lo suyo navegador no ye compatible notSupportedLink = Per qué no ye compatible lo mío navegador? notSupportedOutdatedDetail = Esta versión de Firefox no admite la tecnolochía web con que funciona lo Send. Habrás d'esviellar lo navegador. updateFirefox = Esviellar Firefox deletePopupCancel = Cancelar deleteButtonHover = Borrar footerLinkLegal = Aviso legal footerLinkPrivacy = Privacidat footerLinkCookies = Cookies passwordTryAgain = La contrasenya ye incorrecta. Torne-lo a intentar. javascriptRequired = Send necesita JavaScript whyJavascript = Per qué Send necesita JavaScript? enableJavascript = Activa JavaScript y torna-lo a intentar. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Maxima lonchitut d'a clau: { $length } # A short status message shown when there was an error setting the password passwordSetError = No s'ha puesto definir la clau ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Compartición de fichers simpla y privada introDescription = { -send-brand } te permite de compartir fichers cifraus de cabo a cabo, y tamién un vinclo que expira automaticament. Asinas, puetz mantener en privau lo que compartes y asegurar-te de que los tuyos contenius no se quedan pa cutio en linia. notifyUploadEncryptDone = Lo fichero s'ha cifrau y ye presto pa ninviar-se # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Caduca dimpués de { $downloadCount } u { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 fichero *[other] { $num } fichers } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Mida total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiar lo vinclo que quiers compartir copyLinkButton = Copiar lo vinclo downloadTitle = Descargar los fichers downloadDescription = Este fichero s'ha compartiu per medio de { -send-brand } con cifrau de cabo a cabo y un vinclo que caduca automaticament. trySendDescription = Preba { -send-brand } pa una compartición de fichers simpla y segura. # count will always be > 10 tooManyFiles = { $count -> [one] Nomás se puet puyar 1 fitxer de vez. *[other] Nomás se pueden puyar { $count } fichers de vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Nomás se permite 1 ficher. *[other] Nomás se permiten { $count } fichers. } expiredTitle = Este vinclo ye caducau. notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona millor con a zaguera versión de { -firefox } y funcionará con a versión mas recient d'a mayor parte de navegadors. downloadFirefox = Descargar { -firefox } legalTitle = Aviso de privacidat de { -send-short-brand } legalDateStamp = Versió 1.0, con data d'o 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min addFilesButton = Triar los fichers a cargar trustWarningMessage = Asegura-te de que confías en o destinatario quan compartas datos confidencials. uploadButton = Cargar # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrociega y suelta los fichers # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = u fes clic aquí pa ninviar dica { $size } addPassword = Protecher con una clau emailPlaceholder = Escribe la tuya adreza de correu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Inicia una sesión pa ninviar dica { $size } signInOnlyButton = Iniciar la sesión accountBenefitTitle = Crea una cuenta de { -firefox } u dentra-ie # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartir fichers dica { $size } accountBenefitDownloadCount = Compartir fichers con mas chent accountBenefitTimeLimit = { $count -> [one] Mantiene los vinclos activos dica 1 dia *[other] Mantiene los vinclos activos dica { $count } días } accountBenefitSync = Chestiona los fichers compartius dende qualsequier dispositivo accountBenefitMoz = Descubre mas cosas sobre los atros servicios de { -mozilla } signOut = Zarrar la sesión okButton = Vale downloadingTitle = Se ye descargando noStreamsWarning = Este navegador talment no pueda descifrar un fichero tant gran. noStreamsOptionCopy = Copia lo vinclo pa ubrir-lo en belatro navegador noStreamsOptionFirefox = Preba lo nuestro navegador favorito noStreamsOptionDownload = Continar con este navegador downloadFirefoxPromo = Lo nuevo { -firefox } t'ofreix { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Comparte lo vinclo enta lo tuyo fichero: shareLinkButton = Compartir lo vinclo # $name is the name of the file shareMessage = Baixa-te «{ $name }» con { -send-brand }: compartición de fiches simpla y segura trailheadPromo = I hai una manera de protecher la tuya privacidat. Une-te a Firefox. learnMore = Mas información downloadFlagged = Este vinclo s'ha desactivau per violar las condiciones d'uso. downloadConfirmTitle = Una coseta mas downloadConfirmDescription = Asegura-te de que confías en a persona que t'ha ninviau este fichero, perque no podemos verificar que no danyará lo tuyo dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Confío en a persona que ha ninviau este fichero *[other] Confío en a persona que ha ninviau estes fichers } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Sinyalar este fichero como sospeitoso *[other] Sinyalar estes fichers como sospeitoso } reportDescription = Aduya-nos a comprender qué ha pasau. Quál creyes que ye lo problema con estes fichers? reportUnknownDescription = Vest ta la URL d'o vinclo que quiers sinyalar y fe clic en « { reportFile } ». reportButton = Informar reportReasonMalware = Estes fichers contienen malware u fan parte d'un ataque de phishing. reportReasonPii = Estes fichers contienen información personal identificable sobre yo. reportReasonAbuse = Estes fichers contienen conteniu ilegal u abusivo. reportReasonCopyright = Pa informar sobre una violación de dreitos d'autor u de marca, sigue lo procedimiento descrito en esta pachina. reportedTitle = Fichers sinyalaus reportedDescription = Gracias. Hemos recibiu lo tuyo informe sobre estes fichers. ================================================ FILE: public/locales/ar/send.ftl ================================================ # Send is a brand name and should not be localized. title = فَيَرفُكس سِنْد siteFeedback = الانطباعات importingFile = يستورد… encryptingFile = يعمّي… decryptingFile = يفك التعمية… downloadCount = { $num -> [zero] لا تنزيلات [one] تنزيل واحد [two] تنزيلين [few] { $num } تنزيلات [many] { $num } تنزيلًا *[other] { $num } تنزيل } timespanHours = { $num -> [zero] أقل من ساعة [one] ساعة [two] ساعتين [few] { $num } ساعات [many] { $num } ساعة *[other] { $num } ساعة } copiedUrl = نُسخ! unlockInputPlaceholder = كلمة السر unlockButtonLabel = افتح القفل downloadButtonLabel = نزّل downloadFinish = اكتمل التنزيل fileSizeProgress = ({ $partialSize } من أصل { $totalSize }) sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد» errorPageHeader = حدث خطب ما. fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }. linkExpiredAlt = انتهت صلاحية الرابط notSupportedHeader = متصفحك غير مدعوم. notSupportedLink = لماذا متصفحي غير مدعوم؟ notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك. updateFirefox = حدّث فَيَرفُكس deletePopupCancel = ألغِ deleteButtonHover = احذف footerLinkLegal = القانونية footerLinkPrivacy = الخصوصية footerLinkCookies = الكعكات passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة. javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟ enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }س { $minutes }د # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }د # A short status message shown when the user enters a long password maxPasswordLength = أقصر طول لكلمة السر: { $length } # A short status message shown when there was an error setting the password passwordSetError = يجب ألا تُضبط كلمة السر هذه ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر. notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = ينقضي بعد { $downloadCount } أو { $timespan } timespanMinutes = { $num -> [zero] أقل من دقيقة [one] دقيقة واحدة [two] دقيقتين اثنتين [few] { $num } دقائق [many] { $num } دقيقة *[other] { $num } دقيقة } timespanDays = { $num -> [zero] أقل من يوم [one] يوم واحد [two] يومين اثنين [few] { $num } أيام [many] { $num } يومًا *[other] { $num } يوم } timespanWeeks = { $num -> [zero] أقل من أسبوع [one] أسبوع واحد [two] أسبوعين اثنين [few] { $num } أسابيع [many] { $num } أسبوعًا *[other] { $num } أسبوع } fileCount = { $num -> [zero] { $num } ملف [one] ملف واحد [two] ملفان اثنان [few] { $num } ملفات [many] { $num } ملفًا *[other] { $num } ملف } # byte abbreviation bytes = بايت # kibibyte abbreviation kb = ك.بايت # mebibyte abbreviation mb = م.بايت # gibibyte abbreviation gb = ج.بايت # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = إجمالي الحجم: { $size } # the next line after the colon contains a file name copyLinkDescription = انسخ هذا الرابط لتُشارك الملف: copyLinkButton = انسخ الرابط downloadTitle = نزّل الملفات downloadDescription = شارك أحد هذا الملف معك عبر { -send-brand } وعمّاه بتعمية من الطرفين وبرابط ينقضي أجله تلقائيا. trySendDescription = جرِّب { -send-brand } وشارِك ملفاتك بلا عناء وبخصوصية تامة. # count will always be > 10 tooManyFiles = { $count -> [zero] لا يمكنك تنزيل أي ملف في آن واحد. [one] لا يمكنك تنزيل ما يزيد على ملف واحد في آن واحد. [two] لا يمكنك تنزيل ما يزيد على ملفين اثنين في آن واحد. [few] لا يمكنك تنزيل ما يزيد على { $count } ملفات في آن واحد. [many] لا يمكنك تنزيل ما يزيد على { $count } ملفًا في آن واحد. *[other] لا يمكنك تنزيل ما يزيد على { $count } ملف في آن واحد. } # count will always be > 10 tooManyArchives = { $count -> [zero] الأرشيفات ممنوعة. [one] لا يُسمح إلا بأرشيف واحد. [two] لا يُسمح إلا بأرشيفين اثنين. [few] لا يُسمح إلا ب‍ { $count } أرشيفات. [many] لا يُسمح إلا ب‍ { $count } أرشيفًا. *[other] لا يُسمح إلا ب‍ { $count } أرشيف. } expiredTitle = انقضى وقت الرابط. notSupportedDescription = لن يعمل { -send-brand } في هذا المتصفح. أفضل المتصفحات التي يعمل معها { -send-short-brand } هو { -firefox } بآخر إصدارة، كما وأحدث إصدارة من أغلب المتصفحات الموجودة. downloadFirefox = نزِّل { -firefox } legalTitle = تنويه خصوصية { -send-short-brand } legalDateStamp = الإصدارة ١٫٠ بتاريخ ١٢ مارس ٢٠١٩ # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }يوم { $hours }سا { $minutes }دق addFilesButton = حدّد الملفات التي تريد رفعها uploadButton = ارفع # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = اسحب الملفات وأفلِتها هنا # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = أو انقر لإرسال ملفات يصل حجمها { $size } addPassword = احمِه بكلمة سر emailPlaceholder = أدخل بريدك الإلكتروني # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = لِج وأرسِل ملفات يصل حجمها { $size } signInOnlyButton = لِج accountBenefitTitle = أنشِئ حساب { -firefox } أو لِج إلى حسابك # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = شارِك ملفات يصل حجمها { $size } accountBenefitDownloadCount = شارِك الملفات مع أناس أكثر وأكثر accountBenefitTimeLimit = { $count -> [zero] لا تُبقِ أي روابط نشطة [one] أبقِ الروابط نشطة لمدة تصل إلى يوم واحد [two] أبقِ الروابط نشطة لمدة تصل إلى يومين اثنين [few] أبقِ الروابط نشطة لمدة تصل إلى { $count } أيام [many] أبقِ الروابط نشطة لمدة تصل إلى { $count } يومًا *[other] أبقِ الروابط نشطة لمدة تصل إلى { $count } يوم } accountBenefitSync = أدِر ملفاتك التي شاركتها من أيّ جهاز تريد accountBenefitMoz = اطّلع على المزيد حول خدمات { -mozilla } signOut = اخرج okButton = حسنًا downloadingTitle = يجري التنزيل noStreamsWarning = هناك احتمال بألا يقدر هذا المتصفح على فكّ تعمية الملفات الكبيرة كهذا. noStreamsOptionCopy = انسخ الرابط لتفتحه في متصفح آخر noStreamsOptionFirefox = جرّب متصفّحنا المفضل noStreamsOptionDownload = واصِل بهذا المتصفح downloadFirefoxPromo = ‏{ -send-short-brand } تقدمة { -firefox } الجديد الأنيق. # the next line after the colon contains a file name shareLinkDescription = شارِك الرابط الذي يصل إلى الملف: shareLinkButton = شارِك الرابط # $name is the name of the file shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس. learnMore = اطّلع على المزيد. ================================================ FILE: public/locales/ast/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importando... encryptingFile = Cifrando... decryptingFile = Descifrando... downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargues } timespanHours = { $num -> [one] 1 hora *[other] { $num } hores } copiedUrl = ¡Copióse! unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquiar downloadButtonLabel = Baxar downloadFinish = Completóse la descarga fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Probar Send errorPageHeader = ¡Asocedió daqué malo! fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }. linkExpiredAlt = Caducó l'enllaz notSupportedHeader = El to restolador nun ta sofitáu. notSupportedLink = ¿Por qué'l mio restolador nun ta sofitáu? notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Send. Vas precisar anovar el restolador. updateFirefox = Anovar Firefox deletePopupCancel = Encaboxar deleteButtonHover = Desaniciar footerLinkLegal = Llegal footerLinkPrivacy = Privacidá footerLinkCookies = Cookies passwordTryAgain = La contraseña ye incorreuta. Volvi tentalo. javascriptRequired = Send rique JavaScript whyJavascript = ¿Por qué Send rique JavaScript? enableJavascript = Activa JavaScript y volvi tentalo, por favor. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Llargor máximu de la contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = Nun pudo afitase esta contraseña ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Compartición de ficheros privada y cenciella introDescription = { -send-brand } déxate compartir ficheros con cifráu puntu a puntu y un enllaz que caduca automáticamente. D'esti mou, asegúreste de que lo que compartes ye privao y nun va tar siempres en llinia. notifyUploadEncryptDone = El ficheru ta cifráu y preparáu pa unviase # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Caduca dempués de { $downloadCount } ó { $timespan } timespanMinutes = { $num -> [one] 1 minutu *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } díes } timespanWeeks = { $num -> [one] 1 selmana *[other] { $num } selmanes } fileCount = { $num -> [one] 1 ficheru *[other] { $num } ficheros } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamañu total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copia l'enllaz pa compartir el ficheru: copyLinkButton = Copiar l'enllaz downloadTitle = Descarga de ficheros downloadDescription = Esti ficheru compartióse per { -send-brand } con cifráu puntu a puntu y un enllaz que caduca automáticamente. trySendDescription = Prueba { -send-brand } pa una compartición de ficheros cenciella y segura. # count will always be > 10 tooManyFiles = { $count -> [one] Namás pue xubise 1 ficheru al empar. *[other] Namás puen xubise { $count } ficheros al empar. } # count will always be > 10 tooManyArchives = { $count -> [one] Namás se permite 1 archivu *[other] Namás se permiten { $count } archivos } expiredTitle = Esti enllaz caducó. notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola última versión de { -firefox } y l'actual de la mayoría de restoladores. downloadFirefox = Baxar { -firefox } legalTitle = Avisu de privacidá de { -send-short-brand } legalDateStamp = Versión 1.0, con data del 12 de marzu de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Esbillar los ficheros a unviar trustWarningMessage = Asegúrate de que t'enfotes nel destinatariu al compartir datos sensibles. uploadButton = Xubir # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastra y suelta ficheros # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o calca pa unviar hasta { $size } addPassword = Protexer con una contraseña emailPlaceholder = Introduz el to corréu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Anicia sesión pa unviar hasta { $size } signInOnlyButton = Aniciar sesión accountBenefitTitle = Creación d'una cuenta de { -firefox } o aniciu de sesión nella # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Comparti ficheros d'hasta { $size } accountBenefitDownloadCount = Comparti ficheros con más xente accountBenefitTimeLimit = { $count -> [one] Caltién activos los enllaces demientres 1 día *[other] Caltién activos los enllaces demientres { $count } díes } accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla } signOut = Zarrar sesión okButton = Aceutar downloadingTitle = Baxando noStreamsWarning = Esti restolador quiciabes nun seya a descifrar un ficheru d'esti tamañu. trailheadPromo = Hai un mou de protexer la to privacidá. Xúnite a Firefox. learnMore = Deprender más. downloadFlagged = Esti enllaz desactivóse por violar los términos del serviciu. downloadConfirmTitle = Una cosa más reportReasonMalware = Estos ficheros contienen malware o son parte d'un ataque de phishing reportReasonPii = Estos ficheros contienen información que m'identifica. reportReasonAbuse = Estos ficheros contienen conteníu illegal o abusivu. reportedDescription = Gracies. Recibiemos l'informe tocante a estos ficheros. ================================================ FILE: public/locales/az/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Geri dönüş importingFile = İdxal edilir… encryptingFile = Şifrələnir... decryptingFile = Şifrə açılır... downloadCount = { $num -> [one] 1 endirmə *[other] { $num } endirmə } timespanHours = { $num -> [one] 1 saat *[other] { $num } saat } copiedUrl = Köçürüldü! unlockInputPlaceholder = Parol unlockButtonLabel = Aç downloadButtonLabel = Endir downloadFinish = Endirmə Tamamlandı fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = Send Yoxla errorPageHeader = Nəsə səhv getdi! fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır. linkExpiredAlt = Keçidin vaxtı çıxıb notSupportedHeader = Səyyahınız dəstəklənmir. notSupportedLink = Səyyahım niyə dəstəklənmir? notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz. updateFirefox = Firefox-u Yenilə deletePopupCancel = Ləğv et deleteButtonHover = Sil footerLinkLegal = Hüquqi footerLinkPrivacy = Məxfilik footerLinkCookies = Çərəzlər passwordTryAgain = Səhv parol. Təkrar yoxlayın. javascriptRequired = Send üçün JavaScript lazımdır whyJavascript = Send niyə JavaScript tələb edir? enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } saat { $minutes } dəq # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } dəq # A short status message shown when the user enters a long password maxPasswordLength = Maksimum parol uzunluğu: { $length } # A short status message shown when there was an error setting the password passwordSetError = Parol qurula bilmədi ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } copyLinkButton = Keçidi köçür uploadButton = Yüklə signInOnlyButton = Daxil ol signOut = Çıx okButton = Tamam downloadingTitle = Endirilir shareLinkButton = Keçidi paylaş ================================================ FILE: public/locales/azz/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Nikan uelis tikijkuilos tein tiknemilijtos importingFile = Mokalakijtok… encryptingFile = Motatijtok… decryptingFile = Kichiujtok se uelis kiixtajtoltis ya… downloadCount = { $num -> *[undefined] 1 kitemouijtok / { $num } kintemouijtok } timespanHours = { $num -> *[undefined] 1 hora / { $num } hora } copiedUrl = ¡Moixkopinak! unlockInputPlaceholder = Ichtakatajtol unlockButtonLabel = Xikajchiua tein amo kikaua maj tekiti downloadButtonLabel = Xiktemoui downloadFinish = Nochi motemouij ya fileSizeProgress = ({ $partialSize } itech { $totalSize }) sendYourFilesLink = Xikejeko Send errorPageHeader = ¡Tensa amo kuali kisak! fileTooBig = Nejin tajkuilol semi ueyi. Moneki amo panos { $size } linkExpiredAlt = Nejin tein tikpatskilij amo tekititok ya notSupportedHeader = Monavegador amo kualtia. notSupportedLink = ¿Keyej nonavegador amo kualtia? notSupportedOutdatedDetail = Tetayokoltij, Firefox tein tikuitok amo kiselia tepostekitilis tecnología web tein ika tekiti Send. Moneki tikyankuilis monavegador. updateFirefox = Maj Firefox moyankuili deletePopupCancel = Maj motsakuili uan amo tami tein kichiujtok deleteButtonHover = Maj majchiua footerLinkLegal = Keniuj motekitiltis footerLinkPrivacy = Keniuj tikyekpiaj tein tikseliaj footerLinkCookies = Cookies passwordTryAgain = Amo yektik ichtakatajtol. Oksepa xikijkuilo. javascriptRequired = Send kineki maj moajsi JavaScript whyJavascript = ¿Keyej Send kineki maj moajsi JavaScript? enableJavascript = Se kualtakayot, xikaua maj peua tekiti JavaScript uan oksepa xikejeko. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Keniuj ueyak ichtakatajtol, maj amo pano: { $length } # A short status message shown when there was an error setting the password passwordSetError = Nejin ichtakatajtol amo uel kiixtaliani ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Xiktitani -firefox = Firefox -mozilla = Mozilla introTitle = Amo ouij uan ichtaka xikinpanoltili oksekin motajkuiloluan archivos introDescription = { -send-brand } mitspaleuia uan ijkon tikinpanoltilis oksekin motajkuiloluan archivos ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no kitemaka kampa se kipatskilis tein niman ixpoliui. Ijkuin uelis tikichtakaeuas tein tikintitanilis oksekin uan tikyekmatis tein moaxka amo nochipaya mokauas itech Internet. notifyUploadEncryptDone = Moarchivo moijkuiloj ya kemej amo akin uelis kiixtajtoltis uan se uelis kititanis ya # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Poliui ijkuak tiajsis { $downloadCount } oso { $timespan } timespanMinutes = { $num -> *[undefined] 1 minuto / { $num } minuto } timespanDays = { $num -> *[undefined] 1 tonal / { $num } tonalmej } timespanWeeks = { $num -> *[undefined] 1 semana / { $num } semana } fileCount = { $num -> *[undefined] 1 archivo / { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Nochi tamachiua: { $size } # the next line after the colon contains a file name copyLinkDescription = Xikixkopina tein se kipatskilis uan xikinpanoltili oksekin moarchivo: copyLinkButton = Xikixkopina tein se kipatskilis downloadTitle = Xiktemoui tajkuilolmej archivos downloadDescription = Nejin archivo mopanoltij itechkopa { -send-brand } ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no tein ika se kipatskilis tein niman ixpoliui. trySendDescription = Xikejeko { -send-brand } ijkon amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos. # count will always be > 10 tooManyFiles = { $count -> *[other] Sayoj { $count } tajkuilolmej archivos uelis tikolochtejkoltis saj. } # count will always be > 10 tooManyArchives = { $count -> *[other] Sayoj { $count } tajkuilolmej archivos uelis moajsiskej saj. } expiredTitle = Nejin tein tikpatskilij amo tekititos ok. notSupportedDescription = { -send-brand } amo tekiti ika nejin navegador. { -send-short-brand } okachi kuali tekiti tein ika okachi yankuik { -firefox }, uan no tekitis tein ika okachi yankuikej tel miak navegadores. downloadFirefox = Xiktemoui { -firefox } legalTitle = { -send-short-brand } tanauatia ika yekpialis tein moaxka itech tepos legalDateStamp = Versión 1.0 tein kikixtijkej 12 tonal metsti marzo 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }t { $hours }h { $minutes }m addFilesButton = Xikinixpejpena tajkuilolmej archivos tein tikintejkoltis uploadButton = Xiktejkolti # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Xikintilana uan xikinkajkaua tajkuilolmej archivos # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = oso xikpatskili uan tiktitanis, sayoj tein amo panoua { $size } addPassword = Xikyekpia ika se ichtakatajtol emailPlaceholder = Xikijkuilo mocorreo itech tepos # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Xikalakteua uan uelis tiktitanis tein amo panos { $size } signInOnlyButton = Kampa se kalakteua accountBenefitTitle = Ximochiuili se cuenta itech { -firefox } oso xikalakteua # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Xikintitani tajkuilolmej archivos tein amo panouaj { $size } accountBenefitDownloadCount = Xikintitanili tajkuilolmej archivos oksekin accountBenefitTimeLimit = { $count -> *[undefined] Kampa se kipatskilis maj kisentokakan kualtiakan se tonal ok / { $count } tonalmej ok } accountBenefitSync = Itech tein yeski tepos xikixyekana motajkuiloluan archivos tein tikinpanoltilij oksekin accountBenefitMoz = Okachi tikmatis okseki tapaleuilmej tein kitemaka { -mozilla } signOut = Kampa se kisa okButton = Kuali yetok downloadingTitle = Kitemouijtok noStreamsWarning = Xa navegador amo uelis kitalij nejin tajkuilol archivo tein tel ueyi kemej se uelis kiyekixtajtoltis ya. noStreamsOptionCopy = Xikixkopina tein se kipatskilis uan ijkon se uelis kitatapos itech okse navegador noStreamsOptionFirefox = Xikejeko navegador tein semi techuelita noStreamsOptionDownload = Maj niksentoka niktatekiujti nejin navegador downloadFirefoxPromo = Yankuik { -firefox } mitsixpantilia { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Xikinpanoltili oksekin tein se kipatskilis uan teuika motajkuilol archivo: shareLinkButton = Kampa se kipatskilis tein uelis tikinpanoltilis oksekin # $name is the name of the file shareMessage = Xiktemoui “{ $name }” ika { -send-brand }: amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos trailheadPromo = Kemaj, uelis tikyekpias tein moaxka itech tepos. Xipoui Firefox. learnMore = Xiktemoui tajkuilolmej archivos. ================================================ FILE: public/locales/be/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Імпартаванне... encryptingFile = Зашыфроўка... decryptingFile = Расшыфроўка... downloadCount = { $num -> [one] { $num } сцягванне [few] { $num } сцягванні *[many] { $num } сцягванняў } timespanHours = { $num -> [one] { $num } гадзіна [few] { $num } гадзіны *[many] { $num } гадзін } copiedUrl = Скапіявана! unlockInputPlaceholder = Пароль unlockButtonLabel = Разблакаваць downloadButtonLabel = Сцягнуць downloadFinish = Сцягванне скончана fileSizeProgress = ({ $partialSize } з { $totalSize }) sendYourFilesLink = Паспрабуйце Send errorPageHeader = Нешта пайшло не так! fileTooBig = Гэты файл надта вялікі. Ён мусіць быць меншым за { $size } linkExpiredAlt = Тэрмін дзеяння спасылкі сышоў notSupportedHeader = Ваш браўзер не падтрымліваецца. notSupportedLink = Чаму мой браўзер не падтрымліваецца? notSupportedOutdatedDetail = На жаль, гэтая версія Firefox не падтрымлівае вэб-тэхналогію, што забяспечвае працу Send. Вам трэба абнавіць свой браўзер. updateFirefox = Абнавіць Firefox deletePopupCancel = Скасаваць deleteButtonHover = Выдаліць footerLinkLegal = Прававыя звесткі footerLinkPrivacy = Прыватнасць footerLinkCookies = Кукі passwordTryAgain = Некарэктны пароль. Паспрабуйце зноў. javascriptRequired = Для Send неабходны JavaScript whyJavascript = Чаму для Send неабходны JavaScript? enableJavascript = Калі ласка, уключыце JavaScript і паспрабуйце зноў. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } г. { $minutes } хв. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } хв. # A short status message shown when the user enters a long password maxPasswordLength = Максімальная даўжыня пароля: { $length } # A short status message shown when there was an error setting the password passwordSetError = Гэты пароль немагчыма паставіць ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Просты і прыватны абмен файламі introDescription = { -send-brand } дазваляе вам абменьвацца файламі са скразным шыфраваннем і спасылкамі з абмежаваным тэрмінам дзеяння. Такім чынам, вы можаце дзяліцца файламі прыватна і быць упэўненым, што яны не застануцца ў сеціве назаўжды. notifyUploadEncryptDone = Ваш файл зашыфраваны і гатовы да адпраўкі # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Тэрмін дзеяння сыдзе праз { $downloadCount } або { $timespan } timespanMinutes = { $num -> [one] { $num } хвіліна [few] { $num } хвіліны *[many] { $num } хвілін } timespanDays = { $num -> [one] { $num } дзень [few] { $num } дні *[many] { $num } дзён } timespanWeeks = { $num -> [one] { $num } тыдзень [few] { $num } тыдні *[many] { $num } тыдняў } fileCount = { $num -> [one] { $num } файл [few] { $num } файлы *[many] { $num } файлаў } # byte abbreviation bytes = Б # kibibyte abbreviation kb = КБ # mebibyte abbreviation mb = МБ # gibibyte abbreviation gb = ГБ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Агульны памер: { $size } # the next line after the colon contains a file name copyLinkDescription = Скапіруйце спасылку, каб падзяліцца сваім файлам: copyLinkButton = Скапіраваць спасылку downloadTitle = Сцягнуць файлы downloadDescription = Гэтым файлам падзяліліся праз { -send-brand } са скразным шыфраваннем і спасылкай з абмежаваным тэрмінам дзеяння. trySendDescription = Паспрабуйце { -send-brand } для простага і бяспечнага абмену файламі. # count will always be > 10 tooManyFiles = { $count -> [one] Толькі { $count } файл можна загрузіць за раз. [few] Толькі { $count } файлы можна загрузіць за раз. *[many] Толькі { $count } файлаў можна загрузіць за раз. } # count will always be > 10 tooManyArchives = { $count -> [one] Толькі { $count } архіў дазволены. [few] Толькі { $count } архівы дазволены. *[many] Толькі { $count } архіваў дазволена. } expiredTitle = Тэрмін дзеяння гэтай спасылкі сышоў. notSupportedDescription = { -send-brand } не будзе працаваць у гэтым браўзеры. Лепей за ўсё { -send-short-brand } працуе з апошняй версіяй { -firefox } і будзе працаваць з бягучай версіяй большасці браўзераў. downloadFirefox = Сцягнуць { -firefox } legalTitle = Палітыка прыватнасці { -send-short-brand } legalDateStamp = Версія 1.0 ад 12 сакавіка 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } д. { $hours } г. { $minutes } хв. addFilesButton = Выберыце файлы для загрузкі trustWarningMessage = Пераканайцеся, што давяраеце атрымальніку, калі дзеліцеся канфідэнцыяльнымі звесткамі. uploadButton = Загрузіць # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Перацягніце файлы сюды # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = або клікніце, каб адправіць да { $size }: addPassword = Абараніць паролем emailPlaceholder = Увядзіце сваю электронную пошту # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Увайдзіце, каб адпраўляць да { $size } signInOnlyButton = Увайсці accountBenefitTitle = Стварыце ўліковы запіс { -firefox } або ўвайдзіце # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Дзяліцеся файламі да { $size } accountBenefitDownloadCount = Дзяліцеся файламі з большай колькасцю людзей accountBenefitTimeLimit = { $count -> [one] Трымайце спасылкі актыўнымі да { $count } дня [few] Трымайце спасылкі актыўнымі да { $count } дзён *[many] Трымайце спасылкі актыўнымі да { $count } дзён } accountBenefitSync = Кіруйце адпраўленымі файламі з любой прылады accountBenefitMoz = Даведайцеся пра іншыя сэрвісы { -mozilla } signOut = Выйсці okButton = ОК downloadingTitle = Сцягваецца noStreamsWarning = Гэты браўзер не мае магчымасці расшыфраваць такі вялікі файл. noStreamsOptionCopy = Скапіруйце спасылку, каб адкрыць у іншым браўзеры noStreamsOptionFirefox = Паспрабуйце наш любімы браўзер noStreamsOptionDownload = Працягнуць з гэтым браўзерам downloadFirefoxPromo = { -send-short-brand } прыйшоў да вас з цалкам новага { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Падзяліцеся спасылкай на свой файл: shareLinkButton = Падзяліцца спасылкай # $name is the name of the file shareMessage = Сцягніце «{ $name }» з { -send-brand }: простага і бяспечнага файлаабменніка trailheadPromo = Ёсць спосаб абараніць вашу прыватнасць. Далучайцеся да Firefox. learnMore = Падрабязней. downloadFlagged = Гэта спасылка адключана за парушэнне ўмоў прадастаўлення паслуг. downloadConfirmTitle = Яшчэ адна рэч downloadConfirmDescription = Пераканайцеся, што давяраеце адпраўніку гэтага файла, бо мы не можам пераканацца, што ён не нашкодзіць Вашай прыладзе. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Я давяраю адпраўніку гэтага файла [few] Я давяраю адпраўніку гэтых файлаў *[many] Я давяраю адпраўніку гэтых файлаў } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Паведаміць, што гэты файл падазроныя [few] Паведаміць, што гэтыя файлы падазроныя *[many] Паведаміць, што гэтыя файлы падазроныя } reportDescription = Дапамажыце нам зразумець, што адбываецца. Як вы лічыце, што не так з гэтымі файламі? reportUnknownDescription = Калі ласка, перайдзіце да адрасу спасылкі, пра якую хочаце паведаміць, і націсніце “{ reportFile }”. reportButton = Паведаміць reportReasonMalware = Гэтыя файлы ўтрымліваюць шкоднасныя праграмы альбо з'яўляюцца часткай фішынг-атакі. reportReasonPii = Гэтыя файлы ўтрымліваюць асабістую інфармацыю пра мяне. reportReasonAbuse = Гэтыя файлы ўтрымліваюць незаконнае альбо абразлівае змесціва. reportReasonCopyright = Каб паведаміць аб парушэнні аўтарскіх правоў або гандлёвых марак, скарыстайцеся алгарытмам, апісаным на гэтай старонцы. reportedTitle = Пра файлы паведамлена reportedDescription = Дзякуй. Мы атрымалі Вашу заяву наконт гэтых файлаў. ================================================ FILE: public/locales/bn/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = প্রতিক্রিয়া importingFile = ইম্পোর্ট হচ্ছে... encryptingFile = ইনক্রিপট হচ্ছে... decryptingFile = ডিক্রিপট হচ্ছে... downloadCount = { $num -> [one] 1 ডাউনলোড *[other] { $num } ডাউনলোডগুলো } timespanHours = { $num -> [one] 1 ঘন্টা *[other] { $num } ঘন্টা } copiedUrl = কপি করা হয়েছে! unlockInputPlaceholder = পাসওয়ার্ড unlockButtonLabel = আনলক করুন downloadButtonLabel = ডাউনলোড downloadFinish = ডাউনলোড সম্পন্ন fileSizeProgress = ({ $totalSize } এর { $partialSize }) sendYourFilesLink = Send পরখ করে দেখুন errorPageHeader = কোন সমস্যা হয়েছে! fileTooBig = ফাইলটি আপলোড করার জন্যে খুব বড়। এটি { $size } এর চেয়ে কম হওয়া উচিত। linkExpiredAlt = লিঙ্ক মেয়াদউত্তীর্ণ হয়েছে notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়। notSupportedLink = আমার ব্রাউজার কেন সমর্থিত নয়? notSupportedOutdatedDetail = দুর্ভাগ্যবশত Firefox এই সংস্করণটি ওয়েব প্রযুক্তিকে সমর্থন করে না যা Send কে সমর্থন করে। আপনাকে আপনার ব্রাউজারটি আপডেট করতে হবে। updateFirefox = Firefox হালনাগাদ করুন deletePopupCancel = বাতিল deleteButtonHover = মুছে ফেলুন footerLinkLegal = আইনগত footerLinkPrivacy = গোপনীয়তা footerLinkCookies = কুকি passwordTryAgain = ভুল পাসওয়ার্ড। আবার চেষ্টা করুন। javascriptRequired = Send এর জাভাস্ক্রিপ্ট প্রয়োজন। whyJavascript = কেন Send এর জাভাস্ক্রিপ্ট প্রয়োজন? enableJavascript = জাভাস্ক্রিপ্ট সক্রিয় করুন এবং আবার চেষ্টা করুন। # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ঘ { $minutes }মি # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }মি # A short status message shown when the user enters a long password maxPasswordLength = সর্বোচ্চ পাসওয়ার্ড দৈর্ঘ্য:{ $length } # A short status message shown when there was an error setting the password passwordSetError = এই পাসওয়ার্ড সেট করা যাবে না ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = প্রেরণ -firefox = Firefox -mozilla = Mozilla introTitle = সহজ, ব্যক্তিগত ফাইল শেয়ার introDescription = { -send-brand } ফাইল এনক্রিপশন ও স্বয়ংক্রিয়ভাবে মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করতে দেয়। একারণে আপনি যা শেয়ার করেন তা গোপন রাখতে এবং আপনার জিনিস চিরদিনের জন্য অনলাইনে থাকবে না তা নিশ্চিত করতে পারেন। notifyUploadEncryptDone = আপনার ফাইল এনক্রিপ্ট করা হয়েছে এবং প্রেরণ করতে প্রস্তুত # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } বা { $timespan } পরে মেয়াদ শেষ হবে timespanMinutes = { $num -> [one] ১ মিনিট *[other] { $num } মিনিট } timespanDays = { $num -> [one] ১ দিন *[other] { $num } দিন } timespanWeeks = { $num -> [one] ১ সপ্তাহ *[other] { $num } সপ্তাহ } fileCount = { $num -> [one] ১টি ফাইল *[other] { $num }টি ফাইল } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = মোট আকার: { $size } # the next line after the colon contains a file name copyLinkDescription = আপনার ফাইল শেয়ার করতে লিঙ্ক অনুলিপি করুন: copyLinkButton = লিঙ্ক অনুলিপি downloadTitle = ফাইল ডাউনলোড downloadDescription = ফাইলটি { -send-brand } এর মাধ্যমে এনক্রিপশন ও স্বয়ংক্রিয় মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করা হয়েছে। trySendDescription = সহজ ও নিরাপদ ফাইল শেয়ারের জন্য { -send-brand } ব্যবহার করুন। # count will always be > 10 tooManyFiles = { $count -> [one] একবারে কেবল ১টি ফাইল আপলোড করা যাবে। *[other] একবারে কেবল { $count }টি ফাইল আপলোড করা যাবে। } # count will always be > 10 tooManyArchives = { $count -> [one] কেবল ১টি আর্কাইভ অনুমোদিত। *[other] কেবল { $count } আর্কাইভ অনুমোদিত। } expiredTitle = এই লিঙ্কের মেয়াদ শেষ হয়ে গেছে। notSupportedDescription = { -send-brand } এই ব্রাউজারের সাথে কাজ করবে না। { -firefox } এর সাম্প্রতিকতম সংস্করণে { -send-short-brand } সর্বোত্তমভাবে কাজ করবে, এবং এটি বেশিরভাগ ব্রাউজারের বর্তমান সংস্করণে কাজ করবে। downloadFirefox = { -firefox } ডাউনলোড করুন legalTitle = { -send-short-brand } গোপনীয়তা নোটিশ legalDateStamp = সংস্করণ ১.০, ১২ মার্চ, ২০১৯ তারিখ # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }দি { $hours }ঘ { $minutes }মি addFilesButton = আপলোডের জন্য ফাইল নির্বাচন করুন uploadButton = আপলোড # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ফাইল টেনে এনে ছাড়ুন # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = বা সর্বোচ্চ { $size } আকারের ফাইল পাঠাতে ক্লিক করুন addPassword = পাসওয়ার্ড দ্বারা সুরক্ষিত রাখুন emailPlaceholder = আপনার ইমেইল দিন # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন signInOnlyButton = সাইন ইন accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন accountBenefitDownloadCount = আরও মানুষের সাথে ফাইল শেয়ার করুন accountBenefitTimeLimit = { $count -> [one] ১ দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন *[other] { $count } দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন } accountBenefitSync = যেকোন ডিভাইস থেকে শেয়ার করা ফাইল পরিচালনা করুন accountBenefitMoz = অন্যান্য { -mozilla } সেবা সম্পর্কে জানুন signOut = সাইন আউট okButton = ঠিক আছে downloadingTitle = ডাউনলোড হচ্ছে noStreamsWarning = এই ব্রাউজার এতো বড় একটি ফাইল ডিক্রিপ্ট করতে সক্ষম নয়। noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }। # the next line after the colon contains a file name shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন: shareLinkButton = লিঙ্ক শেয়ার করুন # $name is the name of the file shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন। learnMore = আরও জানুন। ================================================ FILE: public/locales/br/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Oc'h enporzhiañ … encryptingFile = Oc'h enrinegañ.. decryptingFile = Oc'h ezrinegañ... downloadCount = { $num -> [one] { $num } bellgargadenn [two] { $num } bellgargadenn [few] { $num } fellgargadenn [many] { $num } a bellgargadennoù *[other] { $num } pellgargadenn } timespanHours = { $num -> [one] { $num } eur [two] { $num } eur [few] { $num } eur [many] { $num } a eurioù *[other] { $num } eur } copiedUrl = Eilet! unlockInputPlaceholder = Ger-tremen unlockButtonLabel = Dibrennañ downloadButtonLabel = Pellgargañ downloadFinish = Pellgargadur echu fileSizeProgress = ({ $partialSize } war { $totalSize }) sendYourFilesLink = Esaeit Send errorPageHeader = Degouezhet ez eus bet ur fazi! fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size } linkExpiredAlt = Ere diamzeret notSupportedHeader = N'eo ket skoret ho merdeer. notSupportedLink = Perak n'eo ket skoret ma merdeer? notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer. updateFirefox = Hizivaat Firefox deletePopupCancel = Nullañ deleteButtonHover = Dilemel footerLinkLegal = Lezennel footerLinkPrivacy = Buhez prevez footerLinkCookies = Toupinoù passwordTryAgain = Ger-tremen direizh. Klaskit en-dro. javascriptRequired = Send a azgoulenn Javascript whyJavascript = Perak e azgoulenn Send Javascript? enableJavascript = Gweredekait Javascript ha klaskit en-dro. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }e { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Hirder brasañ aotreet evit ar ger-tremen: { $length } # A short status message shown when there was an error setting the password passwordSetError = N'haller ket despizañ ar ger-tremen ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Rannañ restroù en un doare eeun ha prevez introDescription = A-drugarez da { -send-brand } a c'hallit rannañ restroù gant un enrinegañ penn-ouzh-penn hag un ere a ziamzero ent emgefreek. Evel-se e c'hallit mirout ar pezh a rannit prevez ha bezañ sur ne chomo ket ho traoù enlinenn da viken. notifyUploadEncryptDone = Enrineget eo ho restr ha prest eo da vezañ kaset # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Diamzeriñ a raio goude { $downloadCount } pe { $timespan } timespanMinutes = { $num -> [one] { $num } vunutenn [two] { $num } vunutenn [few] { $num } munutenn [many] { $num } a vunutennoù *[other] { $num } munutenn } timespanDays = { $num -> [one] { $num } devezh [two] { $num } zevezh [few] { $num } devezh [many] { $num } a zevezhioù *[other] { $num } devezh } timespanWeeks = { $num -> [one] { $num } sizhun [two] { $num } sizhun [few] { $num } sizhun [many] { $num } a sizhunioù *[other] { $num } sizhun } fileCount = { $num -> [one] { $num } restr [two] { $num } restr [few] { $num } restr [many] { $num } a restroù *[other] { $num } restr } # byte abbreviation bytes = e # kibibyte abbreviation kb = Ke # mebibyte abbreviation mb = Me # gibibyte abbreviation gb = Ge # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ment hollek: { $size } # the next line after the colon contains a file name copyLinkDescription = Eilit an ere evit rannañ ho restr copyLinkButton = Eilañ an ere downloadTitle = Pellgargañ ar restroù downloadDescription = Dre { -send-brand } eo bet rannet ar restr-mañ, gant un enrinegañ penn-ouzh-penn hag un ere a ziamzer ent emgefreek. trySendDescription = Esaeit { -send-brand } evit rannañ restroù en un doare eeun ha prevez. # count will always be > 10 tooManyFiles = { $count -> [one] N'haller pellgas nemet { $count } restr er memes mare. [two] N'haller pellgas nemet { $count } restr er memes mare. [few] N'haller pellgas nemet { $count } restr er memes mare. [many] N'haller pellgas nemet { $count } a restroù er memes mare. *[other] N'haller pellgas nemet { $count } restr er memes mare. } # count will always be > 10 tooManyArchives = { $count -> [one] Aotreet eo{ $count } diell nemetken. [two] Aotreet eo{ $count } ziell nemetken. [few] Aotreet eo{ $count } diell nemetken. [many] Aotreet eo{ $count } a zielloù nemetken. *[other] Aotreet eo{ $count } diell nemetken. } expiredTitle = Diamzeret eo an ere. notSupportedDescription = { -send-brand } n'aio ket en-dro war ar merdeer-mañ. { -send-short-brand } a za en-dro gwelloc'h gant handelv diwezhañ { -firefox }, ha mont a raio en-dro gant handelv bremanel lodenn vrasañ ar merdeerioù. downloadFirefox = Pellgargañ { -firefox } legalTitle = Evezhiadenn a fed buhez prevez { -send-short-brand } legalDateStamp = Handelv 1.0, d'an 12 a viz Meurzh 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }e { $minutes }m addFilesButton = Diuzit ur restr da bellgas trustWarningMessage = Bezit sur ho peus fiziañs en ho tegemerer pa rannit roadennoù kizidik. uploadButton = Pellgas # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Riklit ha laoskit restroù # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = pe klikit evit kas betek { $size } addPassword = Gwareziñ gant ur ger-tremen emailPlaceholder = Enankit ho chomlec'h postel # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Kennaskit evit kas betek { $size } signInOnlyButton = Kennaskañ accountBenefitTitle = Krouit ur gont { -firefox } pe kennaskit # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Rannit restroù betek { $size } accountBenefitDownloadCount = Rannit restroù gant muioc'h a dud accountBenefitTimeLimit = { $count -> [one] Dalc'hit an ereoù oberiant e-pad { $count } devezh [two] Dalc'hit an ereoù oberiant e-pad { $count } zevezh [few] Dalc'hit an ereoù oberiant e-pad { $count } devezh [many] Dalc'hit an ereoù oberiant e-pad { $count } a zevezhioù *[other] Dalc'hit an ereoù oberiant e-pad { $count } devezh } accountBenefitSync = Merit ar restroù rannet gant forzh peseurt trevnad accountBenefitMoz = Gouzout hiroc'h a-zivout gwazerezhioù all { -mozilla } signOut = Digennaskañ okButton = Mat eo downloadingTitle = O pellgargañ noStreamsWarning = Posupl eo ne vefe ket gouest ar merdeer-mañ da ezrinegañ ur restr ken bras. noStreamsOptionCopy = Eilit an ere evit digeriñ anezhañ en ur merdeer all noStreamsOptionFirefox = Esaeit hor merdeer karetañ noStreamsOptionDownload = Kenderc'hel gant ar merdeer-mañ downloadFirefoxPromo = { -send-short-brand } a zo kinniget deoc'h gant ar { -firefox } nevez-flamm. # the next line after the colon contains a file name shareLinkDescription = Rannit an ere etrezek ho restr: shareLinkButton = Rannañ an ere # $name is the name of the file shareMessage = Pellgargañ "{ $name }" gant { -send-brand }: rannañ restroù en un doare eeun ha prevez trailheadPromo = Un doare a zo da wareziñ ho puhez prevez. Tremenit da Firefox. learnMore = Gouzout hiroc'h. downloadFlagged = Diweredekaet eo bet an ere-se dre ma ne zouje ket ouzh an divizoù arver. downloadConfirmTitle = Un draig ouzhpenn downloadConfirmDescription = Bezit sur ho peus fiziañs en deus en deus kaset ar restr-mañ dre ma n'haller ket gwiriañ ne freuzo ket ho trevnad. ================================================ FILE: public/locales/bs/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteSubtitle = web eksperiment siteFeedback = Povratne informacije uploadPageHeader = Privatno, šifrovano dijeljenje datoteka uploadPageExplainer = Pošaljite datoteke putem sigurne, privatne i šifrovane veze koja automatski ističe kako bi se osiguralo da vaše stvari ne ostaju na mreži zauvijek. uploadPageLearnMore = Saznajte više uploadPageDropMessage = Prevucite vaše datoteke ovdje da biste počeli sa otpremanjem uploadPageSizeMessage = Za bolji rad predlažemo da datoteka ne bude veća od 1GB uploadPageBrowseButton = Odaberite datoteku na računaru uploadPageBrowseButton1 = Odaberite datoteku za otpremanje uploadPageMultipleFilesAlert = Otpremanje direktorija ili više datoteka trenutno nije podržano. uploadPageBrowseButtonTitle = Otpremi datoteku uploadingPageProgress = Otpremam { $filename } ({ $size }) importingFile = Uvozim... verifyingFile = Potvrđujem... encryptingFile = Šifrujem... decryptingFile = Dešifrujem... notifyUploadDone = Vaše otpremanje je završeno. uploadingPageMessage = Nakon što se vaša datoteka otpremi, moći ćete da podesite opcije isteka. uploadingPageCancel = Otkaži otpremanje uploadCancelNotification = Vaše otpremanje je otkazano. uploadingPageLargeFileMessage = Ova datoteka je velika i otpremanje može potrajati. Budite strpljivi! uploadingFileNotification = Obavijesti me kada otpremanje bude gotovo. uploadSuccessConfirmHeader = Spremno za slanje uploadSvgAlt = Otpremi uploadSuccessTimingHeader = Veza prema vašoj datoteci će isteći nakon prvog preuzimanja ili za 24 sata. expireInfo = Link za vašu datoteku će isteći nakon { $downloadCount } ili { $timespan }. downloadCount = { $num -> [one] 1 preuzimanja [few] { $num } preuzimanja *[other] { $num } preuzimanja } timespanHours = { $num -> [one] 1 sat [few] { $num } sata *[other] { $num } sati } copyUrlFormLabelWithName = Iskopirajte i podijelite vezu da biste poslali datoteku: { $filename } copyUrlFormButton = Kopiraj u međuspremnik copiedUrl = Kopirano! deleteFileButton = Izbriši datoteku sendAnotherFileLink = Pošalji drugu datoteku # Alternative text used on the download link/button (indicates an action). downloadAltText = Preuzmi downloadsFileList = Preuzimanja # Used as header in a column indicating the amount of time left before a # download link expires (e.g. "10h 5m") timeFileList = Vrijeme # Used as header in a column indicating the number of times a file has been # downloaded downloadFileName = Preuzmi { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Unesite lozinku unlockInputPlaceholder = Lozinka unlockButtonLabel = Otključaj downloadFileTitle = Preuzmi šifrovanu datoteku # Send is a brand name and should not be localized. downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. # Text and title used on the download link/button (indicates an action). downloadButtonLabel = Preuzmi downloadNotification = Vaše preuzimanje je završeno. downloadFinish = Preuzimanje završeno # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } od { $totalSize }) # Send is a brand name and should not be localized. sendYourFilesLink = Probajte Send downloadingPageProgress = Preuzimanje { $filename } ({ $size }) downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo. errorAltText = Greška pri otpremanju errorPageHeader = Nešto nije uredu! errorPageMessage = Dogodila se greška pri otpremanju datoteke. errorPageLink = Pošalji drugu datoteku fileTooBig = Ta datoteka je prevelika za otpremanje. Treba biti manja od { $size }. linkExpiredAlt = Veza istekla expiredPageHeader = Veza je istekla ili nikad nije postojala! notSupportedHeader = Vaš pretraživač nije podržan. # Send is a brand name and should not be localized. notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! notSupportedLink = Zašto moj pretraživač nije podržan? notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Send. Morate ažurirati vaš pretraživač. updateFirefox = Ažuriraj Firefox downloadFirefoxButtonSub = Besplatno preuzimanje uploadedFile = Datoteka copyFileList = Kopiraj URL # expiryFileList is used as a column header expiryFileList = Ističe za deleteFileList = Izbriši nevermindButton = Zanemari legalHeader = Uslovi i privatnost legalNoticeTestPilot = Send je trenutno Test Pilot eksperiment i podržan je uslovima korištenja i obavještenjem o privatnosti. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka ovdje. legalNoticeMozilla = Korištenje Send web stranice podlaže Mozillinom obavještenju o privatnosti na web stranicama i uslovima korištenja web stranica. deletePopupText = Izbrisati ovu datoteku? deletePopupYes = Da deletePopupCancel = Otkaži deleteButtonHover = Izbriši copyUrlHover = Kopiraj URL footerLinkLegal = Pravno # Test Pilot is a proper name and should not be localized. footerLinkAbout = O Test Pilotu footerLinkPrivacy = Privatnost footerLinkTerms = Uslovi footerLinkCookies = Kolačići requirePasswordCheckbox = Zahtjevaj lozinku za preuzimanje ove datoteke addPasswordButton = Dodaj lozinku changePasswordButton = Promijeni passwordTryAgain = Netačna lozinka. Pokušajte ponovo. reportIPInfringement = Prijavite IP prekršaj javascriptRequired = Send zahtjeva JavaScript whyJavascript = Zašto Send zahtjeva JavaScript? enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when a password is successfully set passwordIsSet = Lozinka postavljena # A short status message shown when the user enters a long password maxPasswordLength = Maksimalna veličina lozinke: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ova lozinka se ne može postaviti ================================================ FILE: public/locales/ca/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = S'està important… encryptingFile = S'està xifrant… decryptingFile = S'està desxifrant… downloadCount = { $num -> [one] 1 baixada *[other] { $num } baixades } timespanHours = { $num -> [one] 1 hora *[other] { $num } hores } copiedUrl = Copiat! unlockInputPlaceholder = Contrasenya unlockButtonLabel = Desbloca downloadButtonLabel = Baixa downloadFinish = Ha acabat la baixada fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Proveu el Send errorPageHeader = Hi ha hagut un problema fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }. linkExpiredAlt = L'enllaç ha caducat notSupportedHeader = El vostre navegador no és compatible. notSupportedLink = Per què el meu navegador no és compatible? notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Send. Haureu d'actualitzar el navegador. updateFirefox = Actualitza el Firefox deletePopupCancel = Cancel·la deleteButtonHover = Suprimeix footerLinkLegal = Avís legal footerLinkPrivacy = Privadesa footerLinkCookies = Galetes passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar. javascriptRequired = El Send necessita JavaScript whyJavascript = Per què el Send necessita JavaScript? enableJavascript = Activeu el JavaScript i torneu-ho a provar. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Longitud màxima de la contrasenya: { $length } # A short status message shown when there was an error setting the password passwordSetError = No s'ha pogut definir la contrasenya ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Compartició de fitxers senzilla i privada introDescription = El { -send-brand } permet compartir fitxers amb xifratge d'extrem a extrem mitjançant un enllaç que caduca automàticament. Per tant, us assegureu que tot allò que compartiu és privat i que no es mantindrà a Internet per sempre. notifyUploadEncryptDone = El fitxer s'ha xifrat i està llest per enviar-se # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Caduca després de { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minut *[other] { $num } minuts } timespanDays = { $num -> [one] 1 dia *[other] { $num } dies } timespanWeeks = { $num -> [one] 1 setmana *[other] { $num } setmanes } fileCount = { $num -> [one] 1 fitxer *[other] { $num } fitxers } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Mida total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copieu l'enllaç per compartir el fitxer: copyLinkButton = Copia l'enllaç downloadTitle = Baixa els fitxers downloadDescription = Aquest fitxer s'ha compartit mitjançant el { -send-brand } amb xifratge d'extrem a extrem i un enllaç que caduca automàticament. trySendDescription = Proveu el { -send-brand } per compartir fitxers de forma senzilla i privada. # count will always be > 10 tooManyFiles = { $count -> [one] Només es pot pujar 1 fitxer alhora. *[other] Només es poden pujar { $count } fitxers alhora. } # count will always be > 10 tooManyArchives = { $count -> [one] Només es permet 1 fitxer. *[other] Només es permeten { $count } fitxers. } expiredTitle = Aquest enllaç ha caducat. notSupportedDescription = El { -send-brand } no funcionarà amb aquest navegador. El { -send-short-brand } funciona millor amb l'última versió del { -firefox } i funcionarà amb la versió més recent de la majoria de navegadors. downloadFirefox = Baixa el { -firefox } legalTitle = Avís de privadesa del { -send-short-brand } legalDateStamp = Versió 1.0, amb data del 12 de març de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min addFilesButton = Seleccioneu els fitxers que voleu pujar trustWarningMessage = Assegureu-vos que confieu en el destinatari quan compartiu dades confidencials. uploadButton = Puja # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrossegueu i deixeu anar els fitxers # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o feu clic aquí per enviar fins a { $size } addPassword = Protegeix amb contrasenya emailPlaceholder = Introduïu la vostra adreça electrònica # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Inicieu la sessió per enviar fins a { $size } signInOnlyButton = Inicia la sessió accountBenefitTitle = Creeu un compte del { -firefox } o inicieu la sessió # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartiu fitxers fins a { $size } accountBenefitDownloadCount = Compartiu fitxers amb més persones accountBenefitTimeLimit = { $count -> [one] Manteniu els enllaços actius fins a 1 dia *[other] Manteniu els enllaços actius fins a { $count } dies } accountBenefitSync = Gestioneu els fitxers compartits des de qualsevol dispositiu accountBenefitMoz = Descobriu els altres serveis de { -mozilla } signOut = Tanca la sessió okButton = D'acord downloadingTitle = S'està baixant noStreamsWarning = Pot ser que aquest navegador no pugui desxifrar un fitxer tan gran. noStreamsOptionCopy = Copieu l'enllaç per obrir-lo en un altre navegador noStreamsOptionFirefox = Proveu el nostre navegador preferit noStreamsOptionDownload = Segueix amb aquest navegador downloadFirefoxPromo = El nou { -firefox } us ofereix el { -send-short-brand } # the next line after the colon contains a file name shareLinkDescription = Compartiu l'enllaç al vostre fitxer: shareLinkButton = Comparteix l'enllaç # $name is the name of the file shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura trailheadPromo = Hi ha una manera de protegir la vostra privadesa. Uniu-vos al Firefox. learnMore = Més informació. downloadFlagged = Aquest enllaç s'ha desactivat per infringir les condicions del servei. downloadConfirmTitle = Una cosa més downloadConfirmDescription = Assegureu-vos que confieu en la persona que us ha enviat aquest fitxer, perquè nosaltres no podem verificar que no malmeti el vostre dispositiu. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Confio en la persona que ha enviat aquest fitxer *[other] Confio en la persona que ha enviat aquests fitxers } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Informa que aquest fitxer és sospitós *[other] Informa que aquests fitxers són sospitos } reportDescription = Ajudeu-nos a entendre què passa. Quin problema creieu que tenen aquests fitxers? reportUnknownDescription = Aneu a l'URL de l'enllaç sobre el qual voleu informar i feu clic a «{ reportFile }». reportButton = Informa reportReasonMalware = Aquests fitxers contenen programari maliciós o formen part d'un atac de pesca electrònica. reportReasonPii = Aquests fitxers contenen informació d'identificació personal meva. reportReasonAbuse = Aquests fitxers inclouen contingut il·legal o abusiu. reportReasonCopyright = Per informar sobre una infracció de drets d’autor o de marca comercial, utilitzeu el procés descrit en aquesta pàgina. reportedTitle = S'ha informat d'aquests fitxers reportedDescription = Gràcies. Hem rebut el vostre informe sobre aquests fitxers. ================================================ FILE: public/locales/cak/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Rutzijol importingFile = Tajin nijik… encryptingFile = Tajin newäx rusik'ixik… decryptingFile = Tajin netamäx rusik'ixik... downloadCount = { $num -> [one] 1 qasanïk *[other] { $num } taq qasanïk } timespanHours = { $num -> [one] 1 ramaj *[other] { $num } taq ramaj } copiedUrl = ¡Xwachib'ëx! unlockInputPlaceholder = Ewan tzij unlockButtonLabel = Titzij chik downloadButtonLabel = Tiqasäx downloadFinish = Xtz'aqät qasanïk fileSizeProgress = ({ $partialSize } richin { $totalSize }) sendYourFilesLink = Titojtob'ëx Send errorPageHeader = ¡K'o ri man ütz ta xub'än! 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 notSupportedHeader = Man koch'el ta ri awokik'amaya'l. 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 Send. Rajowaxik nak'ëx ri awokik'amaya'l. updateFirefox = Tik'ex ri Firefox deletePopupCancel = Tiq'at deleteButtonHover = Tiyuj footerLinkLegal = Taqanel tzijol footerLinkPrivacy = Ichinanem footerLinkCookies = Taq kaxlanwey passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik. javascriptRequired = K'atzinel JavaScript chi re ri Send whyJavascript = ¿Achike ruma toq ri Send nrajo' JavaScript? enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }r { $minutes }ch # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ch # A short status message shown when the user enters a long password maxPasswordLength = Nïm raqän ewan tzij: { $length } # A short status message shown when there was an error setting the password passwordSetError = Man tikirel ta ninuk' re ewan tzij re' ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Titaq -firefox = Firefox -mozilla = Mozilla introTitle = Kijunamaxik relik chuqa' ichinan yakb'äl introDescription = { -send-brand } nuya' q'ij chawe ye'akomonij taq yakb'äl ri ewan kisik'ixik chijun chuqa' jun ximonel ri nik'is ruq'ijul pa ruyonil. Ke ri' nawichinaj ronojel ri nakomonij chuqa' yajike' chi ronojel ri taq awachinaq man jumul ta kek'oje' pa k'amab'ey. notifyUploadEncryptDone = Ewan chik rusik'ixik ri ayakb'al chuqa' ütz chik richin nitaq # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Nik'is ruq'ij chi rij { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 ch'utiramaj *[other] { $num } taq ch'utiramaj } timespanDays = { $num -> [one] 1 q'ij *[other] { $num } taq q'ij } timespanWeeks = { $num -> [one] 1 wuqq'ij *[other] { $num } taq wuqq'ij } fileCount = { $num -> [one] 1 yakb'äl *[other] { $num } taq yakb'äl } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ronojel runimilem: { $size } # the next line after the colon contains a file name copyLinkDescription = Tawachib'ej ri ximonel richin nakomonij ri ayakb'al: copyLinkButton = Tiwachib'ëx ximonel downloadTitle = Keqasäx taq yakb'äl downloadDescription = Xkomonïx re yakb'äl re' pa { -send-brand } rik'in chijun ewan rusik'ixik chuqa' nik'is ruq'ijul pa ruyonil. trySendDescription = Tatojtob'ej { -send-brand } richin chanin chuqa' jikïl ye'akomonij taq yakb'äl. # count will always be > 10 tooManyFiles = { $count -> [one] Xa xe 1 yakb'äl tikirel nijotob'äx pa ri ramaj. *[other] Xa xe { $count } taq yakb'äl tikirel yejotob'äx pa ri ramaj. } # count will always be > 10 tooManyArchives = { $count -> [one] Xa xe 1 yakb'äl niya' q'ij chi re. *[other] Xa xe { $count } taq yakb'äl niya' q'ij chi ke. } expiredTitle = Xk'is yan ruq'ij re ximonel re'. notSupportedDescription = Man xtisamäj ta ri { -send-brand } rik'in re okik'amaya'l re'. Nisamäj ütz ri { -send-short-brand } rik'in ri ruk'isib'äl ruwäch { -firefox }, chuqa' xtisamäj rik'in ri ruwäch k'o wakami pa ronojel okik'amaya'l. downloadFirefox = Tiqasäx { -firefox } legalTitle = Rutzijol Richinanem { -send-short-brand } legalDateStamp = Ruwäch 1.0, ruq'ijul marso 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }q { $hours }r { $minutes }ch' addFilesButton = Kecha' taq yakb'äl richin yejotob'äx uploadButton = Tijotob'äx # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Keqirirëx chuqa' ke'osq'opïx taq yakb'äl # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o tapitz'a' richin natäq k'a { $size } addPassword = Tichajïx rik'in ewan tzij emailPlaceholder = Tatz'ib'aj ataqoya'l # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Tatikirisaj molojri'ïl richin natäq k'a { $size } signInOnlyButton = Titikirisäx molojri'ïl accountBenefitTitle = Tatz'uku' jun { -firefox } Rub'i' Ataqoy'al o Tatikirisaj molojri'ïl # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Ke'akomonij taq yakb'äl k'a { $size } accountBenefitDownloadCount = Ke'akomonij taq yakb'äl kik'in ch'aqa' chik winaqi' accountBenefitTimeLimit = { $count -> [one] Ke' atzija' ri taq ximonel chi 1 q'ij *[other] Ke'atzija' ri taq ximonel chi { $count } taq q'ij } accountBenefitSync = Ke'anuk'samajij komonin taq yakb'äl pa xab'achike okisab'äl accountBenefitMoz = Tawetamaj chij ch'aqa' chik { -mozilla } taq samaj signOut = Titz'apïx molojri'ïl okButton = ÜTZ downloadingTitle = Niqasäx noStreamsWarning = Rik'in jub'a' re okik'amaya'l re' man nitikïr ta nretamaj rusik'ixik nima'q taq yakb'äl. noStreamsOptionCopy = Tiwachib'ëx ri ximonel richin nijaq pa jun chik okik'amaya'l noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l noStreamsOptionDownload = Kisamäj na rik'in re okik'amaya'l re' downloadFirefoxPromo = Ja ri k'ak'a' { -firefox } nusüj ri { -send-short-brand } chawe. # the next line after the colon contains a file name shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al: shareLinkButton = Tikomonïx ximonel # $name is the name of the file shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl trailheadPromo = K'o jun rub'anikil richin nachajij ri awichinanem. Tatunu' awi' rik'in ri Firefox. learnMore = Tetamäx ch'aqa' chik. ================================================ FILE: public/locales/ckb/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = ڕەخنەوپێشنیار importingFile = هاوردەکردن... encryptingFile = بەهێماکردن... decryptingFile = هێمالابردن... downloadCount = { $num -> [one] 1 داگرتن *[other] { $num } داگرتن } timespanHours = { $num -> [one] 1 کاژێر *[other] { $num } کاژێر } copiedUrl = لەبەرگیرا! unlockInputPlaceholder = وشەی تێپەڕبوون unlockButtonLabel = کردنەوە downloadButtonLabel = داگرتن downloadFinish = داگرتن تەواو بوو fileSizeProgress = ({ $partialSize } لە { $totalSize }) sendYourFilesLink = Firefox ناردن تاقیبکەرەوە errorPageHeader = هەڵەیەک ڕوویدا fileTooBig = ئەم پەڕگەیە زۆر گەورەیە بۆ بارکردن. پێویستە لە { $size } بچووک تر بێت linkExpiredAlt = بەستەر بەسەرچووە notSupportedHeader = وێبگەڕەکەت پشتگیری ناکرێت notSupportedLink = بۆ وێبگەڕەکەم پشتگیری ناکرێت؟ notSupportedOutdatedDetail = بەداخەوە ئەم وەشانەی Firefox پشتگیری ئەو جۆرە تەکنەلۆژییە ناکات کە پێویستە بۆ Send. پێویستە وێبگەڕەکەت نوێبکەیتەوە. updateFirefox = فاەرفۆکس نوێبکەرەوە deletePopupCancel = پاشگەزبوونەوە deleteButtonHover = سڕینەوە footerLinkLegal = یاسایی footerLinkPrivacy = تایبەتیی footerLinkCookies = شەکرۆکە passwordTryAgain = وشەی تێپەڕبوون هەڵەیە. هەوڵ بدەرەوە. javascriptRequired = فارفۆکسی ناردن پێویستە بە JavaScript هەیە whyJavascript = بۆچی پێویستی بە JavaScript هەیە؟ enableJavascript = تکایە JavaScript چالاک بکە وهەوڵ بدەرەوە. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ک { $minutes }خ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }خ # A short status message shown when the user enters a long password maxPasswordLength = زۆرترین درێژی وشەی تێپەڕی ڕێگەپێدراو: { $length } # A short status message shown when there was an error setting the password passwordSetError = ناتوانرێت وشەی تێپەڕ دابنرێت ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = سانا، بڵاوکەرەوەی پەڕگەی تایبەتیی introDescription = { -send-brand } ڕێگەت دەدات پەڕگەکان بڵاوبکەیتەوە بە شێوەی هێما کردنی کۆتا-بۆ-کۆتا و بەستەرێک کە خۆکارانە بەسەردەچێت. بۆیە دەتوانیت ئاگاداری ئەوە بیت کە چ پەڕگەیەک بە تایبەتی بڵاودەکەیتەوە و دڵنیادەبیتەوە کە شتەکانت بە سەرهێڵی نامێننەوە هەتا کۆتایی. notifyUploadEncryptDone = پەڕگەیە بەهێماکراوە ئێستا ئامادەیە بۆ ناردن # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = بەسەردەچێت دووای { $downloadCount } یان { $timespan } timespanMinutes = { $num -> [one] 1 خولەک *[other] { $num } خولەک } timespanDays = { $num -> [one] 1 ڕؤژ *[other] { $num } ڕۆژ } timespanWeeks = { $num -> [one] 1 هەفتە *[other] { $num } هەفتە } fileCount = { $num -> [one] 1 پەڕگە *[other] { $num } پەڕگە } # byte abbreviation bytes = بایت # kibibyte abbreviation kb = ک.بایت # mebibyte abbreviation mb = م.بایت # gibibyte abbreviation gb = گ.بایت # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = قەبارەی گشتی: { $size } # the next line after the colon contains a file name copyLinkDescription = بەستەر لەبەربگرەوە بۆ بڵاوکردنەوەی پەڕگە: copyLinkButton = بەستەر لەبەربگرەوە downloadTitle = پەڕگەکان دابگرە downloadDescription = ئەم پەڕگەیە لە لایەن { -send-brand } بلاوکراوەتەوە کە بەهێماکراوە بە شێوەی کۆتا-بۆ-کۆتا بە بەستەرێک کە خۆکارانە بەسەردەچێت. trySendDescription = { -send-brand } تاقیبکەرەوە بۆ سانایی، پارێزراو لە بڵاوکردنەوەی پەڕگە. # count will always be > 10 tooManyFiles = { $count -> [one] تەنها 1 پەڕگە دەتوانیت باربکەیت لەم کاتەدا. *[other] تەنها { $count } پەڕگە دەتوانی باربکەیت لەم کاتەدا. } # count will always be > 10 tooManyArchives = { $count -> [one] تەنها 1 ئەرشیف ڕێپێدراوە. *[other] تەنها { $count } ئەرشیف ڕێپێدراوە. } expiredTitle = بەستەر بەسەرچووە. notSupportedDescription = { -send-brand } کارنکات لەگەڵ ئەم وێبگەڕە. { -send-short-brand } باش کاردەکات لەگەڵ کۆتا وەشانی { -firefox }، وکاردەکات لەگەڵ زۆربەی وەشانی ئێستای وێبگەڕەکان. downloadFirefox = { -firefox } دابگرە legalTitle = تێبینی تایبەتیی { -send-short-brand } legalDateStamp = وەشان 1.0، بەروار کراو لە 12 ئازار، 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ڕ { $hours } ک{ $minutes } خ addFilesButton = پەڕگەکان هەڵبژێرە بۆ بارکردن uploadButton = بارکردن # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ڕاکێشان و دانانی پەڕگەکان # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = یان کرتە بکە بۆ ناردنی قەبارەی تاوەکوو { $size } addPassword = بپارێزە لەگەڵ وشەی تێپەڕ emailPlaceholder = پۆستی ئەلکترۆنی بنووسە # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = بچۆژوورەوە بۆ ناردنی قەبارەی تاوەکوو { $size } signInOnlyButton = بچۆژوورەوە accountBenefitTitle = هەژماری { -firefox } درووست بکە یان بچۆژوورەوە # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = پەڕگە بڵاوبکەرەوە تاوەکوو قەبارەی { $size } accountBenefitDownloadCount = پەڕگەکان لەگەڵ خەڵکی زیاتر بڵاوبکەرەوە accountBenefitTimeLimit = { $count -> [one] بەستەرەکان بەکارایی بهێڵەوە تا 1 ڕۆژ *[other] بەستەرەکان بەکارایی بهێڵەوە تا { $count } ڕۆژ } accountBenefitSync = پەڕگە بڵآوکراوەکان بەڕێوەبەرە لەهەر ئامێرێکەوە accountBenefitMoz = زیاتر بزانە دەربارەی خزمەتگوزارییەکانی تری { -mozilla } signOut = بچۆ دەرەوە okButton = باشە downloadingTitle = دادەگیرێت... noStreamsWarning = لەوانەیە ئەم وێبگەڕە نەتوانێت پەڕگەی وا گەورە بە هێما بکات. noStreamsOptionCopy = بەستەر لەبەربگرەوە بۆ کردنەوەی لە وێبگەڕێکی تر noStreamsOptionFirefox = وێبگەڕی دڵخوازی ئێمە تاقیبکەرەوە noStreamsOptionDownload = بەردەوام بە لەگەڵ ئەم وێبگەڕە downloadFirefoxPromo = { -send-short-brand } پیشکەش کراوە بە تۆ لە لایەن { -firefox }. # the next line after the colon contains a file name shareLinkDescription = بەستەر بڵاوبکەرەوە بۆ پەڕگەکەت: shareLinkButton = بەستەر بڵاوبکەرەوە # $name is the name of the file shareMessage = “{ $name }” دابگرە لەگەڵ { -send-brand }: سانا، پاریزراو لە بڵاوکردنەوەی پەڕگە trailheadPromo = ڕێگەیەک هەیە بۆ پارێزگاریکردنی تایبەتێتی خۆت. بەشدار بە لە فایەرفۆکس. learnMore = زیاتر بزانە ================================================ FILE: public/locales/cs/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Probíhá import… encryptingFile = Probíhá šifrování… decryptingFile = Probíhá dešifrování… downloadCount = { $num -> [one] jednom stažení [few] { $num } staženích *[other] { $num } staženích } timespanHours = { $num -> [one] hodinu [few] { $num } hodiny *[other] { $num } hodin } copiedUrl = Zkopírováno! unlockInputPlaceholder = Heslo unlockButtonLabel = Odemknout downloadButtonLabel = Stáhnout downloadFinish = Stahování dokončeno fileSizeProgress = ({ $partialSize } z { $totalSize }) sendYourFilesLink = Vyzkoušet Send errorPageHeader = Nastala chyba! fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }. linkExpiredAlt = Platnost odkazu vypršela notSupportedHeader = Váš prohlížeč není podporován. notSupportedLink = Proč není můj prohlížeč podporovaný? notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Send. Musíte aktualizovat svůj prohlížeč. updateFirefox = Aktualizovat Firefox deletePopupCancel = Zrušit deleteButtonHover = Smazat footerLinkLegal = Právní informace footerLinkPrivacy = Soukromí footerLinkCookies = Cookies passwordTryAgain = Špatné heslo. Zkuste to znovu. javascriptRequired = Send vyžaduje povolený JavaScript whyJavascript = Proč Send vyžaduje povolený JavaScript? enableJavascript = Povolte JavaScript a zkuste to znovu. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } m # A short status message shown when the user enters a long password maxPasswordLength = Maximální délka hesla: { $length } # A short status message shown when there was an error setting the password passwordSetError = Toto heslo nemohlo být nastaveno ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = { $case -> *[nom] Send [gen] Firefoxu Send [dat] Firefoxu Send [acc] Send [voc] Firefoxe Send [loc] Firefoxu Send [ins] Firefoxem Send } -send-short-brand = { $case -> *[nom] Send [gen] Sendu [dat] Sendu [acc] Send [voc] Sende [loc] Sendu [ins] Sendem } -firefox = { $case -> *[nom] Firefox [gen] Firefoxu [dat] Firefoxu [acc] Firefox [voc] Firefoxe [loc] Firefoxu [ins] Firefoxem } -mozilla = { $case -> *[nom] Mozilla [gen] Mozilly [dat] Mozille [acc] Mozillu [voc] Mozillo [loc] Mozille [ins] Mozillou } introTitle = Jednoduché a soukromé sdílení souborů introDescription = S { -send-brand(case: "ins") } jsou sdílené soubory šifrované end-to-end, takže ani my nevíme, co sdílíte. Platnost odkazů je navíc omezená. Soubory tak můžete sdílet soukromě a s jistotou, že se nezůstanou na internetu válet navždy. notifyUploadEncryptDone = Váš soubor je zašifrovaný a připraven k odeslání # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Platnost vyprší po { $downloadCount } nebo za { $timespan } timespanMinutes = { $num -> [one] jednu minutu [few] { $num } minuty *[other] { $num } minut } timespanDays = { $num -> [one] jeden den [few] { $num } dny *[other] { $num } dní } timespanWeeks = { $num -> [one] týden [few] { $num } týdny *[other] { $num } týdnů } fileCount = { $num -> [one] jeden soubor [few] { $num } soubory *[other] { $num } souborů } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Celková velikost: { $size } # the next line after the colon contains a file name copyLinkDescription = Soubor můžete sdílet tímto odkazem: copyLinkButton = Zkopírovat odkaz downloadTitle = Stáhnout soubory downloadDescription = Tento soubor byl sdílen přes { -send-brand(case: "acc") } s end-to-end šifrováním a odkazem s omezenou platností. trySendDescription = Vyzkoušejte jednoduché a bezpečné sdílení souborů s { -send-brand(case: "ins") } # count will always be > 10 tooManyFiles = { $count -> [one] Najednou lze nahrávat jen jeden soubor. [few] Najednou lze nahrávat jen { $count } soubory. *[other] Najednou lze nahrávat jen { $count } souborů. } # count will always be > 10 tooManyArchives = { $count -> [one] Povolen je nejvýše jeden archiv. [few] Povoleny jsou nejvýše { $count } archivy. *[other] Povoleno je nejvýše { $count } archivů. } expiredTitle = Platnost tohoto odkazu vypršela. notSupportedDescription = { -send-brand } nebude v tomto prohlížeči fungovat. Nejlépe { -send-short-brand } funguje v nejnovějším { -firefox(case: "gen") } nebo aktuálních verzích nejpoužívanějších prohlížečů. downloadFirefox = Stáhnout { -firefox(case: "acc") } legalTitle = Zásady { -send-short-brand(case: "acc") } pro ochranu osobních údajů legalDateStamp = Verze 1.0, 12. března 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Vyberte soubory k nahrání trustWarningMessage = Ujistěte se, že adresátovi důvěřujete pro sdílení vašich důvěrných dat. uploadButton = Nahrát # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Přetažením myší nebo kliknutím sem # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = můžete poslat až { $size } addPassword = Ochránit heslem emailPlaceholder = Zadejte svoji e-mailovou adresu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Pro odesílání souborů o velikosti až { $size } se prosím přihlaste signInOnlyButton = Přihlásit se accountBenefitTitle = Vytvořte si účet { -firefox(case: "gen") } nebo se přihlaste # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Sdílejte soubory o velikosti až { $size } accountBenefitDownloadCount = Sdílejte soubory s více lidmi accountBenefitTimeLimit = { $count -> [one] Odkazy platné až jeden den [few] Odkazy platné až { $count } dny *[other] Odkazy platné až { $count } dní } accountBenefitSync = Správa sdílených souborů z jakéhokoliv zařízení accountBenefitMoz = Více informací o dalších službách od { -mozilla(case: "gen") } signOut = Odhlásit se okButton = OK downloadingTitle = Stahování noStreamsWarning = Dešifrování tak velikého souboru se v tomto prohlížeči nemusí podařit. noStreamsOptionCopy = Zkopírujte odkaz pro otevření v jiném prohlížeči noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč noStreamsOptionDownload = Pokračovat v tomto prohlížeči downloadFirefoxPromo = { -send-short-brand } od aplikace { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Sdílet odkaz na soubor: shareLinkButton = Sdílet odkaz # $name is the name of the file shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox. learnMore = Zjistit více. downloadFlagged = Tento odkaz byl pro porušení podmínek používání služby deaktivován. downloadConfirmTitle = Ještě jedna věc downloadConfirmDescription = Ujistěte se, že opravdu důvěřujete odesílateli tohoto souboru, protože nemůžeme potvrdit bezpečnost jeho otevření na vašem zařízení. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Odesílateli tohoto souboru důvěřuji [few] Odesílateli těchto souborů důvěřuji *[other] Odesílateli těchto souborů důvěřuji } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Nahlásit tento soubor jako podezřelý [few] Nahlásit tyto soubory jako podezřelé *[other] Nahlásit tyto soubory jako podezřelé } reportDescription = Pomozte nám. Co si myslíte, že je s těmito soubory špatně? reportUnknownDescription = Otevřete odkaz, který chcete nahlásit, a klepněte na „{ reportFile }“. reportButton = Nahlásit reportReasonMalware = Tyto soubory obsahují malware nebo jsou součástí phishingového útoku. reportReasonPii = Tyto soubory obsahují mé osobní údaje. reportReasonAbuse = Tyto soubory obsahují nelegální nebo urážlivý obsah. reportReasonCopyright = Chcete-li nahlásit porušení autorských práv nebo ochranných známek, použijte postup popsaný na této stránce. reportedTitle = Soubory byly nahlášeny reportedDescription = Děkujeme vám za zaslané hlášení ohledně těchto souborů. ================================================ FILE: public/locales/cy/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Mewnforio… encryptingFile = Wrthi'n amgryptio… decryptingFile = Wrthi'n dadgryptio… downloadCount = { $num -> [zero] Dim llwythi i lawr [one] 1 llwyth i lawr [two] { $num } llwyth i lawr [few] { $num } llwyth i lawr [many] { $num } llwyth i lawr *[other] { $num } llwyth i lawr } timespanHours = { $num -> [zero] awr [one] 1 awr [two] { $num } awr [few] { $num } awr [many] { $num } awr *[other] { $num } awr } copiedUrl = Wedi eu copïo! unlockInputPlaceholder = Cyfrinair unlockButtonLabel = Datgloi downloadButtonLabel = Llwytho i Lawr downloadFinish = Llwytho wedi Gorffen fileSizeProgress = ({ $partialSize } o { $totalSize }) sendYourFilesLink = Rhowch gynnig ar Send errorPageHeader = Aeth rhywbeth o'i le! fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }. linkExpiredAlt = Mae'r ddolen wedi dod i ben notSupportedHeader = Nid yw eich porwr yn cael ei gynnal. notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal? notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Send. Bydd angen i chi ddiweddaru eich porwr. updateFirefox = Diweddaru Firefox deletePopupCancel = Diddymu deleteButtonHover = Dileu footerLinkLegal = Cyfreithiol footerLinkPrivacy = Preifatrwydd footerLinkCookies = Cwcis passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto. javascriptRequired = Mae Send angen JavaScript whyJavascript = Pam fod Send angen JavaScript? enableJavascript = Galluogwch JavaScript a cheisio eto. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }a { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Hyd mwyaf cyfrinair: { $length } # A short status message shown when there was an error setting the password passwordSetError = Nid oedd modd gosod y cyfrinair hwn ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Anfon -firefox = Firefox -mozilla = Mozilla introTitle = Rhannu ffeiliau syml a phreifat introDescription = Mae { -send-brand } yn gadael i chi rannu ffeiliau gydag amgryptio o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. Felly gallwch chi gadw'r hyn rydych chi'n ei rannu'n breifat a sicrhau nad yw'ch pethau'n aros ar-lein am byth. notifyUploadEncryptDone = Mae eich ffeil wedi'i hamgryptio ac yn barod i'w hanfon # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Yn dod i ben ar ôl { $downloadCount } neu { $timespan } timespanMinutes = { $num -> [zero] 0 munud [one] 1 munud [two] { $num } munud [few] { $num } munud [many] { $num } munud *[other] { $num } munud } timespanDays = { $num -> [zero] 0 diwrnod [one] 1 diwrnod [two] { $num } diwrnod [few] { $num } diwrnod [many] { $num } diwrnod *[other] { $num } diwrnod } timespanWeeks = { $num -> [zero] 0 wythnos [one] 1 wythnos [two] { $num } wythnos [few] { $num } wythnos [many] { $num } wythnos *[other] { $num } wythnos } fileCount = { $num -> [zero] 0 ffeil [one] 1 ffeil [two] { $num } ffeil [few] { $num } ffeil [many] { $num } ffeil *[other] { $num } ffeil } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Cyfanswm maint: { $size } # the next line after the colon contains a file name copyLinkDescription = Copïwch y ddolen i rannu eich ffeil: copyLinkButton = Copïo'r ddolen downloadTitle = Llwytho ffeiliau i lawr downloadDescription = Rhannwyd y ffeil hon trwy { -send-brand } gydag amgryptiad o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. trySendDescription = Rhowch gynnig ar { -send-brand } ar gyfer rhannu ffeiliau syml a diogel. # count will always be > 10 tooManyFiles = { $count -> [zero] Nid oes modd llwytho ffeiliau i fyny. [one] Dim ond 1 ffeil y mae modd ei llwytho i fyny ar y tro. [two] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. [few] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. [many] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. *[other] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. } # count will always be > 10 tooManyArchives = { $count -> [zero] Dim caniatâd i archifau. [one] Dim ond 1 archif y'n cael ei ganiatáu. [two] Dim ond { $count } archif sy'n cael eu caniatáu. [few] Dim ond { $count } archif sy'n cael eu caniatáu. [many] Dim ond { $count } archif sy'n cael eu caniatáu. *[other] Dim ond { $count } archif sy'n cael eu caniatáu. } expiredTitle = Mae'r ddolen hon wedi dod i ben. notSupportedDescription = Ni fydd { -send-brand } yn gweithio gyda'r porwr hwn. Mae { -send-short-brand } yn gweithio orau gyda'r fersiwn ddiweddaraf o { -firefox }, a bydd yn gweithio gyda'r fersiwn gyfredol o'r rhan fwyaf o borwyr. downloadFirefox = Llwytho { -firefox } i Lawr legalTitle = Hysbysiad Preifatrwydd { -send-short-brand } legalDateStamp = Fersiwn 1.0, dyddiedig Mawrth 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d { $hours } a { $minutes } m addFilesButton = Dewis ffeiliau i'w llwytho i fyny trustWarningMessage = Gwnewch yn siŵr eich bod yn ymddiried yn eich derbynnydd pan yn rhannu data sensitif. uploadButton = Llwytho i fyny # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Llusgo a gollwng ffeiliau # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = neu glicio i anfon hyd at { $size } addPassword = Diogelu gyda chyfrinair emailPlaceholder = Rhowch eich e-bost # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Mewngofnodi i anfon hyd at { $size } signInOnlyButton = Mewngofnodi accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Rhannu ffeiliau hyd at { $size } accountBenefitDownloadCount = Rhannu ffeiliau gyda mwy o bobl accountBenefitTimeLimit = { $count -> [zero] Cadw dolenni'n weithredol am hyd at 0 diwrnod [one] Cadw dolenni'n weithredol am hyd at 1 diwrnod [two] Cadw dolenni'n weithredol am hyd at { $count } diwrnod [few] Cadw dolenni'n weithredol am hyd at { $count } diwrnod [many] Cadw dolenni'n weithredol am hyd at { $count } diwrnod *[other] Cadw dolenni'n weithredol am hyd at { $count } diwrnod } accountBenefitSync = Rheoli ffeiliau sy'n cael eu rhannu o unrhyw ddyfais accountBenefitMoz = Dysgu am wasanaethau eraill { -mozilla } signOut = Allgofnodi okButton = Iawn downloadingTitle = Llwytho i Lawr noStreamsWarning = Efallai na fydd y porwr hwn yn gallu dadgryptio ffeil mor fawr a hon. noStreamsOptionCopy = Copïwch y ddolen i'w agor mewn porwr arall noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr noStreamsOptionDownload = Parhau gyda'r porwr hwn downloadFirefoxPromo = Mae { -send-short-brand } yn cael ei gynnig i ci gan y { -firefox } newydd. # the next line after the colon contains a file name shareLinkDescription = Rhannu'r ddolen i'ch ffeil: shareLinkButton = Rhannu'r ddolen # $name is the name of the file shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel trailheadPromo = Mae ffordd o ddiogelu eich preifatrwydd. Ymunwch â Firefox. learnMore = Dysgu rhagor. downloadFlagged = Mae'r ddolen wedi'i analluogi am fynd yn groes i'r telerau gwasanaeth. downloadConfirmTitle = Un peth arall downloadConfirmDescription = Gwnewch yn siŵr eich bod yn ymddiried yn y person a anfonodd y ffeil hon atoch oherwydd nid ydym yn gallu gwirio na fydd yn niweidio'ch dyfais. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [zero] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma [one] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma [two] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma [few] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma [many] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma *[other] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [zero] Adrodd y { $count } ffeil yma fel rhai amheus [one] Adrodd y { $count } ffeil yma fel un amheus [two] Adrodd y { $count } ffeil yma fel rhai amheus [few] Adrodd y { $count } ffeil yma fel rhai amheus [many] Adrodd y { $count } ffeil yma fel rhai amheus *[other] Adrodd y { $count } ffeil yma fel rhai amheus } reportDescription = Helpwch ni i ddeall beth sy'n digwydd. Beth ydych chi'n meddwl sydd o'i le gyda'r ffeiliau hyn? reportUnknownDescription = Ewch i url y ddolen rydych am adrodd amdani a chlicio “{ reportFile }”. reportButton = Adrodd reportReasonMalware = Mae'r ffeiliau hyn yn cynnwys meddalwedd maleisus neu'n rhan o ymosodiad gwe-rwydo. reportReasonPii = Mae'r ffeiliau hyn yn cynnwys gwybodaeth bersonol adnabyddadwy amdanaf i. reportReasonAbuse = Mae'r ffeiliau hyn yn cynnwys deunydd anghyfreithlon neu ymosodol. reportReasonCopyright = I adrodd ar dorri hawlfraint neu nod masnach, defnyddiwch y broses sy'n cael ei ddisgrifio yn y dudalen hon. reportedTitle = Ffeiliau Adroddwyd Amdanynt reportedDescription = Diolch. Rydym wedi derbyn eich adroddiad ar y ffeiliau hyn. ================================================ FILE: public/locales/da/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importerer… encryptingFile = Krypterer… decryptingFile = Dekrypterer… downloadCount = { $num -> [one] 1 hentning *[other] { $num } hentninger } timespanHours = { $num -> [one] 1 time *[other] { $num } timer } copiedUrl = Kopieret! unlockInputPlaceholder = Adgangskode unlockButtonLabel = Lås op downloadButtonLabel = Hent downloadFinish = Hentning fuldført fileSizeProgress = ({ $partialSize } af { $totalSize }) sendYourFilesLink = Prøv Send errorPageHeader = Der gik noget galt! fileTooBig = Den fil er for stor at uploade. Den skal være mindre end { $size }. linkExpiredAlt = Link er udløbet notSupportedHeader = Din browser understøttes ikke. notSupportedLink = Hvorfor understøttes min browser ikke? notSupportedOutdatedDetail = Desværre understøtter denne version af Firefox ikke den webteknologi, som driver Send. Du skal opdatere din browser. updateFirefox = Opdater Firefox deletePopupCancel = Annuller deleteButtonHover = Slet footerLinkLegal = Juridisk footerLinkPrivacy = Privatliv footerLinkCookies = Cookies passwordTryAgain = Forkert adgangskode. Prøv igen. javascriptRequired = Send kræver JavaScript whyJavascript = Hvorfor kræver Send JavaScript? enableJavascript = Aktiver JavaScript og prøv igen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } t { $minutes } m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } m # A short status message shown when the user enters a long password maxPasswordLength = Maksimum længde af adgangskode: { $length } # A short status message shown when there was an error setting the password passwordSetError = Adgangskoden kunne ikke sættes ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Enkel, privat fildeling introDescription = { -send-brand } gør det muligt at dele filer via et tidsbegrænset link og med end to end-kryptering. På den måde kan du dele filer privat og samtidig være sikker på, at det delte ikke forbliver online for evigt. notifyUploadEncryptDone = Din fil er krypteret og klar til at blive sendt # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Udløber efter { $downloadCount } eller { $timespan } timespanMinutes = { $num -> [one] 1 minut *[other] { $num } minutter } timespanDays = { $num -> [one] 1 dag *[other] { $num } dage } timespanWeeks = { $num -> [one] 1 uge *[other] { $num } uger } fileCount = { $num -> [one] 1 fil *[other] { $num } filer } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Samlet størrelse: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopier linket for at dele din fil: copyLinkButton = Kopier link downloadTitle = Hent filer downloadDescription = Denne fil blev delt via { -send-brand } med end to end-kryptering og et link, der automatisk udløber. trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. # count will always be > 10 tooManyFiles = { $count -> [one] Du kan kun uploade 1 fil ad gangen. *[other] Du kan kun uploade { $count } filer ad gangen. } # count will always be > 10 tooManyArchives = { $count -> [one] Kun 1 arkiv er tilladt. *[other] Kun { $count } arkiver er tilladt. } expiredTitle = Dette link er udløbet. notSupportedDescription = { -send-brand } virker ikke med denne browser. { -send-short-brand } virker bedst med den nyeste version af { -firefox } og med de fleste andre nye browsere. downloadFirefox = Hent { -firefox } legalTitle = { -send-short-brand }, om privatlivspolitik legalDateStamp = Version 1.0, udsendt d. 12. marts 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d. { $hours } t. { $minutes } m. addFilesButton = Vælg filer, der skal uploades trustWarningMessage = Vær sikker på, at du stoler på modtageren, når du deler følsomme data. uploadButton = Upload # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Træk og slip filer # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = eller klik for at sende filer på op til { $size } addPassword = Beskyt med adgangskode emailPlaceholder = Indtast din mailadresse # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Log ind for at sende filer på op til { $size } signInOnlyButton = Log ind accountBenefitTitle = Opret en { -firefox }-konto eller log ind # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Del filer på op til { $size } accountBenefitDownloadCount = Del filer med flere personer accountBenefitTimeLimit = { $count -> [one] Bevar links aktive i op til 1 dag *[other] Bevar links aktive i op til { $count } dage } accountBenefitSync = Håndter delte filer på enhver enhed accountBenefitMoz = Læs om andre tjenester fra { -mozilla } signOut = Log ud okButton = OK downloadingTitle = Henter noStreamsWarning = Denne browser kan muligvis ikke dekryptere en fil, der er så stor. noStreamsOptionCopy = Kopier linket for at åbne det i en anden browser noStreamsOptionFirefox = Prøv vores favorit-browser noStreamsOptionDownload = Fortsæt med denne browser downloadFirefoxPromo = { -send-short-brand } præsenteres af den nye { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Del linket til din fil: shareLinkButton = Del link # $name is the name of the file shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox. learnMore = Læs mere. downloadFlagged = Dette link er blevet deaktiveret for overtrædelse af tjenestevilkårene. downloadConfirmTitle = En ting til downloadConfirmDescription = Vær sikker på, at du stoler på afsenderen af ​​denne fil, da vi ikke kan garantere, at den ikke vil skade din enhed. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Jeg stoler på personen, som sendte denne fil *[other] Jeg stoler på personen, som sendte disse filer } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Rapportér denne fil som mistænkelig *[other] Rapportér disse filer som mistænkelige } reportDescription = Hjælp os med at forstå, hvad der foregår. Hvad er der i vejen med disse filer? reportUnknownDescription = Gå til adressen på det link, du vil rapportere, og klik på “{ reportFile }”. reportButton = Rapportér reportReasonMalware = Disse filer indeholder malware eller er en del af et phishing-angreb. reportReasonPii = Disse filer indeholder oplysninger om mig, der er personligt identificerbare. reportReasonAbuse = Disse filer indeholder ulovligt eller voldeligt indhold. reportReasonCopyright = Hvis du vil rapportere overtrædelse af ophavsrettigheder eller varemærker, skal du bruge processen, som er beskrevet på denne side. reportedTitle = Rapporterede filer reportedDescription = Tak. Vi har modtaget din rapport om disse filer. ================================================ FILE: public/locales/de/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Wird importiert… encryptingFile = Wird verschlüsselt… decryptingFile = Wird entschlüsselt… downloadCount = { $num -> [one] einem Download *[other] { $num } Downloads } timespanHours = { $num -> [one] einer Stunde *[other] { $num } Stunden } copiedUrl = Kopiert! unlockInputPlaceholder = Passwort unlockButtonLabel = Entsperren downloadButtonLabel = Herunterladen downloadFinish = Download abgeschlossen fileSizeProgress = ({ $partialSize } von { $totalSize }) sendYourFilesLink = Send ausprobieren errorPageHeader = Ein Fehler ist aufgetreten! fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein. linkExpiredAlt = Link abgelaufen notSupportedHeader = Dein Browser wird nicht unterstützt. notSupportedLink = Warum wird mein Browser nicht unterstützt? notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Send basiert. Du musst deinen Browser aktualisieren. updateFirefox = Firefox aktualisieren deletePopupCancel = Abbrechen deleteButtonHover = Löschen footerLinkLegal = Rechtliches footerLinkPrivacy = Datenschutz footerLinkCookies = Cookies passwordTryAgain = Falsches Passwort. Versuche es nochmal. javascriptRequired = Send benötigt JavaScript whyJavascript = Warum benötigt Send JavaScript? enableJavascript = Bitte aktiviere JavaScript und versuche es erneut. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximale Passwortlänge: { $length } # A short status message shown when there was an error setting the password passwordSetError = Dieses Passwort konnte nicht eingerichtet werden ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Einfach und privat Dateien versenden introDescription = Mit { -send-brand } kannst du Dateien sicher mit anderen teilen – mit End-to-End-Verschlüsselung und einem Freigabe-Link, der automatisch abläuft. So bleiben deine geteilten Inhalte privat und du kannst sicherstellen, dass deine Daten nicht für immer im Web herumschwirren. notifyUploadEncryptDone = Deine Datei ist verschlüsselt und zum Senden bereit # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Läuft ab nach { $downloadCount } oder { $timespan } timespanMinutes = { $num -> [one] 1 Minute *[other] { $num } Minuten } timespanDays = { $num -> [one] 1 Tag *[other] { $num } Tage } timespanWeeks = { $num -> [one] 1 Woche *[other] { $num } Wochen } fileCount = { $num -> [one] 1 Datei *[other] { $num } Dateien } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Gesamtgröße: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopiere den Link, um deine Datei zu teilen: copyLinkButton = Link kopieren downloadTitle = Dateien herunterladen downloadDescription = Diese Datei wurde über { -send-brand } mit End-to-End-Verschlüsselung und einem automatisch ablaufenden Link geteilt. trySendDescription = Probiere { -send-brand } aus, um einfach und sicher Dateien zu versenden. # count will always be > 10 tooManyFiles = { $count -> [one] Es kann maximal eine Datei auf einmal hochgeladen werden. *[other] Es können maximal { $count } Dateien auf einmal hochgeladen werden. } # count will always be > 10 tooManyArchives = { $count -> [one] Es ist nur ein Archiv erlaubt. *[other] Es sind nur { $count } Archive erlaubt. } expiredTitle = Dieser Link ist abgelaufen. notSupportedDescription = { -send-brand } funktioniert nicht mit diesem Browser. { -send-short-brand } funktioniert am besten mit der neuesten Version von { -firefox } und funktioniert mit der aktuellen Version der meisten Browser. downloadFirefox = { -firefox } herunterladen legalTitle = Datenschutzerklärung zu { -send-short-brand } legalDateStamp = Version 1.0, Stand 12. März 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Dateien zum Hochladen auswählen trustWarningMessage = Sie sollten dem Empfänger vertrauen, wenn Sie vertrauliche Daten weitergeben. uploadButton = Hochladen # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Dateien per Drag & Drop einfügen # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = oder klicken, um bis zu { $size } zu senden addPassword = Mit Passwort schützen emailPlaceholder = E-Mail-Adresse eingeben # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Melde dich an, um Dateien bis { $size } zu senden signInOnlyButton = Anmelden accountBenefitTitle = Erstelle ein { -firefox }-Konto oder melde dich an # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dateien bis zu { $size } teilen accountBenefitDownloadCount = Teile Dateien mit weiteren Leuten accountBenefitTimeLimit = { $count -> [one] Link bis zu einen Tag lang aktiv halten *[other] Link bis zu { $count } Tage lang aktiv halten } accountBenefitSync = Geteilte Dateien von anderen Geräten aus verwalten accountBenefitMoz = Erfahre mehr über andere { -mozilla }-Dienste signOut = Abmelden okButton = OK downloadingTitle = Wird heruntergeladen… noStreamsWarning = Dieser Browser kann eine so große Datei möglicherweise nicht entschlüsseln. noStreamsOptionCopy = Kopiere den Link, um ihn in einem anderen Browser zu öffnen noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus noStreamsOptionDownload = Mit diesem Browser weitermachen downloadFirefoxPromo = { -send-short-brand } wird Ihnen präsentiert vom brandneuen { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Teilen Sie den Link zu Ihrer Datei: shareLinkButton = Link teilen # $name is the name of the file shareMessage = Laden Sie „{ $name }“ mit { -send-brand } herunter: einfaches, sicheres Teilen von Dateien trailheadPromo = Es gibt einen Weg, deine Privatsphäre zu schützen. Komm zu Firefox. learnMore = Mehr erfahren. downloadFlagged = Dieser Link wurde wegen Verstoßes gegen die Nutzungsbedingungen deaktiviert. downloadConfirmTitle = Eine Sache noch downloadConfirmDescription = Sie sollten dem Absender dieser Datei vertrauen, da wir nicht überprüfen können, ob Ihr Gerät dadurch beschädigt wird. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Ich vertraue der Person, die diese Datei gesendet hat *[other] Ich vertraue der Person, die diese Dateien gesendet hat } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Diese Datei als verdächtig melden *[other] Diese Dateien als verdächtig melden } reportDescription = Helfen Sie uns mit weiteren Informationen. Wo liegt das Problem bei diesen Dateien? reportUnknownDescription = Bitte besuchen Sie die Adresse des Links, den Sie melden möchten, und klicken Sie auf „{ reportFile }“. reportButton = Melden reportReasonMalware = Diese Dateien enthalten Malware oder sind Teil eines Phishing-Angriffs. reportReasonPii = Diese Dateien enthalten personenbezogene Daten über mich. reportReasonAbuse = Diese Dateien enthalten illegale oder missbräuchliche Inhalte. reportReasonCopyright = Um Urheber- oder Markenrechtsverletzungen zu melden, nutzen Sie bitte das auf dieser Seite beschriebene Verfahren. reportedTitle = Dateien gemeldet reportedDescription = Vielen Dank. Wir haben Ihren Bericht über diese Dateien erhalten. ================================================ FILE: public/locales/dsb/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importěrujo se... encryptingFile = Koděrujo se... decryptingFile = Dešifrěrujo se... downloadCount = { $num -> [one] 1 ześěgnjenje [two] { $num } ześěgnjeni [few] { $num } ześěgnjenja *[other] { $num } ześěgnjenjow } timespanHours = { $num -> [one] 1 góźina [two] { $num } góźinje [few] { $num } góźiny *[other] { $num } góźin } copiedUrl = Kopěrowany! unlockInputPlaceholder = Gronidło unlockButtonLabel = Wótwóriś downloadButtonLabel = Ześěgnuś downloadFinish = Ześěgnjenje dokóńcone fileSizeProgress = ({ $partialSize } z { $totalSize }) sendYourFilesLink = Send wopytaś errorPageHeader = Něco njejo se raźiło! fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś. linkExpiredAlt = Wótkaz spadnjony notSupportedHeader = Waš wobglědowak se njepódpěra. notSupportedLink = Cogodla se mój wobglědowak njepódpěra? notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. updateFirefox = Firefox aktualizěrowaś deletePopupCancel = Pśetergnuś deleteButtonHover = Wulašowaś footerLinkLegal = Pšawniske footerLinkPrivacy = Priwatnosć footerLinkCookies = Cookieje passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz. javascriptRequired = Send JavaScript trjeba whyJavascript = Cogodla Send JavaScript trjeba? enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } góź. { $minutes } min. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min. # A short status message shown when the user enters a long password maxPasswordLength = Maksimalna dłujkosć gronidła: { $length } # A short status message shown when there was an error setting the password passwordSetError = Toś to gronidło njedajo se nastajiś ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Jadnore, priwatne datajowe źělenje introDescription = { -send-brand } wam zmóžnja, dataje z koděrowanim kóńc do kóńca a wótkazom źěliś, kótaryž awtomatiski spadnjo. Tak móžośo źělone wopśimjeśe priwatne źaržaś a zawěsćiś, až waše daty online na pśecej njewóstanu. notifyUploadEncryptDone = Waša dataja jo skoděrowana za słanje # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Spadnjo pó { $downloadCount } abo { $timespan } timespanMinutes = { $num -> [one] { $num } minuta [two] { $num } minuśe [few] { $num } minuty *[other] { $num } minutow } timespanDays = { $num -> [one] { $num } źeń [two] { $num } dnja [few] { $num } dny *[other] { $num } dnjow } timespanWeeks = { $num -> [one] { $num } tyźeń [two] { $num } tyźenja [few] { $num } tyźenje *[other] { $num } tyźenjow } fileCount = { $num -> [one] { $num } dataja [two] { $num } dataji [few] { $num } dataje *[other] { $num } datajow } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Cełkowna wjelikosć: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopěrujśo wótkaz, aby swóju dataju źělił: copyLinkButton = Wótkaz kopěrowaś downloadTitle = Dataje ześěgnuś downloadDescription = Toś ta dataja jo se pśez { -send-brand } z koděrowanim kóńc do kóńca a wótkazom źěliła, kótaryž awtomatiski spadnjo. trySendDescription = Wopytajśo { -send-brand } za jadnore, wěste datajowe źělenje. # count will always be > 10 tooManyFiles = { $count -> [one] Jano { $count } dataja dajo se naraz nagraś. [two] Jano { $count } dataji dajotej se naraz nagraś. [few] Jano { $count } dataje daju se naraz nagraś. *[other] Jano { $count } datajow dajo se naraz nagraś. } # count will always be > 10 tooManyArchives = { $count -> [one] Jano { $count } archiw jo dowólony. [two] Jano { $count } archiwa stej dowólonej. [few] Jano { $count } archiwy su dowólone. *[other] Jano { $count } archiwow jo dowólone. } expiredTitle = Toś ten wótkaz jo spadnjony. notSupportedDescription = { -send-brand } z toś tym wobglědowakom njefunkcioněrujo. { -send-short-brand } nejlěpjej z nejnowšeju wersiju { -firefox } funkcioněrujo, a funkcioněrujo z aktualneju wersiju nejwěcej wobglědowakow. downloadFirefox = { -firefox } ześěgnuś legalTitle = Powěźeńka priwatnosći { -send-short-brand } legalDateStamp = Wersija 1.0 wót 12. měrca 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }ź { $hours }g { $minutes }m addFilesButton = Dataje za nagrawanje wubraś trustWarningMessage = Wy měł dostawarjeju dowěriś, gaž sensibelne daty źěliśo. uploadButton = Nagraś # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Śěgniśo a wótpołožćo dataje # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = abo klikniśo, aby do { $size } pósłał addPassword = Z gronidłom šćitaś emailPlaceholder = Zapódajśo swóju e-mailowu adresu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Pśizjawśo se, aby do { $size } pósłał signInOnlyButton = Pśizjawiś accountBenefitTitle = Załožćo konto { -firefox } abo pśizjawśo se # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dataje do { $size } źěliś accountBenefitDownloadCount = Dataje z wěcej luźimi źěliś accountBenefitTimeLimit = { $count -> [one] Wótkaze do { $count } dnja aktiwne źaržaś [two] Wótkaze do { $count } dnjowu aktiwne źaržaś [few] Wótkaze do { $count } dnjow aktiwne źaržaś *[other] Wótkaze do { $count } dnjow aktiwne źaržaś } accountBenefitSync = Źělone dataje z někakego rěda zastojaś accountBenefitMoz = Zgóńśo wěcej wó drugich słužbach { -mozilla } signOut = Wótzjawiś okButton = W pórěźe downloadingTitle = Ześěgujo se noStreamsWarning = Toś ten wobglědowak njamógał taku wjeliku dataju dešifrěrowaś. noStreamsOptionCopy = Kopěrujśo wótkaz, aby jen w drugim wobglědowaku wócynił noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak noStreamsOptionDownload = Z toś tym wobglědowakom pókšacowaś downloadFirefoxPromo = { -send-short-brand } se wam pśez cele nowy { -firefox } pśinjaso. # the next line after the colon contains a file name shareLinkDescription = Źělśo wótkaz k swójej dataji: shareLinkButton = Wótkaz źěliś # $name is the name of the file shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow trailheadPromo = Jo móžnosć, wašu priwatnosć šćitaś. Pśiźćo k Firefox. learnMore = Dalšne informacije. downloadFlagged = Toś ten wótkaz jo se znjemóžnił pśestupjenja wužywańskich wuměnjenjow dla. downloadConfirmTitle = Jadna wěc hyšći downloadConfirmDescription = Wy měł wótpósłarjeju toś teje dataje dowěriś, dokulaž njamóžomy pśeglědaś, lěc to waš rěd kazy. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Dowěrim wósobje, kótaraž jo pósłała toś tu dataju [two] Dowěrim wósobje, kótaraž jo pósłała toś tej dataji [few] Dowěrim wósobje, kótaraž jo pósłała toś te dataje *[other] Dowěrim wósobje, kótaraž jo pósłała toś te dataje } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Toś tu dataju ako suspektnu k wěsći daś [two] Toś tej dataji ako suspektnej k wěsći daś [few] Toś te dataje ako suspektne k wěsći daś *[other] Toś te dataje ako suspektne k wěsći daś } reportDescription = Pomagajśo nam rozumić, co se stawa. Co pó wašom měnjenju njejo w pórědku z toś tymi datajami? reportUnknownDescription = Źiśo pšosym k URL wótkaza, kótaryž cośo k wěsći daś a klikniśo na „{ reportFile }“. reportButton = K wěsći daś reportReasonMalware = Toś te dataje škódnu softwaru wopśimuju abo su źěl napada kšadnjenja datow. reportReasonPii = Toś te dataje wósobinske informacije wó mnje, kótarež mógu mě identificěrowaś. reportReasonAbuse = Toś te dataje njedowólone abo ranjece wopśimjeśe wopśimuju. reportReasonCopyright = Aby pśestupjenje awtorskego pšawa abo pšawa wikowwych markow k wěsći dał, wužywajśo póstupowanje, kótarež se na toś tom boku wopisujo. reportedTitle = Dataje k wěsći dane reportedDescription = Wjeliki źěk. Smy dostali wašu rozpšawu wó toś tych datajach. ================================================ FILE: public/locales/el/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Εισαγωγή… encryptingFile = Κρυπτογράφηση… decryptingFile = Αποκρυπτογράφηση… downloadCount = { $num -> [one] 1 λήψη *[other] { $num } λήψεις } timespanHours = { $num -> [one] 1 ώρα *[other] { $num } ώρες } copiedUrl = Αντιγράφτηκε! unlockInputPlaceholder = Κωδικός πρόσβασης unlockButtonLabel = Ξεκλείδωμα downloadButtonLabel = Λήψη downloadFinish = Η λήψη ολοκληρώθηκε fileSizeProgress = ({ $partialSize } από { $totalSize }) sendYourFilesLink = Δοκιμάστε το Send errorPageHeader = Κάτι πήγε στραβά! fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }. linkExpiredAlt = Ο σύνδεσμος έληξε notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται. notSupportedLink = Γιατί δεν υποστηρίζεται το πρόγραμμα περιήγησής μου; notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας. updateFirefox = Ενημέρωση Firefox deletePopupCancel = Ακύρωση deleteButtonHover = Διαγραφή footerLinkLegal = Νομικά footerLinkPrivacy = Απόρρητο footerLinkCookies = Cookies passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά. javascriptRequired = Το Send απαιτεί JavaScript whyJavascript = Γιατί το Send απαιτεί JavaScript; enableJavascript = Παρακαλώ ενεργοποιήστε το JavaScript και δοκιμάστε ξανά. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ώ { $minutes }λ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }λ # A short status message shown when the user enters a long password maxPasswordLength = Μέγιστο μήκος κωδικού: { $length } # A short status message shown when there was an error setting the password passwordSetError = Δεν ήταν δυνατός ο ορισμός αυτού του κωδικού ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Απλή, ιδιωτική κοινή χρήση αρχείων introDescription = Το { -send-brand } σάς επιτρέπει να μοιράζεστε αρχεία με από άκρη σε άκρη κρυπτογράφηση και ένα σύνδεσμο που λήγει αυτόματα. Έτσι, ό,τι μοιράζεστε παραμένει ιδιωτικό και είστε βέβαιοι πως δεν παραμένει στο διαδίκτυο για πάντα. notifyUploadEncryptDone = Το αρχείο σας έχει κρυπτογραφηθεί και είναι έτοιμο για αποστολή # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Λήγει μετά από { $downloadCount } ή { $timespan } timespanMinutes = { $num -> [one] 1 λεπτό *[other] { $num } λεπτά } timespanDays = { $num -> [one] 1 ημέρα *[other] { $num } ημέρες } timespanWeeks = { $num -> [one] 1 εβδομάδα *[other] { $num } εβδομάδες } fileCount = { $num -> [one] 1 αρχείο *[other] { $num } αρχεία } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Συνολικό μέγεθος: { $size } # the next line after the colon contains a file name copyLinkDescription = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο: copyLinkButton = Αντιγραφή συνδέσμου downloadTitle = Λήψη αρχείων downloadDescription = Αυτό το αρχείο διαμοιράστηκε μέσω του { -send-brand } με κρυπτογράφηση από άκρο σε άκρο και με ένα σύνδεσμο που λήγει αυτόματα. trySendDescription = Δοκιμάστε το { -send-brand } για απλό, ασφαλή διαμοιρασμό αρχείων. # count will always be > 10 tooManyFiles = { $count -> [one] Μόνο 1 αρχείο μπορεί να μεταφορτωθεί κάθε φορά. *[other] Μόνο { $count } αρχεία μπορούν να μεταφορτωθούν κάθε φορά. } # count will always be > 10 tooManyArchives = { $count -> [one] Μόνο 1 αρχείο επιτρέπεται. *[other] Μόνο { $count } αρχεία επιτρέπονται. } expiredTitle = Αυτός ο σύνδεσμος έχει λήξει. notSupportedDescription = Το { -send-brand } δεν θα λειτουργήσει με αυτό το πρόγραμμα περιήγησης. Το { -send-short-brand } λειτουργεί καλύτερα με την πιο πρόσφατη έκδοση του { -firefox }, καθώς και με την τρέχουσα έκδοση των περισσότερων προγραμμάτων περιήγησης. downloadFirefox = Λήψη του { -firefox } legalTitle = Σημείωση Απορρήτου { -send-short-brand } legalDateStamp = Έκδοση 1.0, από 12 Μαρτίου 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }η { $hours }ώ { $minutes }λ addFilesButton = Επιλέξτε αρχεία για μεταφόρτωση trustWarningMessage = Βεβαιωθείτε ότι ο παραλήπτης είναι έμπιστος πριν μοιραστείτε ευαίσθητα δεδομένα. uploadButton = Μεταφόρτωση # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Σύρετε και εναποθέστε αρχεία # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ή κάντε κλικ για να στείλετε μέχρι { $size } addPassword = Προστασία με κωδικό πρόσβασης emailPlaceholder = Εισάγετε το email σας # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size } signInOnlyButton = Σύνδεση accountBenefitTitle = Δημιουργία λογαριασμού { -firefox } ή σύνδεση # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Μοιραστείτε αρχεία έως { $size } accountBenefitDownloadCount = Μοιραστείτε αρχεία με περισσότερα άτομα accountBenefitTimeLimit = { $count -> [one] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και 1 ημέρα *[other] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και { $count } ημέρες } accountBenefitSync = Διαχειριστείτε τα διαμοιρασμένα αρχεία από οποιαδήποτε συσκευή accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla } signOut = Αποσύνδεση okButton = OK downloadingTitle = Γίνεται λήψη noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους. noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης downloadFirefoxPromo = Το { -send-short-brand } παρέχεται σε εσάς από το ολοκαίνουριο { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρχείου σας: shareLinkButton = Κοινή χρήση συνδέσμου # $name is the name of the file shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox. learnMore = Μάθετε περισσότερα. downloadFlagged = Αυτός ο σύνδεσμος έχει απενεργοποιηθεί λόγω παραβίασης των όρων υπηρεσίας. downloadConfirmTitle = Κάτι ακόμα downloadConfirmDescription = Βεβαιωθείτε ότι το αρχείο προέρχεται από έμπιστο άτομο, καθώς δεν μπορούμε να επαληθεύσουμε ότι δεν θα βλάψει τη συσκευή σας. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Εμπιστεύομαι το άτομο που έστειλε το αρχείο *[other] Εμπιστεύομαι το άτομο που έστειλε τα αρχεία } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Αναφορά ύποπτου αρχείου *[other] Αναφορά ύποπτων αρχείων } reportDescription = Βοηθήστε μας να καταλάβουμε τι συμβαίνει. Τι νομίζετε ότι δεν πάει καλά με αυτά τα αρχεία; reportUnknownDescription = Παρακαλούμε μεταβείτε στο URL του συνδέσμου που θέλετε να αναφέρετε και κάντε κλικ στο "{ reportFile }". reportButton = Αναφορά reportReasonMalware = Αυτά τα αρχεία περιέχουν κακόβουλο λογισμικό ή αποτελούν μέρος μιας επίθεσης ηλεκτρονικού ψαρέματος. reportReasonPii = Αυτά τα αρχεία περιέχουν προσωπικές μου πληροφορίες ταυτοποίησης. reportReasonAbuse = Αυτά τα αρχεία περιέχουν παράνομο ή καταχρηστικό περιεχόμενο. reportReasonCopyright = Για να αναφέρετε παραβίαση πνευματικών δικαιωμάτων ή εμπορικών σημάτων, χρησιμοποιήστε τη διαδικασία που περιγράφεται σε αυτή τη σελίδα. reportedTitle = Έγινε αναφορά των αρχείων reportedDescription = Σας ευχαριστούμε. Λάβαμε την αναφορά σας για τα αρχεία. ================================================ FILE: public/locales/en-CA/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importing… encryptingFile = Encrypting… decryptingFile = Decrypting… downloadCount = { $num -> [one] 1 download *[other] { $num } downloads } timespanHours = { $num -> [one] 1 hour *[other] { $num } hours } copiedUrl = Copied! unlockInputPlaceholder = Password unlockButtonLabel = Unlock downloadButtonLabel = Download downloadFinish = Download Complete fileSizeProgress = ({ $partialSize } of { $totalSize }) sendYourFilesLink = Try Send errorPageHeader = Something went wrong! fileTooBig = That file is too big to upload. It should be less than { $size }. linkExpiredAlt = Link expired notSupportedHeader = Your browser is not supported. notSupportedLink = Why is my browser not supported? notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. updateFirefox = Update Firefox deletePopupCancel = Cancel deleteButtonHover = Delete footerLinkLegal = Legal footerLinkPrivacy = Privacy footerLinkCookies = Cookies passwordTryAgain = Incorrect password. Try again. javascriptRequired = Send requires JavaScript whyJavascript = Why does Send require JavaScript? enableJavascript = Please enable JavaScript and try again. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximum password length: { $length } # A short status message shown when there was an error setting the password passwordSetError = This password could not be set ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Simple, private file sharing introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. notifyUploadEncryptDone = Your file is encrypted and ready to send # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } timespanMinutes = { $num -> [one] 1 minute *[other] { $num } minutes } timespanDays = { $num -> [one] 1 day *[other] { $num } days } timespanWeeks = { $num -> [one] 1 week *[other] { $num } weeks } fileCount = { $num -> [one] 1 file *[other] { $num } files } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total size: { $size } # the next line after the colon contains a file name copyLinkDescription = Copy the link to share your file: copyLinkButton = Copy link downloadTitle = Download files downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. trySendDescription = Try { -send-brand } for simple, safe file sharing. # count will always be > 10 tooManyFiles = { $count -> [one] Only 1 file can be uploaded at a time. *[other] Only { $count } files can be uploaded at a time. } # count will always be > 10 tooManyArchives = { $count -> [one] Only 1 archive is allowed. *[other] Only { $count } archives are allowed. } expiredTitle = This link has expired. notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. downloadFirefox = Download { -firefox } legalTitle = { -send-short-brand } Privacy Notice legalDateStamp = Version 1.0, dated March 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Select files to upload trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. uploadButton = Upload # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Drag and drop files # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = or click to send up to { $size } addPassword = Protect with password emailPlaceholder = Enter your email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Sign in to send up to { $size } signInOnlyButton = Sign in accountBenefitTitle = Create a { -firefox } Account or sign in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Share files up to { $size } accountBenefitDownloadCount = Share files with more people accountBenefitTimeLimit = { $count -> [one] Keep links active for up to 1 day *[other] Keep links active for up to { $count } days } accountBenefitSync = Manage shared files from any device accountBenefitMoz = Learn about other { -mozilla } services signOut = Sign out okButton = OK downloadingTitle = Downloading noStreamsWarning = This browser might not be able to decrypt a file this big. noStreamsOptionCopy = Copy the link to open in another browser noStreamsOptionFirefox = Try our favourite browser noStreamsOptionDownload = Continue with this browser downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Share the link to your file: shareLinkButton = Share link # $name is the name of the file shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing trailheadPromo = There is a way to protect your privacy. Join Firefox. learnMore = Learn more. downloadFlagged = This link has been disabled for violating the terms of service. downloadConfirmTitle = One more thing downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] I trust the person who sent this file *[other] I trust the person who sent these files } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Report this file as suspicious *[other] Report these files as suspicious } reportDescription = Help us understand what’s going on. What do you think is wrong with these files? reportUnknownDescription = Please go to the URL of the link you wish to report and click “{ reportFile }”. reportButton = Report reportReasonMalware = These files contain malware or are part of a phishing attack. reportReasonPii = These files contain personally identifiable information about me. reportReasonAbuse = These files contain illegal or abusive content. reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. reportedTitle = Files Reported reportedDescription = Thank you. We have received your report on these files. ================================================ FILE: public/locales/en-GB/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importing… encryptingFile = Encrypting… decryptingFile = Decrypting… downloadCount = { $num -> [one] 1 download *[other] { $num } downloads } timespanHours = { $num -> [one] 1 hour *[other] { $num } hours } copiedUrl = Copied! unlockInputPlaceholder = Password unlockButtonLabel = Unlock downloadButtonLabel = Download downloadFinish = Download Complete fileSizeProgress = ({ $partialSize } of { $totalSize }) sendYourFilesLink = Try Send errorPageHeader = Something went wrong! fileTooBig = That file is too big to upload. It should be less than { $size }. linkExpiredAlt = Link expired notSupportedHeader = Your browser is not supported. notSupportedLink = Why is my browser not supported? notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. updateFirefox = Update Firefox deletePopupCancel = Cancel deleteButtonHover = Delete footerLinkLegal = Legal footerLinkPrivacy = Privacy footerLinkCookies = Cookies passwordTryAgain = Incorrect password. Try again. javascriptRequired = Send requires JavaScript whyJavascript = Why does Send require JavaScript? enableJavascript = Please enable JavaScript and try again. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximum password length: { $length } # A short status message shown when there was an error setting the password passwordSetError = This password could not be set ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Simple, private file sharing introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. notifyUploadEncryptDone = Your file is encrypted and ready to send # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } timespanMinutes = { $num -> [one] 1 minute *[other] { $num } minutes } timespanDays = { $num -> [one] 1 day *[other] { $num } days } timespanWeeks = { $num -> [one] 1 week *[other] { $num } weeks } fileCount = { $num -> [one] 1 file *[other] { $num } files } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total size: { $size } # the next line after the colon contains a file name copyLinkDescription = Copy the link to share your file: copyLinkButton = Copy link downloadTitle = Download files downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. trySendDescription = Try { -send-brand } for simple, safe file sharing. # count will always be > 10 tooManyFiles = { $count -> [one] Only 1 file can be uploaded at a time. *[other] Only { $count } files can be uploaded at a time. } # count will always be > 10 tooManyArchives = { $count -> [one] Only 1 archive is allowed. *[other] Only { $count } archives are allowed. } expiredTitle = This link has expired. notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. downloadFirefox = Download { -firefox } legalTitle = { -send-short-brand } Privacy Notice legalDateStamp = Version 1.0, dated March 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Select files to upload trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. uploadButton = Upload # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Drag and drop files # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = or click to send up to { $size } addPassword = Protect with password emailPlaceholder = Enter your email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Sign in to send up to { $size } signInOnlyButton = Sign in accountBenefitTitle = Create a { -firefox } Account or sign in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Share files up to { $size } accountBenefitDownloadCount = Share files with more people accountBenefitTimeLimit = { $count -> [one] Keep links active for up to 1 day *[other] Keep links active for up to { $count } days } accountBenefitSync = Manage shared files from any device accountBenefitMoz = Learn about other { -mozilla } services signOut = Sign out okButton = OK downloadingTitle = Downloading noStreamsWarning = This browser might not be able to decrypt a file this big. noStreamsOptionCopy = Copy the link to open in another browser noStreamsOptionFirefox = Try our favourite browser noStreamsOptionDownload = Continue with this browser downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Share the link to your file: shareLinkButton = Share link # $name is the name of the file shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing trailheadPromo = There is a way to protect your privacy. Join Firefox. learnMore = Learn more. downloadFlagged = This link has been disabled for violating the terms of service. downloadConfirmTitle = One more thing downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] I trust the person who sent this file *[other] I trust the person who sent these files } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Report this file as suspicious *[other] Report these files as suspicious } reportDescription = Help us understand what’s going on. What do you think is wrong with these files? reportUnknownDescription = Please go to the url of the link you wish to report and click “{ reportFile }”. reportButton = Report reportReasonMalware = These files contain malware or are part of a phishing attack. reportReasonPii = These files contain personally identifiable information about me. reportReasonAbuse = These files contain illegal or abusive content. reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. reportedTitle = Files Reported reportedDescription = Thank you. We have received your report on these files. ================================================ FILE: public/locales/en-US/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importing… encryptingFile = Encrypting… decryptingFile = Decrypting… downloadCount = { $num -> [one] 1 download *[other] { $num } downloads } timespanHours = { $num -> [one] 1 hour *[other] { $num } hours } copiedUrl = Copied! unlockInputPlaceholder = Password unlockButtonLabel = Unlock downloadButtonLabel = Download downloadFinish = Download complete fileSizeProgress = ({ $partialSize } of { $totalSize }) sendYourFilesLink = Try Send errorPageHeader = Something went wrong! fileTooBig = That file is too big to upload. It should be less than { $size } linkExpiredAlt = Link expired notSupportedHeader = Your browser is not supported. notSupportedLink = Why is my browser not supported? notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. updateFirefox = Update Firefox deletePopupCancel = Cancel deleteButtonHover = Delete footerLinkLegal = Legal footerLinkPrivacy = Privacy footerLinkCookies = Cookies passwordTryAgain = Incorrect password. Try again. javascriptRequired = Send requires JavaScript whyJavascript = Why does Send require JavaScript? enableJavascript = Please enable JavaScript and try again. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximum password length: { $length } # A short status message shown when there was an error setting the password passwordSetError = This password could not be set ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Simple, private file sharing introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. notifyUploadEncryptDone = Your file is encrypted and ready to send # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } timespanMinutes = { $num -> [one] 1 minute *[other] { $num } minutes } timespanDays = { $num -> [one] 1 day *[other] { $num } days } timespanWeeks = { $num -> [one] 1 week *[other] { $num } weeks } fileCount = { $num -> [one] 1 file *[other] { $num } files } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total size: { $size } # the next line after the colon contains a file name copyLinkDescription = Copy the link to share your file: copyLinkButton = Copy link downloadTitle = Download files downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. trySendDescription = Try { -send-brand } for simple, safe file sharing. # count will always be > 10 tooManyFiles = { $count -> [one] Only 1 file can be uploaded at a time. *[other] Only { $count } files can be uploaded at a time. } # count will always be > 10 tooManyArchives = { $count -> [one] Only 1 archive is allowed. *[other] Only { $count } archives are allowed. } expiredTitle = This link has expired. notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. downloadFirefox = Download { -firefox } legalTitle = { -send-short-brand } Privacy Notice legalDateStamp = Version 1.0, dated March 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Select files to upload trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. uploadButton = Upload # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Drag and drop files # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = or click to send up to { $size } addPassword = Protect with password emailPlaceholder = Enter your email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Sign in to send up to { $size } signInOnlyButton = Sign in accountBenefitTitle = Create a { -firefox } Account or sign in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Share files up to { $size } accountBenefitDownloadCount = Share files with more people accountBenefitTimeLimit = { $count -> [one] Keep links active for up to 1 day *[other] Keep links active for up to { $count } days } accountBenefitSync = Manage shared files from any device accountBenefitMoz = Learn about other { -mozilla } services signOut = Sign out okButton = OK downloadingTitle = Downloading noStreamsWarning = This browser might not be able to decrypt a file this big. noStreamsOptionCopy = Copy the link to open in another browser noStreamsOptionFirefox = Try our favorite browser noStreamsOptionDownload = Continue with this browser downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Share the link to your file: shareLinkButton = Share link # $name is the name of the file shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing trailheadPromo = There is a way to protect your privacy. Join Firefox. learnMore = Learn more. downloadFlagged = This link has been disabled for violating the terms of service. downloadConfirmTitle = One more thing downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] I trust the person who sent this file *[other] I trust the person who sent these files } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Report this file as suspicious *[other] Report these files as suspicious } reportDescription = Help us understand what’s going on. What do you think is wrong with these files? reportUnknownDescription = Please go to the url of the link you wish to report and click “{ reportFile }”. reportButton = Report reportReasonMalware = These files contain malware or are part of a phishing attack. reportReasonPii = These files contain personally identifiable information about me. reportReasonAbuse = These files contain illegal or abusive content. reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. reportedTitle = Files Reported reportedDescription = Thank you. We have received your report on these files. ================================================ FILE: public/locales/es-AR/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importando… encryptingFile = Cifrando… decryptingFile = Descifrando… downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargas } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = ¡Copiado! unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear downloadButtonLabel = Descargar downloadFinish = Descarga completa fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Probá Send errorPageHeader = ¡Algo falló! fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }. linkExpiredAlt = Enlace explirado notSupportedHeader = El navegador no está soportado. notSupportedLink = ¿Por qué mi navegador no está soportado? notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Send. Necesitás actualizar el navegador. updateFirefox = Actualizar Firefox deletePopupCancel = Cancelar deleteButtonHover = Borrar footerLinkLegal = Legales footerLinkPrivacy = Privacidad footerLinkCookies = Cookies passwordTryAgain = Contraseña incorrecta. Intentá nuevamente. javascriptRequired = Send requiere JavaScript whyJavascript = ¿Por qué Send requiere Java Script? enableJavascript = Por favor habilite JavaScript y pruebe de nuevo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = h { $hours } m { $minutes } # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = m { $minutes } # A short status message shown when the user enters a long password maxPasswordLength = Longitud máxima de la contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = No se pudo establecer la contraseña ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Intercambio de archivos sencillo y privado introDescription = { -send-brand } le permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puede mantener privado lo que comparte y asegurarse de que sus cosas no permanezcan en línea para siempre. notifyUploadEncryptDone = Su archivo está cifrado y listo para enviar # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Vence después de { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 file *[other] { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamaño total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiar el enlace para compartir su archivo: copyLinkButton = Copiar enlace downloadTitle = Descargar archivos downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. trySendDescription = Pruebe { -send-brand } para compartir archivos de forma sencilla y segura. # count will always be > 10 tooManyFiles = { $count -> [one] Solo se puede subir 1 archivo a la vez. *[other] Solo se pueden subir archivos { $count } a la vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Solo se permite 1 archivo. *[other] Solo se permiten { $count } archivos. } expiredTitle = Este enlace caducó. notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funcionará con la versión actual de la mayoría de los navegadores. downloadFirefox = Descargue { -firefox } legalTitle = Aviso de privacidad de { -send-short-brand } legalDateStamp = Versión 1.0, con fecha 12 de marzo de 2019. # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Seleccionar archivos para subir trustWarningMessage = Asegurate de que confiás en tu destinatario cuando compartís datos confidenciales. uploadButton = Subir # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastrar y soltar archivos # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o haga clic para enviar hasta { $size } addPassword = Proteger con contraseña emailPlaceholder = Ingrese su correo electrónico # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Inicie sesión para enviar hasta { $size } signInOnlyButton = Iniciar sesión accountBenefitTitle = Cree una cuenta de { -firefox } o inicie la sesión # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartir archivos hasta { $size } accountBenefitDownloadCount = Compartir archivos con más personas accountBenefitTimeLimit = { $count -> [one] Mantenga los enlaces activos hasta por 1 día *[other] Mantenga los enlaces activos hasta por { $count } días } accountBenefitSync = Administre archivos compartidos desde cualquier dispositivo. accountBenefitMoz = Conocer sobre otros servicios de { -mozilla } signOut = Salir okButton = Aceptar downloadingTitle = Descargando noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador. noStreamsOptionFirefox = Pruebe nuestro navegador favorito noStreamsOptionDownload = Continuar con este navegador downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Compartir el enlace con tu dispositivo: shareLinkButton = Compartir el enlace # $name is the name of the file shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura trailheadPromo = Hay una forma de proteger tu privacidad. Unite a Firefox. learnMore = Conocer más. downloadFlagged = Este enlace fue deshabilitado por violar los términos del servicio. downloadConfirmTitle = Una cosa más downloadConfirmDescription = Asegurate de confiar en la persona que te envió este archivo porque no podemos verificar que no va a dañar tu dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Confío en la persona que envió este archivo *[other] Confío en la persona que envió estos archivos } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Denunciar este archivo como sospechoso *[other] Denunciar estos archivos como sospechosos } reportDescription = Ayudanos a entender lo que está pasando. ¿Qué creés que está mal con estos archivos? reportUnknownDescription = Navegá a la url del enlace que querés denunciar y hacé clic en "{ reportFile }". reportButton = Denunciar reportReasonMalware = Estos archivos contienen programas dañinos o son parte de un fraude electrónico. reportReasonPii = Estos archivos contienen información personal que me puede identificar. reportReasonAbuse = Estos archivos contienen contenido ilegal o abusivo. reportReasonCopyright = Para denunciar una infracción de derechos de autor o de marca registrada, seguí el proceso descrito en esta página. reportedTitle = Archivos denunciados reportedDescription = Gracias. Recibimos tu denuncia sobre estos archivos. ================================================ FILE: public/locales/es-CL/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importando… encryptingFile = Cifrando… decryptingFile = Descifrando… downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargas } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = ¡Copiado! unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear downloadButtonLabel = Descargar downloadFinish = Descarga completa fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Probar Send errorPageHeader = ¡Algo se fue a las pailas! fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }. linkExpiredAlt = Enlace expirado notSupportedHeader = Tu navegador no está soportado. notSupportedLink = ¿Por qué mi navegador no es soportado? notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox deletePopupCancel = Cancelar deleteButtonHover = Eliminar footerLinkLegal = Legal footerLinkPrivacy = Privacidad footerLinkCookies = Cookies passwordTryAgain = Contraseña incorrecta. Vuelve a intentarlo. javascriptRequired = Send requiere JavaScript. whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Longitud máxima de la contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = Esta contraseña no pudo ser establecida ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Intercambio de archivos simple y privado introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que expira automáticamente. Así puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 archivo *[other] { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamaño total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiar el enlace para compartir el archivo: copyLinkButton = Copiar enlace downloadTitle = Bajando archivos downloadDescription = Este archivo fue compartido a través de { -send-brand } con cifrado de punto a punto y un enlace que expira automáticamente. trySendDescription = Prueba { -send-brand } para compartir archivos de forma simple y segura. # count will always be > 10 tooManyFiles = { $count -> [one] Solo 1 archivo puede ser subido a la vez. *[other] Solo { $count } archivos pueden ser subidos a la vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Solo 1 archivo está permitido. *[other] Solo { $count } archivos están permitidos. } expiredTitle = Este enlace ha expirado. notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox } y con la versión actual de la mayoría de los navegadores. downloadFirefox = Bajar { -firefox } legalTitle = Aviso de privacidad de { -send-short-brand } legalDateStamp = Versión 1.0 del 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Selecciona los archivos a subir trustWarningMessage = Asegúrate de que confías en tu destinatario cuando compartas datos sensibles. uploadButton = Subir # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastra y suelta archivos # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o haz clic para enviar hasta { $size } addPassword = Protegido con contraseña emailPlaceholder = Ingresa tu correo # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Conéctate para enviar hasta { $size } signInOnlyButton = Conectarse accountBenefitTitle = Crea una cuenta de { -firefox } o conéctate # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Comparte archivos de hasta { $size } accountBenefitDownloadCount = Comparte archivos con más personas accountBenefitTimeLimit = { $count -> [one] Mantener enlaces activos durante 1 día *[other] Mantener enlaces activos durante { $count } días } accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo accountBenefitMoz = Aprender más acerca de otros servicios de { -mozilla } signOut = Salir okButton = Aceptar downloadingTitle = Bajando noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador noStreamsOptionFirefox = Prueba nuestro navegador favorito noStreamsOptionDownload = Continuar con este navegador downloadFirefoxPromo = { -send-short-brand } es traído a ti por el renovado { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Comparte el enlace a tu dispositivo: shareLinkButton = Compartir enlace # $name is the name of the file shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura trailheadPromo = Hay una forma de proteger tu privacidad. Únete a Firefox. learnMore = Aprender más. downloadFlagged = Este enlace ha sido deshabilitado por violar los términos del servicio. downloadConfirmTitle = Una cosa más downloadConfirmDescription = Asegúrate de confiar en la persona que te envió este archivo porque no podemos verificar que no dañará tu dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Confío en la persona que envió es archivo *[other] Confío en la persona que envió estos archivos } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Reportar este archivo como sospechoso *[other] Reportar estos archivos como sospechosos } reportDescription = Ayúdanos a entender lo que está pasando. ¿Qué crees que está mal con estos archivos? reportUnknownDescription = Por favor, ve a la url del enlace que quieres reportar y haz clic en "{ reportFile }". reportButton = Reportar reportReasonMalware = Estos archivos contienen malware o son parte de un ataque de phishing. reportReasonPii = Estos archivos contienen información personal identificable sobre mí. reportReasonAbuse = Estos archivos contienen contenido ilegal o abusivo. reportReasonCopyright = Para denunciar una infracción de derechos de autor o de marca registrada, sigue el proceso descrito en esta página. reportedTitle = Archivos reportados reportedDescription = Gracias. Hemos recibido tu reporte sobre estos archivos. ================================================ FILE: public/locales/es-ES/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importando... encryptingFile = Cifrando... decryptingFile = Descifrando... downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargas } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = ¡Copiado! unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear downloadButtonLabel = Descargar downloadFinish = Descarga completa fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Prueba Send errorPageHeader = ¡Se ha producido un error! fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado notSupportedHeader = Tu navegador no es compatible. notSupportedLink = ¿Por qué mi navegador no es compatible? notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Send. Tendrás que actualizar tu navegador. updateFirefox = Actualizar Firefox deletePopupCancel = Cancelar deleteButtonHover = Eliminar footerLinkLegal = Legal footerLinkPrivacy = Privacidad footerLinkCookies = Cookies passwordTryAgain = Contraseña incorrecta. Inténtalo de nuevo. javascriptRequired = Send requiere JavaScript whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Longitud máxima de la contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = No se ha podido establecer la contraseña ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Enviar -firefox = Firefox -mozilla = Mozilla introTitle = Compartir archivos de forma sencilla y privada introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así que puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. notifyUploadEncryptDone = El archivo está cifrado y listo para enviar # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Caduca tras { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 archivo *[other] { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamaño total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiar el enlace para compartir el archivo: copyLinkButton = Copiar enlace downloadTitle = Descargar archivos downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. trySendDescription = Prueba { -send-brand } para compartir archivos de forma sencilla y segura. # count will always be > 10 tooManyFiles = { $count -> [one] Solo se puede subir 1 archivo a la vez. *[other] Solo se pueden subir { $count } archivos a la vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Solo se permite 1 archivo. *[other] Solo se permiten { $count } archivos. } expiredTitle = Este enlace ha expirado. notSupportedDescription = { -send-brand } no funciona con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funciona con la última versión de la mayoría de los navegadores. downloadFirefox = Descargar { -firefox } legalTitle = Aviso de privacidad de { -send-short-brand } legalDateStamp = Versión 1.0 del 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Seleccionar archivos para subir trustWarningMessage = Asegúrate de que confías en tu destinatario cuando compartas datos sensibles. uploadButton = Subir # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastrar y soltar archivos # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o hacer clic para enviar hasta { $size } addPassword = Proteger con contraseña emailPlaceholder = Introducir dirección de correo # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Iniciar sesión para enviar hasta { $size } signInOnlyButton = Iniciar sesión accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartir archivos de hasta { $size } accountBenefitDownloadCount = Compartir archivos con más gente accountBenefitTimeLimit = { $count -> [one] Mantener enlaces activos durante 1 día *[other] Mantener enlaces activos durante { $count } días } accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } signOut = Cerrar sesión okButton = Vale downloadingTitle = Descargando noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador noStreamsOptionFirefox = Probar nuestro navegador favorito noStreamsOptionDownload = Continuar en este navegador downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Compartir el enlace a tu archivo: shareLinkButton = Compartir enlace # $name is the name of the file shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla trailheadPromo = Existe la forma de proteger tu privacidad. Únete a Firefox. learnMore = Saber más. downloadFlagged = Este enlace ha sido desactivado por violar los términos del servicio. downloadConfirmTitle = Una cosa más downloadConfirmDescription = Asegúrate de confiar en la persona que te envió este archivo porque no podemos verificar que no va a dañar tu dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Confío en la persona que envió este archivo *[other] Confío en la persona que envió estos archivos } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Denunciar este archivo como sospechoso *[other] Denunciar estos archivos como sospechosos } reportDescription = Ayúdanos a entender lo que está pasando. ¿Qué crees que está mal con estos archivos? reportUnknownDescription = Por favor, ve a la url del enlace que quieres denunciar y haz clic en “{ reportFile }”. reportButton = Denunciar reportReasonMalware = Estos archivos contienen malware o son parte de un ataque de phishing. reportReasonPii = Estos archivos contienen información personal identificable sobre mí. reportReasonAbuse = Estos archivos tienen contenido ilegal o abusivo. reportReasonCopyright = Para denunciar una infracción de derechos de autor o marca registrada, sigue el proceso descrito en esta página. reportedTitle = Archivos denunciados reportedDescription = Gracias. Hemos recibido tu denuncia sobre estos archivos. ================================================ FILE: public/locales/es-MX/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Comentario importingFile = Importando... encryptingFile = Encriptando… decryptingFile = Desencriptando… downloadCount = { $num -> [one] 1 descarga *[other] { $num } descargas } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = ¡Copiado! unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear downloadButtonLabel = Descargar downloadFinish = Descarga completa fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Prueba Send errorPageHeader = ¡Algo salió mal! fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado notSupportedHeader = Tu navegador no está soportado. notSupportedLink = ¿Por qué mi navegador no tiene soporte? notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox deletePopupCancel = Cancelar deleteButtonHover = Eliminar footerLinkLegal = Legal footerLinkPrivacy = Privacidad footerLinkCookies = Cookies passwordTryAgain = Contraseña incorrecta. Intenta de nuevo. javascriptRequired = Send requiere JavaScript whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, habilita JavaScript e intenta de nuevo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Longitud máxima de la contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = No se ha podido establecer la contraseña ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Enviar -firefox = Firefox -mozilla = Mozilla introTitle = Compartir archivos fácil y privado introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puedes mantener en privado lo que compartes y asegurarte de que tus cosas no permanezcan en línea para siempre. notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 archivo *[other] { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamaño total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiar el enlace para compartir el archivo: copyLinkButton = Copiar enlace downloadTitle = Descargar archivos downloadDescription = Este archivo fue compartido vía { -send-brand } con un cifrado de punto a punto y un enlace que expira automáticamente. trySendDescription = Intenta con { -send-brand } para compartir fácil y seguro. # count will always be > 10 tooManyFiles = { $count -> [one] Solo 1 archivo puede ser cargado a la vez. *[other] Solo { $count } archivos pueden ser cargados a la vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Solo 1 archivo está permitido. *[other] Solo { $count } archivos están permitidos. } expiredTitle = Este enlace ha expirado. notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } trabaja mejor que la última versión de { -firefox }, y trabajará con la versión actual de la mayoría de la navegadores. downloadFirefox = Descargar { -firefox } legalTitle = Aviso de privacidad de { -send-short-brand } legalDateStamp = Versión 1.0 del 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Seleccionar archivos para subir uploadButton = Subir # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastrar y soltar archivos # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o hacer clic para enviar hasta { $size } addPassword = Protegido con contraseña emailPlaceholder = Ingresa tu correo electrónico # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Iniciar sesión para enviar hasta { $size } signInOnlyButton = Iniciar sesión accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartir archivos de hasta { $size } accountBenefitDownloadCount = Compartir archivos con más personas accountBenefitTimeLimit = { $count -> [one] Mantener enlaces activos por 1 día *[other] Mantener enlaces activos hasta { $count } días } accountBenefitSync = Administrar archivos compartidos desde cualquier dispositivo accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } signOut = Cerrar sesión okButton = Aceptar downloadingTitle = Descargando noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador noStreamsOptionFirefox = Prueba nuestro navegador favorito noStreamsOptionDownload = Continuar con este navegador downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Comparte el enlace a tu archivo: shareLinkButton = Enlace para compartir # $name is the name of the file shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox. learnMore = Saber más. ================================================ FILE: public/locales/et/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Tagasiside importingFile = Importimine... encryptingFile = Krüptimine… decryptingFile = Dekrüptimine... downloadCount = { $num -> [one] üht allalaadimist *[other] { $num } allalaadimist } timespanHours = { $num -> [one] 1 tunni *[other] { $num } tunni } copiedUrl = Kopeeritud! unlockInputPlaceholder = Parool unlockButtonLabel = Ava downloadButtonLabel = Laadi alla downloadFinish = Allalaadimine lõpetati fileSizeProgress = ({ $partialSize }/{ $totalSize }) sendYourFilesLink = Proovi Send'i errorPageHeader = Midagi läks valesti! fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }. linkExpiredAlt = Link on aegunud notSupportedHeader = Sinu brauser pole toetatud. notSupportedLink = Miks mu brauser toetatud pole? notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama. updateFirefox = Uuenda Firefox deletePopupCancel = Loobu deleteButtonHover = Kustuta footerLinkLegal = Õiguslik teave footerLinkPrivacy = Privaatsusest footerLinkCookies = Küpsistest passwordTryAgain = Vale parool. Palun proovi uuesti. javascriptRequired = Send'i kasutamiseks tuleb JavaScript lubada whyJavascript = Miks Send JavaScripti vajab? enableJavascript = Palun luba JavaScript ja proovi uuesti. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maksimaalne parooli pikkus: { $length } # A short status message shown when there was an error setting the password passwordSetError = Parooli muutmine ebaõnnestus ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Lihtne ja privaatne failijagamine introDescription = { -send-brand } võimaldab sul faile jagada otspunktkrüpteerimise ning automaatselt aeguva lingiga. Nii saad jagatava privaatsena hoida ja kindlustada, et su asjad igavesti internetti vedelema ei jää. notifyUploadEncryptDone = Sinu fail on krüptitud ja saatmiseks valmis # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Aegub peale { $downloadCount } või { $timespan } järel timespanMinutes = { $num -> [one] 1 minuti *[other] { $num } minuti } timespanDays = { $num -> [one] 1 päeva *[other] { $num } päeva } timespanWeeks = { $num -> [one] 1 nädala *[other] { $num } nädala } fileCount = { $num -> [one] 1 fail *[other] { $num } faili } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Kogusuurus: { $size } # the next line after the colon contains a file name copyLinkDescription = Faili jagamiseks kopeeri link: copyLinkButton = Kopeeri link downloadTitle = Failide allalaadimine downloadDescription = See fail jagati teenuse { -send-brand } kaudu otspunktkrüpteeritult ja automaatselt aeguva lingiga. trySendDescription = Proovi lihtsaks ja turvaliseks failijagamiseks { -send-brand } teenust. # count will always be > 10 tooManyFiles = { $count -> [one] Korraga saab üles laadida vaid 1 faili. *[other] Korraga saab üles laadida vaid { $count } faili. } # count will always be > 10 tooManyArchives = { $count -> [one] Vaid 1 arhiveerimine on lubatud. *[other] Vaid { $count } arhiveerimist on lubatud. } expiredTitle = Link on aegunud. notSupportedDescription = { -send-brand } ei tööta selle veebilehitsejaga. Kõige paremini töötab { -send-short-brand } uusima { -firefox }iga ja töötab ka enamikes teistes uuendatud brauserites. downloadFirefox = Laadi { -firefox } alla legalTitle = { -send-short-brand } privaatsusteade legalDateStamp = Versioon 1.0, alates 12. märts 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }p { $hours }t { $minutes }m addFilesButton = Vali failid üleslaadimiseks uploadButton = Laadi üles # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Lohista failid siia # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = või klõpsa kuni { $size } suuruste failide saatmiseks addPassword = Kaitse parooliga emailPlaceholder = Sisesta e-posti aadress # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Logi sisse ning saad saata kuni { $size } suuruseid faile signInOnlyButton = Logi sisse accountBenefitTitle = Loo { -firefox }i konto või logi sisse # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Jaga kuni { $size } suuruseid faile accountBenefitDownloadCount = Jaga faile enamate inimestega accountBenefitTimeLimit = { $count -> [one] Hoia linke aktiivsena 1 päev *[other] Hoia linke aktiivsena kuni { $count } päeva } accountBenefitSync = Jagatud faile saad hallata mis tahes seadmes accountBenefitMoz = Rohkem teavet teistest { -mozilla } teenustest signOut = Logi välja okButton = Olgu downloadingTitle = Allalaadimine noStreamsWarning = Sinu veebilehitseja ei pruugi suuta nii suurt faili dekrüptida. noStreamsOptionCopy = Kopeeri link teises brauseris avamiseks noStreamsOptionFirefox = Proovi meie lemmikbrauserit noStreamsOptionDownload = Jätka selle brauseriga downloadFirefoxPromo = { -send-short-brand } toob sinuni uhiuus { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Jaga linki failile: shareLinkButton = Jaga linki # $name is the name of the file shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist trailheadPromo = Oma privaatsust on võimalik kaitsta. Liitu Firefoxiga. learnMore = Rohkem teavet. ================================================ FILE: public/locales/eu/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Iritzia importingFile = Inportatzen… encryptingFile = Zifratzen... decryptingFile = Deszifratzen... downloadCount = { $num -> [one] Deskarga bat *[other] { $num } deskarga } timespanHours = { $num -> [one] Ordubete *[other] { $num } ordu } copiedUrl = Kopiatuta! unlockInputPlaceholder = Pasahitza unlockButtonLabel = Desblokeatu downloadButtonLabel = Deskargatu downloadFinish = Deskarga burututa fileSizeProgress = ({ $totalSize } / { $partialSize }) sendYourFilesLink = Probatu Send errorPageHeader = Zerbait gaizki joan da! fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du. linkExpiredAlt = Lotura iraungi da notSupportedHeader = Zure nabigatzailea ez da onartzen. notSupportedLink = Zergatik ez da nire nabigatzailea onartzen? notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu. updateFirefox = Eguneratu Firefox deletePopupCancel = Utzi deleteButtonHover = Ezabatu footerLinkLegal = Lege-oharra footerLinkPrivacy = Pribatutasuna footerLinkCookies = Cookieak passwordTryAgain = Pasahitz okerra. Saiatu berriro. javascriptRequired = JavaScript beharrezkoa da Send erabiltzeko. whyJavascript = Zergatik behar du Send-ek JavasScript? enableJavascript = Gaitu JavaScript eta saiatu berriro. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Pasahitzaren gehienezko luzera: { $length } # A short status message shown when there was an error setting the password passwordSetError = Pasahitz hau ezin da ezarri ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Partekatu fitxategiak modu sinple eta pribatuan introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako. notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da timespanMinutes = { $num -> [one] minutu 1 *[other] { $num } minutu } timespanDays = { $num -> [one] egun 1 *[other] { $num } egun } timespanWeeks = { $num -> [one] aste 1 *[other] { $num } aste } fileCount = { $num -> [one] fitxategi 1 *[other] { $num } fitxategi } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamaina guztira: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopiatu fitxategia partekatzeko lotura: copyLinkButton = Kopiatu lotura downloadTitle = Deskargatu fitxategiak downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin. trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako. # count will always be > 10 tooManyFiles = { $count -> [one] Soilik fitxategi bakarra igo daiteke aldi berean. *[other] Soilik { $count } fitxategi igo daitezke aldi berean. } # count will always be > 10 tooManyArchives = { $count -> [one] Soilik artxibo bakarra onartzen da. *[other] Soilik { $count } artxibo onartzen dira. } expiredTitle = Lotura hau iraungi da. notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da. downloadFirefox = Deskargatu { -firefox } legalTitle = { -send-short-brand } pribatutasun-oharra legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa. # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m addFilesButton = Hautatu igotzeko fitxategiak uploadButton = Igo # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arrastatu eta jaregin fitxategiak # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = edo egin klik { $size } arte igotzeko addPassword = Babestu pasahitzarekin emailPlaceholder = Idatzi zure helbide elektronikoa # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Hasi saioa { $size } arte bidaltzeko signInOnlyButton = Hasi saioa accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin accountBenefitTimeLimit = { $count -> [one] Utzi loturak erabilgarri egun batez *[other] Utzi loturak erabilgarri { $count } egunez } accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago signOut = Amaitu saioa okButton = Ados downloadingTitle = Deskargatzen noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko. noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena noStreamsOptionDownload = Jarraitu nabigatzaile honekin downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand } # the next line after the colon contains a file name shareLinkDescription = Partekatu zure fitxategirako lotura: shareLinkButton = Partekatu lotura # $name is the name of the file shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin. learnMore = Argibide gehiago. ================================================ FILE: public/locales/fa/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = بازخورد importingFile = در حال وارد کردن… encryptingFile = در حال رمزنگاری… decryptingFile = در حال رمزگشایی… downloadCount = { $num -> [one] ۱ بارگیری *[other] { $num } بارگیری } timespanHours = { $num -> [one] ۱ ساعت *[other] { $num } ساعت } copiedUrl = رونوشت شد! unlockInputPlaceholder = گذرواژه unlockButtonLabel = باز کردن downloadButtonLabel = بارگیری downloadFinish = بارگیری کامل شد fileSizeProgress = ({ $partialSize } از { $totalSize }) sendYourFilesLink = Send را امتحان کنید errorPageHeader = خطایی رخ داد! fileTooBig = این پرونده بسیار حجیم است. حجم آن می‌بایستی کم تر { $size } باشد. linkExpiredAlt = پیوند منقضی شده است notSupportedHeader = مرورگر شما پشتیبانی نمی‌شود. notSupportedLink = چرا از مرورگر من پشتیبانی نمی‌شود؟ notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. updateFirefox = بروزرسانی فایرفاکس deletePopupCancel = انصراف deleteButtonHover = حذف footerLinkLegal = ملاحظات حقوقی footerLinkPrivacy = حریم‌خصوصی footerLinkCookies = کوکی‌ها passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید. javascriptRequired = Send نیازمند جاوااسکریپت است whyJavascript = چرا Send جاوااسکریپت لازم داد؟ enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } دقیقه # A short status message shown when the user enters a long password maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length } # A short status message shown when there was an error setting the password passwordSetError = امکان ثبت این گذواژه نیست ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = ارسال -firefox = فایرفاکس -mozilla = موزیلا introTitle = اشتراک‌گذاری ساده و خصوصیِ پرونده‌ها introDescription = { -send-brand } به شما امکان اشتراک‌گذاری فایل‌ها با رمزگذاری سرتاسری و لینکی که به طور خودکار منقضی می شود را می‌دهد. در نتیجه می‌توانید اشتراک گذاری‌های خود را خصوصی نگه دارید و اطمینان حاصل کنید که فایل‌های شما تا همیشه آنلاین دردسترس نخواهند ماند. notifyUploadEncryptDone = پرونده شما رمزگذاری شده و آماده ارسال است # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = پس از { $downloadCount } یا { $timespan } منقضی می‌شود timespanMinutes = { $num -> [one] 1 دقیقه *[other] { $num } دقیقه } timespanDays = { $num -> [one] 1 روز *[other] { $num } روز } timespanWeeks = { $num -> [one] 1 هفته *[other] { $num } هفته } fileCount = { $num -> [one] 1 پرونده *[other] { $num } پرونده } # byte abbreviation bytes = بایت # kibibyte abbreviation kb = کیلوبایت # mebibyte abbreviation mb = مگابایت # gibibyte abbreviation gb = گیگابایت # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = حجم کل: { $size } # the next line after the colon contains a file name copyLinkDescription = برای به اشتراک گذاشتن فایل خود، لینک را کپی کنید: copyLinkButton = رونوشت از پیوند downloadTitle = دریافت پرونده‌ها downloadDescription = این پرونده از طریق { -send-brand } با رمزگذاری سرتاسری و پیوندی که به طور خودکار منقضی می شود، به اشتراک گذاشته شد. trySendDescription = { -send-brand } را برای اشتراک گذاری ساده و ایمن پرونده امتحان کنید. # count will always be > 10 tooManyFiles = { $count -> [one] تنها 1 پرونده می‌تواند در لحظه بارگزاری شود. *[other] تنها { $count } پرونده می‌تواند در لحظه بارگزاری شود. } # count will always be > 10 tooManyArchives = { $count -> [one] تنها 1 بایگانی مجاز است. *[other] تنها { $count } بایگانی مجاز است. } expiredTitle = این پیوند منقضی شده است. notSupportedDescription = { -send-brand } با این مرورگر کار نخواهد کرد. { -send-short-brand } بهترین عملکرد را با آخرین نسخه { -firefox } خواهد داشت، و با آخرین نسخه اکثر مرورگر‌های کنونی کار می‌کند. downloadFirefox = دریافت { -firefox } legalTitle = { -send-short-brand } نکات حفظ حریم خصوصی legalDateStamp = نسخه ۱.۰، مورخ ۱۲، ۲۰۱۹ # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } روز { $hours } ساعت { $minutes } دقیقه addFilesButton = پرونده‌ها را برای بارگذاری انتخاب کنید uploadButton = بارگذاری # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = فایل‌ها را بکشید و اینجا رها کنید # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = یا برای ارسال تا { $size } کلیک کنید addPassword = با گذرواژه محافظت کنید emailPlaceholder = ایمیل خود را وارد کنید # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = برای ارسال تا { $size } وارد شوید signInOnlyButton = ورود accountBenefitTitle = یک حساب { -firefox } ایجاد کنید یا وارد شوید # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = پرونده‌هایی تا { $size } را اشتراک‌گذاری کنید accountBenefitDownloadCount = پرونده‌ها را با افراد بیشتری به اشتراک بگذارید accountBenefitTimeLimit = { $count -> [one] پیوند‌ها را تا 1 روز فعال نگه دارید *[other] پیوند‌ها را تا { $count } روز فعال نگه دارید } accountBenefitSync = فایل‌های اشتراکی را از هر دستگاه مدیریت کنید accountBenefitMoz = در مورد سایر خدمات { -mozilla } اطلاعات کسب کنید signOut = خروج okButton = تأیید downloadingTitle = در حال بارگیری noStreamsWarning = ممکن است این مرورگر نتواند یک پرونده به این بزرگی را رمزگشایی کند. noStreamsOptionCopy = لینک را کپی کنید تا در مرورگر دیگری باز شود noStreamsOptionFirefox = مرورگر مورد علاقه ما را امتحان کنید noStreamsOptionDownload = با این مرورگر ادامه دهید downloadFirefoxPromo = { -send-short-brand } با جدیدترین { -firefox } برای شما آماده شده است. # the next line after the colon contains a file name shareLinkDescription = پیوند مربوط به پرونده خود را به اشتراک بگذارید: shareLinkButton = اشتراک‌گذاری پیوند # $name is the name of the file shareMessage = “{ $name }” را با { -send-brand } دانلود کنید: اشتراک‌گذاری ساده و امن فایل trailheadPromo = راهی برای محافظت از حریم خصوصی شما وجود دارد. به Firefox بپیوندید. learnMore = بیشتر بدانید. ================================================ FILE: public/locales/fi/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Tuodaan… encryptingFile = Salataan... decryptingFile = Puretaan salausta... downloadCount = { $num -> [one] yhden latauksen *[other] { $num } latauksen } timespanHours = { $num -> [one] 1 tunnin *[other] { $num } tunnin } copiedUrl = Kopioitu! unlockInputPlaceholder = Salasana unlockButtonLabel = Avaa downloadButtonLabel = Lataa downloadFinish = Lataus valmis fileSizeProgress = { $partialSize } / { $totalSize } sendYourFilesLink = Kokeile Send -palvelua errorPageHeader = Jokin meni pieleen! fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }. linkExpiredAlt = Linkki on vanhentunut notSupportedHeader = Selaintasi ei tueta. notSupportedLink = Miksi selaintani ei tueta? notSupportedOutdatedDetail = Valitettavasti tämä Firefoxin versio ei tue Sendiä käyttävää web-tekniikkaa. Sinun on päivitettävä selaimesi. updateFirefox = Päivitä Firefox deletePopupCancel = Peruuta deleteButtonHover = Poista footerLinkLegal = Juridiset asiat footerLinkPrivacy = Tietosuoja footerLinkCookies = Evästeet passwordTryAgain = Väärä salasana. Yritä uudelleen. javascriptRequired = Firefox-Send vaatii JavaScriptin whyJavascript = Miksi Send vaatii JavaScriptin? enableJavascript = Ota JavaScript käyttöön ja yritä uudelleen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } t { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Salasanan enimmäispituus: { $length } # A short status message shown when there was an error setting the password passwordSetError = Tätä salasanaa ei voitu asettaa ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Helppoa ja yksityistä tiedostonjakoa introDescription = { -send-brand } mahdollistaa tiedostojen jakamisen automaattisesti vanhenevalla linkillä. Tiedostojen jakaminen tapahtuu päästä päähän -salattuna. Näin jakamasi tiedostot pysyvät yksityisinä ja voit olla varma, etteivät lähettämäsi tiedostot pysy verkossa ikuisesti. notifyUploadEncryptDone = Tiedosto on salattu ja valmis lähetettäväksi # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Vanhenee { $downloadCount } tai { $timespan } jälkeen timespanMinutes = { $num -> [one] 1 minuutin *[other] { $num } minuutin } timespanDays = { $num -> [one] 1 päivän *[other] { $num } päivän } timespanWeeks = { $num -> [one] 1 viikon *[other] { $num } viikon } fileCount = { $num -> [one] 1 tiedosto *[other] { $num } tiedostoa } # byte abbreviation bytes = t # kibibyte abbreviation kb = kt # mebibyte abbreviation mb = Mt # gibibyte abbreviation gb = Gt # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Koko yhteensä: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopioi linkki jakaaksesi tiedoston: copyLinkButton = Kopioi linkki downloadTitle = Lataa tiedostot downloadDescription = Tämä tiedosto jaettiin { -send-brand } -palvelun kautta päästä päähän -salattuna ja automaattisesti vanhenevalla linkillä. trySendDescription = Kokeile { -send-brand } -palvelua jakaaksesi tiedostoja helposti ja turvallisesti. # count will always be > 10 tooManyFiles = { $count -> [one] Vain 1 tiedosto on mahdollistaa lähettää kerralla. *[other] Vain { $count } tiedostoa on mahdollista lähettää kerralla. } # count will always be > 10 tooManyArchives = { $count -> [one] Vain 1 arkisto on sallittu. *[other] Vain { $count } arkistoa on sallittu. } expiredTitle = Tämä linkki on vanhentunut. notSupportedDescription = { -send-brand } ei toimi tällä selaimella. { -send-short-brand } toimii parhaiten { -firefox }in uusimmalla versiolla, ja toimii useimpien selainten uusimmilla versioilla. downloadFirefox = Lataa { -firefox } legalTitle = { -send-short-brand }-yksityisyyskäytäntö legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min addFilesButton = Valitse lähetettävät tiedostot trustWarningMessage = Varmista, että luotat vastaanottajaan jakaessasi arkaluontoisia tietoja. uploadButton = Lähetä # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Vedä ja pudota tiedostot # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = tai napsauta lähettääksesi tiedostoja, joiden koko voi olla enintään { $size } addPassword = Suojaa salasanalla emailPlaceholder = Kirjoita sähköpostiosoitteesi # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Kirjautumalla voit lähettää jopa { $size } kokoisia tiedostoja signInOnlyButton = Kirjaudu sisään accountBenefitTitle = Luo { -firefox }-tili tai kirjaudu sisään # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Jaa jopa { $size } kokoisia tiedostoja accountBenefitDownloadCount = Jaa tiedostoja useamman ihmisen kesken accountBenefitTimeLimit = { $count -> [one] Säilytä linkit aktiivisina 1 päivän ajan *[other] Säilytä linkit aktiivisina { $count } päivän ajan } accountBenefitSync = Hallitse jaettuja tiedostoja miltä tahansa laitteelta accountBenefitMoz = Lue lisää muista { -mozilla }-palveluista signOut = Kirjaudu ulos okButton = OK downloadingTitle = Ladataan noStreamsWarning = Tämä selain ei välttämättä osaa purkaa salausta näin suurikokoisista tiedostoista. noStreamsOptionCopy = Kopioi linkki avataksesi sen toisessa selaimessa noStreamsOptionFirefox = Kokeile suosikkiselaintamme noStreamsOptionDownload = Jatka tällä selaimella downloadFirefoxPromo = { -send-short-brand } on olemassa kiitos uuden { -firefox }in. # the next line after the colon contains a file name shareLinkDescription = Jaa linkki tiedostoosi: shareLinkButton = Jaa linkki # $name is the name of the file shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin. learnMore = Lue lisää. downloadFlagged = Tämä linkki on poistettu käytöstä palvelun käyttöehtojen rikkomisen vuoksi. downloadConfirmTitle = Vielä yksi asia downloadConfirmDescription = Varmista, että luotat sinulle tämän tiedoston lähettäneeseen henkilöön, koska emme voi vahvistaa, ettei kyseinen tiedosto vahingoita laitettasi. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Luotan henkilöön, joka lähetti tämän tiedoston *[other] Luotan henkilöön, joka lähetti nämä tiedostot } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Ilmoita tämä tiedosto epäilyttävänä *[other] Ilmoita nämä tiedostot epäilyttävinä } reportDescription = Auta meitä ymmärtämään mitä tapahtuu. Mikä on mielestäsi vialla näissä tiedostoissa? reportUnknownDescription = Siirry sen linkin osoitteeseen, josta haluat tehdä ilmoituksen, ja napsauta “{ reportFile }”. reportButton = Ilmoita reportReasonMalware = Nämä tiedostot sisältävät haittaohjelmia tai ovat osa tietojenkalasteluhyökkäystä. reportReasonPii = Nämä tiedostot sisältävät henkilökohtaisia tietoja minusta. reportReasonAbuse = Nämä tiedostot sisältävät laitonta tai loukkaavaa sisältöä. reportReasonCopyright = Ilmoita tekijänoikeuksien tai tavaramerkkien loukkauksista tällä sivulla kuvatun prosessin mukaisesti. reportedTitle = Tiedostot ilmoitettu reportedDescription = Kiitos. Olemme vastaanottaneet raporttisi näistä tiedostoista. ================================================ FILE: public/locales/fr/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importation… encryptingFile = Chiffrement… decryptingFile = Déchiffrement… downloadCount = { $num -> [one] 1 téléchargement *[other] { $num } téléchargements } timespanHours = { $num -> [one] 1 heure *[other] { $num } heures } copiedUrl = Lien copié ! unlockInputPlaceholder = Mot de passe unlockButtonLabel = Déverrouiller downloadButtonLabel = Télécharger downloadFinish = Téléchargement terminé fileSizeProgress = ({ $partialSize } sur { $totalSize }) sendYourFilesLink = Essayer Send errorPageHeader = Une erreur s’est produite. fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit être inférieure à { $size }. linkExpiredAlt = Le lien a expiré notSupportedHeader = Votre navigateur n’est pas pris en charge. notSupportedLink = Pourquoi mon navigateur n’est-il pas pris en charge ? notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Send. Vous devez mettre à jour votre navigateur. updateFirefox = Mettre à jour Firefox deletePopupCancel = Annuler deleteButtonHover = Supprimer footerLinkLegal = Mentions légales footerLinkPrivacy = Confidentialité footerLinkCookies = Cookies passwordTryAgain = Mot de passe incorrect. Veuillez réessayer. javascriptRequired = Send nécessite JavaScript whyJavascript = Pourquoi Send nécessite-t-il JavaScript ? enableJavascript = Veuillez activer JavaScript puis réessayer. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Longueur maximale du mot de passe : { $length } # A short status message shown when there was an error setting the password passwordSetError = Ce mot de passe n’a pas pu être défini ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Partage de fichiers simple et privé introDescription = { -send-brand } vous permet de partager des fichiers chiffrés de bout en bout ainsi qu’un lien qui expire automatiquement. Ainsi, vous pouvez garder ce que vous partagez en privé et vous assurer que vos contenus ne restent pas en ligne pour toujours. notifyUploadEncryptDone = Votre fichier est chiffré et prêt à l’envoi # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expire après { $downloadCount } ou { $timespan } timespanMinutes = { $num -> [one] 1 minute *[other] { $num } minutes } timespanDays = { $num -> [one] 1 jour *[other] { $num } jours } timespanWeeks = { $num -> [one] 1 semaine *[other] { $num } semaines } fileCount = { $num -> [one] 1 fichier *[other] { $num } fichiers } # byte abbreviation bytes = o # kibibyte abbreviation kb = Ko # mebibyte abbreviation mb = Mo # gibibyte abbreviation gb = Go # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Taille totale : { $size } # the next line after the colon contains a file name copyLinkDescription = Copiez le lien pour partager votre fichier : copyLinkButton = Copier le lien downloadTitle = Télécharger les fichiers downloadDescription = Ce fichier a été partagé via { -send-brand } avec un chiffrement de bout en bout et un lien qui expire automatiquement. trySendDescription = Essayez { -send-brand } pour un partage de fichiers simple et sécurisé. # count will always be > 10 tooManyFiles = { $count -> [one] Un seul fichier peut être envoyé à la fois. *[other] Seuls { $count } fichiers peuvent être envoyés à la fois. } # count will always be > 10 tooManyArchives = { $count -> [one] Une seule archive est autorisée. *[other] Seules { $count } archives sont autorisées. } expiredTitle = Ce lien a expiré. notSupportedDescription = { -send-brand } ne fonctionnera pas avec ce navigateur. { -send-short-brand } fonctionne mieux avec la dernière version de { -firefox } et fonctionnera avec la dernière version de la plupart des navigateurs. downloadFirefox = Télécharger { -firefox } legalTitle = Politique de confidentialité de { -send-short-brand } legalDateStamp = Version 1.0 du 12 mars 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min addFilesButton = Sélectionnez des fichiers à envoyer trustWarningMessage = Assurez-vous de faire confiance au destinataire lorsque vous partagez des données sensibles. uploadButton = Envoyer # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Glissez-déposez des fichiers # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ou cliquez pour envoyer jusqu’à { $size } addPassword = Protéger par mot de passe emailPlaceholder = Votre adresse électronique # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Connectez-vous pour envoyer jusqu’à { $size } signInOnlyButton = Connexion accountBenefitTitle = Créez un compte { -firefox } ou connectez-vous # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Partagez des fichiers jusqu’à { $size } accountBenefitDownloadCount = Partagez des fichiers avec davantage de personnes accountBenefitTimeLimit = { $count -> [one] Maintenez les liens actifs jusqu’à 1 journée *[other] Maintenez les liens actifs jusqu’à { $count } jours } accountBenefitSync = Gérez les fichiers partagés à partir de n’importe quel appareil accountBenefitMoz = Apprenez-en davantage sur les autres services { -mozilla } signOut = Se déconnecter okButton = OK downloadingTitle = Téléchargement en cours noStreamsWarning = Ce navigateur pourrait ne pas être en mesure de déchiffrer un fichier aussi volumineux. noStreamsOptionCopy = Copiez le lien pour l’ouvrir dans un autre navigateur noStreamsOptionFirefox = Essayez notre navigateur préféré noStreamsOptionDownload = Continuer avec ce navigateur downloadFirefoxPromo = { -send-short-brand } vous est proposé par le tout nouveau { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Partagez le lien vers votre fichier : shareLinkButton = Partager le lien # $name is the name of the file shareMessage = Télécharger « { $name } » avec { -send-brand } : un moyen simple et sûr de partager des fichiers trailheadPromo = Il existe un moyen de protéger votre vie privée. Rejoignez Firefox. learnMore = En savoir plus. downloadFlagged = Ce lien a été désactivé en raison d’une violation des conditions d’utilisation. downloadConfirmTitle = Une dernière chose downloadConfirmDescription = Assurez-vous de faire confiance à la personne qui vous a envoyé ce fichier, car nous ne pouvons pas vérifier qu’il n’endommagera pas votre appareil. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Je fais confiance à la personne qui a envoyé ce fichier *[other] Je fais confiance à la personne qui a envoyé ces fichiers } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Signaler ce fichier comme suspect *[other] Signaler ces fichiers comme suspects } reportDescription = Aidez-nous à comprendre ce qui se passe. Selon vous, quel est le problème avec ces fichiers ? reportUnknownDescription = Accédez à l’adresse du lien que vous souhaitez signaler et cliquez sur « { reportFile } ». reportButton = Signaler reportReasonMalware = Ces fichiers contiennent des logiciels malveillants ou contribuent à une attaque de hameçonnage. reportReasonPii = Ces fichiers contiennent des informations personnelles qui me concernent. reportReasonAbuse = Ces fichiers contiennent du contenu illégal ou abusif. reportReasonCopyright = Pour signaler une violation de droit d’auteur ou de marque, suivez la procédure décrite sur cette page. reportedTitle = Fichiers signalés reportedDescription = Merci, nous avons reçu votre signalement relatif à ces fichiers. ================================================ FILE: public/locales/fy-NL/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Ymportearje… encryptingFile = Fersiferje… decryptingFile = Untsiferje… downloadCount = { $num -> [one] 1 download *[other] { $num } downloads } timespanHours = { $num -> [one] 1 oer *[other] { $num } oer } copiedUrl = Kopiearre! unlockInputPlaceholder = Wachtwurd unlockButtonLabel = Deblokkearje downloadButtonLabel = Downloade downloadFinish = Download foltôge fileSizeProgress = ({ $partialSize } fan { $totalSize }) sendYourFilesLink = Send probearje errorPageHeader = Der is wat misgien! fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $size }. linkExpiredAlt = Keppeling ferrûn notSupportedHeader = Jo browser wurdt net stipe. notSupportedLink = Wêrom wurdt myn browser net stipe? notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Send mooflik makket net. Jo moatte jo browser fernije. updateFirefox = Firefox fernije deletePopupCancel = Annulearje deleteButtonHover = Fuortsmite footerLinkLegal = Juridysk footerLinkPrivacy = Privacy footerLinkCookies = Cookies passwordTryAgain = Net krekt wachtwurd. Probearje it opnij. javascriptRequired = Send fereasket JavaScript. whyJavascript = Werom hat Send JavaScript nedich? enableJavascript = Skeakelje JavaScript yn en probearje nochris. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }o { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maksimale wachtwurdlingte: { $length } # A short status message shown when there was an error setting the password passwordSetError = Dit wachtwurd koe net ynsteld wurde ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Ienfâldich, privee bestannen diele introDescription = Mei { -send-brand } kinne jo bestannen mei ein-ta-ein-fersifering en in automatysk ferrinnende keppeling diele. Sa kinne jo de dielde ynhâld privee hâlde, sadat jo gegevens net foar altyd online bliuwt. notifyUploadEncryptDone = Jo bestân is fersifere en ree om te ferstjoeren # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ferrint nei { $downloadCount } of { $timespan } timespanMinutes = { $num -> [one] 1 minute *[other] { $num } minuten } timespanDays = { $num -> [one] 1 dei *[other] { $num } dagen } timespanWeeks = { $num -> [one] 1 wike *[other] { $num } wiken } fileCount = { $num -> [one] 1 bestân *[other] { $num } bestannen } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Totale grutte: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopiearje de keppeling, om jo bestannen te dielen: copyLinkButton = Keppeling kopierje downloadTitle = Bestannen downloade downloadDescription = Dit bestân is mei ein-ta-ein-fersifering en in keppeling dy't automatysk ferrint dield fia { -send-brand }. trySendDescription = Probearje { -send-brand }, om ienfâldich en privee bestannen te dielen. # count will always be > 10 tooManyFiles = { $count -> [one] Der kin maksimaal ien bestân opladen wurde. *[other] Der kinne maksimaal { $count } bestannen opladen wurde. } # count will always be > 10 tooManyArchives = { $count -> [one] Der is mar ien argyf tastien. *[other] Der binne mar { $count } argiven tastien. } expiredTitle = Dizze keppeling is ferrûn. notSupportedDescription = { -send-brand } funksjonearret net mei dizze browser. { -send-short-brand } funksjonearret it bêste mei de nijste ferzje fan { -firefox } en funksjonearret mei de aktuele ferzje fan de measte browsers. downloadFirefox = { -firefox } downloade legalTitle = { -send-short-brand }-privacyferklearring legalDateStamp = Ferzje 1.0, datearre 12 maart 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }o { $minutes }m addFilesButton = Bestannen selektearje om op te laden trustWarningMessage = Soargje derfoar dat jo jo ûntfanger fertrouwe wannear't jo gefoelige gegevens diele. uploadButton = Oplade # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Sleep en pleats bestannen # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = of stjoer oant { $size } troch te klikken addPassword = Mei wachtwurd beskermje emailPlaceholder = Fier jo e-mailadres yn # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Meld jo oan, om bestannen oant { $size } te stjoeren signInOnlyButton = Oanmelde accountBenefitTitle = Meitsje in { -firefox }-account of meld jo oan # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Diel bestannen oant { $size } accountBenefitDownloadCount = Diel bestannen mei mear minsken accountBenefitTimeLimit = { $count -> [one] Keppeling oant ien dei lang aktyf hâlde *[other] Keppeling oant { $count } dagen lang aktyf hâlde } accountBenefitSync = Behear dielde bestannen fan elk apparaat ôf accountBenefitMoz = Lês mear oer oare { -mozilla }-tsjinsten signOut = Ofmelde okButton = OK downloadingTitle = Downloade noStreamsWarning = Dizze browser kin in sa'n grut bestân mooglik net fersiferje. noStreamsOptionCopy = Kopiearje de koppeling om yn in oare browser te iepenjen noStreamsOptionFirefox = Probearje ús favorite browser noStreamsOptionDownload = Trochgean mei dizze browser downloadFirefoxPromo = { -send-short-brand } wurdt jo oanbean troch it folslein fernijde { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Diel de keppeling nei jo bestân: shareLinkButton = Keppeling diele # $name is the name of the file shareMessage = Download ‘{ $name }’ mei { -send-brand }: ienfâldich, feilich bestannen diele trailheadPromo = Der is in manier om jo privacy te beskermjen. Doch mei mei Firefox. learnMore = Mear ynfo. downloadFlagged = Dizze keppeling is útskeakele fanwegen skeining fan de servicebetingsten. downloadConfirmTitle = Noch ien ding downloadConfirmDescription = Soargje derfoar dat jo de persoan fertrouwe dy't jo dit bestân stjoerd hat, omdat wy net ferifiearje kinne dat it jo apparaat net skansearje sil. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Ik fertrou de persoan dy't dit bestân stjoerd hat *[other] Ik fertrou de persoan dy't dizze bestannen stjoerd hat } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Dit bestân as fertocht rapportearje *[other] Dizze bestannen as fertocht rapportearje } reportDescription = Help ús te begripen wat der oan de hân is. Wat is der neffens jo mis mei dizze bestannen? reportUnknownDescription = Gean nei de URL fan de keppeling dy't jo melde wolle en klik op ‘{ reportFile }’. reportButton = Rapportearje reportReasonMalware = Dizze bestannen befetsje malware of binne part fan in phishingoanfal. reportReasonPii = Dizze bestannen befetsje persoanlik identifisearjende ynformaasje oer my. reportReasonAbuse = Dizze bestannen befetsje yllegale of beledigjende ynhâld. reportReasonCopyright = Brûk de proseduere op dizze side om ynbreuk op auteursrjochten of hannelsmerken te melden. reportedTitle = Bestannen rapportearre reportedDescription = Tank. Wy hawwe jo rapport oer dizze bestannen ûntfongen. ================================================ FILE: public/locales/gn/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Ojegueruhína… encryptingFile = Mo’ãmby… decryptingFile = Ñemo’ã’o… downloadCount = { $num -> [one] 1 mboguejy *[other] { $num } mboguejy } timespanHours = { $num -> [one] 1 aravo *[other] { $num } aravo } copiedUrl = Monguatiapyre! unlockInputPlaceholder = Ñe’ẽñemi unlockButtonLabel = Mbojera downloadButtonLabel = Mboguejy downloadFinish = Oguejypáma fileSizeProgress = ({ $partialSize } rehe { $totalSize }) sendYourFilesLink = Eipuru Send errorPageHeader = ¡Oiko jejavy! fileTooBig = Marandurenda tuichaiterei ehupi hag̃ua. Michĩveva’erã { $size } gui. linkExpiredAlt = Juajuha ndoikóiva notSupportedHeader = Ne kundaha ndorekói pytyvõ. notSupportedLink = ¿Mba’ére che kundahára ndorekói ñepytyvõ? notSupportedOutdatedDetail = Ko Firefox rembiapo ndaipu’akái ñanduti rembipurupyahu oikotevẽva Send. Embohekopyahúke ne kundahára. updateFirefox = Firefox mbohekopyahu deletePopupCancel = Heja deleteButtonHover = Mboguete footerLinkLegal = Añetegua footerLinkPrivacy = Ñemigua footerLinkCookies = Kookie passwordTryAgain = Ñe’ẽñemi ndoikóiva. Eha’ãjey. javascriptRequired = Send oikotevẽ JavaScript whyJavascript = ¿Mba’ére Send oikotevẽ JavaScript? enableJavascript = Ikatúpa embojuruja JavaScript ha eha’ãjey uperire. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } m # A short status message shown when the user enters a long password maxPasswordLength = Ñe’ẽñemi pukukue: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ndaikatúi oikóvo ko ñe’ẽñemi ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Marandurenda ñemoambue hasy’ỹ ha ñemiguáva introDescription = { -send-brand } omoherakuãkuaa marandurenda papapýpe ñepyrũ guive opa peve ha juajuha opareíva ijehegui. Ikatu oreko ñemihápe emoherakuãva ha ehecháta mba’éicha ne mba’ekuéra noĩri ñandutípe opa ára. notifyUploadEncryptDone = Ne marandurenda oñemo’ã ha ikatúma emondo # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Opáta { $downloadCount } rire térã { $timespan } timespanMinutes = { $num -> [one] 1 aravo’i *[other] { $num } aravo’i } timespanDays = { $num -> [one] 1 ára *[other] { $num } ára } timespanWeeks = { $num -> [one] 1 arapokõindy *[other] { $num } arapokõindy } fileCount = { $num -> [one] 1 marandurenda *[other] { $num } marandurenda } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tuichakue: { $size } # the next line after the colon contains a file name copyLinkDescription = Emonguatia juajuha ha emoherakuã ne marandurenda: copyLinkButton = Emonguatia juajuha downloadTitle = Emboguejy marandurenda downloadDescription = Ko marandurenda omoherakuã { -send-brand } rupive papapýpe ñepyrũ guive opa peve ha juajuha opáva ijehegui reheve. trySendDescription = Eipuru { -send-brand } emoherakuã hag̃ua marandurenda tasy’ỹ ha tekorosãme. # count will always be > 10 tooManyFiles = { $count -> [one] Ikatu ehupi 1 marandurenda oñondive *[other] Ikatu ehupi { $count } marandurenda oñondive } # count will always be > 10 tooManyArchives = { $count -> [one] Oñemoneĩ 1 marandurenda añoite *[other] Oñemoneĩ { $count } marandurenda añoite } expiredTitle = Ko juajuha ndoikovéima. notSupportedDescription = { -send-brand } ndoikomo’ãi ko kundahára ndive. { -send-short-brand } oikoporãvéta { -firefox } rembiapokue ipyahuvéva ndive, ha oikóta opavavete kundahára ndive. downloadFirefox = Emboguejy { -firefox } legalTitle = { -send-short-brand } Marandu ñemigua legalDateStamp = Mba’epyahu 1.0, 12 jasyapy 2019 peguare # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Eiporavo marandurenda ehupi hag̃ua trustWarningMessage = Ejerovia añetépa emondotaháre emoherakuãvo mba’ekuaarã kañyguáva. uploadButton = Hupi # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Embosyryry ha epoi marandurenda # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = térã eikutu emondo hag̃ua { $size } peve addPassword = Ñe’ẽñemíme mo’ãmbyre emailPlaceholder = Emoinge ne ñanduti veve # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Eñepyrũ tembiapo emondo hag̃ua { $size } peve signInOnlyButton = Eñepyrũ tembiapo accountBenefitTitle = Emoheñói { -firefox } mba’ete térã eñepyrũ tembiapo # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Emoherakuã marandurenda { $size } peve accountBenefitDownloadCount = Emoherakuã marandurenda hetave tapicha ndive accountBenefitTimeLimit = { $count -> [one] Eguereko juajuha hendyhápe 1 ára *[other] Eguereko juajuha hendyhápe { $count } ára } accountBenefitSync = Eñangareko marandurenda moherakuãmbyrére oimeraẽ mba’e’oka guive. accountBenefitMoz = Eikuaa ambue { -mozilla } mba’epytyvõrã signOut = Emboty tembiapo okButton = OK downloadingTitle = Oñemboguejyhína noStreamsWarning = Ikatu ko kundahára ndoikuaái marandurenda tuichaitereíva. noStreamsOptionCopy = Embokuatia juajuha embojuruja hag̃ua ambue kundahárape. noStreamsOptionFirefox = Eipuru ore kundahára rohayhuvéva noStreamsOptionDownload = Eku’ejey ko kundahára ndive downloadFirefoxPromo = Ipyahúva { -firefox } ome’ẽse ndéve { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Emoherakuã juajuha ne mba’e’oka ndive: shareLinkButton = Emoherakuã juajuha # $name is the name of the file shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasy’ỹ ha tekorosãme trailheadPromo = Mba’éichapa emo’ãta ne ñemigua. Eipuru Firefox. learnMore = Kuaave. downloadFlagged = Ko juajuha ojepe’áma ombyai rupi mba’epytyvõrã ñemboguata. downloadConfirmTitle = Peteĩ mba’eve downloadConfirmDescription = Ejerovia añetépa pe tapicha oguerukáva ndéve ko marandurenda ndaikatúire rohechajey ne mba’e’oka. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Ajerovia tapicháre orukáva ko marandurenda *[other] Ajerovia umi tapicha orukáva ko’ã marandurenda } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Ehechauka ko marandurenda imarãkuaávarõ *[other] Ehechauka ko’ã marandurenda imarãkuaávarõ } reportDescription = Orepytyvõ roikumbývo mba’épa oiko. ¿Mba’épa ere oĩvaiha ko’ã marandurenda ndive? reportUnknownDescription = Eikundaha pe url juajuha ekoroiseha ndive ha eikutu “{ reportFile }”. reportButton = Ekorói reportReasonMalware = Ko’ã marandurenda oreko tembiaporape imarãva térã oñembyaikuaáva. reportReasonPii = Ko’ã marandurenda oreko marandu nemba’etéva che kuaaukakuaáva. reportReasonAbuse = Ko’ã marandurenda oreko tetepy ivai térã imbaretéva. reportReasonCopyright = Ekoróitarõ derécho ñembyaíre térã marca registrada, ehecha jehaipyre ko kuatiaroguépe. reportedTitle = Marandurenda jekoroihague reportedDescription = Aguyje. Og̃uahẽ nde jekorói ko’ã marandurenda rehegua. ================================================ FILE: public/locales/gor/send.ftl ================================================ # Send is a brand name and should not be localized. title = Firefox Molawo siteSubtitle = web yimontalo siteFeedback = Potunu uploadPageLearnMore = Pobalajariya po'olo uploadPageBrowseButton = Tulawota berkas to delomo komputermu uploadPageBrowseButton1 = Tulawota berkas u detohulo uploadPageBrowseButtonTitle = Detohe berkas uploadingPageProgress = Hemodetohu { $filename } ({ $size }) notifyUploadDone = Diletohumu ma yilapato uploadingPageMessage = Bataliya modetohu uploadingPageCancel = Bataliya modetohu uploadCancelNotification = Diletohumu ma bilatali uploadingPageLargeFileMessage = Berkas botiya damango wawu paralu wakutu ngope'e mopodetohu. Potihulo'opo! uploadingFileNotification = Poleleya ola'u wonu ma yilapato lodetohu. uploadSuccessConfirmHeader = Siap Molawo uploadSvgAlt = Detohe timespanHours = { $num -> *[other] { $num } jam } copiedUrl = Yilami deleteFileButton = Luluta berkas sendAnotherFileLink = Lawola berkas uwewo # Alternative text used on the download link/button (indicates an action). downloadAltText = Mopohuli downloadsFileList = Mopohuli # Used as header in a column indicating the amount of time left before a # download link expires (e.g. "10h 5m") timeFileList = Wakutu # Used as header in a column indicating the number of times a file has been # downloaded downloadFileName = Mopohuli { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Tuwota Password unlockInputPlaceholder = Password unlockButtonLabel = Hu'owa downloadFileTitle = Mopohuli Enskripsi Berkas # Text and title used on the download link/button (indicates an action). downloadButtonLabel = Mopohuli downloadNotification = U pilopohulimu ma yilapato. downloadFinish = Mopohuli Yilapato # This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } meyalo { $totalSize }) # Send is a brand name and should not be localized. sendYourFilesLink = Yimontali Firefox Molawo downloadingPageProgress = Modetohu { $filename } ({ $size }) downloadFirefoxButtonSub = Pereyi Mopohuli uploadedFile = Berkas copyFileList = Kupe'iya URL # expiryFileList is used as a column header expiryFileList = Mopulito To deleteFileList = Luluta nevermindButton = Sambelo deletePopupText = Luluta berkas botiya? deletePopupYes = Joo deletePopupCancel = Bataliya deleteButtonHover = Luluta copyUrlHover = Kupe'iya URL footerLinkLegal = Legal # Test Pilot is a proper name and should not be localized. footerLinkAbout = Tomimbihu Test Pilot changePasswordButton = Boli'a ================================================ FILE: public/locales/he/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = מתבצע ייבוא… encryptingFile = מתבצעת הצפנה... decryptingFile = מתבצע פענוח... downloadCount = { $num -> [one] הורדה אחת *[other] { $num } הורדות } timespanHours = { $num -> [one] שעה אחת [two] שעתיים *[other] { $num } שעות } copiedUrl = הועתק! unlockInputPlaceholder = ססמה unlockButtonLabel = שחרור נעילה downloadButtonLabel = הורדה downloadFinish = ההורדה הושלמה fileSizeProgress = ({ $partialSize } מתוך { $totalSize }) sendYourFilesLink = נסו את Send errorPageHeader = משהו השתבש! fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }. linkExpiredAlt = הקישור פג notSupportedHeader = הדפדפן שלך לא נתמך. notSupportedLink = למה אין תמיכה בדפדפן שלי? notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Send. יש לעדכן את הגרסה של הדפדפן שלך. updateFirefox = עדכון Firefox deletePopupCancel = ביטול deleteButtonHover = מחיקה footerLinkLegal = מידע משפטי footerLinkPrivacy = פרטיות footerLinkCookies = קובצי עוגיות passwordTryAgain = סיסמה שגויה. נא לנסות שוב. javascriptRequired = ל־Send דרוש JavaScript whyJavascript = למה ל־Send דרוש JavaScript? enableJavascript = נא להפעיל JavaScript ולנסות שוב. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } דק׳ # A short status message shown when the user enters a long password maxPasswordLength = אורך הססמה המרבי: { $length } # A short status message shown when there was an error setting the password passwordSetError = לא ניתן להגדיר את הססמה הזאת ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = שיתוף קבצים פרטי ופשוט introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח. notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan } timespanMinutes = { $num -> [one] דקה אחת *[other] { $num } דקות } timespanDays = { $num -> [one] יום אחד [two] יומיים *[other] { $num } ימים } timespanWeeks = { $num -> [one] שבוע אחד [two] שבועיים *[other] { $num } שבועות } fileCount = { $num -> [one] קובץ אחד *[other] { $num } קבצים } # byte abbreviation bytes = בתים # kibibyte abbreviation kb = ק״ב # mebibyte abbreviation mb = מ״ב # gibibyte abbreviation gb = ג״ב # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = גודל כולל: { $size } # the next line after the colon contains a file name copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך: copyLinkButton = העתקת קישור downloadTitle = הורדת קבצים downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי. trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח. # count will always be > 10 tooManyFiles = { $count -> [one] ניתן להעלות רק קובץ אחד בכל פעם. *[other] ניתן להעלות רק { $count } קבצים בכל פעם. } # count will always be > 10 tooManyArchives = { $count -> [one] רק ארכיון אחד מורשה. *[other] רק { $count } ארכיונים מורשים. } expiredTitle = פג תוקפו של קישור זה. notSupportedDescription = ‏{ -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים. downloadFirefox = הורדת { -firefox } legalTitle = הצהרת פרטיות של { -send-short-brand } legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות addFilesButton = בחירת קבצים להעלאה trustWarningMessage = עליך לוודא שבעת שיתוף מידע רגיש הנמענים שלך הם מהימנים. uploadButton = העלאה # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = גרירה והשלכת קבצים # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size } addPassword = הגנה באמצעות ססמה emailPlaceholder = נא להכניס כתובת דוא״ל # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size } signInOnlyButton = כניסה accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size } accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים accountBenefitTimeLimit = { $count -> [one] שמירה על קישורים פעילים עד ליום אחד *[other] שמירה על קישורים פעילים עד ל־{ $count } ימים } accountBenefitSync = ניהול קבצים משותפים מכל מכשיר accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים signOut = יציאה okButton = אישור downloadingTitle = בהורדה noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה. noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו noStreamsOptionDownload = המשך בדפדפן זה downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox } # the next line after the colon contains a file name shareLinkDescription = שיתוף הקישור לקובץ שלך: shareLinkButton = שיתוף קישור # $name is the name of the file shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox. learnMore = מידע נוסף. downloadFlagged = קישור זה הושבת מכיוון שהפר את תנאי השירות. downloadConfirmTitle = דבר אחד אחרון downloadConfirmDescription = נא לוודא שמי ששלח לך את הקובץ הזה מהימן כיוון שאין לנו אפשרות לוודא שהוא לא יפגע במכשיר שלך. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] שולח הקובץ הזה מהימן *[other] שולח הקבצים האלו מהימן } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] דיווח על קובץ זה כחשוד *[other] דיווח על קבצים אלו כחשודים } reportUnknownDescription = נא לגשת אל כתובת הקישור עליו ברצונך לדווח וללחוץ על ״{ reportFile }״. reportButton = דיווח reportReasonMalware = קבצים אלה מכילים תוכנה זדונית או שהינם חלק מהתקפת דיוג. reportReasonAbuse = קבצים אלה מכילים תוכן בלתי חוקי או פוגע. reportReasonCopyright = כדי לדווח על הפרה של זכויות יוצרים או סימני מסחר, יש להשתמש בתהליך המתואר בדף זה. reportedTitle = קבצים שדווחו reportedDescription = תודה. קיבלנו את הדיווח שלך על קבצים אלה. ================================================ FILE: public/locales/hr/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Uvoz… encryptingFile = Šifriranje … decryptingFile = Dešifriranje … downloadCount = { $num -> [one] { $num } preuzimanje [few] { $num } preuzimanja *[other] { $num } preuzimanja } timespanHours = { $num -> [one] { $num } sat [few] { $num } sata *[other] { $num } sati } copiedUrl = Kopirano! unlockInputPlaceholder = Lozinka unlockButtonLabel = Otključaj downloadButtonLabel = Preuzmi downloadFinish = Preuzimanje je završeno. fileSizeProgress = ({ $partialSize } od { $totalSize }) sendYourFilesLink = Isprobaj Send errorPageHeader = Dogodila se neka greška! fileTooBig = Datoteka je prevelika za prijenos. Mora biti manja od { $size }. linkExpiredAlt = Poveznica je istekla notSupportedHeader = Tvoj preglednik nije podržan. notSupportedLink = Zašto moj preglednik nije podržan? notSupportedOutdatedDetail = Nažalost, ovo izdanje Firefoxa ne podržava web tehnologiju koja omogućava Send. Morat ćeš ažurirati preglednik. updateFirefox = Ažuriraj Firefox deletePopupCancel = Odustani deleteButtonHover = Obriši footerLinkLegal = Pravni podaci footerLinkPrivacy = Privatnost footerLinkCookies = Kolačići passwordTryAgain = Netočna lozinka. Pokušaj ponovo. javascriptRequired = Za Send potreban je JavaScript whyJavascript = Zašto je za Send potreban JavaScript? enableJavascript = Aktiviraj JavaScript i pokušaj ponovo. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }s { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }min # A short status message shown when the user enters a long password maxPasswordLength = Maksimalna duljina lozinke: { $length } # A short status message shown when there was an error setting the password passwordSetError = Lozinku nije moguće postaviti ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Jednostavno i privatno dijeljenje datoteka introDescription = { -send-brand } omogućava dijeljenje datoteka sa šifriranjem i poveznicom koja će automatski isteći. Ovim putem, stvari koje dijeliš ostaju privatne i osiguravaš se da ne ostaju zauvijek dostupne na internetu. notifyUploadEncryptDone = Tvoja je datoteka šifrirana i spremna za slanje. # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Isteći će nakon { $downloadCount } ili { $timespan } timespanMinutes = { $num -> [one] { $num } minuta [few] { $num } minute *[other] { $num } minuta } timespanDays = { $num -> [one] { $num } dan [few] { $num } dana *[other] { $num } dana } timespanWeeks = { $num -> [one] { $num } tjedan [few] { $num } tjedna *[other] { $num } tjedana } fileCount = { $num -> [one] { $num } datoteka [few] { $num } datoteke *[other] { $num } datoteka } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ukupna veličina: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopiraj poveznicu za dijeljenje svoje datoteke: copyLinkButton = Kopiraj poveznicu downloadTitle = Preuzmi datoteke downloadDescription = Ova se datoteka dijelila putem usluge { -send-brand } sa šifriranjem i poveznicom koja će automatski isteći. trySendDescription = Probaj { -send-brand } za jednostavno i sigurno dijeljenje datoteka. # count will always be > 10 tooManyFiles = { $count -> [one] Istovremeno se može prenijeti samo { $count } datoteka. [few] Istovremeno se može prenijeti samo { $count } datoteke. *[other] Istovremeno se može prenijeti samo { $count } datoteka. } # count will always be > 10 tooManyArchives = { $count -> [one] Dozvoljena je samo { $count } arhiva. [few] Dozvoljene su samo { $count } arhive. *[other] Dozvoljeno je samo { $count } arhiva. } expiredTitle = Poveznica je istekla. notSupportedDescription = { -send-brand } neće raditi s ovim preglednikom. { -send-short-brand } najbolje radi sa zadnjom { -firefox } verzijom i radit će s aktualnim verzijama većine preglednika. downloadFirefox = Preuzmi { -firefox } legalTitle = { -send-short-brand } politika privatnosti legalDateStamp = Verzija 1.0, od 12. ožujka 2019. godine # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }s { $minutes }m addFilesButton = Odaberi datoteke za prijenos trustWarningMessage = Budite sigurni da vjerujete primatelju prije dijeljenja osjetljivih podataka. uploadButton = Prijenos # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Povuci i ispusti datoteke # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ili pritisni gumb, za slanje do { $size } addPassword = Zaštiti s lozinkom emailPlaceholder = Upiši svoju e-adresu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Prijavi se, za slanje do { $size } signInOnlyButton = Prijavi se accountBenefitTitle = Otvori { -firefox } račun ili se prijavi # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dijeli datoteke do { $size } accountBenefitDownloadCount = Dijeli datoteke s više osoba accountBenefitTimeLimit = { $count -> [one] Ostavi poveznice aktivnima { $count } dan [few] Ostavi poveznice aktivnima { $count } dana *[other] Ostavi poveznice aktivnima { $count } dana } accountBenefitSync = Upravljaj dijeljenim datotekama s bilo kojeg uređaja accountBenefitMoz = Saznaj više o drugim { -mozilla } uslugama signOut = Odjavi se okButton = U redu downloadingTitle = Preuzimanje noStreamsWarning = Ovaj preglednik možda neće moći dešifrirati datoteku ove veličine. noStreamsOptionCopy = Za otvaranje u drugom pregledniku, kopiraj poveznicu noStreamsOptionFirefox = Isprobaj naš omiljeni preglednik noStreamsOptionDownload = Nastavi s ovim preglednikom downloadFirefoxPromo = Potpuno novi { -firefox } donosi { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Dijeli poveznicu na tvoju datoteku: shareLinkButton = Dijeli poveznicu # $name is the name of the file shareMessage = Preuzmi „{ $name }” pomoću { -send-brand }: jednostavno i sigurno dijeljenje datoteka trailheadPromo = Postoji način, kako zaštititi vlastitu privatnost. Pridruži se Firefoxu. learnMore = Saznaj više. downloadFlagged = Poveznica je onemogućena zbog kršenja uvjeta pružanja usluge. downloadConfirmTitle = Još jedna stvar downloadConfirmDescription = Budite sigurni da vjerujete osobi koja vam je poslala ovu datoteku, zato što mi ne možemo provjeriti da li će ova datoteka naštetiti vašem uređaju. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Vjerujem osobi koja je poslala ove datoteke [few] Vjerujem osobi koja je poslala ove datoteke *[other] Vjerujem osobi koja je poslala ove datoteke } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Prijavi ove datoteke kao sumnjive [few] Prijavi ove datoteke kao sumnjive *[other] Prijavi ove datoteke kao sumnjive } reportDescription = Pomozite nam da shvatimo što se dešava. Zašto mislite da nešto nije u redu s ovim datotekama? reportUnknownDescription = Idite na poveznicu koju želite prijaviti i kliknite “{ reportFile }”. reportButton = Prijavi datoteku reportReasonMalware = Ove datoteke sadrže zlonamjerni softver ili su dio napada za krađu identiteta. reportReasonPii = Ove datoteke sadrže moje osobne podatke. reportReasonAbuse = Ove datoteke sadrže ilegalni ili nasilni sadržaj. reportReasonCopyright = Kako biste prijavili kršenje autorskih prava, koristite proces opisan na ovoj stranici. reportedTitle = Datoteke prijavljene reportedDescription = Hvala vam. Primili smo vašu prijavu za ove datoteke. ================================================ FILE: public/locales/hsb/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importuje so... encryptingFile = Zaklučuje so... decryptingFile = Dešifruje so... downloadCount = { $num -> [one] 1 sćehnjenje [two] { $num } sćehnjeni [few] { $num } sćehnjenja *[other] { $num } sćehnjenjow } timespanHours = { $num -> [one] 1 hodźina [two] { $num } hodźinje [few] { $num } hodźiny *[other] { $num } hodźin } copiedUrl = Kopěrowany! unlockInputPlaceholder = Hesło unlockButtonLabel = Wotewrěć downloadButtonLabel = Sćahnyć downloadFinish = Sćehnjenje dokónčene fileSizeProgress = ({ $partialSize } z { $totalSize }) sendYourFilesLink = Send wupruwować errorPageHeader = Něšto je so nimokuliło! fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size } być. linkExpiredAlt = Wotkaz je spadnjeny notSupportedHeader = Waš wobhladowak so njepodpěruje. notSupportedLink = Čehodla so mój wobhladowak njepodpěruje? notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Send bazuje. Dyrbiće swój wobhladowak aktualizować. updateFirefox = Firefox aktualizować deletePopupCancel = Přetorhnyć deleteButtonHover = Zhašeć footerLinkLegal = Prawniske footerLinkPrivacy = Priwatnosć footerLinkCookies = Placki passwordTryAgain = Wopačne hesło. Prošu spytajće hišće raz. javascriptRequired = Send JavaScript trjeba whyJavascript = Čehodla Send JavaScript trjeba? enableJavascript = Prošu zmóžńće JavaScript a spytajće hišće raz. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } hodź. { $minutes } mjeń. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } mjeń. # A short status message shown when the user enters a long password maxPasswordLength = Maksimalna dołhosć hesła: { $length } # A short status message shown when there was an error setting the password passwordSetError = Tute hesło njeda so nastajić ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Jednore, priwatne datajowe dźělenje introDescription = { -send-brand } wam zmóžnja, dataje ze zaklučowanjom kónc do kónca a wotkazom dźělić, kotryž awtomatisce spadnje. Tak móžeće dźěleny wobsah priwatny dźeržeć a zawěsćić, zo waše daty online na přeco njewóstanu. notifyUploadEncryptDone = Waša dataja je zaklučowana a hotowa za słanje # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Spadnje po { $downloadCount } abo { $timespan } timespanMinutes = { $num -> [one] { $num } mjeńšina [two] { $num } mjeńšinje [few] { $num } mjeńšiny *[other] { $num } mjeńšin } timespanDays = { $num -> [one] { $num } dźeń [two] { $num } dnjej [few] { $num } dny *[other] { $num } dnjow } timespanWeeks = { $num -> [one] { $num } tydźeń [two] { $num } njedźeli [few] { $num } njedźele *[other] { $num } njedźel } fileCount = { $num -> [one] { $num } dataja [two] { $num } dataji [few] { $num } dataje *[other] { $num } datajow } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Cyłkowna wulkosć: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopěrujće wotkaz, zo byšće swoju dataju dźělił: copyLinkButton = Wotkaz kopěrować downloadTitle = Dataje sćahnyć downloadDescription = Tuta dataja je so přez { -send-brand } ze zaklučowanjom kónc do kónca a wotkazom dźěliła, kotryž awtomatisce spadnje. trySendDescription = Spytajće { -send-brand } za jednore, wěste datajowe dźělenje. # count will always be > 10 tooManyFiles = { $count -> [one] Jenož { $count } dataja da so na jedne dobo nahrać. [two] Jenož { $count } dataji datej so na jedne dobo nahrać. [few] Jenož { $count } dataje dadźa so na jedne dobo nahrać. *[other] Jenož { $count } datajow da so na jedne dobo nahrać. } # count will always be > 10 tooManyArchives = { $count -> [one] Jenož { $count } archiw je dowoleny. [two] Jenož { $count } archiwaj stej dowolenej. [few] Jenož { $count } archiwy su dowolene. *[other] Jenož { $count } archiwow je dowolene. } expiredTitle = Tutón wotkaz je spadnjeny. notSupportedDescription = { -send-brand } z tutym wobhladowakom njefunguje. { -send-short-brand } najlěpje z najnowšej wersiju { -firefox } funguje, a funguje z aktualnej wersiju najwjace wobhladowakow. downloadFirefox = { -firefox } scáhnyć legalTitle = Zdźělenka priwatnosće { -send-short-brand } legalDateStamp = Wersija 1.0 wot 12. měrca 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Dataje za nahrawanje wubrać trustWarningMessage = Wy měł přijimarjej dowěrić, hdyž sensibelne daty dźěliće. uploadButton = Nahrać # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Ćehńće a wotkładźće dataje # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = abo klikńće, zo byšće do { $size } pósłał addPassword = Z hesłom škitać emailPlaceholder = Zapodajće swoju e-mejlowu adresu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Přizjewće so, zo byšće do { $size } pósłał signInOnlyButton = Přizjewić accountBenefitTitle = Załožće konto { -firefox } abo přizjewće so # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dataje do { $size } dźělić accountBenefitDownloadCount = Dataje z wjace ludźimi dźělić accountBenefitTimeLimit = { $count -> [one] Wotkazy do { $count } dnja aktiwne dźeržeć [two] Wotkazy do { $count } dnjow aktiwne dźeržeć [few] Wotkazy do { $count } dnjow aktiwne dźeržeć *[other] Wotkazy do { $count } dnjow aktiwne dźeržeć } accountBenefitSync = Dźělene dataje z někajkeho grata rjadować accountBenefitMoz = ZHońće wjace wo druhich słužbach { -mozilla } signOut = Wotzjewić okButton = W porjadku downloadingTitle = Sćahuje so noStreamsWarning = Tutón wobhladowak njemóhł tajku wulku dataju dešifrować. noStreamsOptionCopy = Kopěrujće wotkaz, zo byšće jón w druhim wobhladowaku wočinił noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak noStreamsOptionDownload = Z tutym wobhladowakom pokročować downloadFirefoxPromo = { -send-short-brand } so wam přez cyle nowy { -firefox } přinjese. # the next line after the colon contains a file name shareLinkDescription = Dźělće wotkaz k swojej dataji: shareLinkButton = Wotkaz dźělić # $name is the name of the file shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow trailheadPromo = Je móžnosć, wašu priwatnosć škitać. Přińdźće k Firefox. learnMore = Dalše informacije. downloadFlagged = Tutón wotkaz je so přestupjenja wužiwanskich wuměnjenjow dla znjemóžnił. downloadConfirmTitle = Jedna wěc hišće downloadConfirmDescription = Wy měł wotpósłarjej tuteje dataje dowěrić, dokelž njemóžemy přepruwować, hač to wašemu gratej wadźi. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Dowěrju wosobje, kotraž je tutu dataju pósłała [two] Dowěrju wosobje, kotraž je tutej dataji pósłała [few] Dowěrju wosobje, kotraž je tute dataje pósłała *[other] Dowěrju wosobje, kotraž je tute dataje pósłała } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Tutu dataju jako podhladnu zdźělić [two] Tutej dataji jako podhladnej zdźělić [few] Tute dataje jako podhladne zdźělić *[other] Tute dataje jako podhladne zdźělić } reportDescription = Pomhajće nam rozumić, što so stawa. Što po wašim zdaću z tutymi datajemi w porjadku njeje? reportUnknownDescription = Dźiće prošu k URL wotkaza, kotryž chceće zdźělić a klikńće na „{ reportFile }“. reportButton = Zdźělić reportReasonMalware = Tute dataje škódnu softwaru wobsahuja abo su dźěl nadpada kradnjenja datow. reportReasonPii = Tute dataje wosobinske informacije wo mni, kotrež móža mje identifikować. reportReasonAbuse = Tute dataje njedowoleny abo ranjacy wobsah wobsahuja. reportReasonCopyright = Zo byšće zranjenje awtorskeho prawa abo prawa wikowanskich znamjenjow zdźělił, wužiwajće postupowanje, kotrež so na tutej stronje wopisuje. reportedTitle = Dataje su zdźělene reportedDescription = Wulki dźak. Smy wašu rozprawu wo tutych datajach dóstali. ================================================ FILE: public/locales/hu/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importálás… encryptingFile = Titkosítás… decryptingFile = Visszafejtés… downloadCount = { $num -> [one] 1 letöltés *[other] { $num } letöltés } timespanHours = { $num -> [one] 1 óra *[other] { $num } óra } copiedUrl = Másolva! unlockInputPlaceholder = Jelszó unlockButtonLabel = Feloldás downloadButtonLabel = Letöltés downloadFinish = A letöltés befejeződött fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = Próbálja ki a Sendet errorPageHeader = Hiba történt! fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell legyen. linkExpiredAlt = A hivatkozás lejárt notSupportedHeader = A böngésző nem támogatott. notSupportedLink = Miért nem támogatott a böngészőm? notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Send alapját képező technológiát. Frissítenie kell a böngészőjét. updateFirefox = Firefox frissítése deletePopupCancel = Mégse deleteButtonHover = Törlés footerLinkLegal = Jogi információk footerLinkPrivacy = Adatvédelem footerLinkCookies = Sütik passwordTryAgain = Helytelen jelszó. Próbálja meg újra. javascriptRequired = A Sendhez JavaScript szükséges whyJavascript = Miért van szükség JavaScriptre a Sendhez? enableJavascript = Kérjük engedélyezze a JavaScriptet, majd próbálkozzon újra. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ó { $minutes }p # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }p # A short status message shown when the user enters a long password maxPasswordLength = Maximális jelszóhossz: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ez a jelszó nem állítható be ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Egyszerű, privát fájlmegosztás introDescription = A { -send-brand }del végpontok közötti titkosítással oszthat meg fájlokat, a hivatkozások pedig automatikusan lejárnak. Így bizalmasan tarthatja azt, amit megoszt, és biztosíthatja, hogy a dolgok nem maradnak örökre online. notifyUploadEncryptDone = A fájl titkosítva és készen áll a küldésre # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } vagy { $timespan } után elévül timespanMinutes = { $num -> [one] 1 perc *[other] { $num } perc } timespanDays = { $num -> [one] 1 nap *[other] { $num } nap } timespanWeeks = { $num -> [one] 1 hét *[other] { $num } hét } fileCount = { $num -> [one] 1 fájl *[other] { $num } fájl } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Teljes méret: { $size } # the next line after the colon contains a file name copyLinkDescription = Másolja a hivatkozást a fájl megosztásához: copyLinkButton = Hivatkozás másolása downloadTitle = Fájlok letöltése downloadDescription = Ez a fájl a { -send-brand } szolgáltatással lett megosztva, végpontok közötti titkosítással, és a hivatkozás automatikusan elévül. trySendDescription = Próbálja ki a { -send-brand }et az egyszerű, biztonságos fájlmegosztásért. # count will always be > 10 tooManyFiles = { $count -> [one] Egyszerre csak 1 fájl tölthető fel. *[other] Egyszerre csak { $count } fájl tölthető fel. } # count will always be > 10 tooManyArchives = { $count -> [one] Csak 1 archívum engedélyezett. *[other] Csak { $count } archívum engedélyezett. } expiredTitle = Ez a hivatkozás elévült. notSupportedDescription = A { -send-brand } nem működik ebben a böngészőben. A { -send-short-brand } a { -firefox } legfrissebb verziójával működik a legjobban, de működik a legtöbb böngésző aktuális verziójával is. downloadFirefox = A { -firefox } letöltése legalTitle = { -send-short-brand } adatvédelmi nyilatkozat legalDateStamp = 1.0-s verzió, kelt 2019. március 12-én # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }n { $hours }ó { $minutes }p addFilesButton = Válassza ki a feltöltendő fájlokat trustWarningMessage = Érzékeny adatok megosztásakor győződjön meg róla, hogy megbízik-e a címzettben. uploadButton = Feltöltés # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Húzza ide a fájlokat # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = vagy jelentkezzen be, és küldjön legfeljebb { $size }-ot addPassword = Jelszavas védelem emailPlaceholder = Adja meg az e-mail címét # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Jelentkezzen be, és küldjön legfeljebb { $size }-ot signInOnlyButton = Bejelentkezés accountBenefitTitle = Hozzon létre egy { -firefox } fiókot vagy jelentkezzen be # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Osszon meg fájlokat { $size }-ig accountBenefitDownloadCount = Osszon meg fájlokat több emberrel accountBenefitTimeLimit = { $count -> [one] A hivatkozások aktívan tartása legfeljebb 1 napig *[other] A hivatkozások aktívan tartása legfeljebb { $count } napig } accountBenefitSync = Kezelje a megosztott fájlokat bármely eszközről accountBenefitMoz = Ismerje meg a többi { -mozilla } szolgáltatást signOut = Kijelentkezés okButton = OK downloadingTitle = Letöltés noStreamsWarning = Előfordulhat, hogy a böngésző nem fog tudni visszafejteni egy ekkora fájlt. noStreamsOptionCopy = Másolja a hivatkozást, és nyissa meg egy másik böngészőben noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket noStreamsOptionDownload = Folytatás ezzel a böngészővel downloadFirefoxPromo = A { -send-short-brand }et a vadonatúj { -firefox } hozza el Önnek. # the next line after the colon contains a file name shareLinkDescription = Ossza meg a fájlja hivatkozását: shareLinkButton = Hivatkozás megosztása # $name is the name of the file shareMessage = „{ $name }” letöltése a { -send-brand } segítségével: egyszerű, biztonságos fájlmegosztás trailheadPromo = Védje meg a magánszféráját. Csatlakozzon a Firefoxhoz. learnMore = További tudnivalók. downloadFlagged = Ezt a hivatkozást a szolgáltatási feltételek megsértése miatt letiltottuk. downloadConfirmTitle = Még egy dolog downloadConfirmDescription = Győződjön meg arról, hogy megbízik-e abban, aki küldte a fájlt, mert nem tudjuk ellenőrizni, hogy nem okoz-e kárt az eszközén. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Megbízom abban a személyben, aki elküldte ezt a fájlt *[other] Megbízom abban a személyben, aki elküldte ezeket a fájlokat } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Fájl jelentése gyanúsként *[other] Fájlok jelentése gyanúsként } reportDescription = Segítsen megérteni, hogy mi a helyzet. Ön szerint mi a baj ezekkel a fájlokkal? reportUnknownDescription = Ugorjon a jelentendő hivatkozás URL-jéhez, és kattintson a „{ reportFile }” gombra. reportButton = Jelentés reportReasonMalware = Ezek a fájlok rosszindulatú programokat tartalmaznak, vagy adathalász támadás részét képezik. reportReasonPii = Ezek a fájlok személyesen azonosítható információkat tartalmaznak rólam. reportReasonAbuse = Ezek a fájlok illegális vagy visszaélésszerű tartalmúak. reportReasonCopyright = A szerzői jogok vagy védjegyek megsértésének jelentéséhez használja az ezen az oldalon írt folyamatot. reportedTitle = Fájlok jelentve reportedDescription = Köszönjük. Megkaptuk a jelentését ezekről a fájlokról. ================================================ FILE: public/locales/hus/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Ka olna' max jant'oj yab u t'ojnal alwa' importingFile = k'wajat i chiyál... encryptingFile = K'wajat i tsinat dheyál... decryptingFile = K'wajat i exal ki wila'... downloadCount = { $num -> *[other] 1 pa'badh { $num } pa'badh } timespanHours = { $num -> *[other] 1 hora { $num } hora } copiedUrl = Letsbadh... unlockInputPlaceholder = Tsinat japixtal unlockButtonLabel = Ka japiy downloadButtonLabel = Ka pa'ba' downloadFinish = Tala' pa'iyits fileSizeProgress = { $partialSize } xi ti { $totalSize } sendYourFilesLink = Ka eyendha' Send errorPageHeader = ¡Yab kalej alwa'! fileTooBig = Tekedh pulik axi a le' ka kadh'ba', kwa'al kin alemna' { $size } linkExpiredAlt = Yabats u awil ki ela' notSupportedHeader = Yab u awil ka japiyat k'al axi NAVEGADOR notSupportedLink = ¿Jale' ti u NAVEGADOR yab in japiyal? notSupportedOutdatedDetail = Yab u awil ka eyendha' Send kom an NAVEGADOR Firefox biyalits. Ka Pa'ba' axi it. updateFirefox = Ka itmedha' Firefox deletePopupCancel = Ka kuba' deleteButtonHover = Ka pakuw footerLinkLegal = Axi walkadh ka t'ajan footerLinkPrivacy = Tsinataláb footerLinkCookies = Cookies passwordTryAgain = Yab ja' an tsinat japixtaláb. Ka exa' junil. javascriptRequired = Send in yejenchal JavaScript whyJavascript = ¿Jale' Send in yejenchal JavaScript? enableJavascript = Ka lek'wtsiy JavaScript ani ka exa' junil. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = In puwél an tsinat japixtaláb pel: { $length } # A short status message shown when there was an error setting the password passwordSetError = Axi tsinat japixtaláb yab u awil ka eyendha' ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Yab k'ibat, a tsinat t'ojlabil u awil ka buk'uw introDescription = { -send-brand } in t'ajál abal ka buk'uw a t'ojlabil po axé' tsinat abal an atikláb axi tat yab a le' kin tsu'uw yab kin ejtow, aniyej an enlace abal ka pa'ba' an t'ojláb u talél kwetém. Antsan patal axi ka abna' u awil ka buk'uw tsinat ani antsan jayej axi ka buk'uw yab u jilk'onal ets'ey ti ébtsolom (internet). notifyUploadEncryptDone = A t'ojlabil xo' tsinadhits ani u awilits ka abna' # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ne'ets ka taliy ti { $downloadCount } o ti { $timespan } timespanMinutes = { $num -> *[other] 1 minuto { $num } } timespanDays = { $num -> *[other] 1 k'icháj { $num } k'ichajchik } timespanWeeks = { $num -> *[other] 1 semana { $num } i semanachik } fileCount = { $num -> *[other] 1 t'ojláb { $num } t'ojlabchik } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = In puwél an t'ojláb: { $size } # the next line after the colon contains a file name copyLinkDescription = Ka k'ot'biy an enlace abal ka ejtow ka buk'uw a t'ojlabil: copyLinkButton = ka k'ot'biy an enlace downloadTitle = Ka pa'ba' an t'ojláb downloadDescription = Axi t'ojláb aban k'al in tolmixtal an { -send-brand } ani tsinat, aniyej in tsap an enlace u talél kwetém. trySendDescription = Ka eyendha' { -send-brand } abal ka abna' a t'ojlabil, yab k'ibat ani k'anidh. # count will always be > 10 tooManyFiles = { $count -> *[other] Expidh u awil ka k'adhba' 1 i t'ojláb Expidh u awil ka k'adhba' { $count } i t'ojláb. } # count will always be > 10 tooManyArchives = { $count -> *[other] Expidh u awil 1 i t'ojláb. Expidh u awil { $count } i t'ojláb. } expiredTitle = An enlace talíts in tsap. notSupportedDescription = { -send-brand } yab u t'ojnal al axi navegador. { -send-short-brand } u t'ojnal alwa' k'al an { -firefox } axi it, ani ne'ets ka t'ojon alwa' k'al an it navegadorchik. downloadFirefox = Ka pa'ba' { -firefox } legalTitle = Tin kwentaj an "Tsinaxtaláb a k'al" { -send-short-brand } legalDateStamp = Versión 1.0 ani t'ajadh ti Marzo 12 ti tamub 2019. # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } k'icháj { $hours } hora { $minutes } minuto addFilesButton = Ka takuy an t'ojláb axi ne'ets ka k'adhba' uploadButton = Ka k'adhba' # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Ka kina' a t'ojlabil ani ka walka' te' # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o ka t'aja' an clic abal ka abna' ma { $size } addPassword = Ka k'aniy k'al jún i tsinat japixtaláb emailPlaceholder = Ka punuw a abnax dhuchlab Correo Electrónico. # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Kit otsits abal ka ejtow ka abna' ma { $size } signInOnlyButton = Kit otsits accountBenefitTitle = Ka ts'ejka' jún a it k'al (cuenta) { -firefox } o kit otsits max a kwa'alits jún. # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Ka buk'uw a t'ojlabil, ma { $size } accountBenefitDownloadCount = Ka buk'uw a t'ojlabil k'al pil i atiklabchik accountBenefitTimeLimit = { $count -> *[other] Ka ko'oy an enlace ma 1 a k'icháj Ka ko'oy an enlacechik ma { $count } a k'icháhchik } accountBenefitSync = Ka ejtow tit t'ojnal k'al t'ojlabil al jawakitsk'ij tum eyendhabnél accountBenefitMoz = Ka exla' jant'oj ti pidhál { -mozilla } signOut = Kit kalej okButton = Ka bats'uw downloadingTitle = K'wajat ti pa'íl noStreamsWarning = Walám axi navegador yab ne'ets kin ejtow kin japiy jún i t'ojláb tekedh pulik. noStreamsOptionCopy = Ka k'ot'biy an enlace abal ka japiy al pil i navegador noStreamsOptionFirefox = Ka eyendha' i navegador noStreamsOptionDownload = yab kit kalej al axi navegador downloadFirefoxPromo = An it { -firefox } ti pidhál { -send-short-brand } # the next line after the colon contains a file name shareLinkDescription = Ka abna' an enlace al an eyendhanél: shareLinkButton = Ka abna' an enlace # $name is the name of the file shareMessage = Ka pa'ba' “{ $name }” k'al { -send-brand }: ka abna' a t'ojlabil, yab k'ibat ani k'anidh trailheadPromo = U awil ka k'aniy axi tat a k'al. Kit tamkun k'al Firefox. learnMore = Ka ajiy más. ================================================ FILE: public/locales/hy-AM/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Արձագանք importingFile = Ներմուծում... encryptingFile = Գաղտնագրում… decryptingFile = Վերծանում… downloadCount = { $num -> [one] 1 ներբեռնում *[other] { $num } ներբեռնումներ } timespanHours = { $num -> [one] 1 ժամ *[other] { $num } ժամ } copiedUrl = Պատճենված unlockInputPlaceholder = Գաղտնաբառ unlockButtonLabel = Ապակողպել downloadButtonLabel = Ներբեռնել downloadFinish = Ներբեռնումն ավարտված է fileSizeProgress = ({ $partialSize }-ը { $totalSize })-ից sendYourFilesLink = Փորձել Send-ը errorPageHeader = Ինչ-որ բան այն չէ fileTooBig = Այդ ֆայլը չափազանց մեծ է վերբեռնելու համար: Այն պետք է լինի ավելի քիչ, քան { $size }-ը linkExpiredAlt = Հղումն ավարտված է notSupportedHeader = Ձեր զննարկիչը չի աջակցվում: notSupportedLink = Ինչու իմ զննարկիչը չի աջակցվում: notSupportedOutdatedDetail = Դժբախտաբար, Firefox- ի այս տարբերակը չի աջակցում այն վեբ տեխնոլոգիան, որը պետք է Send-ի համար: Դուք պետք է թարմացնեք ձեր զննարկիչը: updateFirefox = Թարմացնել Firefox-ը deletePopupCancel = Չեղարկել deleteButtonHover = Ջնջել footerLinkLegal = Իրավական footerLinkPrivacy = Գաղտնիություն footerLinkCookies = Cookie-ներ passwordTryAgain = Սխալ գաղտնաբառ. Կրկին փորձեք: javascriptRequired = Send-ը պահանջում է JavaScript whyJavascript = Ինչո՞ւ է Send-ը պահանջում JavaScript. enableJavascript = Խնդրում ենք միացնել JavaScript-ը և կրկին փորձել: # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ժ { $minutes }ր # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ր # A short status message shown when the user enters a long password maxPasswordLength = Գանղտնաբառի առավելագույն չափ. { $length } # A short status message shown when there was an error setting the password passwordSetError = Այս գաղտնաբառը հնարավոր չէ սահմանել ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Ուղարկել -firefox = Firefox -mozilla = Mozilla introTitle = Պարզ, մասնավոր ֆայլերի փոխանակում introDescription = { -send-brand }-ը թույլ է տալիս փոխանակել ֆայլեր ծայրից ծայր գաղտնագրման միջոցով և այնպիսի հղում, որն ինքնաբերաբար ավարտվում է: Այսպիսով, դուք կարող եք վերահսկել այն, ինչով կիսվում եք և համոզված լինեք, որ ձեր նյութերը հավերժ չեն մնա առցանց: notifyUploadEncryptDone = Ձեր ֆայլը գաղտնագրված է և պատրաստ է ուղարկել # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ավարտվելու է { $downloadCount }-ից կամ { $timespan }-ից timespanMinutes = { $num -> [one] 1 րոպե *[other] { $num } րոպե } timespanDays = { $num -> [one] 1 օր *[other] { $num } օր } timespanWeeks = { $num -> [one] 1 շաբաթ *[other] { $num } շաբաթ } fileCount = { $num -> [one] 1 ֆայլ *[other] { $num } ֆայլեր } # byte abbreviation bytes = Բ # kibibyte abbreviation kb = ԿԲ # mebibyte abbreviation mb = ՄԲ # gibibyte abbreviation gb = ԳԲ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ընդհանուր չափ՝ { $size } # the next line after the colon contains a file name copyLinkDescription = Պատճենեք հղումը՝ ֆայլը համօգտագործելու համար. copyLinkButton = Պատճենել հղումը downloadTitle = Ներբեռնել ֆայլերը downloadDescription = Հայլը համօգտագործվել է { -send-brand }-ի միջոցով ՝ ծայրից ծայր գաղտնագրմամբ և ինքնաբերաբար ավարտվող հղմամբ: trySendDescription = Փորձեք { -send-brand }-ը՝ ֆայլերի պարզ և անվտանգ փոխանակման համար: # count will always be > 10 tooManyFiles = { $count -> [one] Միաժամանակ միայն 1 ֆայլ կարող է վերբեռնվել: *[other] Միաժամանակ միայն { $count } ֆայլեր կարող են վերբեռնվել: } # count will always be > 10 tooManyArchives = { $count -> [one] Միայն 1 արխիվ է թույլատրված: *[other] Միայն { $count } արխիվներ են թույլատրված: } expiredTitle = Այս հղումն ավարտված է: notSupportedDescription = { -send-brand }-ը չի աշխատի այս զննարկչի հետ: { -send-short-brand }-ը լավագույն կերպով աշխատում է { -firefox }-ի վերջին տարբերակի հետ և կաշխատի զննարկիչների մեծամասնության վերջին տարբերակների հետ: downloadFirefox = Ներբեռնել { -firefox }-ը legalTitle = { -send-short-brand }-ի Գաղտնիության ծանուցում legalDateStamp = Տարբերակ 1.0, թվագրված՝ 2019 թ. մարտի 12-ով # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }օր { $hours }ժ { $minutes }ր addFilesButton = Ընտրեք ֆայլեր՝ վերբեռնելու համար uploadButton = Վերբեռնել # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Քաշեք և գցեք ֆայլերը # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = կամ կտտացրեք`ուղարկելու համար մինչև { $size } addPassword = Պաշտպանեք գաղտնաբառով emailPlaceholder = Մուտքագրեք ձեր էլ. փոստը # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Մուտք գործեք՝ { $size } ուղարկելու համար signInOnlyButton = Մուտք գործել accountBenefitTitle = Ստեղծեք { -firefox } հաշիվ կամ մուտք գործեք # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Կիսվեք մինչև { $size } ֆայլերով accountBenefitDownloadCount = Կիսվեք ֆայլերով ավելի շատ մարդկանց հետ accountBenefitTimeLimit = { $count -> [one] Հղումներն ակտիվ պահել մինչև 1 օր *[other] Հղումներն ակտիվ պահել մինչև { $count } օր } accountBenefitSync = Կառավարեք համօգտագործվող ֆայլերը ցանկացած սարքից accountBenefitMoz = Իմացեք { -mozilla }-ի այլ ծառայությունների մասին signOut = Դուրս գրվել okButton = Լավ downloadingTitle = Ներբեռնվում է noStreamsWarning = Այս զննարկիչը չի կարողանա վերծանել այսպիսի մեծ ֆայլը noStreamsOptionCopy = Պատճենեք հղումը`այլ զննարկիչում բացելու համար noStreamsOptionFirefox = Փորձեք մեր սիրած զննարկիչը noStreamsOptionDownload = Շարունակեք այս զննարկիչով downloadFirefoxPromo = { -send-short-brand }-ը ձեզ է առաջարկում ամբողջովին նոր { -firefox }: # the next line after the colon contains a file name shareLinkDescription = Կիսվեք ձեր ֆայլի հղումով. shareLinkButton = Համօգտագործել հղումը # $name is the name of the file shareMessage = Ներբեռնեք “{ $name }”-ը { -send-brand }-ով ՝ պարզ և ապահով՝ ֆայլերի համօգտագործում trailheadPromo = Ձեր գաղտնիությունը պաշտպանելու միջոց կա: Միացեք Firefox- ին: learnMore = Իմանալ ավելին ================================================ FILE: public/locales/ia/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importation… encryptingFile = Cryptation... decryptingFile = Decryptation… downloadCount = { $num -> [one] { $num } discargamento *[other] { $num } discargamentos } timespanHours = { $num -> [one] { $num } hora *[other] { $num } horas } copiedUrl = Copiate! unlockInputPlaceholder = Contrasigno unlockButtonLabel = Disblocar downloadButtonLabel = Discargar downloadFinish = Discargamento completate fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Proba Send errorPageHeader = Un error occurreva! fileTooBig = Iste file es troppo grande pro incargar. Illo debe esser inferior a { $size }. linkExpiredAlt = Ligamine expirate notSupportedHeader = Tu navigator non es supportate notSupportedLink = Proque non es mi navigator supportate? notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologia web que actiona Send. Tu debe actualisar tu navigator. updateFirefox = Actualisar Firefox deletePopupCancel = Cancellar deleteButtonHover = Deler footerLinkLegal = Legal footerLinkPrivacy = Confidentialitate footerLinkCookies = Cookies passwordTryAgain = Contrasigno incorrecte. Retenta. javascriptRequired = Send require JavaScript whyJavascript = Proque Send require JavaScript? enableJavascript = Por favor activa JavaScript e tenta novemente. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maxime longor del contrasigno: { $length } # A short status message shown when there was an error setting the password passwordSetError = Iste contrasigno non ha potite esser establite ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Comparti file in maniera confidential introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre. notifyUploadEncryptDone = Tu file es cryptate e preste pro esser inviate # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira post { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuta *[other] { $num } minutas } timespanDays = { $num -> [one] 1 die *[other] { $num } dies } timespanWeeks = { $num -> [one] 1 septimana *[other] { $num } septimanas } fileCount = { $num -> [one] 1 file *[other] { $num } files } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Dimension total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copia le ligamine pro compartir le file: copyLinkButton = Copiar ligamine downloadTitle = Discargar files downloadDescription = Iste file era compartite via { -send-brand } con cryptographia bilateral e un ligamine que expira automaticamente. trySendDescription = Prova { -send-brand } pro le compartimento de file simple e secur. # count will always be > 10 tooManyFiles = { $count -> [one] Solmente 1 file pote ser incargate al vice. *[other] Solmente { $count } files pote esser incargate al vice. } # count will always be > 10 tooManyArchives = { $count -> [one] Solo 1 archivo es permittite. *[other] Solo { $count } archivos es permitter. } expiredTitle = Iste ligamine ha expirate. notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores. downloadFirefox = Discargar { -firefox } legalTitle = Aviso de confidentialitate de { -send-short-brand } legalDateStamp = Version 1.0 del 12 martio 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Selige le files a incargar trustWarningMessage = Verifica que tu te fide a tu destinatario quando tu comparti datos sensibile. uploadButton = Incargar # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Traher e deponer files # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o cliccar pro inviar usque { $size } addPassword = Proteger per contrasigno emailPlaceholder = Insere tu adresse de e-mail # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Aperi session pro inviar usque a { $size } signInOnlyButton = Aperir session accountBenefitTitle = Crea un conto { -firefox } o registra te # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Comparti files usque { $size } accountBenefitDownloadCount = Comparti files con plus de personas accountBenefitTimeLimit = { $count -> [one] Retene active le ligamine pro 1 die *[other] Retene active le ligamine pro { $count } dies } accountBenefitSync = Gere files compartite ab non importa qual apparato accountBenefitMoz = Discoperi altere servicios de { -mozilla } signOut = Clauder session okButton = OK downloadingTitle = Discargamento noStreamsWarning = Es possibile que iste navigator non pote decryptar un file de iste proportiones. noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator noStreamsOptionFirefox = Prova nostre navigator favorite noStreamsOptionDownload = Continuar con iste navigator downloadFirefoxPromo = { -send-short-brand } es portate a te per le novissime { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Condivide le ligamine a tu file: shareLinkButton = Condivide ligamine # $name is the name of the file shareMessage = Discarga “{ $name }” con { -send-brand }: condivide files in modo simple e secur trailheadPromo = Il ha un via pro proteger tu confidentialitate. Junge te a Firefox! learnMore = Saper plus. downloadFlagged = Iste ligamine ha essite disactivate per violation del terminos de servicio. downloadConfirmTitle = Un altere cosa downloadConfirmDescription = Verifica que tu te fide al persona qui te inviava iste file, perque nos non pote verificar que illo non violara tu apparato. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Io me fide al persona qui inviava iste file *[other] Io me fide al persona qui inviava iste files } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] reportar iste file como suspecte *[other] reportar iste files como suspecte } reportDescription = Adjuta nos a comprender lo que eveni. Que pensa tu es problematic con iste files? reportUnknownDescription = Va al URL del ligamine que tu desira signalar e clicca “{ reportFile }”. reportButton = Reportar reportReasonMalware = Iste files contine malware o es parte de un attacco fraudulente. reportReasonPii = Iste files contine informationes personal identificabile re me. reportReasonAbuse = Iste files contine contento illegal o abusive. reportReasonCopyright = Pro signalar violation de derectos de autor o marca de fabrica, usa le procedura describite a iste pagina. reportedTitle = Files reportate reportedDescription = Gratias. Nos ha recipite tu reporto sur iste files. ================================================ FILE: public/locales/id/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Mengimpor… encryptingFile = Mengenkripsi... decryptingFile = Mendekripsi... downloadCount = { $num -> *[other] { $num } unduhan } timespanHours = { $num -> *[other] { $num } jam } copiedUrl = Tersalin! unlockInputPlaceholder = Sandi unlockButtonLabel = Buka downloadButtonLabel = Unduh downloadFinish = Unduhan Selesai fileSizeProgress = ({ $partialSize } dari { $totalSize }) sendYourFilesLink = Coba Send errorPageHeader = Terjadi kesalahan! fileTooBig = Berkas terlalu besar untuk diunggah. Harus kurang dari { $size }. linkExpiredAlt = Tautan kedaluwarsa notSupportedHeader = Peramban Anda tidak mendukung. notSupportedLink = Mengapa peramban saya tidak didukung? notSupportedOutdatedDetail = Sayangnya Firefox versi ini tidak mendukung teknologi web yang menggerakkan Send. Anda perlu memperbarui peramban Anda. updateFirefox = Perbarui Firefox deletePopupCancel = Batal deleteButtonHover = Hapus footerLinkLegal = Legal footerLinkPrivacy = Privasi footerLinkCookies = Kuki passwordTryAgain = Sandi salah. Silakan coba lagi. javascriptRequired = Send membutuhkan JavaScript. whyJavascript = Mengapa Send membutuhkan JavaScript? enableJavascript = Silakan aktifkan JavaScript dan coba lagi. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }j { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Panjang sandi maksimal: { $length } # A short status message shown when there was an error setting the password passwordSetError = Tidak bisa menyetel sandi ini ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Berbagi berkas dengan mudah dan privat introDescription = { -send-brand } mudahkan Anda membagikan berkas dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. Sehingga Anda dapat menjaga apa yang Anda bagikan secara privat dan memastikan barang Anda tidak selamanya ada di daring. notifyUploadEncryptDone = Berkas Anda terenkripsi dan siap untuk dikirim # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Berakhir setelah { $downloadCount } atau { $timespan } timespanMinutes = { $num -> *[other] { $num } menit } timespanDays = { $num -> *[other] { $num } hari } timespanWeeks = { $num -> *[other] { $num } pekan } fileCount = { $num -> *[other] { $num } berkas } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total ukuran: { $size } # the next line after the colon contains a file name copyLinkDescription = Salin tautan untuk membagikan berkas Anda: copyLinkButton = Salin tautan downloadTitle = Unduh berkas downloadDescription = Berkas ini dibagikan lewat { -send-brand } dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. trySendDescription = Coba { -send-brand } untuk berbagi berkas dengan mudah dan aman. # count will always be > 10 tooManyFiles = { $count -> *[other] Hanya { $count } berkas dapat diunggah dalam sekali waktu. } # count will always be > 10 tooManyArchives = { $count -> *[other] Hanya { $count } arsip diperbolehkan. } expiredTitle = Tautan ini telah kadaluarsa. notSupportedDescription = { -send-brand } tidak dapat digunakan dengan peramban ini. { -send-short-brand } bekerja maksimal dengan versi terbaru { -firefox }, dan akan bekerja dengan versi terkini mayoritas peramban. downloadFirefox = Unduh { -firefox } legalTitle = Pemberitahuan Privasi { -send-short-brand } legalDateStamp = Versi 1.0, tertanggal 12 Maret 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }h { $hours }j { $minutes }m addFilesButton = Pilih berkas untuk diunggah trustWarningMessage = Pastikan Anda mempercayai penerima Anda saat berbagi data sensitif. uploadButton = Unggah # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Seret dan jatuhkan berkas # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = atau klik untuk mengirim hingga { $size } addPassword = Lindungi dengan kata sandi emailPlaceholder = Masukkan surel Anda # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Masuk untuk dapat mengirim hingga { $size } signInOnlyButton = Masuk accountBenefitTitle = Buat { -firefox } Account atau masuk # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Bagikan berkas hingga { $size } accountBenefitDownloadCount = Bagikan berkas kepada lebih banyak orang accountBenefitTimeLimit = { $count -> *[other] Buat tautan aktif selama { $count } hari } accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya signOut = Keluar okButton = Oke downloadingTitle = Mengunduh noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini. noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya noStreamsOptionFirefox = Coba peramban favorit kami noStreamsOptionDownload = Lanjutkan dengan peramban ini downloadFirefoxPromo = { -send-short-brand } dipersembahkan untuk Anda oleh { -firefox } terbaru. # the next line after the colon contains a file name shareLinkDescription = Bagikan tautan ke berkas Anda: shareLinkButton = Bagikan tautan # $name is the name of the file shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox. learnMore = Pelajari lebih lanjut. downloadFlagged = Tautan ini telah dinonaktifkan karena melanggar persyaratan layanan. downloadConfirmTitle = Satu hal lagi downloadConfirmDescription = Pastikan Anda memercayai orang yang mengirimi Anda file ini karena kami tidak dapat memverifikasi bahwa hal itu tidak akan merusak perangkat Anda. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] Saya percaya orang yang mengirim file-file ini } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] Laporkan file-file ini karena mencurigakan } reportDescription = Bantu kami memahami apa yang sedang terjadi. Apa yang menurut Anda salah dengan file-file ini? reportUnknownDescription = Buka url tautan yang ingin Anda laporkan dan klik “{ reportFile }”. reportButton = Melaporkan reportReasonMalware = File-file ini mengandung malware atau merupakan bagian dari serangan phishing. reportReasonPii = File-file ini mengandung informasi pribadi tentang saya. reportReasonAbuse = File-file ini mengandung konten ilegal atau kasar. reportReasonCopyright = Untuk melaporkan pelanggaran hak cipta atau merek dagang, gunakan proses yang dijelaskan di laman ini . reportedTitle = File Dilaporkan reportedDescription = Terima kasih. Kami telah menerima laporan Anda tentang file-file ini. ================================================ FILE: public/locales/ig/send.ftl ================================================ # Send is a brand name and should not be localized. title = Firefox Zipu importingFile = Mbubata… encryptingFile = ezoro ezo... decryptingFile = Kpebie downloadCount = { $num -> [one] ụbọchị { $num } *[other] Abuọ } timespanHours = { $num -> [one] { $num } otu *[other] { $num } abụọ } copiedUrl = edepụtachaghiri unlockInputPlaceholder = okwuntughe unlockButtonLabel = imeghe downloadButtonLabel = budata downloadFinish = Mbudata zuru ezu fileSizeProgress = ({ $partialSize } nke { $totalSize }) sendYourFilesLink = Firefox Zipu errorPageHeader = Onwere ihe na-adighi mma fileTooBig = Failu a ebuka ibulite. Ọ kwẹsịghi ịkalị { $size } linkExpiredAlt = Njiko jedebe notSupportedHeader = Adighi akwado ihe nchogharị gị notSupportedLink = Gịnị kpatara na akwadoghị ihe nchọgharị m? notSupportedOutdatedDetail = Ọ dị nwute na ụdị Firefox a anaghị akwado teknụzụ weebụ na-eji Firefox Zipụ. Ikwesiri imelite ihe nchọgharị gị. updateFirefox = Melite Firefox deletePopupCancel = Kagbuo deleteButtonHover = Hichapụ footerLinkLegal = n'Iwu footerLinkPrivacy = nzuzo footerLinkCookies = Kuki ga passwordTryAgain = okwuntughe ezighi ezi.Nwaa ọzọ javascriptRequired = Firefox Zipu chọrọ whyJavascript = Kedu ihe kpatara Send jiri chọ JavaScript? enableJavascript = Biko họrọ JavaScript ma nwaa ọzọ # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Oke okwuntughe kachasị: { $length } # A short status message shown when there was an error setting the password passwordSetError = Enweghị ike ịtọ paswọọdụ a ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Zipu, Ziga -firefox = Firefox -mozilla = Mozilla introTitle = Mfe, nkekọrịta faịlụ nkeonwe introDescription = na-ahapu gị ịkekọrịta faịlụ na izo ya na njedebe na njedebe na-akwụsị na akpaghị aka. Yabụ ị nwere ike idobe ihe ị na -eche ma hụ na ngwongwo gị agaghị adị n'ịntanetị ruo mgbe ebighi ebi. notifyUploadEncryptDone = Failu gi zoro ezo ma di njikere iziga # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ọ ga-agwu mgbe { $downloadCount } ma ọ bụ { $timespan } gasịrị timespanDays = { $num -> [one] 1 ụbọchị *[other] ụbọchị { $num } } timespanWeeks = { $num -> [one] 1 izu *[other] izu { $num } } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $Number } { $nkeji } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = { $nha } # the next line after the colon contains a file name copyLinkDescription = Detuo njikọ ahụ iji kee faịlụ gị copyLinkButton = Detuo njikọ downloadTitle = Budata faịlụ gasi downloadDescription = Nkekọrịta faịlụ a site na site na iji zoo njedebe na-njedebe yana otu njikọ na-akwụsị na-akpaghị aka. trySendDescription = Gbalịa maka nyefe faịlụ dị mfe. expiredTitle = Njikọ a emebiela. notSupportedDescription = agaghị eji ihe nchọgharị a rụọ ọrụ. na arụ ọrụ kacha mma na ụdị nke , ọ ga-arụkwa ụdị nke ihe nchọgharị ka ugbu a. downloadFirefox = Budata legalTitle = Nkwupụta Nzuzo legalDateStamp = 1.dị 1.0, akara ụbọchị Maachi 12, 2019 okButton = O ================================================ FILE: public/locales/it/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importazione in corso… encryptingFile = Crittazione in corso… decryptingFile = Decrittazione in corso… downloadCount = { $num -> [one] 1 download *[other] { $num } download } timespanHours = { $num -> [one] 1 ora *[other] { $num } ore } copiedUrl = Copiato unlockInputPlaceholder = Password unlockButtonLabel = Sblocca downloadButtonLabel = Scarica downloadFinish = Download completato fileSizeProgress = ({ $partialSize } di { $totalSize }) sendYourFilesLink = Prova Send errorPageHeader = Si è verificato un errore. fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferiore a { $size }. linkExpiredAlt = Link scaduto notSupportedHeader = Il browser in uso non è supportato. notSupportedLink = Perché questo browser non risulta supportato? notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Send. È necessario aggiornare il browser. updateFirefox = Aggiorna Firefox deletePopupCancel = Annulla deleteButtonHover = Elimina footerLinkLegal = Note legali footerLinkPrivacy = Privacy footerLinkCookies = Cookie passwordTryAgain = Password errata, riprovare. javascriptRequired = Send richiede JavaScript whyJavascript = Perché Send richiede JavaScript? enableJavascript = Attiva JavaScript e riprova. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Lunghezza massima della password: { $length } # A short status message shown when there was an error setting the password passwordSetError = Impossibile impostare la password ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Condividi file in modo semplice e riservato introDescription = { -send-brand } permette di condividere file con crittografia end-to-end attraverso un link che scade automaticamente. In questo modo hai la garanzia che i tuoi contenuti vengano condivisi in modo riservato e non rimangano online per sempre. notifyUploadEncryptDone = Il file è crittato e pronto per l’invio # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Scade dopo { $downloadCount } o tra { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minuti } timespanDays = { $num -> [one] 1 giorno *[other] { $num } giorni } timespanWeeks = { $num -> [one] 1 settimana *[other] { $num } settimane } fileCount = { $num } file # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Dimensione totale: { $size } # the next line after the colon contains a file name copyLinkDescription = Copia il link per condividere il file: copyLinkButton = Copia link downloadTitle = Scarica file downloadDescription = Questo file è stato condiviso tramite { -send-brand } con crittografia end-to-end e un link che scade automaticamente. trySendDescription = Prova { -send-brand } per condividere file in modo semplice e sicuro. # count will always be > 10 tooManyFiles = È possibile caricare solo { $count } file alla volta. # count will always be > 10 tooManyArchives = { $count -> [one] È consentito solo un archivio. *[other] Sono consentiti solo { $count } archivi. } expiredTitle = Questo link è scaduto. notSupportedDescription = Non è possibile utilizzare { -send-brand } con questo browser. { -send-short-brand } funziona al meglio con l’ultima versione di { -firefox } ma è compatibile con l’ultima versione della maggior parte dei browser. downloadFirefox = Scarica { -firefox } legalTitle = Informativa sulla privacy di { -send-short-brand } legalDateStamp = Versione 1.0 del 12 marzo 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }g { $hours }h { $minutes }m addFilesButton = Seleziona i file da caricare trustWarningMessage = Assicurati che il destinatario sia affidabile quando condividi dati sensibili. uploadButton = Carica # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Trascina e rilascia i file # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o fai clic per inviare fino a { $size } addPassword = Proteggi con una password emailPlaceholder = Inserisci il tuo indirizzo email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Accedi per inviare fino a { $size } signInOnlyButton = Accedi accountBenefitTitle = Crea un account { -firefox } o accedi # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Condividi file fino a { $size } accountBenefitDownloadCount = Condividi file con più persone accountBenefitTimeLimit = { $count -> [one] Mantieni link attivi per 1 giorno *[other] Mantieni link attivi per { $count } giorni } accountBenefitSync = Gestisci i file condivisi da qualsiasi dispositivo accountBenefitMoz = Scopri altri servizi { -mozilla } signOut = Disconnetti okButton = OK downloadingTitle = Download in corso… noStreamsWarning = Questo browser potrebbe non essere in grado di decrittare un file così grande. noStreamsOptionCopy = Copia il link e aprilo in un altro browser noStreamsOptionFirefox = Prova il nostro browser preferito noStreamsOptionDownload = Continua con questo browser downloadFirefoxPromo = { -send-short-brand } è offerto dal nuovissimo { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Condividi il link al tuo file: shareLinkButton = Condividi link # $name is the name of the file shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura trailheadPromo = C’è un modo per proteggere la tua privacy. Entra in Firefox. learnMore = Ulteriori informazioni. downloadFlagged = Questo link è stato disattivato perché vìola i termini di servizio. downloadConfirmTitle = Un’ultima cosa downloadConfirmDescription = Assicurati che la persona che ti ha inviato questo file sia affidabile perché non possiamo garantire che non sia in grado di danneggiare il tuo dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Considero affidabile la persona che ha inviato questo file *[other] Considero affidabile la persona che ha inviato questi file } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Segnala questo file come sospetto *[other] Segnala questi file come sospetti } reportDescription = Aiutaci a capire che cosa è successo. Qual è il problema con questi file? reportUnknownDescription = Vai all’indirizzo del link che vuoi segnalare e fai clic su “{ reportFile }”. reportButton = Segnala reportReasonMalware = Questi file contengono malware o fanno parte di un attacco phishing. reportReasonPii = Questi file contengono informazioni personali identificabili che mi riguardano. reportReasonAbuse = Questi file contengono contenuti illegali o offensivi. reportReasonCopyright = Per segnalare violazioni del copyright o abusi di marchi registrati, utilizzare la procedura descritta in questa pagina. reportedTitle = File segnalati reportedDescription = Grazie, abbiamo ricevuto la tua segnalazione relativa a questi file. ================================================ FILE: public/locales/ixl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Aq'a yol sti' importingFile = Eq'otzan encryptingFile = La muj isik'lele decryptingFile = Ni jaj ve't isik'lele' downloadCount = { $num -> [one] Eq'omal ku'tzan *[other] { $num } Eq'omalaj ku'tzan } timespanHours = { $num -> [one] 1 Ch'ich' *[other] { $num } Nimalaj ch'ich' } copiedUrl = Eesamal ivatz! unlockInputPlaceholder = Kach'ub'al unlockButtonLabel = Eesa ikach'ub'al downloadButtonLabel = Eq'o ku'tzan downloadFinish = Eq'o ku'tzan kaajayil fileSizeProgress = ({ $partialSize }tetz{ $totalSize }) sendYourFilesLink = B'anb'e ve't u Send errorPageHeader = At ma'l kam valexh kat eli! notSupportedHeader = U chukb'al aq'one' ye' ni toleb'e'. notSupportedLink = Kam q'ii uve' ye' kuxh ni toleb' u chukb'al vaq'one'? updateFirefox = Tz'ajsa tatine' Firefox deletePopupCancel = Ya'samal deleteButtonHover = Sojsa footerLinkPrivacy = Tetz kuxhtu' footerLinkCookies = Cookies # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Aq'b'en -firefox = Firefox -mozilla = Mozilla # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m emailPlaceholder = Aq'ku' a correo shareLinkButton = La jatxb'en u vaa' learnMore = Ootzi ka'te. ================================================ FILE: public/locales/ja/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = インポート中... encryptingFile = 暗号化中... decryptingFile = 復号化中... downloadCount = { $num -> *[other] { $num } 回のダウンロード } timespanHours = { $num -> *[other] { $num } 時間 } copiedUrl = コピー完了! unlockInputPlaceholder = パスワード unlockButtonLabel = ロック解除 downloadButtonLabel = ダウンロード downloadFinish = ダウンロード完了 fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = Send を試す errorPageHeader = 何か問題が発生しました。 fileTooBig = このファイルは大きすぎるためアップロードできません。上限は { $size } です。 linkExpiredAlt = リンク期限切れ notSupportedHeader = お使いのブラウザーには対応していません。 notSupportedLink = なぜ私のブラウザーには対応していないのでしょうか? notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 updateFirefox = Firefox を更新 deletePopupCancel = キャンセル deleteButtonHover = 削除 footerLinkLegal = 法的情報 footerLinkPrivacy = プライバシー footerLinkCookies = Cookie passwordTryAgain = パスワードが正しくありません。再度入力してください。 javascriptRequired = Send を使うには JavaScript が必要です whyJavascript = Send が JavaScript を必要とする理由 enableJavascript = JavaScript を有効にして再度試してください。 # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } 時間 { $minutes } 分 # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } 分 # A short status message shown when the user enters a long password maxPasswordLength = パスワード最長文字数: { $length } # A short status message shown when there was an error setting the password passwordSetError = このパスワードは設定できませんでした ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = 簡単に、プライベートにファイル共有 introDescription = { -send-brand } では、暗号化してファイル共有でき、リンクは自動的に期限切れになります。そのため、共有するものをプライベートに保管でき、オンライン上に永遠に残さないようにできます。 notifyUploadEncryptDone = ファイルが暗号化され、送信する準備ができました # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = 有効期間: { $downloadCount } または { $timespan } timespanMinutes = { $num -> *[other] { $num } 分 } timespanDays = { $num -> *[other] { $num } 日 } timespanWeeks = { $num -> *[other] { $num } 週間 } fileCount = { $num -> *[other] { $num } ファイル } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = 合計サイズ: { $size } # the next line after the colon contains a file name copyLinkDescription = リンクをコピーしてファイルを共有: copyLinkButton = リンクをコピー downloadTitle = ファイルをダウンロード downloadDescription = このファイルは { -send-brand } により、暗号化されて共有されました。リンクは自動的に期限切れになります。 trySendDescription = 簡単で安全なファイル共有ができる { -send-brand } を試してください。 # count will always be > 10 tooManyFiles = { $count -> *[other] 一度にアップロードできるのは { $count } ファイルまでです。 } # count will always be > 10 tooManyArchives = { $count -> *[other] { $count } 回までしかダウンロードできません。 } expiredTitle = このリンクは期限切れです。 notSupportedDescription = { -send-brand } は、このブラウザーでは動作しません。{ -send-short-brand } は最新バージョンの { -firefox } で最もよく動作し、その他の現バージョンのブラウザーでも動作します。 downloadFirefox = { -firefox } をダウンロード legalTitle = { -send-short-brand } プライバシー通知 legalDateStamp = バージョン 1.0, 2019年3月12日時点 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } 日 { $hours } 時 { $minutes } 分 addFilesButton = アップロードするファイルを選択 trustWarningMessage = 機密データを共有する場合は、受信者が信頼できる相手であることを確認してください。 uploadButton = アップロード # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ファイルをドラッグ&ドロップ # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = または、クリックして最大 { $size } のファイルを送信 addPassword = パスワードで保護 emailPlaceholder = メールアドレスを入力 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = ログインすると最大 { $size } のファイルを送信できます signInOnlyButton = ログイン accountBenefitTitle = { -firefox } アカウントを作成またはログイン # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = 最大 { $size } までのファイルを共有 accountBenefitDownloadCount = より多くの人とファイルを共有 accountBenefitTimeLimit = { $count -> *[other] リンクを { $count } 日間有効化 } accountBenefitSync = 様々な端末から共有したファイルを管理 accountBenefitMoz = { -mozilla } の他のサービスについて詳しく学ぶ signOut = ログアウト okButton = OK downloadingTitle = ダウンロード中 noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。 noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください noStreamsOptionFirefox = Firefox を試してみる noStreamsOptionDownload = このブラウザーで続ける downloadFirefoxPromo = { -send-short-brand } はすべてが新しくなった { -firefox } により提供されています。 # the next line after the colon contains a file name shareLinkDescription = ファイルへのリンクを共有しましょう: shareLinkButton = リンクを共有 # $name is the name of the file shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有 trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。 learnMore = 詳細情報 downloadFlagged = サービス利用規約に違反しているため、このリンクは無効になっています。 downloadConfirmTitle = さらにもう一つ downloadConfirmDescription = このファイルが端末に悪影響を及ぼさないことを確かめられないため、送信者が信頼できる相手であることを確認してください。 # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] ファイルの送信者を信頼します } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] 疑わしいファイルとして報告する } reportDescription = 詳しく調べるためにお知らせください。これらのファイルの何が問題だと思われますか? reportUnknownDescription = 報告したい内容のリンクの URL にアクセスし、“{ reportFile }” をクリックしてください。 reportButton = 問題を報告 reportReasonMalware = これらのファイルにはマルウェアが含まれているか、フィッシング詐欺攻撃の一部です。 reportReasonPii = これらのファイルには私に関する個人情報が含まれています。 reportReasonAbuse = これらのファイルには違法または虐待的なコンテンツが含まれています。 reportReasonCopyright = 著作権または商標の侵害を報告するには、このページ に記載された手続きに従ってください。 reportedTitle = ファイルを報告しました reportedDescription = ご協力ありがとうございました。これらのファイルに関する報告を受け取りました。 ================================================ FILE: public/locales/ka/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = გადმოტანა... encryptingFile = დაშიფვრა... decryptingFile = გაშიფვრა... downloadCount = { $num -> [one] 1 ჩამოტვირთვა *[other] { $num } ჩამოტვირთვა } timespanHours = { $num -> [one] 1 საათი *[other] { $num } საათი } copiedUrl = ასლი აღებულია! unlockInputPlaceholder = პაროლი unlockButtonLabel = გახსნა downloadButtonLabel = ჩამოტვირთვა downloadFinish = ჩამოტვირთვა დასრულდა fileSizeProgress = ({ $partialSize } { $totalSize }-იდან) sendYourFilesLink = გამოცადეთ Send errorPageHeader = რაღაც ხარვეზია! fileTooBig = ფაილი ზედმეტად დიდია. უნდა იყოს { $size } ზომაზე ნაკლები. linkExpiredAlt = ბმული ვადაგასულია notSupportedHeader = თქვენი ბრაუზერი არაა მხარდაჭერილი. notSupportedLink = რატომ არაა ჩემი ბრაუზერი მხარდაჭერილი? notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. updateFirefox = Firefox-ის განახლება deletePopupCancel = გაუქმება deleteButtonHover = წაშლა footerLinkLegal = სამართლებრივი საკითხები footerLinkPrivacy = პირადულობა footerLinkCookies = ფუნთუშები passwordTryAgain = პაროლი არასწორია. სცადეთ ხელახლა. javascriptRequired = Send საჭიროებს JavaScript-ს whyJavascript = რატომ საჭიროებს Send JavaScript-ს? enableJavascript = გთხოვთ ჩართოთ JavaScript და სცადოთ ხელახლა. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }სთ { $minutes }წთ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }წთ # A short status message shown when the user enters a long password maxPasswordLength = პაროლის დაშვებული ზომა: { $length } # A short status message shown when there was an error setting the password passwordSetError = ამ პაროლის დაყენება ვერ ხერხდება ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = ფაილის გაზიარება მარტივად, დაცულად introDescription = { -send-brand } საშუალებას გაძლევთ გააზიაროთ ფაილები გამჭოლი დაშიფვრითა და ბმულით, რომელიც გარკვეული დროის შემდეგ თავისთავად გაუქმდება. ასე რომ, რასაც გააზიარებთ იქნება საიდუმლო და არც ინტერნეტში არ დარჩება სამუდამოდ. notifyUploadEncryptDone = თქვენი ფაილი დაშიფრულია და მზადაა გასაგზავნად # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = ვადის გასვლამდე დარჩენილია { $downloadCount } ან { $timespan } timespanMinutes = { $num -> [one] 1 წუთი *[other] { $num } წუთი } timespanDays = { $num -> [one] 1 დღე *[other] { $num } დღე } timespanWeeks = { $num -> [one] 1 კვირა *[other] { $num } კვირა } fileCount = { $num -> [one] 1 ფაილი *[other] { $num } ფაილი } # byte abbreviation bytes = ბ # kibibyte abbreviation kb = კბ # mebibyte abbreviation mb = მბ # gibibyte abbreviation gb = გბ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = სულ ზომა: { $size } # the next line after the colon contains a file name copyLinkDescription = ბმულის ასლი ფაილის გასაზიარებლად: copyLinkButton = ბმულის ასლი downloadTitle = ფაილების ჩამოტვირთვა downloadDescription = ფაილი გაზიარებულია { -send-brand }-ის საშუალებით, გამჭოლი დაშიფვრითა და ვადიანი ბმულით. trySendDescription = გამოსცადეთ { -send-brand }, ფაილების გაზიარება მარტივად, დაცულად. # count will always be > 10 tooManyFiles = { $count -> [one] მხოლოდ 1 ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. *[other] მხოლოდ { $count } ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. } # count will always be > 10 tooManyArchives = { $count -> [one] მხოლოდ 1 არქივია დაშვებული. *[other] მხოლოდ { $count } არქივია დაშვებული. } expiredTitle = ბმული ვადაგასულია. notSupportedDescription = { -send-brand } არ იმუშავებს ამ ბრაუზერთან. { -send-short-brand } საუკეთესოდ მუშაობს ახალ { -firefox }-ზე და აგრეთვე უმეტესი ბრაუზერების უახლეს ვერსიებზე. downloadFirefox = ჩამოტვირთეთ { -firefox } legalTitle = { -send-short-brand } პირადულობის განაცხადი legalDateStamp = ვერსია 1.0, დათარიღებული 12 მარტით, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } დღე { $hours } სთ { $minutes } წთ addFilesButton = ფაილების შერჩევა ასატვირთად trustWarningMessage = დარწმუნდით, რომ ენდობით მიმღებს, სანამ მნიშვნელოვან მონაცემებს გაუზიარებთ. uploadButton = ატვირთვა # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = გადმოიტანეთ და მოათავსეთ ფაილები # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ან დაწკაპეთ გასაგზავნად { $size }-მდე addPassword = პაროლით დაცვა emailPlaceholder = შეიყვანეთ ელფოსტა # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე signInOnlyButton = შესვლა accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე accountBenefitDownloadCount = გაუზიარეთ ფაილები მეტ ხალხს accountBenefitTimeLimit = { $count -> [one] დატოვეთ ფაილები 1 დღემდე *[other] დატოვეთ ფაილები { $count } დღემდე } accountBenefitSync = მართეთ გაზიარებული ფაილები ნებისმიერი მოწყობილობიდან accountBenefitMoz = გაეცანით { -mozilla }-ს სხვა მომსახურებებს signOut = გამოსვლა okButton = კარგი downloadingTitle = მიმდინარეობს ჩამოტვირთვა noStreamsWarning = ამ ბრაუზერმა, შესაძლოა ვერ მოახერხოს ასეთი დიდი ფაილის გაშიფვრა. noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით downloadFirefoxPromo = { -send-short-brand }-ს წარმოგიდგინეთ უახლესი { -firefox }. # the next line after the colon contains a file name shareLinkDescription = ფაილის ბმულის გაზიარება: shareLinkButton = ბმულის გაზიარება # $name is the name of the file shareMessage = ჩამოტვირთეთ „{ $name }“ { -send-brand }-ით: ფაილების გაზიარება მარტივად, უსაფრთხოდ trailheadPromo = გზა, თქვენი პირადულობის დასაცავად. შემოუერთდით Firefox-ს. learnMore = იხილეთ ვრცლად. downloadFlagged = ბმული გაუქმებულია, მომსახურების პირობების დარღვევის გამო. downloadConfirmTitle = კიდევ ერთი რამ downloadConfirmDescription = დარწმუნდით, რომ სანდოა პირი, ვინც ეს ფაილი გამოგიგზავნათ, რადგან ჩვენ ვერ დაგპირდებით, რომ არ დააზიანებს თქვენს მოწყობილობას. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] ვენდობი პირს, რომელმაც ეს ფაილი გამომიგზავნა *[other] ვენდობი პირს, რომელმაც ეს ფაილები გამომიგზავნა } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] მოხსენება, საეჭვო ფაილზე *[other] მოხსენება, საეჭვო ფაილებზე } reportDescription = დაგვეხმარეთ გარკვევაში. თქვენი აზრით, რა ფაილებია? reportUnknownDescription = გთხოვთ გადახვიდეთ ბმულზე, რომლზეც გსურთ გვაცნობოთ და დაწკაპეთ „{ reportFile }“. reportButton = მოხსენება reportReasonMalware = ეს ფაილები შეიცავს მავნე კოდს ან თაღლითური შეტევის ნაწილია. reportReasonPii = ეს ფაილები შეიცავს ვინაობის ამსახველ მასალას ჩემზე. reportReasonAbuse = ეს ფაილები შეიცავს უკანონო ან შეურაცხმყოფელ მასალას. reportReasonCopyright = საავტორო უფლებებთან ან სავაჭრო ნიშნებთან დაკავშირებულ დარღვევებზე მოხსენებისთვის, გთხოვთ იხილოთ განმარტებითი მითითებები ამ გვერდზე. reportedTitle = ფაილებზე მოხსენება გაგზავნილია reportedDescription = გმადლობთ. მივიღეთ თქვენი მოხსენება, ამ ფაილებზე. ================================================ FILE: public/locales/kab/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Akter... encryptingFile = Awgelhen... decryptingFile = Azmek... downloadCount = { $num -> [one] 1 usider *[other] { $num } isidar } timespanHours = { $num -> [one] 1 usrag *[other] { $num } isragen } copiedUrl = Yenɣel! unlockInputPlaceholder = Awal uffir unlockButtonLabel = Serreḥ downloadButtonLabel = Sider downloadFinish = Asider yemmed fileSizeProgress = ({ $partialSize } seg { $totalSize }) sendYourFilesLink = Ɛreḍ Send errorPageHeader = Yella wayen yeḍran! fileTooBig = Afaylu-agi meqqer aṭas. Yessefk ad yili daw n { $size }. linkExpiredAlt = Aseɣwen yemmut notSupportedHeader = Iminig-ik ur ittusefrak ara notSupportedLink = Ayγer iminig inu ur yettwasefrek ara? notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Send. Yessefk ad tleqmeḍ iminig-ik. updateFirefox = Leqqem Firefox deletePopupCancel = Sefsex deleteButtonHover = Kkes footerLinkLegal = Usḍif footerLinkPrivacy = Tabaḍnit footerLinkCookies = Inagan n tuqqna passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen. javascriptRequired = Send yesra JavaScript whyJavascript = Ayɣer firefox Send yesra JavaScript? enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }Tisdatin # A short status message shown when the user enters a long password maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length } # A short status message shown when there was an error setting the password passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Afessas, beṭṭu n ifuyla s wudem uslig introDescription = { -send-brand } ad k·kem-yeǧǧ ad tebḍuḍ ifuyla iwgelhanen si ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥerzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad tamneḍ imi agbur-ik·im ur yettɣimi ara i lebda. notifyUploadEncryptDone = Afaylu-ik yewgelhen daɣen ihegga i tuzna # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ad yemmet deffir { $downloadCount } neɣ { $timespan } timespanMinutes = { $num -> [one] 1 n tsedat *[other] { $num } n tsedatin } timespanDays = { $num -> [one] 1 n wass *[other] { $num } n wussan } timespanWeeks = { $num -> [one] 1 n dduṛt *[other] { $num } n ledwaṛ } fileCount = { $num -> [one] 1 n ufaylu *[other] { $num } n yifuyla } # byte abbreviation bytes = B # kibibyte abbreviation kb = KAṬ # mebibyte abbreviation mb = MAṬ # gibibyte abbreviation gb = GAṬ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tuɣzi s umata: { $size } # the next line after the colon contains a file name copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek copyLinkButton = Nɣel aseɣwen downloadTitle = Sider ifuyla downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman. trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu. # count will always be > 10 tooManyFiles = { $count -> [one] Ala 1 n ufaylu i yemzren ad yali i tikkelt. *[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt. } # count will always be > 10 tooManyArchives = { $count -> [one] Ala 1 n teṛcibt i yettwasirgen. *[other] Ala { $count } n teṛcibin i yettwasiregn. } expiredTitle = Immut useɣwen. notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen. downloadFirefox = Sider { -firefox } legalTitle = Tasertit tabaḍnit n { -send-short-brand } legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ass { $hours } srg { $minutes } tsd addFilesButton = Fren ifuyla ad tessaliḍ trustWarningMessage = Ḍmen d akken tumneḍ anermis ticki tebḍiḍ isefka n tbadnit. uploadButton = Sali # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Ẓuɣer sakin sers ifuyla # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = neɣ sit akken ad tazneḍ arma d { $size } addPassword = Ḥrez s wawal uffir emailPlaceholder = Sekcem imayl inek # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Qqen akken ad tazneḍ arma d { $size } signInOnlyButton = Qqen accountBenefitTitle = Rnu amiḍan { -firefox } akken ad teqqneḍ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Bḍu ifuyla arma d { $size } accountBenefitDownloadCount = Bḍu ifuyla d wugan n medden accountBenefitTimeLimit = { $count -> [one] Eǧǧ iseɣwan d urmiden arma d 1 n wass *[other] Eǧǧ iseɣwan d urmiden arma d { $count } n wassan } accountBenefitSync = Sefrek ifuyla yebdan seg yal ibenk accountBenefitMoz = Issin ugar ɣef yimeẓla-nniḍen n { -mozilla } signOut = Ffeɣ okButton = IH downloadingTitle = Azdam noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren. noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin noStreamsOptionDownload = Kemmel akked iminig-a downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut. # the next line after the colon contains a file name shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik: shareLinkButton = Bḍu aseɣwen # $name is the name of the file shareMessage = Sider "{ $name }" s { -send-brand }: d fessas, d aɣelsan i beṭṭu n yifuyla. trailheadPromo = Yella wallal n ummesten n tudert-ik tusligt. Ddu ɣer Firefox. learnMore = Issin ugar. downloadFlagged = Aseɣwen-a yensa acku ur iquder ara tiwtilin n useqdec. downloadConfirmTitle = Taɣawsa-nniḍen downloadConfirmDescription = Ḍmen d akken tumneḍ amdan i ak-d-yuznen afaylu-a acku ur nezmir ara ad nwali ma yella ur iṭuṛṛu ara ibenk-ik. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Umneɣ amdan i yi-d-yuznen afaylu-a. *[other] Umneɣ amdan i yi-d-yuznen ifuyla-a. } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Mmel-d afaylu-a ma tkukraḍ *[other] Mmel-d ifuyla-a ma tkukraḍ } reportDescription = Mudd-aɣ-d afus n tallalt akken ad negzu acu i la iḍerrun. Acu twalaḍ cwiya-t kan deg yifuyla-a? reportUnknownDescription = Ttxil-k·m rzu ɣer url n useɣwen i tebɣiḍ ad t-tceggreḍ syen sit ɣef “{ reportFile }”. reportButton = Aneqqis reportReasonMalware = Ifuyla-a deg-sen yir iseɣzanen neɣ d aḥric seg uẓdam n ṣṣyada. reportReasonPii = Ifuyla-a deg-sen talɣut tudmawant yettwassnen i yi-yeɛnan. reportReasonAbuse = Ifuyla-a deg-sen agbur arusḍif neɣ anaffal. reportReasonCopyright = I ucegger n tkerḍa n yizerfan n umeskar neɣ n tecraḍ, seqdec asesfer i d-yettwagelmen ɣef usebter-a. reportedTitle = Ifuyla i d-yettwaceqqren reportedDescription = Tanemmirt. Nermes-d aneqqis-ik·im ɣef yifuyla-a. ================================================ FILE: public/locales/ko/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = 가져오는 중… encryptingFile = 암호화 중… decryptingFile = 복호화 중… downloadCount = 다운로드 { $num }회 timespanHours = { $num }시간 copiedUrl = 복사 완료! unlockInputPlaceholder = 비밀번호 unlockButtonLabel = 잠금 해제 downloadButtonLabel = 다운로드 downloadFinish = 다운로드 완료 fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = Send 써보기 errorPageHeader = 오류가 발생했습니다! fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야 합니다. linkExpiredAlt = 링크가 만료됨 notSupportedHeader = 이 브라우저는 지원되지 않습니다. notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요? notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다. updateFirefox = Firefox 업데이트 deletePopupCancel = 아니오 deleteButtonHover = 삭제 footerLinkLegal = 법적 정보 footerLinkPrivacy = 개인정보 보호 footerLinkCookies = 쿠키 passwordTryAgain = 비밀번호가 맞지 않습니다. 다시 시도해 주세요. javascriptRequired = Send는 JavaScript를 필요로 합니다 whyJavascript = 왜 Send에 JavaScript가 필요하죠? enableJavascript = JavaScript를 활성화하고 다시 시도해 주세요. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }시간 { $minutes }분 # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }분 # A short status message shown when the user enters a long password maxPasswordLength = 최대 비밀번호 길이: { $length } # A short status message shown when there was an error setting the password passwordSetError = 이 비밀번호를 설정할 수 없었습니다 ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = 간단하고, 사생활을 보호하는 파일 공유 introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다. notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다 # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨 timespanMinutes = { $num -> *[other] { $num }분 } timespanDays = { $num -> *[other] { $num }일 } timespanWeeks = { $num -> *[other] { $num }주 } fileCount = { $num -> *[other] { $num } 파일 } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = 전체 크기: { $size } # the next line after the colon contains a file name copyLinkDescription = 링크를 복사해서 파일을 공유하세요: copyLinkButton = 링크 복사 downloadTitle = 파일 다운로드 downloadDescription = 이 파일은 종단간 암호화 및 자동으로 만료되는 링크를 지원하는 { -send-brand }를 통해 공유되었습니다. trySendDescription = 간단하고 안전한 파일 공유를 원하시나요? { -send-brand }를 사용해보세요. # count will always be > 10 tooManyFiles = { $count -> *[other] 한번에 { $count }개의 파일만 업로드 할 수 있습니다. } # count will always be > 10 tooManyArchives = { $count -> *[other] { $count }개의 아카이브만 허용됩니다. } expiredTitle = 이 링크는 만료되었습니다. notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다. downloadFirefox = { -firefox } 다운로드 legalTitle = { -send-short-brand } 개인정보처리방침 legalDateStamp = 버전 1.0, 2019년 3월 12일자 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분 addFilesButton = 업로드할 파일들을 선택하세요 trustWarningMessage = 중요한 정보를 공유할 때는 수신자들이 모두 믿을 만한 사람들인지를 꼭 확인하세요. uploadButton = 업로드 # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = 파일들을 여기에 끌어서 놓으세요 # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요. addPassword = 비밀번호로 파일 보호 emailPlaceholder = 이메일 입력 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인 signInOnlyButton = 로그인 accountBenefitTitle = { -firefox } 계정 생성 또는 로그인 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = { $size }까지의 파일 공유 accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유 accountBenefitTimeLimit = { $count -> *[other] 최대 { $count }일까지 링크 유지 } accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리 accountBenefitMoz = 다른 { -mozilla } 서비스에 대해 알아보기 signOut = 로그아웃 okButton = 확인 downloadingTitle = 다운로드 중 noStreamsWarning = 이 브라우저는 이렇게 큰 파일은 암호화 해제를 못할 수도 있습니다. noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사 noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요 noStreamsOptionDownload = 이 브라우저로 계속하기 downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다. # the next line after the colon contains a file name shareLinkDescription = 파일 링크 공유: shareLinkButton = 링크 공유 # $name is the name of the file shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다. trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. Firefox에 가입하세요. learnMore = 더 알아보기. downloadFlagged = 서비스 약관 위반으로 인해 비활성화된 링크입니다. downloadConfirmTitle = 한 가지 더 downloadConfirmDescription = 이 파일이 기기에 해를 끼치지 않는 다는 점을 확인하지 못했기 때문에 이 파일을 보낸 사람을 신뢰할 수 있는지 확인하세요. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] 이 파일을 보낸 사람을 신뢰함 } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] 이 파일을 의심스러운 것으로 신고 } reportDescription = 어떤 일이 발생했는지 알려 주세요. 이 파일의 어느 부분이 문제인 것 같나요? reportUnknownDescription = 신고하려는 링크의 URL로 가서 “{ reportFile }”를 클릭하세요. reportButton = 신고 reportReasonMalware = 이 파일은 악성 코드를 포함하고 있거나 피싱 공격의 일부입니다. reportReasonPii = 이 파일에는 본인에 대한 개인 식별 정보가 포함되어 있습니다. reportReasonAbuse = 이 파일에는 불법적이거나 모욕적인 내용이 들어 있습니다. reportReasonCopyright = 저작권 또는 상표권 침해를 신고하려면 이 페이지에 설명된 절차를 따르십시오. reportedTitle = 파일 신고됨 reportedDescription = 파일에 대한 신고를 접수했습니다. 감사합니다. ================================================ FILE: public/locales/lt/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importuojama… encryptingFile = Šifruojama… decryptingFile = Iššifruojama… downloadCount = { $num -> [one] { $num } kartą [few] { $num } kartus *[other] { $num } kartų } timespanHours = { $num -> [one] { $num } valandos [few] { $num } valandų *[other] { $num } valandų } copiedUrl = Nukopijuota! unlockInputPlaceholder = Slaptažodis unlockButtonLabel = Atrakinti downloadButtonLabel = Parsisiųsti downloadFinish = Parsiuntimas baigtas fileSizeProgress = ({ $partialSize } iš { $totalSize }) sendYourFilesLink = Išbandyti „Send“ errorPageHeader = Nutiko kažkas negero! fileTooBig = Pasirinktas failas yra per didelis, kad jį būtų galima įkelti. Failo dydis neturėtų viršyti { $size } linkExpiredAlt = Saitas nebegalioja notSupportedHeader = Jūsų naršyklė nepalaikoma. notSupportedLink = Kodėl mano naršyklė nepalaikoma? notSupportedOutdatedDetail = Deja, šioje „Firefox“ naršyklės laidoje nepalaikoma „Send“ veikti reikalinga technologija. Jeigu norite naudotis šia paslauga, turėsite atnaujinti savo naršyklę. updateFirefox = Atnaujinti „Firefox“ deletePopupCancel = Atsisakyti deleteButtonHover = Šalinti footerLinkLegal = Teisinė informacija footerLinkPrivacy = Privatumas footerLinkCookies = Slapukai passwordTryAgain = Slaptažodis netinka. Bandykite dar kartą. javascriptRequired = „Send“ veikimui būtina įgalinti „JavaScript“ palaikymą whyJavascript = Kodėl „Send“ neveikia išjungus „JavaScript“? enableJavascript = Įgalinkit „JavaScript“ ir bandykite dar kartą. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } val. { $minutes } min. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min. # A short status message shown when the user enters a long password maxPasswordLength = Didžiausias leistinas slaptažodžio ilgis: { $length } simb. # A short status message shown when there was an error setting the password passwordSetError = Slaptažodžio nustatyti nepavyko ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = { $case -> *[nominative] Mozilla [genitive] Mozillos [dative] Mozillai [accusative] Mozillą [instrumental] Mozilla [locative] Mozilloje } introTitle = Paprastas ir privatus dalijimasis failais introDescription = „{ -send-brand }“ suteikia galimybę dalintis failais, pasitelkiant abipusį šifravimą ir riboto galiojimo saitus. Tai padeda pasidalintus failus išlaikyti privačiais ir užtikrina, jog trumpam įkelti failai neliks pasiekiami internete amžinai. notifyUploadEncryptDone = Failas užšifruotas ir parengtas išsiuntimui # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Nustos galioti parsisiuntus { $downloadCount } arba po { $timespan } timespanMinutes = { $num -> [one] { $num } minutės [few] { $num } minučių *[other] { $num } minučių } timespanDays = { $num -> [one] { $num } dienos [few] { $num } dienų *[other] { $num } dienų } timespanWeeks = { $num -> [one] { $num } savaitės [few] { $num } savaičių *[other] { $num } savaičių } fileCount = { $num -> [one] { $num } failas [few] { $num } failai *[other] { $num } failų } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Bendras dydis: { $size } # the next line after the colon contains a file name copyLinkDescription = Nukopijuokite saitą, jeigu norite pasidalinti failu: copyLinkButton = Kopijuoti saitą downloadTitle = Parsisiųsti failus downloadDescription = Šiuo failu pasidalinta per „{ -send-brand }“, pasitelkiant abipusį šifravimą ir riboto galiojimo saitą. trySendDescription = Išbandykite „{ -send-brand }“ paprastam ir saugiam dalijimuisi failais. # count will always be > 10 tooManyFiles = { $count -> [one] Vienu metu galima įkelti ne daugiau kaip { $count } failą. [few] Vienu metu galima įkelti ne daugiau kaip { $count } failus. *[other] Vienu metu galima įkelti ne daugiau kaip { $count } failų. } # count will always be > 10 tooManyArchives = { $count -> [one] Leidžiama turėti iki ne daugiau kaip { $count } archyvą. [few] Leidžiama turėti iki ne daugiau kaip { $count } archyvus. *[other] Leidžiama turėti iki ne daugiau kaip { $count } archyvų. } expiredTitle = Šis saitas nebegalioja. notSupportedDescription = „{ -send-brand }“ su šia naršykle neveikia. „{ -send-short-brand }“ geriausiai veikia su paskiausia „{ -firefox }“ laida, o taip pat veikia su daugumos kitų naršyklių paskiausiomis laidomis. downloadFirefox = Parsisiųsti „{ -firefox }“ legalTitle = „{ -send-short-brand }“ privatumo pranešimas legalDateStamp = 1.0 versija, 2019 m. kovo 12 d # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d. { $hours } val. { $minutes } min. addFilesButton = Rinktis failus įkėlimui trustWarningMessage = Dalindamiesi svarbiais duomenimis įsitikinkite, kad pasitikite gavėju. uploadButton = Įkelti # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Užtempkite ir numeskite failus čia # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = arba spustelėkite mygtuką ir dalinkitės failais iki { $size } addPassword = Apsaugoti slaptažodžiu emailPlaceholder = Įveskite savo el. pašto adresą # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Prisijunkite, jeigu norite siųsti iki { $size } signInOnlyButton = Prisijungti accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dalinkitės iki { $size } dydžio failais accountBenefitDownloadCount = Dalinkitės su daugiau žmonių accountBenefitTimeLimit = { $count -> [one] Išlaikykite saitus galiojančiais iki { $count } dienos. [few] Išlaikykite saitus galiojančiais iki { $count } dienų. *[other] Išlaikykite saitus galiojančiais iki { $count } dienų. } accountBenefitSync = Tvarkykite failus, kuriais dalijatės, iš bet kurio įrenginio accountBenefitMoz = Sužinokite apie kitas „{ -mozilla(case: "genitive") }“ paslaugas signOut = Atsijungti okButton = Gerai downloadingTitle = Parsiunčiama noStreamsWarning = jūsų naršyklei gali nepavykti iššifruoti tokio didelio failo. noStreamsOptionCopy = Nukopijuokite saitą ir atverkite jį kita naršykle noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę noStreamsOptionDownload = Tęsti naudojantis šia naršykle downloadFirefoxPromo = „{ -send-short-brand }“ jums atkeliauja iš naujosios „{ -firefox }“. # the next line after the colon contains a file name shareLinkDescription = Pasidalinkite saitu į jūsų failą: shareLinkButton = Dalintis saitu # $name is the name of the file shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“. learnMore = Sužinoti daugiau. downloadFlagged = Šis saitas panaikintas dėl paslaugos teikimo nuostatų pažeidimo. downloadConfirmTitle = Dar vienas dalykas downloadConfirmDescription = Įsitikinkite, kad pasitikite asmeniu, atsiuntusiu šį failą, nes mes negalime užtikrinti, kad jis nepakenks jūsų įrenginiui. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Aš pasitikiu asmeniu, atsiuntusiu šį failą [few] Aš pasitikiu asmeniu, atsiuntusiu šiuos failus *[other] Aš pasitikiu asmeniu, atsiuntusiu šiuos failus } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Pranešti apie įtartiną failą [few] Pranešti apie įtartinus failus *[other] Pranešti apie įtartinus failus } reportDescription = Padėkite mums suprasti situaciją. Kas jūsų nuomone negerai su šiais failais? reportUnknownDescription = Atverkite saitą, apie kurį norite pranešti, ir spustelėkite „{ reportFile }“. reportButton = Pranešti reportReasonMalware = Šiuose failuose yra kenkėjiškos programinės įrangos, arba jie yra dalis sukčiavimo atakos. reportReasonPii = Šiuose failuose yra mano asmeninės informacijos. reportReasonAbuse = Šiuose failuose yra nelegalaus arba neteisėto turinio. reportReasonCopyright = Norėdami pranešti apie autorių teisių ar prekės ženklo pažeidimus, vadovaukitės šiame puslapyje aprašytu procesu. reportedTitle = Apie failus pranešta reportedDescription = Ačiū. Mes gavome jūsų pranešimą apie šiuos failus. ================================================ FILE: public/locales/lus/send.ftl ================================================ encryptingFile = Encrypting... decryptingFile = Decrypting ## Send version 2 strings ================================================ FILE: public/locales/meh/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Tu'un jianininu importingFile = Nasia´a… encryptingFile = Encriptando... decryptingFile = Desencriptando… downloadCount = { $num -> *[other] { $num } nxinuun } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = Ntɨɨn unlockInputPlaceholder = Contraseña unlockButtonLabel = Nkasɨ downloadButtonLabel = Xinuu downloadFinish = Nnɨ´ɨ xinuu fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Ni´i Send errorPageHeader = ¡Iyo iin ntu nkene va´a! fileTooBig = Archivo ya´a ka´nu. Nejia chunku´va { $size } linkExpiredAlt = Nnɨ´ɨ enlace notSupportedHeader = Ntu íyo tiñu nuu ka̱a̱ nánuku ya´a. notSupportedLink = ¿Navi ntu satiñu nuu ka̱a̱ nánuku ya´a? notSupportedOutdatedDetail = Tuni Firefox ya´a ntu satiñu vii jii Send. Nejika xinunu a jíía ka̱a̱ nánuku. updateFirefox = Naxi´ñá Firefox deletePopupCancel = Nkuvi-ka deleteButtonHover = Xita footerLinkLegal = Tu´un nichi footerLinkPrivacy = Tu´un xitu a kumiji noo´o footerLinkCookies = Cookies passwordTryAgain = Contraseña ntu vatu. Nachu´un tuku. javascriptRequired = Send ni´i JavaScript whyJavascript = ¿Navi Send ni´i JavaScript? enableJavascript = Kua´a jia´a JavaScript jee nachu´un tuku. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Naja ka´nu koo contraseña: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ntu nkuvi sá´á contraseña ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Kua´a daa archivo ñama jee yu´u introDescription = { -send-brand } taji jia´anu archivos jii cifrado uvi nuu jee iin enlace nɨ´ɨ. Sukuan kuvi kumi yu´unu daa archivo jia´anu jee kuninu nkino daa ya´a kue´e kuiya íchi nuu. notifyUploadEncryptDone = Archivo noo´o íyo cifrado jee kuvi chu´un íchi # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Nɨ'ɨ dee nña´a { $downloadCount } a xiin { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 día *[other] { $num } días } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 archivo *[other] { $num } archivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ka´nu: { $size } # the next line after the colon contains a file name copyLinkDescription = Tɨɨn enlace jee kua´a archivo: copyLinkButton = Tɨɨn enlacae downloadTitle = Xinuu archivo downloadDescription = Archivo ya´a nsajia { -send-brand } jíí cifrado punto a punto jee iin enlace naa. trySendDescription = Nasá´á jii { -send-brand } kua´a ñama jee vatu. # count will always be > 10 tooManyFiles = { $count -> [one] Ntuxini 1 archivo kuvi ska. *[other] Ntuxini { $count } archivos kuvi ska. } # count will always be > 10 tooManyArchives = { $count -> [one] Ntu xini 1 archivo íyo *[other] Ntu xini { $count } archivos íyo } expiredTitle = Nnɨ'ɨ link ya´a. notSupportedDescription = { -send-brand } nsatiñu jii ka̱a̱ nánuku ya´a. { -send-short-brand } satiñu va´a jii tuni íchi yata { -firefox }, jee satiñu va´a jii tuni íyo ntañu´u kuaiyo daa ka̱a̱ nánuku. downloadFirefox = Xinuun { -firefox } legalTitle = Tu´un xitu a kumiji noo´o { -send-short-brand } legalDateStamp = Versión 1.0 del 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Kaji archivos ska uploadButton = Ska # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Staka jee sía daa archivo # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = a xiin kuaxin saa chu´un íchi nee { $size } addPassword = Iyo yu´u jii contraseña emailPlaceholder = Chu´un email noo´o # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Kajie´e sesión saa chu´un íchi nee { $size } signInOnlyButton = Kajie´e sesión accountBenefitTitle = Sá´á iin cuenta { -firefox } a xiin kajie´e sesión # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Kua´a archivo ka´nu { $size } accountBenefitDownloadCount = Kua´a archivos jii inka ñivɨ accountBenefitTimeLimit = { $count -> [one] Kuteku enlaces 1 kivɨ *[other] Kuteku daa enlaces { $count } kivɨ } accountBenefitSync = Tetiñu archivos jia´anu ntaka ka̱a̱ accountBenefitMoz = Ka´vi kue´eka jiee inka tiñu { -mozilla } signOut = Kasɨ sesión okButton = Kuvi downloadingTitle = Xinuu noStreamsWarning = Kuvi ka̱a̱ nánaku ya´a nxituvi a vaji nuu iin archivo ka´nu. noStreamsOptionCopy = Tɨɨn enlace jee síne nuu inka ka̱a̱ nánuku noStreamsOptionFirefox = Ni´i ka̱a̱ nánuku va´a noStreamsOptionDownload = Kaka jii ka̱a̱ nánuku ya´a downloadFirefoxPromo = { -send-short-brand } taji jíía { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Kua´a enlace archivo noo´o shareLinkButton = Kua´a link # $name is the name of the file shareMessage = Xinuu “{ $name }” jii { -send-brand }: ntu viji trailheadPromo = Iyo iin kuvi kumi privacidad noo´o. Nayonika Firefox. learnMore = Ka´vi kue´eka ================================================ FILE: public/locales/mix/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Ndakiin… encryptingFile = Ndasami tu'un… decryptingFile = Nchiko tu'un… downloadCount = { $num -> [one] 1 snuú *[other] { $num } snuú } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = ¡Tsa ndatavi ña! unlockInputPlaceholder = Tu'un seè unlockButtonLabel = Kuna downloadButtonLabel = Snuù downloadFinish = Ntsinu snui fileSizeProgress = ({ $partialSize } ña { $totalSize }) sendYourFilesLink = Kuachu'un Send errorPageHeader = ¡Yee ña va'a! fileTooBig = Kanu tutu yo. Tsini ñu'u koi tana { $size }. linkExpiredAlt = Ntoo enlace notSupportedHeader = Kue ku kuni página. notSupportedLink = ¿Chanu kue ku kuncheuña? notSupportedOutdatedDetail = Firefox kue ku kuni página web takua kuachu'un Send. tsiniñu'u ndu tsa'a navegador. updateFirefox = Ndu tsa'a Firefox deletePopupCancel = Kunchatu deleteButtonHover = Stoò footerLinkLegal = Aviso legal footerLinkPrivacy = Ña meu footerLinkCookies = Cookies passwordTryAgain = Kue vaa ni chau sivi siki. Chai tuku. javascriptRequired = Send tsiniñui JavaScript whyJavascript = ¿Chanu Send tsiniñui JavaScript? enableJavascript = Saá ña mani katsi JavaScript chá kitsa tuku. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Kua tu'un see: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ma ku ntanii tu'un see ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Stucha kue tutu ku introDescription = { -send-brand } ku stuchaku tutu seé tsi inkana tsi iin enlace ña ntóo mituin. Sa'an ku kunka va'a ña stuchaku cha ma ku kunchee na kue tutu ku. notifyUploadEncryptDone = Tsa inka va'a tutu ku tsa ku stuchaku ña # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Ku kunkai mancha { $downloadCount } a { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 kii *[other] { $num } kii } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 tutu *[other] { $num } tutu } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Kua: { $size } # the next line after the colon contains a file name copyLinkDescription = Ndatava enlace takua stuchaku tutú. copyLinkButton = Ndatava enlace downloadTitle = Snuú tutu downloadDescription = Tutu yo stuchaku ña tsi { -send-brand } inka si'i chá ku nto'o mituin. trySendDescription = Kuachu'un { -send-brand } takua stuchaku nchi tutu niku # count will always be > 10 tooManyFiles = { $count -> [one] Ku skau 1 tutu ni. *[other] Mitu'un { $count }tutu ku skau. } # count will always be > 10 tooManyArchives = { $count -> [one] 1 tutu ni ku. *[other] Mitu'un { $count } tutu ni ku. } expiredTitle = Koo enlace inka notSupportedDescription = { -send-brand } ma ku Kuachu'un navegador yo. { -send-short-brand } Sachu'in va'a la versión da ntii { -firefox }, sachu'un tsi versión tsa'a su inka kue navegador. downloadFirefox = Snuú { -firefox } legalTitle = Tu'un privacidad { -send-short-brand } legalDateStamp = Versión 1.0 del 12 de marzo de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Katsi tutu ku skau trustWarningMessage = Kunche'e a va'a nu ku ntachuún ña. uploadButton = Skaa # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Xita cha sia kue tutu # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = katavi takua stuchaku ña mancha { $size } addPassword = Inka vai tsi tu'un seé emailPlaceholder = Chaa korreo ku # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = kitsa takua kuachu'una mancha { $size } signInOnlyButton = Kitsaa accountBenefitTitle = Saa iin kuenta ña { -firefox } a kitsa # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Stucha tutu mancha { $size } accountBenefitDownloadCount = Stucha tutu tsi kuaka nivi accountBenefitTimeLimit = { $count -> [one] Ku kunka tutu ku mancha 1 kii *[other] Ku kunka tutu ku mancha { $count } kii } accountBenefitSync = Stucha tutu tsí nchi kaa ndusu niku accountBenefitMoz = Kavi tutú tsa { -mozilla } signOut = Kee okButton = Vaá downloadingTitle = Snuì noStreamsWarning = Ku ña navegador yo ma ku mini iin tutú kanu. noStreamsOptionCopy = Ndatava enlace takua kunu tsí inka navegador noStreamsOptionFirefox = Kuachu'un navegador ña va'a nu ntia noStreamsOptionDownload = Kunka tsi navegador yo downloadFirefoxPromo = { -send-short-brand } snai ña tsaa { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Stucha enlace tutu ku: shareLinkButton = Stucha Enlace # $name is the name of the file shareMessage = Snuu «{ $name }» tsi { -send-brand }: kue nchichi trailheadPromo = Ku china vau ña chau. Kita'an tsi Firefox. learnMore = Skua'a kuakaa. downloadFlagged = Va'á enlace yo. downloadConfirmTitle = Una cosa más downloadConfirmDescription = A tsinu nivo tachu'un tutu yo takua ma stivia kàa ndusu ku. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Va'a nivi ntachu'un tutu yo *[other] Va'a nivi ntachu'un tutu yo } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Katu'un ña va'á tutu yo *[other] Katu'un ña va'á kue tutu yo } reportDescription = Chinche kue yu na kunikue ña yee. ¿A va'á kue tutu yo? reportUnknownDescription = Sa'a ña mani kuncheu, url ña enlace ña va'á cha katavi “{ reportFile }”. reportButton = Ka tu'un reportReasonMalware = Inka ña va'á nu kue tutu yo. reportReasonPii = Inka kue tu'un me nu kue tutu yo. reportReasonAbuse = Yee ña va'á nu kue tutu yo. reportReasonCopyright = Tatu ye ña va'á nu derechos de autor a marca registrada, kavi tutu yo esta página. reportedTitle = Ku ncheé tutu reportedDescription = Ti tsavu. tsa kumikue tu'un tsa'a tutuku. ================================================ FILE: public/locales/ml/send.ftl ================================================ # Send is a brand name and should not be localized. title = ഫയർഫോക്സ് സെൻഡ് siteFeedback = പ്രതികരണം importingFile = ഇറക്കുമതി ചെയ്യുന്നു... encryptingFile = എൻക്രിപ്റ്റ് ചെയ്യുന്നു... decryptingFile = ഡീക്രിപ്റ്റ് ചെയ്യുന്നു... downloadCount = { $num -> [one] ഒരു ഡൗൺലോഡ് *[other] { $num } ഡൗൺലോഡുകൾ } timespanHours = { $num -> [one] 1 മണിക്കൂർ *[other] { $num } മണിക്കൂറുകൾ } copiedUrl = പകർത്തി! unlockInputPlaceholder = രഹസ്യവാക്ക് unlockButtonLabel = തുറക്കുക downloadButtonLabel = ഡൗൺലോഡ് downloadFinish = ഡൗൺലോഡ് പൂർത്തിയായി fileSizeProgress = ({ $totalSize } -ന്റെ { $partialSize }) sendYourFilesLink = ഫയർഫോക്സ് സെൻഡ് പരീക്ഷിക്കൂ errorPageHeader = എന്തോ പ്രശ്നമുണ്ട്! fileTooBig = ഈ ഫയൽ വളരെ വലുതായതിനാൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിച്ചില്ല. പരമാവധി വലുപ്പം { $size } ആണ്. linkExpiredAlt = കണ്ണി കാലഹരണപ്പെട്ടു notSupportedHeader = താങ്കളുടെ ബ്രൗസറിന് പിന്തുണയില്ല. notSupportedLink = എന്തുകൊണ്ടാണ് എന്റെ ബ്രൗസറിന് പിന്തുണയില്ലാത്തത്? notSupportedOutdatedDetail = ദൗർഭാഗ്യവശാൽ ഫയർഫോക്സിന്റെ ഈ പതിപ്പ് ഫയർഫോക്സ് സെൻഡ് ഉപയോഗിക്കുന്ന വെബ് സാങ്കേതികവിദ്യ പിന്തുണയ്ക്കുന്നില്ല. താങ്കൾ താങ്കളുടെ ബ്രൗസർ പുതുക്കേണ്ടി വരും. updateFirefox = ഫയർഫോക്സ് പുതുക്കൂ deletePopupCancel = റദ്ദാക്കുക deleteButtonHover = നീക്കം ചെയ്യുക footerLinkLegal = നിയമസംബന്ധവിവരങ്ങൾ footerLinkPrivacy = സ്വകാര്യത footerLinkCookies = കുക്കികൾ passwordTryAgain = രഹസ്യവാക്ക് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക. javascriptRequired = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ ജാവാസ്ക്രിപ്റ്റ് വേണം whyJavascript = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ എന്തിനാണ് ജാവാസ്ക്രിപ്റ്റ്? enableJavascript = ദയവായി ജാവാസ്ക്രിപ്റ്റ് പ്രവർത്തനസജ്ജമാക്കിയിട്ട് വീണ്ടും ശ്രമിക്കുക. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } മണിക്കൂർ { $minutes } മിനുട്ട് # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } മിനുട്ട് # A short status message shown when the user enters a long password maxPasswordLength = രഹസ്യവാക്കിന്റെ പരമാവധി നീളം: { $length } # A short status message shown when there was an error setting the password passwordSetError = ഈ രഹസ്യവാക്ക് ക്രമീകരിക്കാനായില്ല ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = ഫയർഫോക്സ് സെൻഡ് -send-short-brand = സെൻഡ് -firefox = ഫയർഫോക്സ് -mozilla = മോസില്ല introTitle = ലളിതവും സ്വകാര്യവുമായ ഫയൽ പങ്കിടൽ introDescription = തനിയെ കാലഹരണപ്പെടുന്ന ലിങ്ക് ഉപയോഗിച്ച് തുടക്കം മുതല്‍ അവസാനം വരെയുള്ള എന്‍ക്രിപ്ഷന്‍ സാങ്കേതികതയോടെ ഫയലുകള്‍ പങ്കിടാന്‍ { -send-brand } ഉപയോഗിക്കാം. അത് കൊണ്ട് തന്നെ നിങ്ങള്‍ പങ്കിടുന്നത് സ്വകാര്യമായി സൂക്ഷിക്കാനും അത് ഓണ്‍ലൈനില്‍ എക്കാലവും കാണില്ലെന്ന് ഉറപ്പാക്കാനും പറ്റും. notifyUploadEncryptDone = നിങ്ങളുടെ ഫയൽ എൻക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു, അയയ്ക്കാൻ തയ്യാറാണ് # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } അല്ലെങ്കിൽ { $timespan } കഴിഞ്ഞാൽ കാലഹരണപ്പെടും timespanMinutes = { $num -> [one] മിനുട്ട് *[other] { $num } മിനുട്ട് } timespanDays = { $num -> [one] 1 ദിവസം *[other] { $num } ദിവസം } timespanWeeks = { $num -> [one] 1 ആഴ്ച *[other] { $num } ആഴ്ച } fileCount = { $num -> [one] 1 ഫയൽ *[other] { $num } ഫയലുകൾ } # byte abbreviation bytes = ബൈറ്റ് # kibibyte abbreviation kb = കി.ബൈ # mebibyte abbreviation mb = എംബി # gibibyte abbreviation gb = ജിബി # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = ആകെ വലിപ്പം: { $size } # the next line after the colon contains a file name copyLinkDescription = നിങ്ങളുടെ ഫയൽ പങ്കിടാനുള്ള ലിങ്ക് പകർത്തുക: copyLinkButton = ലിങ്ക് പകർത്തുക downloadTitle = ഫയലുകൾ ഡൗൺലോഡുചെയ്യുക downloadDescription = ഈ ഫയൽ { -send-brand } ഉപയോഗിച്ച് എൻഡ്-ടു-എൻഡ് എൻക്രിപ്ഷനോടും തനിയെ കാലഹരണപ്പെടുന്ന ഒരു ലിങ്കോടും കൂടി പങ്കിട്ടതാണ്. trySendDescription = ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടലിനായി { -send-brand } പരീക്ഷിക്കുക. # count will always be > 10 tooManyFiles = { $count -> [one] ഒരേസമയം 1 ഫയൽ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. *[other] ഒരേസമയം { $count } ഫയലുകൾ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. } # count will always be > 10 tooManyArchives = { $count -> [one] ഒരു ആർക്കൈവ് മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. *[other] { $count } ആർക്കൈവുകൾ മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. } expiredTitle = ഈ ലിങ്ക് കാലഹരണപ്പെട്ടു. notSupportedDescription = ഈ ബ്രൌസറിൽ { -send-brand } പ്രവർത്തിക്കില്ല. { -send-short-brand } { -firefox }- ന്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ വളരെ നന്നായി പ്രവർത്തിക്കുന്നു, കൂടാതെ മിക്ക ബ്രൌസറുകളുടെയും നിലവിലെ പതിപ്പിൽ പ്രവർത്തിക്കുകയും ചെയ്യും. downloadFirefox = { -firefox } ഡൗണ്‍ലോഡ് ചെയ്യുക legalTitle = { -send-short-brand } സ്വകാര്യതാ അറിയിപ്പ് legalDateStamp = 2019 മാർച്ച് 12 തീയതിയിൽ പതിപ്പ് 1.0 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ദിവസം { $hours } മണിക്കൂർ { $minutes } മിനിറ്റ് addFilesButton = അപ്‌ലോഡ് ചെയ്യാനുള്ള ഫയലുകൾ തിരഞ്ഞെടുക്കുക uploadButton = അപ്‍ലോഡ് # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ഫയലുകൾ വലിച്ചിടുക # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = അല്ലെങ്കിൽ { $size } വരെ അയയ്ക്കുന്നതിന് അമർത്തുക addPassword = രഹസ്യവാക്ക് ഉപയോഗിച്ച് സംരക്ഷിക്കുക emailPlaceholder = നിങ്ങളുടെ ഇമെയിൽ നൽകുക # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = { $size } വരെയുള്ള ഫയലുകൾ അയയ്ക്കുന്നതിന് പ്രവേശിക്കുക signInOnlyButton = പ്രവേശിയ്ക്കുക accountBenefitTitle = ഒരു { -firefox } അക്കൗണ്ട് സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവേശിക്കുക # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = { $size } വരെയുള്ള ഫയലുകൾ പങ്കിടുക accountBenefitDownloadCount = കൂടുതൽ ആളുകളുമായി ഫയലുകൾ പങ്കിടുക accountBenefitTimeLimit = { $count -> [one] ഒരു ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക *[other] { $count } ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക } accountBenefitSync = ഏതൊരു ഉപകരണത്തിൽ നിന്നും പങ്കിട്ട ഫയലുകൾ കൈകാര്യം ചെയ്യുക accountBenefitMoz = മറ്റ് { -mozilla } സേവനങ്ങളെക്കുറിച്ച് അറിയുക signOut = പുറത്തിറങ്ങുക okButton = ശരി downloadingTitle = ഡൌണ്‍ലോഡ് ചെയ്യുന്നു noStreamsWarning = ഇത്ര വലിയ ഫയൽ ബ്രൌസറില്‍ ഡീക്രിപ്റ്റ് ചെയ്യാൻ കഴിഞ്ഞേക്കില്ല. noStreamsOptionCopy = മറ്റൊരു ബ്രൗസറിൽ തുറക്കുന്നതിന് ലിങ്ക് പകർത്തുക noStreamsOptionFirefox = ഞങ്ങളുടെ പ്രിയപ്പെട്ട ബ്രൗസർ പരീക്ഷിക്കുക noStreamsOptionDownload = ഈ ബ്രൗസറിൽ തുടരുക downloadFirefoxPromo = എറ്റവും പുതിയ { -firefox } { -send-short-brand } മുഖേന നിങ്ങൾക്ക് എത്തിച്ചിരിക്കുന്നു. # the next line after the colon contains a file name shareLinkDescription = നിങ്ങളുടെ ഫയലിനുള്ള കണ്ണി പങ്കിടുക: shareLinkButton = കണ്ണി പങ്കിടുക # $name is the name of the file shareMessage = "{ -send-brand }" ഉപയോഗിച്ച് { $name } ഡൌൺലോഡ് ചെയ്യുക: ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടൽ ================================================ FILE: public/locales/ms/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteSubtitle = experimen web siteFeedback = Maklum balas uploadPageHeader = Peribadi, Perkongsian Fail Dienkrip uploadPageExplainer = Hantar fail melalui pautan yang selamat, peribadi dan dienkrip, yang akan luput secara automatik untuk memastikan fail anda itu tidak terus berada dalam talian selama-lamanya. 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 uploadPageBrowseButton1 = 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 }) importingFile = Mengimport… verifyingFile = Mengesahkan... encryptingFile = Mengenkripsi... decryptingFile = Mengenkripsi... notifyUploadDone = Muat naik anda sudah siap. uploadingPageMessage = Setelah siap fail anda dimuat naik, akan boleh tetapkan pilihan luput. uploadingPageCancel = 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 = Muat naik uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam. expireInfo = Pautan ke fail anda akan luput selepas { $downloadCount } atau { $timespan }. downloadCount = { $num -> *[other] { $num } muat turun } timespanHours = { $num -> *[other] { $num } jam } copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename } copyUrlFormButton = Salin ke Klipbod copiedUrl = Disalin! deleteFileButton = Buang Fail sendAnotherFileLink = Hantar fail lain # Alternative text used on the download link/button (indicates an action). downloadAltText = Muat turun downloadsFileList = Muat turun # Used as header in a column indicating the amount of time left before a # download link expires (e.g. "10h 5m") timeFileList = Masa # Used as header in a column indicating the number of times a file has been # downloaded downloadFileName = Muat turun { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Masukkan Kata Laluan unlockInputPlaceholder = Kata laluan unlockButtonLabel = Buka downloadFileTitle = Muat turun Fail Enkripsi # Send is a brand name and should not be localized. downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan 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 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 }) # Send is a brand name and should not be localized. sendYourFilesLink = Cuba Send downloadingPageProgress = Memuat turun { $filename } ({ $size }) downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya. 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 = Pautan sudah luput expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud! notSupportedHeader = Pelayar anda tidak disokong. # Send is a brand name and should not be localized. notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! notSupportedLink = Kenapa pelayar saya tidak disokong? notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Send. Anda perlu mengemaskini pelayar anda. updateFirefox = Kemaskini Firefox downloadFirefoxButtonSub = Muat turun Percuma uploadedFile = Fail copyFileList = Salin URL # expiryFileList is used as a column header expiryFileList = Luput Pada deleteFileList = Buang nevermindButton = Tak apalah legalHeader = Terma & Privasi legalNoticeTestPilot = Send adalah eksperimen Ujian Perintis, dan tertakluk kepada Terma Perkhidmatan dan Notis Privasi Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data di sini. legalNoticeMozilla = Penggunaan laman web Send juga tertakluk kepada Notis Privasi Laman web dan Terma Penggunaan Laman web Mozilla. deletePopupText = Buang fail ini? deletePopupYes = Ya deletePopupCancel = Batal deleteButtonHover = Buang copyUrlHover = Salin URL footerLinkLegal = Perundangan # Test Pilot is a proper name and should not be localized. footerLinkAbout = Perihal Ujian Perintis footerLinkPrivacy = Privasi footerLinkTerms = Terma footerLinkCookies = Kuki requirePasswordCheckbox = Perlu kata laluan untuk memuat turun fail ini addPasswordButton = Tambah Kata laluan changePasswordButton = Tukar passwordTryAgain = Kata laluan tidak betul. Cuba lagi. reportIPInfringement = Lapor Pencerobohan IP javascriptRequired = Send perlukan JavaScript whyJavascript = Kenapa Send perlukan JavaScript? enableJavascript = Sila dayakan JavaScript dan cuba lagi. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when a password is successfully set passwordIsSet = Kata laluan ditetapkan # A short status message shown when the user enters a long password maxPasswordLength = Panjang kata laluan maksimum: { $length } # A short status message shown when there was an error setting the password passwordSetError = Kata laluan ini tidak boleh ditetapkan ================================================ FILE: public/locales/nb-NO/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importerer… encryptingFile = Krypterer... decryptingFile = Dekrypterer... downloadCount = { $num -> [one] 1 nedlasting *[other] { $num } nedlastinger } timespanHours = { $num -> [one] 1 time *[other] { $num } timer } copiedUrl = Kopiert! unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp downloadButtonLabel = Last ned downloadFinish = Nedlastingen er fullført. fileSizeProgress = ({ $partialSize } av { $totalSize }) sendYourFilesLink = Prøv Send errorPageHeader = Det oppstod en feil. fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $size }. linkExpiredAlt = Lenke utløpt notSupportedHeader = Din nettleser er ikke støttet. notSupportedLink = Hvorfor er ikke nettleseren min støttet? notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Send. Du trenger å oppdatere nettleseren din. updateFirefox = Oppdater Firefox deletePopupCancel = Avbryt deleteButtonHover = Slett footerLinkLegal = Juridisk informasjon footerLinkPrivacy = Personvern footerLinkCookies = Infokapsler passwordTryAgain = Feil passord. Prøv igjen. javascriptRequired = Send krever JavaScript. whyJavascript = Hvorfor krever Send JavaScript? enableJavascript = Slå på JavaScript og prøv igjen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maksimum passordlengde: { $length } # A short status message shown when there was an error setting the password passwordSetError = Dette passordet kunne ikke settes ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Enkel, privat fildeling introDescription = { -send-brand } lar deg dele filer via en tidsbegrenset lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samtidig være trygg på at filene dine ikke blir liggende på nettet for alltid. notifyUploadEncryptDone = Filen din er kryptert og klar til å sende # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan } timespanMinutes = { $num -> [one] 1 minutt *[other] { $num } minutter } timespanDays = { $num -> [one] 1 dag *[other] { $num } dager } timespanWeeks = { $num -> [one] 1 uke *[other] { $num } uker } fileCount = { $num -> [one] 1 fil *[other] { $num } filer } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total størrelse: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopier lenken for å dele filen din: copyLinkButton = Kopier lenke downloadTitle = Last ned filer downloadDescription = Denne filen ble delt via { -send-brand } med ende-til-ende-kryptering og en lenke som automatisk utløper. trySendDescription = Prøv { -send-brand } for enkel, sikker fildeling. # count will always be > 10 tooManyFiles = { $count -> [one] Kun 1 fil kan lastes opp om gangen. *[other] Kun { $count } filer kan lastes opp om gangen. } # count will always be > 10 tooManyArchives = { $count -> [one] Kun 1 arkiv er tillatt. *[other] Kun { $count } arkiver er tillatt. } expiredTitle = Denne lenken er utløpt. notSupportedDescription = { -send-brand } virker ikke med denne nettleseren. { -send-short-brand } fungerer best med den nyeste versjonen av { -firefox }, og vil fungere med den nyeste versjonen av de fleste nettlesere. downloadFirefox = Last ned { -firefox } legalTitle = { -send-short-brand } Personvernerklæring legalDateStamp = Versjon 1.0, datert den 12. mars 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m addFilesButton = Velg filer du vil laste opp trustWarningMessage = Forsikre deg om at du stoler på mottakeren din når du deler sensitive data. uploadButton = Last opp # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Dra og slipp filer # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = eller klikk for å sende filer på opptil { $size } addPassword = Beskytt med passord emailPlaceholder = Skriv inn e-postadressen din # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Logg inn for å sende opptil { $size } signInOnlyButton = Logg inn accountBenefitTitle = Opprett en { -firefox }-konto eller logg inn # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Del filer på opptil { $size } accountBenefitDownloadCount = Del filer med flere personer accountBenefitTimeLimit = { $count -> [one] Hold lenker aktiv opptil 1 dag *[other] Hold lenker aktiv opptil { $count } dager } accountBenefitSync = Behandle delte filer fra en hvilken som helst enhet accountBenefitMoz = Les om andre { -mozilla }-tjenester signOut = Logg ut okButton = OK downloadingTitle = Laster ned noStreamsWarning = Denne nettleseren kan kanskje ikke dekryptere en så stor fil. noStreamsOptionCopy = Kopier lenken for å åpne den i en annen nettleser noStreamsOptionFirefox = Prøv favorittnettleseren vår noStreamsOptionDownload = Fortsett med denne nettleseren downloadFirefoxPromo = { -send-short-brand } presenteres for deg av den helt nye { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Del lenken til filen din: shareLinkButton = Del lenke # $name is the name of the file shareMessage = Last ned ‹{ $name }› med { -send-brand }: enkel, trygg fildeling trailheadPromo = Det finnes en måte å ta vare på personvernet ditt. Bruk Firefox. learnMore = Les mer. downloadFlagged = Denne koblingen er deaktivert på grunn av brudd på vilkårene for tjenesten. downloadConfirmTitle = En ting til downloadConfirmDescription = Forsikre deg om at du stoler på personen som sendte deg denne filen, fordi vi ikke kan bekrefte at den ikke vil skade enheten din. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Jeg stoler på personen som sendte denne filen *[other] Jeg stoler på personen som sendte disse filene } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Rapporter denne filen som mistenkelig *[other] Rapporter disse filene som mistenkelige } reportDescription = Hjelp oss å forstå hva som skjer. Hva tror du er galt med disse filene? reportUnknownDescription = Gå til adressen til lenken du ønsker å rapportere, og klikk «{ reportFile }». reportButton = Rapporter reportReasonMalware = Disse filene inneholder skadelig programvare eller er del av et nettfiskingsangrep (phishing-angrep). reportReasonPii = Disse filene inneholder personlig identifiserbar informasjon om meg. reportReasonAbuse = Disse filene inneholder ulovlig eller voldelig innhold. reportReasonCopyright = For å rapportere brudd på opphavsrett eller varemerke, bruk prosessen som er beskrevet på denne siden. reportedTitle = Filer rapportert reportedDescription = Takk skal du ha. Vi har mottatt rapporten din om disse filene. ================================================ FILE: public/locales/nl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importeren… encryptingFile = Versleutelen… decryptingFile = Ontsleutelen… downloadCount = { $num -> [one] 1 download *[other] { $num } downloads } timespanHours = { $num -> [one] 1 uur *[other] { $num } uur } copiedUrl = Gekopieerd! unlockInputPlaceholder = Wachtwoord unlockButtonLabel = Ontgrendelen downloadButtonLabel = Downloaden downloadFinish = Downloaden voltooid fileSizeProgress = ({ $partialSize } van { $totalSize }) sendYourFilesLink = Send proberen errorPageHeader = Er is iets misgegaan! fileTooBig = Dat bestand is te groot om te worden geüpload. Het moet kleiner zijn dan { $size }. linkExpiredAlt = Koppeling verlopen notSupportedHeader = Uw browser wordt niet ondersteund. notSupportedLink = Waarom wordt mijn browser niet ondersteund? notSupportedOutdatedDetail = Helaas ondersteunt deze versie van Firefox de webtechnologie die Send gebruikt niet. U dient uw browser bij te werken. updateFirefox = Firefox bijwerken deletePopupCancel = Annuleren deleteButtonHover = Verwijderen footerLinkLegal = Juridisch footerLinkPrivacy = Privacy footerLinkCookies = Cookies passwordTryAgain = Onjuist wachtwoord. Probeer het opnieuw. javascriptRequired = Send vereist JavaScript whyJavascript = Waarom vereist Send JavaScript? enableJavascript = Schakel JavaScript in en probeer het opnieuw. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }u { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximale wachtwoordlengte: { $length } # A short status message shown when there was an error setting the password passwordSetError = Dit wachtwoord kon niet worden ingesteld ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Eenvoudig, privé bestanden delen introDescription = Met { -send-brand } kunt u bestanden delen met end-to-endversleuteling en een koppeling die automatisch verloopt. Hierdoor kunt u privé houden wat u wilt delen en er zeker van zijn dat uw zaken niet voor altijd online blijven. notifyUploadEncryptDone = Uw bestand is versleuteld en klaar voor verzending # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Verloopt na { $downloadCount } of { $timespan } timespanMinutes = { $num -> [one] 1 minuut *[other] { $num } minuten } timespanDays = { $num -> [one] 1 dag *[other] { $num } dagen } timespanWeeks = { $num -> [one] 1 week *[other] { $num } weken } fileCount = { $num -> [one] 1 bestand *[other] { $num } bestanden } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Totale grootte: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopieer de koppeling om uw bestand te delen: copyLinkButton = Koppeling kopiëren downloadTitle = Bestanden downloaden downloadDescription = Dit bestand is gedeeld via { -send-brand } met end-to-endversleuteling en een koppeling die automatisch verloopt. trySendDescription = Probeer { -send-brand } voor eenvoudig, veilig bestanden delen. # count will always be > 10 tooManyFiles = { $count -> [one] Er kan slechts één bestand tegelijk worden geüpload. *[other] Er kunnen slechts { $count } bestanden tegelijk worden geüpload. } # count will always be > 10 tooManyArchives = { $count -> [one] Slechts één archief is toegestaan. *[other] Slechts { $count } archieven zijn toegestaan. } expiredTitle = Deze koppeling is verlopen. notSupportedDescription = { -send-brand } werkt niet met deze browser. { -send-short-brand } werkt het beste met de nieuwste versie van { -firefox }, en werkt met de huidige versie van de meeste browsers. downloadFirefox = { -firefox } downloaden legalTitle = Privacybeleid van { -send-short-brand } legalDateStamp = Versie 1.0 d.d. 12 maart 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }u { $minutes }m addFilesButton = Selecteer te uploaden bestanden trustWarningMessage = Zorg ervoor dat u uw ontvanger vertrouwt wanneer u gevoelige gegevens deelt. uploadButton = Uploaden # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Versleep bestanden # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = of klik om tot { $size } te versturen addPassword = Beveiligen met wachtwoord emailPlaceholder = Voer uw e-mailadres in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Meld u aan om tot { $size } te versturen signInOnlyButton = Aanmelden accountBenefitTitle = Maak een { -firefox }-account of meld u aan # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Bestanden tot { $size } delen accountBenefitDownloadCount = Bestanden met meerdere personen delen accountBenefitTimeLimit = { $count -> [one] Koppelingen tot één dag actief houden *[other] Koppelingen tot { $count } dagen actief houden } accountBenefitSync = Gedeelde bestanden vanaf andere apparaten beheren accountBenefitMoz = Info over andere services van { -mozilla } signOut = Afmelden okButton = OK downloadingTitle = Downloaden noStreamsWarning = Deze browser kan een bestand van deze omvang mogelijk niet ontcijferen. noStreamsOptionCopy = Koppeling kopiëren om in een andere browser te openen noStreamsOptionFirefox = Onze favoriete browser proberen noStreamsOptionDownload = Doorgaan met deze browser downloadFirefoxPromo = { -send-short-brand } wordt u aangeboden door het volledig vernieuwde { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Deel de koppeling naar uw bestand: shareLinkButton = Koppeling delen # $name is the name of the file shareMessage = Download ‘{ $name }’ met { -send-brand }: eenvoudig, veilig bestanden delen trailheadPromo = Er is een manier om uw privacy te beschermen. Doe mee met Firefox. learnMore = Meer info. downloadFlagged = Deze koppeling is uitgeschakeld wegens schending van de servicevoorwaarden. downloadConfirmTitle = Nog een ding downloadConfirmDescription = Zorg ervoor dat u de persoon vertrouwt die u dit bestand heeft gestuurd, omdat we niet kunnen verifiëren dat het uw apparaat niet zal schaden. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Ik vertrouw de persoon die dit bestand heeft verzonden *[other] Ik vertrouw de persoon die deze bestanden heeft verzonden } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Dit bestand als verdacht rapporteren *[other] Deze bestanden als verdacht rapporteren } reportDescription = Help ons te begrijpen wat er aan de hand is. Wat is er volgens u mis met deze bestanden? reportUnknownDescription = Ga naar de URL van de koppeling die u wilt melden en klik op ‘{ reportFile }’. reportButton = Rapporteren reportReasonMalware = Deze bestanden bevatten malware of zijn onderdeel van een phishingaanval. reportReasonPii = Deze bestanden bevatten persoonlijk identificeerbare informatie over mij. reportReasonAbuse = Deze bestanden bevatten illegale of beledigende inhoud. reportReasonCopyright = Gebruik de procedure op deze pagina om inbreuk op auteursrechten of handelsmerken te melden. reportedTitle = Bestanden gerapporteerd reportedDescription = Dank u. We hebben uw rapport over deze bestanden ontvangen. ================================================ FILE: public/locales/nn-NO/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importerer… encryptingFile = Krypterer… decryptingFile = Dekrypterer... downloadCount = { $num -> [one] 1 nedlasting *[other] { $num } nedlastingar } timespanHours = { $num -> [one] 1 time *[other] { $num } timar } copiedUrl = Kopiert! unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp downloadButtonLabel = Last ned downloadFinish = Nedlastinga er fullført. fileSizeProgress = ({ $partialSize } av { $totalSize }) sendYourFilesLink = Prøv Send errorPageHeader = Noko gjekk gale! fileTooBig = Fila er for stor, og kan ikkje lastast opp. Ho må vere mindre enn { $size }. linkExpiredAlt = Lenka har gått ut notSupportedHeader = Nettlesaren din er ikkje støtta. notSupportedLink = Kvifor er ikkje nettlesaren min støtta? notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Send. Du må å oppdatere nettlesaren din. updateFirefox = Oppdater Firefox deletePopupCancel = Avbryt deleteButtonHover = Slett footerLinkLegal = Juridisk informasjon footerLinkPrivacy = Personvern footerLinkCookies = Infokapslar passwordTryAgain = Feil passord. Prøv på nytt. javascriptRequired = Send krev JavaScript. whyJavascript = Kvifor krev Send JavaScript? enableJavascript = Slå på JavaScript og prøv igjen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maksimum passordlengde: { $length } # A short status message shown when there was an error setting the password passwordSetError = Dette passordet kunne ikkje stillast inn ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Enkel, privat fildeling introDescription = { -send-brand } lèt deg dele filer via ei tidsavgrensa lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samstundes vere trygg på at det ikkje ligg på nettet for alltid. notifyUploadEncryptDone = Fila di er kryptert og klar til å bli sendt # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Går ut etter { $downloadCount } eller { $timespan } timespanMinutes = { $num -> [one] 1 minutt *[other] { $num } minutt } timespanDays = { $num -> [one] 1 dag *[other] { $num } dagar } timespanWeeks = { $num -> [one] 1 veke *[other] { $num } veker } fileCount = { $num -> [one] 1 fil *[other] { $num } filer } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total storleik: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopier lenka for å dele fila di: copyLinkButton = Kopier lenke downloadTitle = Last ned filer downloadDescription = Denne fila vart delt via { -send-brand }, med ende-til-ende-kryptering, og ei lenke som automatisk går ut. trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. # count will always be > 10 tooManyFiles = { $count -> [one] Berre 1 fil kan lastast opp om gongen. *[other] Berre { $count } filer kan lastast opp om gongen. } # count will always be > 10 tooManyArchives = { $count -> [one] Berre 1 arkiv er lov. *[other] Berre { $count } arkiv er lov. } expiredTitle = Denne lenka har gått ut. notSupportedDescription = { -send-brand } fungerer ikkje med denne nettlesaren. { -send-short-brand } fungerer best med siste versjon av { -firefox } og med dei fleste andre nye nettlesarar. downloadFirefox = Last ned { -firefox } legalTitle = { -send-short-brand }, om personvernpraksis legalDateStamp = Versjon 1.0, datert den 12 mars 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m addFilesButton = Vel filer som skal lastast opp trustWarningMessage = Forsikre deg om at du stolar på mottakaren din når du deler sensitive data. uploadButton = Last opp # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Dra og slepp filer # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = eller klikk for å sende filer på opptil { $size } addPassword = Vern med passord emailPlaceholder = Skriv inn e-postadressa di # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Logg inn for å sende filer på opptil { $size } signInOnlyButton = Logg inn accountBenefitTitle = Lag ein { -firefox }-konto eller logg inn # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Del filer på opptil { $size } accountBenefitDownloadCount = Del filer med fleire personar accountBenefitTimeLimit = { $count -> [one] Hald lenka aktiv opptil 1 dag *[other] Hald lenker aktive opptil { $count } dagar } accountBenefitSync = Handter delte filer frå kva som helst eining accountBenefitMoz = Les om andre { -mozilla }-tenster signOut = Logg ut okButton = OK downloadingTitle = Lastar ned noStreamsWarning = Denne nettlesaren kan kanskje ikkje dekryptere ei så stor fil. noStreamsOptionCopy = Kopier lenka for å opne henne i ein annan nettlesar noStreamsOptionFirefox = Prøv favorittnettlesaren vår noStreamsOptionDownload = Fortset med denne nettlesaren downloadFirefoxPromo = { -send-short-brand } vert presentert for deg av den heilt nye { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Del lenka til fila di: shareLinkButton = Del lenke # $name is the name of the file shareMessage = Last ned "{ $name }" med { -send-brand }: enkel, trygg fildelning trailheadPromo = Det finst ein måte å ta vare på personvernet ditt. Ver med Firefox på ferda. learnMore = Les meir. downloadFlagged = Denne koplinga er deaktivert på grunn av brot på vilkåra for tenesta. downloadConfirmTitle = Ein ting til downloadConfirmDescription = Forsikre deg om at du stolar på personen som sende deg denne fila fordi, vi ikkje kan stadfeste at ho ikkje vil skade eininga di. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Eg stolar på personen som sende denne fila *[other] Eg stolar på personen som sende desse filene } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Rapporter denne fila som mistenkjeleg *[other] Rapporter desse filene som mistenkjelege } reportDescription = Hjelp oss å forstå kva som skjer. Kva trur du er gale med desse filene? reportUnknownDescription = Gå til lenkeadressa du ønskjer å rapportere, og klikk «{ reportFile }». reportButton = Rapporter reportReasonMalware = Desse filene inneheld skadeleg programvare eller er del av eit nettfiskingsangrep (phishing-angrep). reportReasonPii = Desse filene inneheld personleg identifiserbar informasjon om meg. reportReasonAbuse = Desse filene inneheld ulovleg eller valdeleg innhald. reportReasonCopyright = For å rapportere brot på opphavsrett eller varemerke, bruk prosessen som er beskriven på denne sida. reportedTitle = Rapporterte filer reportedDescription = Takk skal du ha. Vi har fått rapporten din om desse filene. ================================================ FILE: public/locales/oc/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importacion… encryptingFile = Chiframent… decryptingFile = Deschiframent… downloadCount = { $num -> [one] 1 telecargament *[other] { $num } telecargaments } timespanHours = { $num -> [one] 1 ora *[other] { $num } oras } copiedUrl = Copiat ! unlockInputPlaceholder = Senhal unlockButtonLabel = Desverrolhar downloadButtonLabel = Telecargar downloadFinish = Telecargament acabat fileSizeProgress = ({ $partialSize } sus { $totalSize }) sendYourFilesLink = Ensajar Send errorPageHeader = I a quicòm que truca. fileTooBig = Aqueste fichièr es tròp gròs per l’enviar. Sa talha deu èsser inferiora a { $size }. linkExpiredAlt = Lo ligam a expirat notSupportedHeader = Vòstre navegador es pas compatible. notSupportedLink = Perqué mon navegador es pas compatible ? notSupportedOutdatedDetail = Aquesta version de Firefox es pas compatibla amb la tecnologia web amb la quala fonciona Send. Vos cal metre a jorn lo navegador. updateFirefox = Metre a jorn Firefox deletePopupCancel = Anullar deleteButtonHover = Suprimir footerLinkLegal = Mencions legalas footerLinkPrivacy = Vida privada footerLinkCookies = Cookies passwordTryAgain = Senhal incorrècte. Tornatz ensajar. javascriptRequired = Send requesís JavaScript whyJavascript = Perque Send requesís JavaScript ? enableJavascript = Volgatz activar lo JavaScript e ensajatz tornamai. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Talha maximala del senhal : { $length } # A short status message shown when there was an error setting the password passwordSetError = Aqueste senhal a pas pogut èsser definit ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Partatge simple e privat de fichièrs introDescription = { -send-brand } vos permet de partejar de fichièr amb un chiframent del cap a la fin e un ligam qu’expira automaticament. Atal podètz gardar privat çò que partejatz e vos assegurar que demorarà pas en linha per totjorn. notifyUploadEncryptDone = Vòstre fichièr es chifrat e prèst per mandadís # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira aprèp { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuta *[other] { $num } minutas } timespanDays = { $num -> [one] 1 jorn *[other] { $num } jorns } timespanWeeks = { $num -> [one] 1 setmana *[other] { $num } setmanas } fileCount = { $num -> [one] 1 fichièr *[other] { $num } fichièrs } # byte abbreviation bytes = o # kibibyte abbreviation kb = Ko # mebibyte abbreviation mb = Mo # gibibyte abbreviation gb = Go # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Talha totala : { $size } # the next line after the colon contains a file name copyLinkDescription = Copiatz lo ligam per partejar vòstre fichièr : copyLinkButton = Copiar lo ligam downloadTitle = Telecargar los fichièrs downloadDescription = Aqueste fichièr foguèt partejat via { -send-brand } amb chiframent del cap a la fin e un ligam qu’expira automaticament. trySendDescription = Ensajatz { -send-brand } per un partiment de fichièrs simple e segur. # count will always be > 10 tooManyFiles = { $count -> [one] Òm pòt pas qu’enviar 1 fichièr al còp. *[other] Òm pòt pas qu’enviar { $count } fichièrs al còp. } # count will always be > 10 tooManyArchives = { $count -> [one] Pas qu’un archiu es autorizat. *[other] Pas que { $count } archius son autorizats. } expiredTitle = Aqueste ligam a expirat. notSupportedDescription = { -send-brand } foncionarà pas amb aqueste navegador. { -send-short-brand } fonciona melhor amb la darrièra version de { -firefox } e foncionarà amb la version mai recenta de la màger part dels navegadors. downloadFirefox = Telecargar { -firefox } legalTitle = Avís de confidencialitat de { -send-short-brand } legalDateStamp = Version 1.0 del 12 de març de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min addFilesButton = Seleccionatz los fichièrs de mandar trustWarningMessage = Asseguratz-vos que vos fisatz del destinari quand partejatz de donadas confidencialas. uploadButton = Enviar # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Lisatz-depausatz de fichièrs # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = o clicatz per enviar fins a { $size } addPassword = Protegir amb un senhal emailPlaceholder = Picatz vòstra adreça electronica # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Connectatz-vos per enviar fins a { $size } signInOnlyButton = Connexion accountBenefitTitle = Creatz un compte { -firefox } o connectatz-vos # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Partejatz de fichièrs fins a { $size } accountBenefitDownloadCount = Partejatz de fichièrs amb mai de personas accountBenefitTimeLimit = { $count -> [one] Mantenètz los ligams actius fins a 1 jorn *[other] Mantenètz los ligams actius fins a { $count } jorns } accountBenefitSync = Gerissètz los fichièrs partejats de qualque siá periferic estant accountBenefitMoz = Aprenètz-ne mai suls autres servicis { -mozilla } signOut = Desconnexion okButton = D'acòrd downloadingTitle = Telecargament noStreamsWarning = Pòt arribar qu’aqueste navegador pòsca pas deschifrar un fichièr tan gròs. noStreamsOptionCopy = Copiatz lo ligam per lo dobrir dins un autre navegador noStreamsOptionFirefox = Ensajatz nòstre navegador preferit noStreamsOptionDownload = Contunhar amb aqueste navegador downloadFirefoxPromo = Lo nòu { -firefox } vos provesís { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Partejatz lo ligam cap a vòstre fichièr : shareLinkButton = Partejar lo ligam # $name is the name of the file shareMessage = Telecargar « { $name } » amb { -send-brand } : un biais simple e segur de partejar de fichièrs. trailheadPromo = Existís un biais de protegir vòstra vida privada. Rejonhètz Firefox. learnMore = Ne saber mai. downloadFlagged = Aqueste ligam foguèt desactivat a causa d’una infraccions a las condicions d’utilizacion. downloadConfirmTitle = Un quicomet mai downloadConfirmDescription = Asseguratz-vos que la persona que vos mandèt aqueste fichièr perque podèm pas verificar qu’es pas malfasent per vòstre periferic # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Me fisi de la persona que me mandèt lo fichièr *[other] Me fisi de la persona que me mandèt los fichièrs } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Senhalar aqueste fichièr coma suspècte *[other] Senhalar aquestes fichièrs coma suspèctes } reportDescription = Ajudatz-nos a comprendre qué passa. Qué vos fa pensar que quicòm truca amb aquestes fichièrs ? reportUnknownDescription = Anatz a l’URL del ligam que volètz senhalar e clicatz « { reportFile } ». reportButton = Senhalar reportReasonMalware = Aquestes fichièrs contenon de logicials malvolents o forman part d’un atac de pesca electronica. reportReasonPii = Aquestes fichièrs contenon d’informacions d’identificacion personala que me concernisson. reportReasonAbuse = Aquestes fichièrs contenon de contengut illegal o abusiu. reportReasonCopyright = Per senhalar una violacion de drech d’autor o de marca, seguissètz la procedura descricha sus aquesta pagina. reportedTitle = Fichièrs senhalats reportedDescription = Mercés. Avèm recebut vòstre senhalament d’aquestes fichièrs. ================================================ FILE: public/locales/pa-IN/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = ...ਦਰਾਮਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ encryptingFile = ...ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ decryptingFile = ...ਡਿਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ downloadCount = { $num -> [one] 1 ਡਾਊਨਲੋਡ *[other] { $num } ਡਾਊਨਲੋਡ } timespanHours = { $num -> [one] 1 ਘੰਟਾ *[other] { $num } ਘੰਟੇ } copiedUrl = ਨਕਲ ਕੀਤਾ! unlockInputPlaceholder = ਪਾਸਵਰਡ unlockButtonLabel = ਅਣ-ਲਾਕ ਕਰੋ downloadButtonLabel = ਡਾਊਨਲੋਡ ਕਰੋ downloadFinish = ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ fileSizeProgress = ({ $totalSize } ਵਿੱਚੋਂ { $partialSize }) sendYourFilesLink = Send ਵਰਤੋ errorPageHeader = ਕੁਝ ਗਲਤ ਵਾਪਰਿਆ! fileTooBig = ਇਹ ਫਾਇਲ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਬਹੁਤ ਵੱਡੀ ਹੈ। ਇਸ { $size } ਤੋਂ ਘੱਟ ਚਾਹੀਦੀ ਹੈ linkExpiredAlt = ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ notSupportedHeader = ਤੁਹਾਡਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। notSupportedLink = ਮੇਰਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਕਿਉ ਨਹੀਂ ਹੈ? notSupportedOutdatedDetail = ਅਫ਼ਸੋਸ ਹੈ ਕਿ ਫਾਇਰਫਾਕਸ ਦਾ ਇਹ ਵਰਜ਼ਨ ਵੈੱਬ ਤਕਨਾਲੋਜੀ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ, ਜੋ ਕਿ Send ਨੂੰ ਬਣਾਉਂਦੀਆਂ ਹਨ। ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ। updateFirefox = ਫਾਇਰਫਾਕਸ ਅੱਪਡੇਟ ਕਰੋ deletePopupCancel = ਰੱਦ ਕਰੋ deleteButtonHover = ਹਟਾਓ footerLinkLegal = ਕਨੂੰਨ footerLinkPrivacy = ਪਰਦੇਦਾਰੀ footerLinkCookies = ਕੂਕੀਜ਼ passwordTryAgain = ਗਲਤ ਪਾਸਵਰਡ ਹੈ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। javascriptRequired = Send ਲਈ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਚਾਹੀਦੀ ਹੈ whyJavascript = Send ਨੂੰ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਦੀ ਲੋੜ ਕਿਓ ਹੈ? enableJavascript = ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਸਮਰੱਥ ਕਰੋ ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ਘੰ { $minutes }ਮਿੰ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ਮਿੰ # A short status message shown when the user enters a long password maxPasswordLength = ਵੱਧ ਤੋਂ ਵੱਧ ਪਾਸਵਰਡ ਦੀ ਲੰਬਾਈ: { $length } # A short status message shown when there was an error setting the password passwordSetError = ਇਹ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = ਭੇਜੋ -firefox = ਫਾਇਰਫਾਕਸ -mozilla = ਮੋਜ਼ੀਲਾ introTitle = ਸੌਖਾ, ਪ੍ਰਾਈਵੇਟ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ introDescription = { -send-brand } ਤੁਹਾਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਸ਼ਨ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਦਿੰਦਾ ਹੈ ਅਤੇ ਲਿੰਕ ਦੀ ਮਿਆਦ ਆਪਣੇ ਆਪ ਪੁੱਗ ਜਾਂਦੀ ਹੈ। ਇਸ ਕਰਕੇ ਤੁਸੀਂ ਤੁਹਾਡੇ ਵਲੋਂ ਸਾਂਝੇ ਕੀਤੇ ਨੂੰ ਨਿੱਜੀ ਬਣਾਈ ਰੱਖਦੇ ਹੋ ਅਤੇ ਪੱਕਾ ਕਰਦੇ ਹੋ ਕਿ ਤੁਹਾਡਾ ਸਾਮਾਨ ਹਮੇਸ਼ਾਂ ਆਨਲਾਈਨ ਨਹੀਂ ਰਹਿੰਦਾ ਹੈ। notifyUploadEncryptDone = ਤੁਹਾਡਾ ਫਾਇਲ ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਗਈ ਤੇ ਭੇਜਣ ਲਈ ਤਿਆਰ ਹੈ # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } ਜਾਂ { $timespan } ਦੇ ਬਾਅਦ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ timespanMinutes = { $num -> [one] 1 ਮਿੰਟ *[other] { $num } ਮਿੰਟ } timespanDays = { $num -> [one] 1 ਦਿਨ *[other] { $num } ਦਿਨ } timespanWeeks = { $num -> [one] 1 ਹਫ਼ਤਾ *[other] { $num } ਹਫ਼ਤੇ } fileCount = { $num -> [one] 1 ਫ਼ਾਇਲ *[other] { $num } ਫ਼ਾਇਲ } # byte abbreviation bytes = ਬਾਈਟ # kibibyte abbreviation kb = ਕਿਲੋਬਾਈਟ # mebibyte abbreviation mb = ਮੈਗਾਬਾਈਟ # gibibyte abbreviation gb = ਗੀਗਾਬਾਈਟ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = ਕੁੱਲ ਆਕਾਰ: { $size } # the next line after the colon contains a file name copyLinkDescription = ਆਪਣੀ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ: copyLinkButton = ਲਿੰਕ ਕਾਪੀ ਕਰੋ downloadTitle = ਫਾਇਲਾਂ ਡਾਊਨਲੋਡ ਕਰੋ downloadDescription = ਇਹ ਫਾਇਲ ਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਟ ਕਰਕੇ { -send-brand } ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ ਸੀ ਅਤੇ ਲਿੰਕ ਆਪਣੇ-ਆਪ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ। trySendDescription = ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਲਈ { -send-brand } ਵਰਤ ਕੇ ਵੇਕੋ। # count will always be > 10 tooManyFiles = { $count -> [one] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ 1 ਫਾਇਲ ਹੀ ਅੱਪਲੋਡ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। *[other] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ { $count } ਫਾਇਲਾਂ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। } # count will always be > 10 tooManyArchives = { $count -> [one] ਸਿਰਫ਼ 1 ਅਕਾਇਵ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। *[other] ਸਿਰਫ਼ { $count } ਅਕਾਇਵਾਂ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। } expiredTitle = ਇਹ ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੈ। notSupportedDescription = { -send-brand } ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ। { -send-short-brand } { -firefox } ਦੇ ਨਵੇਂ ਵਰਜ਼ਨ ਨਾਲ ਸਭ ਤੋਂ ਵਧੀਆ ਕੰਮ ਕਰਦਾ ਹੈ ਅਤੇ ਬਹੁਤੇ ਬਰਾਊਜ਼ਰ ਦੇ ਮੌਜੂਦਾ ਵਰਜ਼ਨ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ। downloadFirefox = { -firefox } ਡਾਊਨਲੋਡ ਕਰੋ legalTitle = { -send-short-brand } ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ legalDateStamp = ਵਰਜ਼ਨ 1.0, ਮਿਤੀ 12 ਮਾਰਚ 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ਦਿਨ { $hours } ਘੰ { $minutes } ਮਿੰ addFilesButton = ਚੁਣੀਆਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ uploadButton = ਅੱਪਲੋਡ ਕਰੋ # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ਫਾਇਲਾਂ ਖਿੱਚੋ ਅਤੇ ਸੁੱਟੋ # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ਜਾਂ { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਕਲਿੱਕ ਕਰੋ addPassword = ਪਾਸਵਰਡ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ emailPlaceholder = ਆਪਣੀ ਈਮੇਲ ਦਿਓ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਸਾਇਨ ਅੱਪ ਕਰੋ signInOnlyButton = ਸਾਇਨ ਇਨ accountBenefitTitle = { -firefox } ਖਾਤਾ ਬਣਾਓ ਜਾਂ ਸਾਇਨ ਕਰੋ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = { $size } ਤੱਕ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ accountBenefitDownloadCount = ਹੋਰ ਲੋਕਾਂ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ accountBenefitTimeLimit = { $count -> [one] ਲਿੰਕਾਂ ਨੂੰ 1 ਦਿਨ ਲਈ ਸਰਗਰਮ ਰੱਖੋ *[other] ਲਿੰਕਾਂ ਨੂੰ { $count } ਦਿਨਾਂ ਲਈ ਸਰਗਰਮ ਰੱਖੋ } accountBenefitSync = ਕਿਸੇ ਵੀ ਡਿਵਾਇਸ ਤੋਂ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਦਾ ਬੰਦੋਬਸਤ ਕਰੋ accountBenefitMoz = ਹੋਰ { -mozilla } ਸੇਵਾਵਾਂ ਬਾਰੇ ਜਾਣੋ signOut = ਸਾਈਨ ਆਉਟ okButton = ਠੀਕ ਹੈ downloadingTitle = ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ noStreamsWarning = ਇਹ ਬਰਾਊਜ਼ਰ ਨੂੰ ਇਸ ਵੱਡੀ ਫਾਇਲ ਨੂੰ ਡਿਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਸਮਰੱਥ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ। noStreamsOptionCopy = ਹੋਰ ਬਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹਣ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ noStreamsOptionFirefox = ਸਾਡੇ ਮਨਪਸੰਦ ਬਰਾਊਜ਼ਰ ਵਰਤ ਕੇ ਵੇਖੋ noStreamsOptionDownload = ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਜਾਰੀ ਰੱਖੋ downloadFirefoxPromo = { -send-short-brand } ਤੁਹਾਡੇ ਲਈ ਬਿਲਕੁਲ ਨਵਾਂ { -firefox } ਹੈ। # the next line after the colon contains a file name shareLinkDescription = ਆਪਣੀ ਫਾਇਲ ਲਈ ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ: shareLinkButton = ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ # $name is the name of the file shareMessage = { -send-brand } ਨਾਲ "{ $name }" ਡਾਊਨਲੋਡ ਕਰੋ: ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ trailheadPromo = ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਸੁਰੱਖਿਆ ਦਾ ਢੰਗ ਹੈ। ਫਾਇਰਫਾਕਸ ਨਾਲ ਜੁੜੋ। learnMore = ਹੋਰ ਸਿੱਖੋ downloadConfirmTitle = ਇੱਕ ਗੱਲ ਹੋਰ ================================================ FILE: public/locales/pai/send.ftl ================================================ siteFeedback = Tkweek uk kabyuwuha ## Send version 2 strings ================================================ FILE: public/locales/pl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importowanie… encryptingFile = Szyfrowanie… decryptingFile = Odszyfrowywanie… downloadCount = { $num -> [one] 1 pobraniu [few] { $num } pobraniach *[many] { $num } pobraniach } timespanHours = { $num -> [one] godzinie [few] { $num } godzinach *[many] { $num } godzinach } copiedUrl = Skopiowano unlockInputPlaceholder = Hasło unlockButtonLabel = Odblokuj downloadButtonLabel = Pobierz downloadFinish = Ukończono pobieranie fileSizeProgress = ({ $partialSize } z { $totalSize }) sendYourFilesLink = Wypróbuj Send errorPageHeader = Coś się nie udało. fileTooBig = Ten plik jest za duży, aby go wysłać. Musi być mniejszy niż { $size } linkExpiredAlt = Odnośnik wygasł notSupportedHeader = Używana przeglądarka nie jest obsługiwana. notSupportedLink = Dlaczego ta przeglądarka nie jest obsługiwana? notSupportedOutdatedDetail = Ta wersja Firefoksa nie obsługuje technologii internetowej, która napędza Send. Należy uaktualnić przeglądarkę. updateFirefox = Uaktualnij Firefoksa deletePopupCancel = Anuluj deleteButtonHover = Usuń footerLinkLegal = Kwestie prawne footerLinkPrivacy = Prywatność footerLinkCookies = Ciasteczka passwordTryAgain = Niepoprawne hasło. Spróbuj ponownie. javascriptRequired = Send wymaga języka JavaScript whyJavascript = Dlaczego Send wymaga języka JavaScript? enableJavascript = Włącz obsługę języka JavaScript i spróbuj ponownie. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } godz. { $minutes } min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min # A short status message shown when the user enters a long password maxPasswordLength = Maksymalna długość hasła: { $length } # A short status message shown when there was an error setting the password passwordSetError = Nie można ustawić tego hasła ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Proste, prywatne udostępnianie plików introDescription = { -send-brand } umożliwia udostępnianie plików za pomocą szyfrowania typu „end-to-end” i odnośników, które automatycznie wygasają. Dzięki temu możesz mieć pewność, że to co udostępniasz jest bezpieczne i nie pozostanie w Internecie na zawsze. notifyUploadEncryptDone = Plik jest zaszyfrowany i gotowy do wysłania # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Wygasa po { $downloadCount } lub { $timespan } timespanMinutes = { $num -> [one] minucie [few] { $num } minutach *[many] { $num } minutach } timespanDays = { $num -> [one] dniu [few] { $num } dniach *[many] { $num } dniach } timespanWeeks = { $num -> [one] tygodniu [few] { $num } tygodniach *[many] { $num } tygodniach } fileCount = { $num -> [one] 1 plik [few] { $num } pliki *[many] { $num } plików } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Całkowity rozmiar: { $size } # the next line after the colon contains a file name copyLinkDescription = Skopiuj odnośnik, aby udostępnić plik: copyLinkButton = Kopiuj odnośnik downloadTitle = Pobierz pliki downloadDescription = Ten plik został udostępniony przez { -send-brand } za pomocą szyfrowania typu „end-to-end” i odnośnika, który automatycznie wygasa. trySendDescription = Wypróbuj { -send-brand }, aby prosto i bezpiecznie udostępniać pliki. # count will always be > 10 tooManyFiles = { $count -> [one] Jednocześnie można wysyłać tylko jeden plik. [few] Jednocześnie można wysyłać tylko { $count } pliki. *[many] Jednocześnie można wysyłać tylko { $count } plików. } # count will always be > 10 tooManyArchives = { $count -> [one] Dozwolone jest tylko jedno archiwum. [few] Dozwolone są tylko { $count } archiwa. *[many] Dozwolonych jest tylko { $count } archiwów. } expiredTitle = Ten odnośnik wygasł. notSupportedDescription = { -send-brand } nie będzie działać w tej przeglądarce. { -send-short-brand } najlepiej działa w najnowszej wersji przeglądarki { -firefox }, ale będzie działać także w aktualnych wersjach większości przeglądarek. downloadFirefox = Pobierz przeglądarkę { -firefox } legalTitle = Zasady ochrony prywatności serwisu { -send-short-brand } legalDateStamp = Wersja 1.0 z 12 marca 2019 r. # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d. { $hours } godz. { $minutes } min addFilesButton = Wybierz pliki do wysłania trustWarningMessage = Upewnij się, że ufasz odbiorcy, kiedy udostępniasz prywatne dane. uploadButton = Wyślij # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Przeciągnij pliki # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = lub kliknij, aby wysłać do { $size } addPassword = Chroń hasłem emailPlaceholder = Wpisz adres e-mail # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Zaloguj się, aby wysłać do { $size } signInOnlyButton = Zaloguj się accountBenefitTitle = Utwórz konto { -firefox } lub zaloguj się # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Udostępniaj pliki do { $size } accountBenefitDownloadCount = Udostępniaj pliki większej liczbie osób accountBenefitTimeLimit = { $count -> [one] Odnośniki aktywne przez jeden dzień [few] Odnośniki aktywne przez { $count } dni *[many] Odnośniki aktywne przez { $count } dni } accountBenefitSync = Zarządzaj udostępnionymi plikami z każdego urządzenia accountBenefitMoz = Poznaj inne serwisy organizacji { -mozilla } signOut = Wyloguj się okButton = OK downloadingTitle = Pobieranie noStreamsWarning = Ta przeglądarka może nie być w stanie odszyfrować tak dużego pliku. noStreamsOptionCopy = Skopiuj odnośnik, aby otworzyć w innej przeglądarce noStreamsOptionFirefox = Wypróbuj naszą ulubioną przeglądarkę noStreamsOptionDownload = Kontynuuj za pomocą tej przeglądarki downloadFirefoxPromo = { -send-short-brand } jest oferowany przez zupełnie nową przeglądarkę { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Udostępnij odnośnik do pliku: shareLinkButton = Udostępnij odnośnik # $name is the name of the file shareMessage = Pobierz „{ $name }” za pomocą { -send-brand }: prostego i bezpiecznego udostępniania plików trailheadPromo = Jest sposób na ochronę swojej prywatności. Dołącz do Firefoksa. learnMore = Więcej informacji. downloadFlagged = Ten odnośnik został wyłączony z powodu naruszenia warunków korzystania z usługi. downloadConfirmTitle = Jeszcze jedna rzecz downloadConfirmDescription = Upewnij się, że ufasz osobie, która wysłała Ci ten plik, ponieważ nie możemy zweryfikować, czy nie spowoduje on uszkodzenia Twojego urządzenia. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Ufam osobie, która wysłała ten plik [few] Ufam osobie, która wysłała te pliki *[many] Ufam osobie, która wysłała te pliki } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Zgłoś ten plik jako podejrzany [few] Zgłoś te pliki jako podejrzane *[many] Zgłoś te pliki jako podejrzane } reportDescription = Pomóż nam zrozumieć, co się stało. Co według Ciebie jest nie tak z tymi plikami? reportUnknownDescription = Przejdź do adresu odnośnika, który chcesz zgłosić, i kliknij „{ reportFile }”. reportButton = Zgłoś reportReasonMalware = Te pliki zawierają złośliwe oprogramowanie lub są częścią próby oszustwa. reportReasonPii = Te pliki zawierają informacje umożliwiające identyfikację mojej osoby. reportReasonAbuse = Te pliki zawierają nielegalne lub obraźliwe treści. reportReasonCopyright = Aby zgłosić naruszenie praw autorskich lub znaków towarowych, skorzystaj z procedury opisanej na ten stronie. reportedTitle = Pliki zostały zgłoszone reportedDescription = Dziękujemy. Otrzymaliśmy Twoje zgłoszenie dotyczące tych plików. ================================================ FILE: public/locales/ppl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Shitechnawati importingFile = Mukalaktia nemi… encryptingFile = Tikichtakawiat tinemit… decryptingFile = Tikichtakapuat tinemit… downloadCount = { $num -> [one] temultijtuk *[other] { $num } temultijtuk } timespanHours = { $num -> [one] oraj *[other] { $num } oraj } copiedUrl = Muishkupintuk! unlockInputPlaceholder = Ichtakatajkwilul unlockButtonLabel = Shiktapua downloadButtonLabel = Shiktemulti downloadFinish = Senkiska mutemultij fileSizeProgress = ({ $partialSize } ipal { $totalSize }) sendYourFilesLink = Shikejeku Send errorPageHeader = IJtakawtuk! fileTooBig = Ini tajkwilul sujsul etek pal tiktejkultia. Ma nemi san { $size }. linkExpiredAlt = Ne ilpika pulijtuk notSupportedHeader = Te tikishmatit ne mutachialuni. notSupportedLink = Taika te ankishmatit nutachialuni? notSupportedOutdatedDetail = Ini tamakalis ipal Firefox tesu kimati ne tzawaltekitilis ne kiyulitia Send. Nemi pal tikyankwilia ne mutachialuni. updateFirefox = Shikyankwili Firefox deletePopupCancel = Shikilwi tesu deleteButtonHover = Shikpulu footerLinkLegal = Ipanpa ne tajtuli footerLinkPrivacy = Teichtakayu footerLinkCookies = Cookies passwordTryAgain = Ne ichtakatajkwilul tesu yek. Shikejeku uksenpa. javascriptRequired = Send muneki JavaScript whyJavascript = Taika Send muneki JavaScript? enableJavascript = Shichiwa ma JavaScript tekiti wan shikejeku uksenpa. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Ne iweyaka ne ichtakatajkwilul muneki: { $length } # A short status message shown when there was an error setting the password passwordSetError = Te tiweliket tiktaliat ini ichtakataketzalis ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Shiktitani -firefox = Firefox -mozilla = Mozilla introTitle = Shikmajmaka se tajkwilul, te uij wan ichtaka introDescription = { -send-brand } metzpalewia tikmajmaka se tajkwilul iwan taichtakawilis wan se ilpika puliwi nemanha. Yajika, tikpia muichtakayu pal tikmajmaka wan tesu naka senpa mutajtatka tik matapan. notifyUploadEncryptDone = Ne archivoj nemi ichtakawijtuk wan weli tiktitania # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Puliwi kwak ajsi { $downloadCount } ush { $timespan } timespanMinutes = { $num -> [one] { $num } minutoj *[other] { $num } minutoj } timespanDays = { $num -> [one] { $num } tunal *[other] { $num } tunal } timespanWeeks = { $num -> [one] { $num } semanaj *[other] { $num } semanaj } fileCount = { $num -> [one] { $num } tajkwilul *[other] { $num } tajkwilul } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Itamachiwka: { $size } # the next line after the colon contains a file name copyLinkDescription = Shikishkupina ne ilpika pal tikmajmaka mutajkwilul: copyLinkButton = Shikishkupina ne ilpika downloadTitle = Shiktemulti tajkwilul downloadDescription = Ini tajkwilul kiski itech { -send-brand } iwan taichtakawilis wan se ilpika ka puliwi nemanha. trySendDescription = Shikejeku { -send-brand } wan shiktakuli ichtaka wan te uij. # count will always be > 10 tooManyFiles = { $count -> [one] Semaya se tajkwilul weli pal tiktejkultia sansepa. *[other] Semaya { $count } tajkwilul weli pal tiktejkultia sansepa. } # count will always be > 10 tooManyArchives = { $count -> [one] Semaya se amapial weli mutitania. *[other] Semaya { $count } amapial weli mutitania. } expiredTitle = Ne ilpika puliwik. notSupportedDescription = { -send-brand } tesu yawi tekiti iwan ini tachialuni. { -send-short-brand } tekiti sujsul yek iwan ne tipan tamakalis ipal { -firefox }, wan nusan iwan ne tipan tamakalis ipal miak tachialuni. downloadFirefox = Shiktemulti { -firefox } legalTitle = { -send-short-brand } Tanawatilis ipanpa teichtakayu legalDateStamp = Tamakalis 1.0, tik marzoj 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } t { $hours } h { $minutes } m addFilesButton = Shikpejpena ne tajkwilul pal tiktejkultia uploadButton = Shiktejkulti # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Shiktilana wan shikmayawi ne tajkwilul # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = u shikpachu pal tiktitania { $size } addPassword = Shiktajpia iwan ichtakatajkwilul emailPlaceholder = Shiktali mutepusamaw # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Shiktali mutukay pal tiktitania { $size } signInOnlyButton = Shiktali mutukay accountBenefitTitle = Shikchiwa se mutapujka tik { -firefox } ush shiktali mutukay # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Shiktakuli tajtajkwilul ka { $size } accountBenefitDownloadCount = Shiktakuli tajtajkwilul iwan seuk accountBenefitTimeLimit = { $count -> [one] Shikpia ne ilpika tapujtuk 1 tunal *[other] Shikpia ne ilpika tapujtuk { $count } tunal } accountBenefitSync = Shiktajpia ne tajkwilul takulijtuk ka kanaj accountBenefitMoz = Shikmati ipanpa ukse { -mozilla } tayekultilis signOut = Shikisa okButton = Yek downloadingTitle = Kitemultia nemi noStreamsWarning = Ini tachialuni anka te weli kichtakapua ini tajkwilul wey. noStreamsOptionCopy = Shikishkupina ne ilpika pal tiktapua tik ukse tachialuni noStreamsOptionFirefox = Shikejeku ne tachialuni tikishwelitat noStreamsOptionDownload = Ma ninemi senpa iwan ini tachialuni downloadFirefoxPromo = Ne yankwik { -firefox } metzwikilia { -send-short-brand }. # the next line after the colon contains a file name shareLinkDescription = Shiktakuli ne ilpika ipal mutajkwilul: shareLinkButton = Shiktakuli ne ilpika # $name is the name of the file shareMessage = Shiktemulti “{ $name }” iwan { -send-brand }: ichtaka wan te uij trailheadPromo = Nemi ken pal tiktajpia ne muichtakayu. Shimuishtuka iwan Firefox. learnMore = Shimumachti ukchupi. ================================================ FILE: public/locales/pt-BR/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importando… encryptingFile = Criptografando… decryptingFile = Descriptografando… downloadCount = { $num -> [one] baixar 1 vez *[other] baixar { $num } vezes } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = Copiado! unlockInputPlaceholder = Senha unlockButtonLabel = Desbloquear downloadButtonLabel = Baixar downloadFinish = Download concluído fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Experimente o Send errorPageHeader = Oops, ocorreu um erro! fileTooBig = Esse arquivo ou grupo de arquivos é grande demais para ser enviado. Deve ser menor que { $size }. linkExpiredAlt = Link expirado notSupportedHeader = Seu navegador não é suportado. notSupportedLink = Por que meu navegador não é suportado? notSupportedOutdatedDetail = Infelizmente essa versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Você precisa atualizar o seu navegador. updateFirefox = Atualizar o Firefox deletePopupCancel = Cancelar deleteButtonHover = Remover da lista footerLinkLegal = Jurídico footerLinkPrivacy = Privacidade footerLinkCookies = Cookies passwordTryAgain = Senha incorreta. Tente novamente. javascriptRequired = O Send requer JavaScript whyJavascript = Por que o Send precisa do JavaScript? enableJavascript = Ative o JavaScript e tente novamente. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }min # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }min # A short status message shown when the user enters a long password maxPasswordLength = Tamanho máximo da senha: { $length } # A short status message shown when there was an error setting the password passwordSetError = Essa senha não pôde ser definida ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Compartilhamento de arquivos fácil e privativo introDescription = O { -send-brand } permite compartilhar arquivos com criptografia de ponta a ponta através de um link que expira automaticamente. Assim você pode proteger o que compartilha e ter certeza que suas coisas não ficarão online para sempre. notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 dia *[other] { $num } dias } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 arquivo *[other] { $num } arquivos } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamanho total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copie o link para compartilhar seu arquivo: copyLinkButton = Copiar link downloadTitle = Baixar arquivos downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia de ponta a ponta e um link que expira automaticamente. trySendDescription = Experimente o { -send-brand } para compartilhar arquivos com simplicidade e segurança. # count will always be > 10 tooManyFiles = { $count -> [one] Somente 1 arquivo pode ser enviado por vez. *[other] Somente { $count } arquivos podem ser enviados por vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Só é permitido 1 pacote. *[other] Só são permitidos { $count } pacotes. } expiredTitle = Este link expirou. notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e funcionará com a versão atual da maioria dos navegadores. downloadFirefox = Baixar o { -firefox } legalTitle = Aviso de privacidade do { -send-short-brand } legalDateStamp = Versão 1.0, de 12 de março de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Selecionar arquivos para enviar trustWarningMessage = Certifique-se de que confia no destinatário ao compartilhar dados sensíveis. uploadButton = Enviar # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arraste e solte arquivos aqui # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ou clique para enviar até { $size } addPassword = Proteger com senha emailPlaceholder = Informe seu e-mail # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Entre na sua conta para enviar até { $size } signInOnlyButton = Entrar accountBenefitTitle = Crie uma Conta { -firefox } ou entre se já tiver # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Compartilhe arquivos até { $size }. accountBenefitDownloadCount = Compartilhe arquivos com mais pessoas. accountBenefitTimeLimit = { $count -> [one] Mantenha links ativos por até 1 dia. *[other] Mantenha links ativos por até { $count } dias. } accountBenefitSync = Gerencie arquivos compartilhados a partir de qualquer dispositivo. accountBenefitMoz = Conheça outros serviços da { -mozilla }. signOut = Sair okButton = OK downloadingTitle = Baixando noStreamsWarning = Este navegador pode não conseguir descriptografar um arquivo tão grande. noStreamsOptionCopy = Copiar o link para abrir em outro navegador noStreamsOptionFirefox = Experimente nosso navegador preferido noStreamsOptionDownload = Continuar com este navegador downloadFirefoxPromo = O { -send-short-brand } é apresentado pelo novo { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Compartilhe o link para o seu arquivo: shareLinkButton = Compartilhar link # $name is the name of the file shareMessage = Baixe "{ $name }" com o { -send-brand }: compartilhamento de arquivos simples e seguro trailheadPromo = Existe um meio de proteger sua privacidade. Use o Firefox. learnMore = Saiba mais. downloadFlagged = Este link foi desativado por violar os termos do serviço. downloadConfirmTitle = Mais uma coisa downloadConfirmDescription = Certifique-se de que confia na pessoa que enviou este arquivo, pois não podemos conferir se não prejudicará seu dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Eu confio na pessoa que enviou este arquivo *[other] Eu confio na pessoa que enviou estes arquivos } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Denunciar este arquivo como suspeito *[other] Denunciar estes arquivos como suspeitos } reportDescription = Ajude-nos a entender o que está acontecendo. O que você acha que há de errado com estes arquivos? reportUnknownDescription = Acesse o endereço do link que deseja denunciar e clique em “{ reportFile }”. reportButton = Denunciar reportReasonMalware = Estes arquivos contêm malware (código malicioso) ou fazem parte de um ataque de phishing (fraude). reportReasonPii = Estes arquivos contêm informações de identificação pessoal sobre mim. reportReasonAbuse = Estes arquivos contêm conteúdo ilegal ou abusivo. reportReasonCopyright = Para denunciar violação de direitos autorais ou de marca, siga o procedimento descrito nesta página. reportedTitle = Arquivos denunciados reportedDescription = Obrigado. Recebemos sua denúncia sobre estes arquivos. ================================================ FILE: public/locales/pt-PT/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = A importar... encryptingFile = A encriptar... decryptingFile = A desencriptar... downloadCount = { $num -> [one] 1 transferência *[other] { $num } transferências } timespanHours = { $num -> [one] 1 hora *[other] { $num } horas } copiedUrl = Copiado! unlockInputPlaceholder = Palavra-passe unlockButtonLabel = Desbloquear downloadButtonLabel = Transferir downloadFinish = Transferência concluída fileSizeProgress = ({ $partialSize } de { $totalSize }) sendYourFilesLink = Experimentar o Send errorPageHeader = Algo correu mal. fileTooBig = Esse ficheiro é muito grande para carregar. Deve ser menor do que { $size }. linkExpiredAlt = Ligação expirada notSupportedHeader = O seu navegador não é suportado. notSupportedLink = Porque é que o meu navegador não é suportado? notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Precisa de atualizar o seu navegador. updateFirefox = Atualizar o Firefox deletePopupCancel = Cancelar deleteButtonHover = Apagar footerLinkLegal = Informação legal footerLinkPrivacy = Privacidade footerLinkCookies = Cookies passwordTryAgain = Palavra-passe incorreta. Tente novamente. javascriptRequired = O Send requer JavaScript whyJavascript = Porque é que o Send requer JavaScript? enableJavascript = Por favor ative o JavaScript e tente novamente. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Comprimento máximo de palavra-passe: { $length } # A short status message shown when there was an error setting the password passwordSetError = Esta palavra-passe não pôde ser definida ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Partilha de ficheiros simples e privada introDescription = O { -send-brand } permite partilhar ficheiros com encriptação de ponta a ponta e uma ligação que expira automaticamente. Para que possa manter o que partilha privado e garantir que as suas coisas não fiquem online para sempre. notifyUploadEncryptDone = O seu ficheiro está encriptado e pronto a enviar # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } minutos } timespanDays = { $num -> [one] 1 dia *[other] { $num } dias } timespanWeeks = { $num -> [one] 1 semana *[other] { $num } semanas } fileCount = { $num -> [one] 1 ficheiro *[other] { $num } ficheiros } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tamanho total: { $size } # the next line after the colon contains a file name copyLinkDescription = Copie a ligação para partilhar o seu ficheiro: copyLinkButton = Copiar ligação downloadTitle = Transfira ficheiros downloadDescription = Este ficheiro foi partilhado via { -send-brand } com encriptação de ponta a ponta e uma ligação que expira automaticamente. trySendDescription = Experimente o { -send-brand } para uma partilha de ficheiros simples e segura. # count will always be > 10 tooManyFiles = { $count -> [one] Apenas 1 ficheiro pode ser carregado de cada vez. *[other] Apenas { $count } ficheiros podem ser carregados de cada vez. } # count will always be > 10 tooManyArchives = { $count -> [one] Apenas 1 ficheiro é permitido. *[other] Apenas { $count } ficheiros são permitidos. } expiredTitle = Esta ligação expirou. notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e irá funcionar com a versão atual da maioria dos navegadores. downloadFirefox = Transferir o { -firefox } legalTitle = Aviso de privacidade do { -send-short-brand } legalDateStamp = Versão 1.0, de 12 de março de 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Selecionar ficheiros para carregar trustWarningMessage = Tenha a certeza que confia no destinatário ao partilhar dados sensíveis. uploadButton = Carregar # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Arraste e largue ficheiros # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ou clique para enviar até { $size } addPassword = Proteger com palavra-passe emailPlaceholder = Introduzir o seu email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Iniciar sessão para enviar até { $size } signInOnlyButton = Iniciar sessão accountBenefitTitle = Crie uma Conta { -firefox } ou inicie sessão # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Partilhe ficheiros até { $size } accountBenefitDownloadCount = Partilhe ficheiros com mais pessoas accountBenefitTimeLimit = { $count -> [one] Mantenha ligações ativas até 1 dia *[other] Mantenha ligações ativas até { $count } dias } accountBenefitSync = Gira ficheiros partilhas a partir de qualquer dispositivo accountBenefitMoz = Saiba mais acerca de outros serviços da { -mozilla } signOut = Terminar sessão okButton = OK downloadingTitle = A transferir noStreamsWarning = Este navegador pode não conseguir desencriptar um ficheiro tão grande. noStreamsOptionCopy = Copie a ligação para abrir noutro navegador noStreamsOptionFirefox = Experimente o nosso navegador favorito noStreamsOptionDownload = Continuar com este navegador downloadFirefoxPromo = O { -send-short-brand } é trazido a si pelo novo { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Partilhe a ligação para o seu ficheiro: shareLinkButton = Partilhar ligação # $name is the name of the file shareMessage = Transferir “{ $name }“ com o { -send-brand }: partilha de ficheiros simples e segura trailheadPromo = Existe um modo para proteger a sua privacidade. Adira ao Firefox. learnMore = Saiba mais. downloadFlagged = Esta ligação foi desativada por violar os termos do serviço. downloadConfirmTitle = Mais uma coisa downloadConfirmDescription = Tenha a certeza que confia na pessoa que lhe enviou este ficheiro, pois não podemos garantir que o mesmo não irá danificar o seu dispositivo. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Eu confio na pessoa que enviou este ficheiro *[other] Eu confio na pessoa que enviou estes ficheiros } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Denunciar este ficheiro como suspeito *[other] Denunciar estes ficheiros como suspeitos } reportDescription = Ajude-nos a compreender o que está a acontecer. O que acha que está errado com estes ficheiros? reportUnknownDescription = Por favor, aceda ao endereço da ligação que pretende denunciar e clique em “{ reportFile }”. reportButton = Denunciar reportReasonMalware = Estes ficheiros contêm software malicioso ou fazem parte de um ataque de phishing. reportReasonPii = Estes ficheiros contêm dados pessoais sobre mim. reportReasonAbuse = Estes ficheiros contêm conteúdo ilegal ou abusivo. reportReasonCopyright = Para denunciar violação de direitos de autor ou de marca comercial, utilize o procedimento descrito nesta página. reportedTitle = Ficheiros denunciados reportedDescription = Obrigado. Recebemos a sua denúncia sobre estes ficheiros. ================================================ FILE: public/locales/quc/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Utzijoxik importingFile = Ujek'ik… encryptingFile = Uwiqik… decryptingFile = Usolik… downloadCount = { $num -> [one] 1 uqasaxik *[other] { $num } taq uqasaxik } timespanHours = { $num -> [one] 1 ramaj *[other] { $num } taq ramaj } copiedUrl = Copied! unlockInputPlaceholder = Retokib'al unlockButtonLabel = Utzoqopixik downloadButtonLabel = Uqasaxik downloadFinish = Tz'aqat uqasaxik fileSizeProgress = ({ $partialSize } rech { $totalSize }) sendYourFilesLink = Chak'amb'ejaj Send errorPageHeader = K'o man utz ta xub'ano fileTooBig = Le kemk'olib'al sib'alaj nim chech upaqab'isaxik. Rajawaxik nitz' chi uwach{ $size } linkExpiredAlt = Xq'ax uq'ijol kemwiqb'al notSupportedHeader = Man toq'am ta le anik'onel notSupportedLink = ¿Jasche man toq'am ta le nunik'onel? notSupportedOutdatedDetail = Chakuyu' we okib'al rech Firefox man kutoq'aj ta le k'ak'eta'm rech web' le kuya' uchuq'ab' Send. Rajawaxik kak'ak'arisaj le anik'onel. updateFirefox = Chak'ak'arisaj Firefox deletePopupCancel = Uq'atexik deleteButtonHover = Uchupik footerLinkLegal = Nim wuj footerLinkPrivacy = Echeb'alil footerLinkCookies = Cookies passwordTryAgain = Man utz ta le retokib'al. Chab'ana' chi jumul. javascriptRequired = Le Send kajawataj JavaScript chech whyJavascript = ¿jasche kajawataj JavaScript chech Send? enableJavascript = Chatzija' JavaScript k'ate k'u ri' chab'ana' chi jumul. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Nimalaj unimal retokib'al: { $length } # A short status message shown when there was an error setting the password passwordSetError = Man kkowimb'ex ta ujeqeb'axik le retokib'al ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Utaqik -firefox = Firefox -mozilla = Mozilla introTitle = Man k'ax taj, ukomonexik taq kemk'olib'al pa echeb'alil introDescription = { -send-brand } kuya' bé chi awech kakomonej taq kemk'olib'al ruk' wiqitajem chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. Are chi man katzaq ta le kakomone'j pa echeb'alil chi'l chasuk'ub'a' rilik chi le taq ajastaq man kk'oji' ta pa nimk'atz pa junelik. notifyUploadEncryptDone = Le akemk'olib'al wiqitalik chi'l utz chi kataqo # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Kq'ax uq'ijol chi rij { $downloadCount } on { $timespan } timespanMinutes = { $num -> [one] 1 kajb'al *[other] { $num } taq kajb'al } timespanDays = { $num -> [one] 1 q'ij *[other] { $num } taq q'ij } timespanWeeks = { $num -> [one] 1 wuqq'ij *[other] { $num } taq wuqq'ij } fileCount = { $num -> [one] 1 kemk'olib'al *[other] { $num } taq kemk'olib'al } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ronojel unimal: { $size } # the next line after the colon contains a file name copyLinkDescription = Chawinaqirisaj uwach le kemwiqb'al chech ukomone'xik le akemk'olib'al: copyLinkButton = Relesaxik uwach kemwiqb'al downloadTitle = Uqasaxik taq kemwiqb'al downloadDescription = We kemk'olib'al xkomone'x pa { -send-brand } ruk' wiqitajem pa xkut chi xkut chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. trySendDescription = Chak'amb'ejaj { -send-brand } chech man k'ax taj, ukomonexik kemk'olib'al pa chajib'al. # count will always be > 10 tooManyFiles = { $count -> [one] Xa 1 kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. *[other] Xew { $count } taq kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. } # count will always be > 10 tooManyArchives = { $count -> [one] Xew 1 kemk'olib'al ya'om b'e chech. *[other] Xew { $count } taq kemk'olib'al ya'om b'e chech } expiredTitle = Xq'ax uq'ijol we kemwiqb'al notSupportedDescription = { -send-brand } man kchakun ta ruk' we nik'onel. { -send-short-brand } are qas utz uchakunem ruk' le maja naj okib'al rech { -firefox }, xuquje' kchakun ruk' le okib'al rech chanim rech nima ronojel taq nik'onelab'. downloadFirefox = Uqasaxik { -firefox } legalTitle = { -send-short-brand } ub'ixikil rech echeb'alil legalDateStamp = Okib'al 1.0, uq'ijol rech urox ik' 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Ucha'ik taq kemk'olib'al chech upaqab'isaxik uploadButton = Upaqab'isaxik # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Uchararexik chi'l utzoqopixik taq kemk'olib'al # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = on chapitz'a' chech utaqik chech { $size } addPassword = Chajital rumal retokib'al emailPlaceholder = Chach'apa' le ataqoqxa'nib'al # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Chamajij kemchak chech utaqik chech { $size } signInOnlyButton = Chamajij kemchak accountBenefitTitle = Chawinaqirisaj jun { -firefox } kemb'i'aj on chamajij kemchak # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Chakomone'j taq kemk'olib'al kq'ax pa uwi' { $size } accountBenefitDownloadCount = Chakomone'j taq kemk'olib'al kuk' nik'aj chi winaq accountBenefitTimeLimit = { $count -> [one] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' 1 q'ij *[other] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' { $count } taq q'ij } accountBenefitSync = Chawilawachij komone'tal taq kemk'olib'al pa apachike wiqkemchakub'al accountBenefitMoz = Chaweta'maj chi rij jun chi { -mozilla } taq patanib'al signOut = Chatz'apij kemchak okButton = Ja'e downloadingTitle = Ktajin uqasaxik noStreamsWarning = We nik'onel wene man kkowin taj kusol jun jewa' unimal kemk'olib'al noStreamsOptionCopy = Chawelesaj uwach le kemwiqb'al chech ujaqik jun chi nik'onel noStreamsOptionFirefox = Chak'amb'ejaj le ajawatal nik'onel noStreamsOptionDownload = Chab'ana' na ruk' we nik'onel downloadFirefoxPromo = { -send-short-brand } k'amom la chi awech rumal le k'ak' { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Chakomone'j le kemwiqb'al chech le akemk'olib'al: shareLinkButton = Chakomone'j kemwiqb'al # $name is the name of the file shareMessage = Chaqasaj “{ $name }” ruk' { -send-brand }: man k'ax ta ub'anik, ukomone'xik kemk'olib'al pa chajib'al trailheadPromo = K'o jun ub'e'al chech uchajixik le a'echeb'alil. Chat'iqa' awib' pa. Firefox. learnMore = Chaweta'maj nik'aj chik ================================================ FILE: public/locales/ro/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Se importă… encryptingFile = Se criptează… decryptingFile = Se decriptează… downloadCount = { $num -> [one] 1 descărcare [few] { $num } descărcări *[other] { $num } de descărcări } timespanHours = { $num -> [one] 1 oră [few] { $num } ore *[other] { $num } de ore } copiedUrl = Copiat! unlockInputPlaceholder = Parolă unlockButtonLabel = Deblochează downloadButtonLabel = Descarcă downloadFinish = Descărcare încheiată fileSizeProgress = ({ $partialSize } din { $totalSize }) sendYourFilesLink = Încearcă Send errorPageHeader = Ceva nu a funcționat! fileTooBig = Acest fișier este prea mare. Ar trebuie să fie sub { $size }. linkExpiredAlt = Link expirat notSupportedHeader = Browserul tău nu este suportat. notSupportedLink = De ce browserul meu nu este suportat? notSupportedOutdatedDetail = Din păcate, această versiune de Firefox nu suportă tehnologiile web din spatele Send. Va trebui să actualizezi browserul. updateFirefox = Actualizează Firefox deletePopupCancel = Renunță deleteButtonHover = Șterge footerLinkLegal = Mențiuni legale footerLinkPrivacy = Confidențialitate footerLinkCookies = Cookie-uri passwordTryAgain = Parolă incorectă. Încearcă din nou. javascriptRequired = Send necesită JavaScript whyJavascript = De ce Send necesită JavaScript? enableJavascript = Te rugăm să reactivezi JavaScript și să încerci din nou. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Lungime minimă a parolei: { $length } # A short status message shown when there was an error setting the password passwordSetError = Această parolă nu a putut fi setată ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Partajare de fișiere simplă și privată introDescription = { -send-brand } îți permite să partajezi fișiere cu criptare capăt-la-capăt și un link care expiră automat. Deci, poți păstra confidențial ceea ce partajezi și te poți asigura că ce ai partajat nu rămâne online pentru totdeauna. notifyUploadEncryptDone = Fișierul tău este criptat și gata de trimitere # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Expiră după { $downloadCount } sau { $timespan } timespanMinutes = { $num -> [one] 1 minut [few] { $num } minute *[other] { $num } de minute } timespanDays = { $num -> [one] 1 zi [few] { $num } zile *[other] { $num } de zile } timespanWeeks = { $num -> [one] 1 săptămână [few] { $num } săptămâni *[other] { $num } de săptămâni } fileCount = { $num -> [one] 1 fișier [few] { $num } fișiere *[other] { $num } de fișiere } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Mărime totală: { $size } # the next line after the colon contains a file name copyLinkDescription = Copiază linkul pentru partajarea fișierului: copyLinkButton = Copiază linkul downloadTitle = Descarcă fișierele downloadDescription = Acest fișier a fost partajat prin { -send-brand }, cu criptare capăt-la-capăt și un link care expiră automat. trySendDescription = Încearcă { -send-brand } pentru o partajare simplă și sigură a fișierelor. # count will always be > 10 tooManyFiles = { $count -> [one] Numai 1 fișier poate fi încărcat simultan. [few] Numai { $count } fișiere pot fi încărcate simultan. *[other] Numai { $count } de fișiere pot fi încărcate simultan. } # count will always be > 10 tooManyArchives = { $count -> [one] Numai 1 arhivă este permisă. [few] Numai { $count } arhive sunt permise. *[other] Numai { $count } de arhive sunt permise. } expiredTitle = Acest link a expirat. notSupportedDescription = { -send-brand } nu va funcționa pe acest browser. { -send-short-brand } funcționează cel mai bine cu ultima versiune de { -firefox } și va funcționa cu versiunea curentă a majorității browserelor. downloadFirefox = Descarcă { -firefox } legalTitle = Notificare privind confidențialitatea { -send-short-brand } legalDateStamp = Versiunea 1.0 din data de 12 martie 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }z { $hours }h { $minutes }m addFilesButton = Selectează fișierele pentru încărcare trustWarningMessage = Asigură-te că destinatarul este de încredere când partajezi date sensibile. uploadButton = Încarcă # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Trage și plasează fișierele # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = sau dă clic pentru a trimite până la { $size } addPassword = Protejează cu parolă emailPlaceholder = Introdu e-mailul tău # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Autentifică-te pentru a trimite până la { $size } signInOnlyButton = Autentificare accountBenefitTitle = Creează un cont { -firefox } sau autentifică-te # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Partajează fișiere de până la { $size } accountBenefitDownloadCount = Partajează fișiere cu mai multe persoane accountBenefitTimeLimit = { $count -> [one] Păstrează linkurile active până la 1 zi [few] Păstrează linkurile active până la { $count } zile *[other] Păstrează linkurile active până la { $count } de zile } accountBenefitSync = Gestionează fișierele partajate de pe orice dispozitiv accountBenefitMoz = Află despre celelalte servicii { -mozilla } signOut = Deconectare okButton = Ok downloadingTitle = Se descarcă noStreamsWarning = Este posibil ca acest browser să nu poată decripta un fișier atât de mare. noStreamsOptionCopy = Copiază linkul pentru a-l deschide într-un alt browser noStreamsOptionFirefox = Încearcă browserul nostru favorit noStreamsOptionDownload = Continuă cu acest browser downloadFirefoxPromo = { -send-short-brand } îți este adus de noul { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Partajează linkul către fișier: shareLinkButton = Partajează linkul # $name is the name of the file shareMessage = Descarcă „{ $name }” cu { -send-brand }: partajare simplă și sigură a fișierelor trailheadPromo = Există o modalitate de a-ți proteja viața privată. Folosește Firefox. learnMore = Află mai multe. downloadFlagged = Acest link a fost dezactivat pentru că încalcă termenii de utilizare a serviciului. downloadConfirmTitle = Încă ceva downloadConfirmDescription = Asigură-te că persoana care ți-a trimis acest fișier este de încredere pentru că noi nu putem verifica dacă nu cumva îți va afecta dispozitivul. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Am încredere în persoana care a trimis acest fișier [few] Am încredere în persoana care a trimis aceste fișiere *[other] Am încredere în persoana care a trimis aceste fișiere } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Raportează acest fișier ca suspect [few] Raportează aceste fișiere ca suspecte *[other] Raportează aceste fișiere ca suspecte } reportDescription = Ajută-ne să înțelegem ce se întâmplă. Ce crezi că e în neregulă cu aceste fișiere? reportUnknownDescription = Intră pe URL-ul linkului pe care vrei să îl raportezi și dă clic pe „{ reportFile }”. reportButton = Raportează reportReasonMalware = Aceste fișiere conțin cod rău-intenționat sau fac parte dintr-un atac de înșelăciune. reportReasonPii = Aceste fișiere conțin date cu caracter personal identificabile despre mine. reportReasonAbuse = Aceste fișiere au un conținut ilegal sau ofensator. reportReasonCopyright = Pentru a raporta o încălcare a drepturilor de reproducere sau a mărcilor comerciale, folosește procedura descrisă aici. reportedTitle = Fișiere raportate reportedDescription = Îți mulțumim. Am primit raportarea ta despre aceste fișiere. ================================================ FILE: public/locales/ru/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Импортирование... encryptingFile = Шифрование... decryptingFile = Расшифровка... downloadCount = { $num -> [one] { $num } загрузки [few] { $num } загрузок *[other] { $num } загрузок } timespanHours = { $num -> [one] { $num } час [few] { $num } часа *[other] { $num } часов } copiedUrl = Скопировано! unlockInputPlaceholder = Пароль unlockButtonLabel = Разблокировать downloadButtonLabel = Загрузить downloadFinish = Загрузка завершена fileSizeProgress = ({ $partialSize } из { $totalSize }) sendYourFilesLink = Попробовать Send errorPageHeader = Что-то пошло не так! fileTooBig = Файл слишком большой. Он должен быть меньше { $size }. linkExpiredAlt = Истёк срок действия ссылки notSupportedHeader = Ваш браузер не поддерживается. notSupportedLink = Почему мой браузер не поддерживается? notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Send. Ваш нужно обновить свой браузер. updateFirefox = Обновить Firefox deletePopupCancel = Отмена deleteButtonHover = Удалить footerLinkLegal = Права footerLinkPrivacy = Приватность footerLinkCookies = Куки passwordTryAgain = Неверный пароль. Попробуйте снова. javascriptRequired = Для Send необходим JavaScript whyJavascript = Почему Send требуется JavaScript? enableJavascript = Пожалуйста, включите JavaScript и попробуйте снова. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } ч. { $minutes } мин. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } мин. # A short status message shown when the user enters a long password maxPasswordLength = Максимальная длина пароля: { $length } # A short status message shown when there was an error setting the password passwordSetError = Этот пароль не может быть установлен ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Простой и безопасный обмен файлами introDescription = { -send-brand } позволяет вам делиться файлами со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. Так что, вы сможете делиться файлами приватно и они не останутся в сети навсегда. notifyUploadEncryptDone = Ваш файл зашифрован и готов к отправке # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Срок хранения истекает после { $downloadCount } или через { $timespan } timespanMinutes = { $num -> [one] { $num } минуту [few] { $num } минуты *[other] { $num } минут } timespanDays = { $num -> [one] { $num } день [few] { $num } дня *[other] { $num } дней } timespanWeeks = { $num -> [one] { $num } неделю [few] { $num } недели *[other] { $num } недель } fileCount = { $num -> [one] { $num } файл [few] { $num } файла *[other] { $num } файлов } # byte abbreviation bytes = Б # kibibyte abbreviation kb = КБ # mebibyte abbreviation mb = МБ # gibibyte abbreviation gb = ГБ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Общий размер: { $size } # the next line after the colon contains a file name copyLinkDescription = Скопируйте ссылку, чтобы поделиться своим файлом: copyLinkButton = Копировать ссылку downloadTitle = Загрузить файлы downloadDescription = Этот файл был отправлен через { -send-brand } со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. trySendDescription = Испытайте простой и безопасный обмен файлами с помощью { -send-brand }. # count will always be > 10 tooManyFiles = { $count -> [one] Только { $count } файл может загружаться одновременно. [few] Только { $count } файла могут загружаться одновременно. *[other] Только { $count } файлов могут загружаться одновременно. } # count will always be > 10 tooManyArchives = { $count -> [one] Только { $count } архив разрешён. [few] Только { $count } архива разрешено. *[other] Только { $count } архивов разрешено. } expiredTitle = Срок действия этой ссылки истёк. notSupportedDescription = { -send-brand } не будет работать в этом браузере. { -send-short-brand } лучше всего работает с последней версией { -firefox }, и будет работать с последними версиями популярных браузеров. downloadFirefox = Загрузить { -firefox } legalTitle = Уведомление о конфиденциальности { -send-short-brand } legalDateStamp = Версия 1.0, от 12 марта 2019 года # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } дн. { $hours } ч. { $minutes } мин. addFilesButton = Выберите файлы для выгрузки trustWarningMessage = Убедитесь, что вы доверяете своему получателю при обмене конфиденциальными данными. uploadButton = Выгрузить # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Перетащите файлы сюда # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = или щёлкните здесь, чтобы отправить их (до { $size }) addPassword = Защитить паролем emailPlaceholder = Введите ваш адрес электронной почты # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Войдите, чтобы отправлять файлы до { $size } signInOnlyButton = Войти accountBenefitTitle = Создайте Аккаунт { -firefox } или войдите # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Делитесь файлами до { $size } accountBenefitDownloadCount = Делитесь файлами с несколькими людьми accountBenefitTimeLimit = { $count -> [one] Оставить ссылку активной в течение { $count } дня [few] Оставить ссылку активной в течение { $count } дней *[other] Оставить ссылку активной в течение { $count } дней } accountBenefitSync = Управляйте своими файлами с любого устройства accountBenefitMoz = Узнайте о других службах { -mozilla } signOut = Выйти okButton = OK downloadingTitle = Загрузка noStreamsWarning = Этот браузер может не иметь возможности расшифровать такой большой файл. noStreamsOptionCopy = Скопируйте ссылку, чтобы открыть в другом браузере noStreamsOptionFirefox = Попробуйте наш любимый браузер noStreamsOptionDownload = Продолжить в этом браузере downloadFirefoxPromo = { -send-short-brand } доступен вам в полностью новом { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Поделитесь ссылкой на ваш файл: shareLinkButton = Поделиться ссылкой # $name is the name of the file shareMessage = Загрузите «{ $name }» с { -send-brand }: простой и безопасный обмен файлами trailheadPromo = Существует способ защитить вашу приватность. Присоединяйтесь к Firefox. learnMore = Подробнее. downloadFlagged = Эта ссылка была отключена за нарушение условий использования. downloadConfirmTitle = Ещё один совет downloadConfirmDescription = Убедитесь, что вы доверяете человеку, который отправил вам этот файл, потому что мы не знаем, не повредит ли файл вашему устройству. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Я доверяю человеку, который отправил этот файл [few] Я доверяю человеку, который отправил эти файлы *[many] Я доверяю человеку, который отправил эти файлы } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Сообщить об этом файле как о подозрительном [few] Сообщить об этих файлах как о подозрительных *[many] Сообщить об этих файлах как о подозрительных } reportDescription = Помогите нам понять, что происходит. Что по вашему мнению не так с этими файлами? reportUnknownDescription = Перейдите к адресу ссылки, о которой хотите сообщить, и щёлкните «{ reportFile }». reportButton = Сообщить reportReasonMalware = Эти файлы содержат вредоносные программы или являются частью фишинговой атаки. reportReasonPii = Эти файлы содержат мои личные данные. reportReasonAbuse = Эти файлы содержат незаконный или оскорбительный контент. reportReasonCopyright = Чтобы сообщить о нарушении авторских прав или товарных знаков, используйте процедуру, описанную на этой странице. reportedTitle = О файлах сообщено reportedDescription = Спасибо. Мы получили вашу жалобу на эти файлы. ================================================ FILE: public/locales/sk/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importuje sa… encryptingFile = Šifruje sa… decryptingFile = Dešifruje sa… downloadCount = { $num -> [one] 1 prevzatí [few] { $num } prevzatiach *[other] { $num } prevzatiach } timespanHours = { $num -> [one] 1 hodine [few] { $num } hodinách *[other] { $num } hodinách } copiedUrl = Skopírované! unlockInputPlaceholder = Heslo unlockButtonLabel = Odomknúť downloadButtonLabel = Prevziať downloadFinish = Preberanie bolo dokončené fileSizeProgress = ({ $partialSize } z { $totalSize }) sendYourFilesLink = Vyskúšajte Send errorPageHeader = Vyskytol sa problém. fileTooBig = Súbor je príliš veľký. Mal by byť menší než { $size }. linkExpiredAlt = Platnosť odkazu vypršala notSupportedHeader = Váš prehliadač nie je podporovaný. notSupportedLink = Prečo nie je môj prehliadač podporovaný? notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Send. Budete musieť aktualizovať svoj prehliadač. updateFirefox = Aktualizovať Firefox deletePopupCancel = Zrušiť deleteButtonHover = Odstrániť footerLinkLegal = Právne informácie footerLinkPrivacy = Súkromie footerLinkCookies = Cookies passwordTryAgain = Nesprávne heslo. Skúste to znova. javascriptRequired = Send vyžaduje JavaScript whyJavascript = Prečo Send vyžaduje JavaScript? enableJavascript = Prosím, povoľte JavaScript a skúste to znova. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } hod. { $minutes } min. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min. # A short status message shown when the user enters a long password maxPasswordLength = Maximálna dĺžka hesla: { $length } # A short status message shown when there was an error setting the password passwordSetError = Heslo nešlo nastaviť ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Jednoduché a súkromné zdieľanie súborov introDescription = S { -send-brand(case: "ins") } sú zdieľané súbory šifrované end-to-end, takže ani my nevieme, čo zdieľate. Platnosť odkazu je navyše obmedzená. Súbory tak môžete zdieľať súkromne a s istotou, že neostanú na internete naveky. notifyUploadEncryptDone = Váš súbor je zašifrovaný a pripravený na odoslanie # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Platnosť odkazu vyprší po { $downloadCount } alebo po { $timespan } timespanMinutes = { $num -> [one] 1 minúte [few] { $num } minútach *[other] { $num } minútach } timespanDays = { $num -> [one] 1 dni [few] { $num } dňoch *[other] { $num } dňoch } timespanWeeks = { $num -> [one] 1 týždni [few] { $num } týždňoch *[other] { $num } týždňoch } fileCount = { $num -> [one] 1 súbor [few] { $num } súbory *[other] { $num } súborov } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Celková veľkosť: { $size } # the next line after the colon contains a file name copyLinkDescription = Súbor môžete zdieľať pomocou tohto odkazu: copyLinkButton = Kopírovať odkaz downloadTitle = Prevziať súbory downloadDescription = Tento súbor bol zdieľaný prostredníctvom služby { -send-brand }, ktorá poskytuje end-to-end šifrovanie a odkazy s obmedzenou platnosťou. trySendDescription = Vyskúšajte jednoduché a bezpečné zdieľanie súborov so službou { -send-brand } # count will always be > 10 tooManyFiles = { $count -> [one] Naraz možno nahrávať len 1 súbor. [few] Naraz možno nahrávať len { $count } súbory. *[other] Naraz možno nahrávať len { $count } súborov. } # count will always be > 10 tooManyArchives = { $count -> [one] Povolený je najviac 1 archív. [few] Povolené sú najviac { $count } archívy. *[other] Povolených je najviac { $count } archívov. } expiredTitle = Platnosť odkazu vypršala. notSupportedDescription = { -send-brand } nebude v tomto prehliadači fungovať. { -send-short-brand } najlepšie funguje v najnovšej verzii { -firefox(case: "gen") } alebo aktuálnych verziách najpoužívanejších prehliadačov. downloadFirefox = Prevziať { -firefox } legalTitle = Zásady ochrany súkromia služby { -send-short-brand } legalDateStamp = Verzia 1.0, z 12. marca 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min addFilesButton = Vyberte súbory pre nahratie trustWarningMessage = Uistite sa, že pri zdieľaní citlivých údajov dôverujete adresátovi. uploadButton = Nahrať # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Pretiahnutím súboru alebo kliknutím sem # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = môžete poslať až { $size } addPassword = Chrániť heslom emailPlaceholder = Zadajte e-mailovú adresu # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Pre odoslanie súborov s veľkosťou až { $size }, sa, prosím, prihláste signInOnlyButton = Prihlásiť sa accountBenefitTitle = Vytvorte si účet { -firefox } alebo sa prihláste # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Zdieľanie súborov s veľkosťou až { $size } accountBenefitDownloadCount = Zdieľanie súborov s viacerými ľuďmi accountBenefitTimeLimit = { $count -> [one] Odkazy platné až 1 deň [few] Odkazy platné až { $count } dni *[other] Odkazy platné až { $count } dní } accountBenefitSync = Správa zdieľaných súborov z akéhokoľvek zariadenia accountBenefitMoz = Ďalšie informácie o ďalších službách od { -mozilla(case: "gen") } signOut = Odhlásiť sa okButton = OK downloadingTitle = Preberá sa noStreamsWarning = Tento prehliadač nemusí byť schopný dešifrovať takto veľký súbor. noStreamsOptionCopy = Skopírovať odkaz pre otvorenie v inom prehliadači noStreamsOptionFirefox = Vyskúšajte náš obľúbený prehliadač noStreamsOptionDownload = Pokračovať v tomto prehliadači downloadFirefoxPromo = { -send-short-brand } vám prináša najnovší { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Zdieľajte odkaz na súbor: shareLinkButton = Zdieľať odkaz # $name is the name of the file shareMessage = Prevezmite si súbor „{ $name }“ so službou { -send-brand } - jednoduché a bezpečné zdieľanie súborov trailheadPromo = Existuje spôsob, ako chrániť vaše súkromie. Prihláste sa do Firefoxu. learnMore = Ďalšie informácie. downloadFlagged = Tento odkaz bol pre porušenie podmienok používania služby deaktivovaný. downloadConfirmTitle = Ešte jedna vec downloadConfirmDescription = Uistite sa, že naozaj dôverujete odosielateľovi tohto súboru, pretože nemôžeme overiť jeho bezpečnosť. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Dôverujem odosielateľovi tohto súboru [few] Dôverujem odosielateľovi týchto súborov *[other] Dôverujem odosielateľovi týchto súborov } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Nahlásiť tento súbor ako podozrivý [few] Nahlásiť tieto súbory ako podozrivé *[other] Nahlásiť tieto súbory ako podozrivé } reportDescription = Pomôžte nám pochopiť, čo sa deje. Čo si myslíte, že s týmito súbormi nie je v poriadku? reportUnknownDescription = Otvorte odkaz, ktorý chcete nahlásiť, a kliknite na „{ reportFile }“. reportButton = Nahlásiť reportReasonMalware = Tieto súbory obsahujú malvér alebo sú súčasťou pshishingového útoku. reportReasonPii = Tieto súbory obsahujú moje osobné údaje. reportReasonAbuse = Tieto súbory obsahujú nelegálny alebo urážlivý obsah. reportReasonCopyright = Ak chcete nahlásiť porušenie autorských práv alebo zneužitie ochranných známok, použite postup popísaný na tejto stránke. reportedTitle = Súbory boli nahlásené reportedDescription = Ďakujeme vám za nahlásenie týchto súborov. ================================================ FILE: public/locales/sl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Uvažanje … encryptingFile = Šifriranje ... decryptingFile = Dešifriranje ... downloadCount = { $num -> [one] 1 prenosu [two] { $num } prenosih [few] { $num } prenosih *[other] { $num } prenosih } timespanHours = { $num -> [one] 1 uro [two] { $num } uri [few] { $num } ure *[other] { $num } ur } copiedUrl = Kopirano! unlockInputPlaceholder = Geslo unlockButtonLabel = Odkleni downloadButtonLabel = Prenesi downloadFinish = Prenos končan fileSizeProgress = ({ $partialSize } od { $totalSize }) sendYourFilesLink = Preskusite Send errorPageHeader = Prišlo je do težave! fileTooBig = Ta datoteka je prevelika za nalaganje. Največja možna velikost je { $size }. linkExpiredAlt = Povezava je potekla notSupportedHeader = Vaš brskalnik ni podprt. notSupportedLink = Zakaj moj brskalnik ni podprt? notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Send. Svoj brskalnik boste morali posodobiti. updateFirefox = Posodobi Firefox deletePopupCancel = Prekliči deleteButtonHover = Izbriši footerLinkLegal = Pravno obvestilo footerLinkPrivacy = Zasebnost footerLinkCookies = Piškotki passwordTryAgain = Napačno geslo. Poskusite znova. javascriptRequired = Send zahteva JavaScript whyJavascript = Zakaj Send zahteva JavaScript? enableJavascript = Omogočite JavaScript in poskusite znova. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Največja dolžina gesla: { $length } # A short status message shown when there was an error setting the password passwordSetError = Gesla ni mogoče nastaviti ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = { $sklon -> *[imenovalnik] Firefox [rodilnik] Firefoxa [dajalnik] Firefoxu [tozilnik] Firefox [mestnik] Firefoxu [orodnik] Firefoxom } -mozilla = { $sklon -> *[imenovalnik] Mozilla [rodilnik] Mozille [dajalnik] Mozilli [tozilnik] Mozillo [mestnik] Mozilli [orodnik] Mozillo } introTitle = Preprosto, zasebno deljenje datotek introDescription = { -send-brand } vam omogoča v celoti šifrirano pošiljanje datotek s povezavo, ki samodejno poteče. Z njim lahko zasebno delite svoje datoteke in zagotovite, da ne bodo za vedno ostale na spletu. notifyUploadEncryptDone = Vaša datoteka je šifrirana in pripravljena za pošiljanje # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Poteče po { $downloadCount } ali čez { $timespan } timespanMinutes = { $num -> [one] 1 minuto [two] { $num } minuti [few] { $num } minute *[other] { $num } minut } timespanDays = { $num -> [one] 1 dan [two] { $num } dni [few] { $num } dni *[other] { $num } dni } timespanWeeks = { $num -> [one] 1 teden [two] { $num } tedna [few] { $num } tedne *[other] { $num } tednov } fileCount = { $num -> [one] 1 datoteka [two] { $num } datoteki [few] { $num } datoteke *[other] { $num } datotek } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Skupna velikost: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopirajte povezavo za deljenje datoteke: copyLinkButton = Kopiraj povezavo downloadTitle = Prenesi datoteke downloadDescription = Ta datoteka je bila v skupni rabi preko { -send-brand } s šifriranjem od konca do konca in povezavo, ki samodejno poteče. trySendDescription = Preizkusite { -send-brand } za preprosto in varno deljenje datotek. # count will always be > 10 tooManyFiles = { $count -> [one] Naložite lahko največ 1 datoteko naenkrat. [two] Naložite lahko največ { $count } datoteki naenkrat. [few] Naložite lahko največ { $count } datoteke naenkrat. *[other] Naložite lahko največ { $count } datotek naenkrat. } # count will always be > 10 tooManyArchives = { $count -> [one] Dovoljen je največ 1 arhiv. [two] Dovoljena sta največ { $count } arhiva. [few] Dovoljeni so največ { $count } arhivi. *[other] Dovoljenih je največ { $count } arhivov. } expiredTitle = Ta povezava je potekla. notSupportedDescription = { -send-brand } v tem brskalniku ne bo deloval. { -send-short-brand } najbolje deluje v najnovejši različici { -firefox(sklon: "rodilnik") }, deloval pa bo tudi v trenutni različici večine brskalnikov. downloadFirefox = Prenesite { -firefox } legalTitle = Obvestilo o zasebnosti za { -send-short-brand } legalDateStamp = Različica 1.0, v veljavi od 12. marca 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Izberite datoteke za nalaganje trustWarningMessage = Pri deljenju občutljivih podatkov bodite prepričani, da zaupate prejemniku. uploadButton = Naloži # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Povlecite in spustite datoteke # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ali kliknite za pošiljanje do { $size } addPassword = Zaščiti z geslom emailPlaceholder = Vnesite e-poštni naslov # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Prijavite se za pošiljanje do { $size } signInOnlyButton = Prijava accountBenefitTitle = Ustvarite { -firefox } Račun ali se prijavite # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Delite datoteke do velikosti { $size } accountBenefitDownloadCount = Delite datoteke z več osebami accountBenefitTimeLimit = { $count -> [one] Ohranite povezave dejavne do en dan [two] Ohranite povezave dejavne do { $count } dni [few] Ohranite povezave dejavne do { $count } dni *[other] Ohranite povezave dejavne do { $count } dni } accountBenefitSync = Upravljajte deljene datoteke s katerekoli naprave accountBenefitMoz = Več o drugih storitvah { -mozilla(sklon: "rodilnik") } signOut = Odjava okButton = V redu downloadingTitle = Prenašanje noStreamsWarning = Ta brskalnik morda ne bo zmogel dešifrirati tako velike datoteke. noStreamsOptionCopy = Kopirajte povezavo, da jo odprete v drugem brskalniku noStreamsOptionFirefox = Poskusite z našim najljubšim brskalnikom noStreamsOptionDownload = Nadaljujte s tem brskalnikom downloadFirefoxPromo = { -send-short-brand } vam omogoča čisto novi { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Delite povezavo do datoteke: shareLinkButton = Deli povezavo # $name is the name of the file shareMessage = Prenesite "{ $name }" s { -send-brand }om: enostavno in varno deljenje datotek trailheadPromo = Vašo zasebnost lahko zaščitite. Pridružite se Firefoxu. learnMore = Več o tem. downloadFlagged = Ta povezava je bila onemogočena, ker je kršila pogoje storitve. downloadConfirmTitle = Še to downloadConfirmDescription = Bodite prepričani, da zaupate osebi, ki vam je poslala to datoteko, ker ne moremo preveriti, da ne bo škodovala vaši napravi. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Zaupam pošiljatelju te datoteke [two] Zaupam pošiljatelju teh datotek [few] Zaupam pošiljatelju teh datotek *[other] Zaupam pošiljatelju teh datotek } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Prijavi sumljivo datoteko [two] Prijavi sumljivi datoteki [few] Prijavi sumljive datoteke *[other] Prijavi sumljive datoteke } reportDescription = Pomagajte nam razumeti, kaj se dogaja. Kaj mislite, da je s temi datotekami narobe? reportUnknownDescription = Obiščite naslov povezave, ki jo želite prijaviti, in kliknite »{ reportFile }«. reportButton = Prijavi reportReasonMalware = Te datoteke vsebujejo zlonamerno programsko opremo ali so del napada lažnega predstavljanja. reportReasonPii = Te datoteke vsebujejo osebne podatke o meni. reportReasonAbuse = Te datoteke vsebujejo nezakonito ali nasilno vsebino. reportReasonCopyright = Za prijavo kršitve avtorskih pravic ali blagovne znamke sledite postopku, opisanem na tej strani. reportedTitle = Datoteke prijavljene reportedDescription = Hvala. Prejeli smo vašo prijavo teh datotek. ================================================ FILE: public/locales/sn/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Zvirikutaurwa importingFile = Kutora faira encryptingFile = Kuinikiriputa enableJavascript = Ndinokumbira mubvumidze JavaScript moedza zvekare # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }maawa { $minutes }mineti # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }mineti # A short status message shown when the user enters a long password maxPasswordLength = Pasiwedhi haipfuuri mavara:{ $length } # A short status message shown when there was an error setting the password passwordSetError = Pasiwedhi haina kuita ## Send version 2 strings ================================================ FILE: public/locales/sq/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Po importohet… encryptingFile = Po fshehtëzohet… decryptingFile = Po shfshehtëzohet… downloadCount = { $num -> [one] 1 shkarkimi *[other] { $num } shkarkimesh } timespanHours = { $num -> [one] 1 ore *[other] { $num } orësh } copiedUrl = U kopjua! unlockInputPlaceholder = Fjalëkalim unlockButtonLabel = Zhbllokoje downloadButtonLabel = Shkarkoje downloadFinish = Shkarkim i Plotësuar fileSizeProgress = ({ $partialSize } nga { $totalSize }) gjithsej sendYourFilesLink = Provoni Send errorPageHeader = Diç shkoi ters! fileTooBig = Kjo kartelë është shumë e madhe për ngarkim. Do të duhej të ishte më pak se { $size }. linkExpiredAlt = Lidhja skadoi notSupportedHeader = Shfletuesi juaj nuk mbulohet. notSupportedLink = Pse nuk mbulohet ky shfletues? notSupportedOutdatedDetail = Mjerisht, ky version i Firefox-it nuk e mbulon teknologjinë web mbi të cilën bazohet Send. Do t’ju duhet të përditësoni shfletuesin tuaj. updateFirefox = Përditësojeni Firefox-in deletePopupCancel = Anuloje deleteButtonHover = Fshije footerLinkLegal = Ligjore footerLinkPrivacy = Privatësi footerLinkCookies = Cookies passwordTryAgain = Fjalëkalim i pasaktë. Riprovoni. javascriptRequired = Send lyp JavaScript whyJavascript = Ç’i duhet Send-it JavaScript-i? enableJavascript = Ju lutemi, aktivizoni JavaScript-in dhe riprovoni. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Gjatësi maksimum fjalëkalimi: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ky fjalëkalim s’u caktua dot ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Ndarje e thjeshtë, private, kartelash me të tjerët introDescription = { -send-brand } ju lejon të ndani kartela me të tjerët, me fshehtëzim skaj-më-skaj dhe me një lidhje që skadon automatikisht. Kështu mund ta mbani private atë që ndani me të tjerë dhe të garantoni që gjërat tuaja s’do të qëndrojnë në linjë përgjithmonë. notifyUploadEncryptDone = Kartela juaj është fshehtëzuar dhe gati për dërgim # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Skadon pas { $downloadCount } ose { $timespan } timespanMinutes = { $num -> [one] 1 minutë *[other] { $num } minuta } timespanDays = { $num -> [one] 1 ditë *[other] { $num } ditë } timespanWeeks = { $num -> [one] 1 javë *[other] { $num } javë } fileCount = { $num -> [one] 1 kartelë *[other] { $num } kartela } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Madhësia gjithsej: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopjoni lidhjen për dhënien e kartelës tuaj: copyLinkButton = Kopjoje lidhjen downloadTitle = Shkarkoni kartela downloadDescription = Kjo kartelë u nda me të tjerët përmes { -send-brand }, me fshehtëzim skaj-më-skaj dhe një lidhje që skadon automatikisht. trySendDescription = Provoni { -send-brand }, për ndarje të thjeshtë, të parrezik, kartelash me të tjerët. # count will always be > 10 tooManyFiles = { $count -> [one] Mund të ngarkohet vetëm 1 kartelë në herë. *[other] Mund të ngarkohen vetëm { $count } kartela në herë. } # count will always be > 10 tooManyArchives = { $count -> [one] Lejohet vetëm 1 arkiv. *[other] Lejohen vetëm { $count } arkiva. } expiredTitle = Kjo lidhje ka skaduar. notSupportedDescription = { -send-brand } s’do të funksionojë me këtë shfletues. { -send-short-brand } funksionin më mirë me versionin më të ri të { -firefox }, dhe do të funksionojë me versionin e tanishëm të shumicës së shfletuesve. downloadFirefox = Shkarkoni { -firefox } legalTitle = Njoftim Privatësie Për { -send-short-brand } legalDateStamp = Version 1.0, daton 12 mars, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Përzgjidhni kartela për ngarkim trustWarningMessage = Sigurohuni se i besoni marrësit tuaj, kur ndani me të të dhëna rezervat. uploadButton = Ngarkoje # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Tërhiqni dhe lini kartela # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ose klikoni që të dërgohen deri në { $size } addPassword = Mbrojini me fjalëkalim emailPlaceholder = Jepni email-in tuaj # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Bëni hyrjen që të dërgoni deri më { $size } signInOnlyButton = Hyni accountBenefitTitle = Krijoni një Llogari { -firefox } ose bëni hyrjen në një të tillë # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Ndani me të tjerët kartela deri { $size } accountBenefitDownloadCount = Ndani kartela me më tepër persona accountBenefitTimeLimit = { $count -> [one] Mbaji aktive lidhjet për deri 1 ditë *[other] Mbaji aktive lidhjet për deri { $count } ditë } accountBenefitSync = Administroni nga çfarëdo pajisje kartela të përbashkëta accountBenefitMoz = Mësoni më tepër rreth shërbimesh { -mozilla } signOut = Dilni okButton = OK downloadingTitle = Shkarkim noStreamsWarning = Ky shfletues mund të mos jetë në gjendje të shfshehtëzojë një kartelë kaq të madhe. noStreamsOptionCopy = Kopjoje lidhjen për ta hapur në një tjetër shfletues noStreamsOptionFirefox = Provoni shfletuesin tonë të parapëlqyer noStreamsOptionDownload = Vazhdo me këtë shfletues downloadFirefoxPromo = { -send-short-brand } ju vjen nga { -firefox }-i i ri fringo. # the next line after the colon contains a file name shareLinkDescription = Ndani me të tjerët lidhjen për te kartela juaj: shareLinkButton = Ndani me të tjerët lidhjen # $name is the name of the file shareMessage = Shkarkojeni “{ $name }” me { -send-brand }: shkëmbim kartelash dhe thjesht dhe pa rrezik trailheadPromo = Ka një rrugë për të mbrojtur privatësinë tuaj. Bëhuni pjesë e Firefox-it. learnMore = Mësoni më tepër. downloadFlagged = Kjo lidhje është çaktivizuar, ngaqë cenon kushtet e shërbimit. downloadConfirmTitle = Edhe një gjë të fundit downloadConfirmDescription = Sigurohuni se i besoni personit që ju dërgoi këtë kartelë, ngaqë s’mund të verifikojmë se nuk do të vërë në rrezik pajisjen tuaj. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] I besoj personit që dërgoi këtë kartelë *[other] I besoj personit që dërgoi këto kartela } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Raportojeni këtë kartelë si të dyshimtë *[other] Raportojeni këto kartela si të dyshimta } reportDescription = Ndihmonani të kuptojmë ç’po ndodh. Çfarë mendoni se është gabim me këto kartela? reportUnknownDescription = Ju lutemi, shkoni te url-ja e lidhjes që doni të raportoni dhe klikoni mbi “{ reportFile }”. reportButton = Raportoje reportReasonMalware = Këto kartela përmbajnë malware ose janë pjesë e një sulmi karremëzimi. reportReasonPii = Këto kartela përmbajnë të dhëna personalisht të identifikueshme rreth meje. reportReasonAbuse = Këto kartela përmbajnë lëndë të paligjshme ose abuzive. reportReasonCopyright = Për të raportuar cenim të drejtash kopjimi ose shenjash tregtare, përdorni procesin e përshkruar në këtë faqe. reportedTitle = Kartela të Raportuara reportedDescription = Faleminderit. E kemimarrë raportin tuaj rreth këtyre kartelave. ================================================ FILE: public/locales/sr/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Увозим… encryptingFile = Шифрујем… decryptingFile = Дешифрујем… downloadCount = { $num -> [one] { $num } преузимања [few] { $num } преузимања *[other] { $num } преузимања } timespanHours = { $num -> [one] { $num } сата [few] { $num } сата *[other] { $num } сати } copiedUrl = Ископирано! unlockInputPlaceholder = Лозинка unlockButtonLabel = Откључај downloadButtonLabel = Преузми downloadFinish = Преузимање је завршено. fileSizeProgress = ({ $partialSize } од { $totalSize }) sendYourFilesLink = Испробајте Send errorPageHeader = Нешто је пошло наопако! fileTooBig = Та датотека је превелика за отпремање. Треба да буде мања од { $size }. linkExpiredAlt = Веза је истекла notSupportedHeader = Ваш прегледач није подржан. notSupportedLink = Зашто мој прегледач није подржан? notSupportedOutdatedDetail = Нажалост, ово издање Firefox-a не подржава веб технологију која омогућава Send. Мораћете да ажурирате ваш прегледач. updateFirefox = Ажурирај Firefox deletePopupCancel = Откажи deleteButtonHover = Обриши footerLinkLegal = Правни подаци footerLinkPrivacy = Приватност footerLinkCookies = Колачићи passwordTryAgain = Нетачна лозинка. Пробајте поново. javascriptRequired = За Send је потребан JavaScript whyJavascript = Зашто је потребан JavaScript за Send? enableJavascript = Омогућите JavaScript и пробајте поново. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ч { $minutes }м # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }м # A short status message shown when the user enters a long password maxPasswordLength = Највећа дужина лозинке: { $length } # A short status message shown when there was an error setting the password passwordSetError = Не можемо поставити ову лозинку ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Једноставно и приватно дељење датотека introDescription = { -send-brand } вам дозвољава да делите датотеке које су шифроване с краја на крај преко везе која самостално истиче. Тако да можете приватно делити ваше ствари које неће остати на вебу заувек. notifyUploadEncryptDone = Ваша датотека је шифрована и спремна за слање # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Истиче након { $downloadCount } или { $timespan } timespanMinutes = { $num -> [one] { $num } минут [few] { $num } минута *[other] { $num } минута } timespanDays = { $num -> [one] { $num } дан [few] { $num } дана *[other] { $num } дана } timespanWeeks = { $num -> [one] { $num } недеља [few] { $num } недеље *[other] { $num } недеља } fileCount = { $num -> [one] { $num } датотека [few] { $num } датотеке *[other] { $num } датотека } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Укупна величина: { $size } # the next line after the colon contains a file name copyLinkDescription = Копирајте везу да бисте поделили вашу датотеку: copyLinkButton = Копирај везу downloadTitle = Преузми датотеке downloadDescription = Ова датотека је подељена преко услуге { -send-brand } која омогућава шифровање с краја на крај преко везе која самостално истиче. trySendDescription = Пробајте { -send-brand } за једноставно и безбедно дељење датотека. # count will always be > 10 tooManyFiles = { $count -> [one] Можете отпремити само { $count } датотеку истовремено. [few] Можете отпремити само { $count } датотеке истовремено. *[other] Можете отпремити само { $count } датотека истовремено. } # count will always be > 10 tooManyArchives = { $count -> [one] Дозвољена је само { $count } архива. [few] Дозвољене су само { $count } архиве. *[other] Дозвољено је само { $count } архива. } expiredTitle = Ова веза је истекла. notSupportedDescription = { -send-brand } неће радити у овом прегледачу. { -send-short-brand } најбоље ради са последњим издањем прегледача { -firefox } и радиће са тренутним издањима већине других прегледача. downloadFirefox = Преузми { -firefox } legalTitle = Политика приватности услуге { -send-short-brand } legalDateStamp = Издање 1.0, датум објављивања 12. март 2019. године # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }д { $hours }ч { $minutes }м addFilesButton = Изаберите датотеке за отпремање trustWarningMessage = Будите сигурни да верујете примаоцу пре дељења осетљивих података. uploadButton = Отпреми # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Превуците и пустите датотеке # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = или кликните за слање садржаја великог до { $size } addPassword = Заштитите лозинком emailPlaceholder = Унесите вашу е-адресу # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Пријавите се да пошаљете садржај до { $size } signInOnlyButton = Пријавите се accountBenefitTitle = Направите { -firefox } налог или се пријавите # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Поделите датотеке велике до { $size } accountBenefitDownloadCount = Поделите датотеке са више особа accountBenefitTimeLimit = { $count -> [one] Остави везе активним највише { $count } дан [few] Остави везе активним највише { $count } дана *[other] Остави везе активним највише { $count } дана } accountBenefitSync = Управљајте подељеним датотекама са било ког уређаја accountBenefitMoz = Сазнајте више о другим { -mozilla }-иним услугама signOut = Одјава okButton = У реду downloadingTitle = Преузимам noStreamsWarning = Овај прегледач можда неће моћи да дешифрује оволико велику датотеку. noStreamsOptionCopy = Копирај везу за отварање у другом прегледачу noStreamsOptionFirefox = Пробајте наш омиљени прегледач noStreamsOptionDownload = Наставите у овом прегледачу downloadFirefoxPromo = { -send-short-brand } вам је омогућен захваљући потпуно новом програму { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Поделите везу до датотеке: shareLinkButton = Поделите везу # $name is the name of the file shareMessage = Преузмите „{ $name }“ помоћу програма { -send-brand }: једноставно и безбедно дељење датотека trailheadPromo = Постоји начин да заштитите вашу приватност. Придружите се Firefox-у. learnMore = Сазнајте више. downloadFlagged = Ова веза је онемогућена због кршења услова услуге. downloadConfirmTitle = Још једна ствар downloadConfirmDescription = Будите сигурни да верујете особи која вам је послала ову датотеку, јер не можемо обећати да неће оштетити ваш уређа. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Верујем особи која је послала ову датотеку [few] Верујем особи која је послала ове датотеке *[other] Верујем особама које су послале ове датотеке } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Пријави ову датотеку као сумњиву [few] Пријави ове датотеке као сумњиве *[other] Пријави ове датотеке као сумњиве } reportDescription = Помозите нам да схватимо шта се дешава. Шта мислите да није у реду са овим датотекама? reportUnknownDescription = Идите на адресу везе коју желите да пријавите и изаберите “{ reportFile }”. reportButton = Пријави reportReasonMalware = Ове датотеке садрже злонамеран софтвер или су део напада за крађу идентитета. reportReasonPii = Ове датотеке садрже моје личне податке. reportReasonAbuse = Ове датотеке садрже илегални или насилни садржај. reportReasonCopyright = Да бисте пријавили кршење ауторских права или заштитног знака, следите кораке на овој страници. reportedTitle = Датотеке су пријављене reportedDescription = Хвала вам. Примили смо вашу пријаву ових датотека. ================================================ FILE: public/locales/su/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Ngimpor... encryptingFile = Ngénkripsi... decryptingFile = Ngadékripsi... downloadCount = { $num -> *[other] { $num } undeuran } timespanHours = { $num -> *[other] { $num } jam } copiedUrl = Ditiron! unlockInputPlaceholder = Kecap sandi unlockButtonLabel = Laan konci downloadButtonLabel = Undeur downloadFinish = Undeuran anggeus fileSizeProgress = ({ $partialSize } ti { $totalSize }) sendYourFilesLink = Pecakan Send errorPageHeader = Aya nu salah! fileTooBig = Koropak unjalkeuneun badag teuing. Kudu kurang ti { $size }. linkExpiredAlt = Tutumbu kadaluwarsa notSupportedHeader = Panyungsi anjeun teu dirojong notSupportedLink = Naha panyungsi kuring teu dirojong? notSupportedOutdatedDetail = Hanjakal Firefox vérsi ieu teu ngarojong téhnologi wéb nu ngagerakkeun Send. Anjeun perlu ngapdét panyungsi anjeun. updateFirefox = Apdét Firefox deletePopupCancel = Bolay deleteButtonHover = Pupus footerLinkLegal = Légal footerLinkPrivacy = Privasi footerLinkCookies = Réréméh passwordTryAgain = Kecap sandi salah. Pecakan deui. javascriptRequired = Send merlukeun JavaScript whyJavascript = Naha Send merlukeun JavaScript? enableJavascript = Prak hurungkeun JavaScript sarta pecakan deui. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }j { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Panjang sandi maksimal: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ieu kecap sandi teu bisa disét ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Simpel, babagi koropak privat introDescription = { -send-brand } migampang anjeun babagi koropak kalawan énkripsi tungtung-ka-tungtung sarta tutumbu nu otomatis kadaluwarsa. Sahingga anjeun bisa ngaraksa naon nu ku anjeun bagi sacara privat jeung mastikeun banda anjeun teu salawasna daring. notifyUploadEncryptDone = Koropak anjeun kaénkripsi sarta siap dikirim. # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Kadaluwarsa sanggeu { $downloadCount } atawa { $timespan } timespanMinutes = { $num -> [one] samenit *[other] { $num } menit } timespanDays = { $num -> [one] sapoé *[other] { $num } poé } timespanWeeks = { $num -> [one] saminggu *[other] { $num } minggu } fileCount = { $num -> [one] sakoropak *[other] { $num } koropak } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Ukuran total: { $size } # the next line after the colon contains a file name copyLinkDescription = Tiron tutumbu pikeun babagi koropak anjeun: copyLinkButton = Tiron tutumbu downloadTitle = Undeur koropak downloadDescription = Ieu koropak geus dibagikeun liwat { -send-brand } kalawan énkripsi tungtung-ka-tungtung sarta tutumbuna otomatis kadaluwarsa. trySendDescription = Pecakan { -send-brand } pikeun simpelna, babagi koropak aman. # count will always be > 10 tooManyFiles = { $count -> [one] Ayeuna kur sakoropak nu bisa diunjal. *[other] Ngan { $count } koropak nu bisa diunjal sakaligus. } # count will always be > 10 tooManyArchives = { $count -> [one] Ngan saarsip nu diidinan. *[other] Ngan { $count } arsip nu diidinan. } expiredTitle = Ieu tutumbu geus kadaluwarsa. notSupportedDescription = { -send-brand } moal jalan di ieu panyungsi. { -send-short-brand } jalan naker dina { -firefox } vérsi pamganyarna, sarta bakal jalan di loba panyungsi vérsi kiwari. downloadFirefox = Undeur { -firefox } legalTitle = { -send-short-brand } Wawar Privasi legalDateStamp = Versi 1.0, kaping 12 Maret 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }p { $hours }j { $minutes }m addFilesButton = Pilih koropak unjalkeuneun trustWarningMessage = Sing yakin yén anjeun percaya nalika ngabagi data sénsitip ka nu nampa. uploadButton = Unjal # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Ésérkeun sarta ésotkeun koropak # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = atawa klik pikeun ngirim nika { $size } addPassword = Piningan ku kecap sandi emailPlaceholder = Asupkeun surélék anjeun # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Asup sangkan bisa ngirim nika { $size } signInOnlyButton = Asup accountBenefitTitle = Jieun akun { -firefox } atawa asup # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Bagikeun koropak nika { $size } accountBenefitDownloadCount = Bagikeun koropak ka balaréa accountBenefitTimeLimit = { $count -> [one] Aktipkeun tutumbu jang sapoéeun *[other] Aktipkeun tutumbu jang { $count } poé } accountBenefitSync = Kokolakeun koropak nu dibagikeun ti parangkat mana wé accountBenefitMoz = Tengetan ngeunaan layanan { -mozilla } lianna signOut = Kaluar okButton = OKÉH downloadingTitle = Ngundeur noStreamsWarning = Ieu panyungsi kawasna mah teu bisa ngadékrip koropak badag kieu. noStreamsOptionCopy = Tiron tutumbu jang bukaeun di panyungsi séjén noStreamsOptionFirefox = Pecakan panyungsi karesep kami noStreamsOptionDownload = Tuluykeun ku ieu panyungsi downloadFirefoxPromo = { -send-short-brand } téh disanggakeun keur anjeun kalawan { -firefox } sarwa anyar. # the next line after the colon contains a file name shareLinkDescription = Bagikeun tutumbu ka koropak anjeun: shareLinkButton = Bagikeun tutumbu # $name is the name of the file shareMessage = Undeur "{ $name }" ku { -send-brand }: simpel, babagi koropak aman trailheadPromo = Aya cara pikeun ngamankeun privasi anjeun. Jabung jeung Firefox. learnMore = Lenyepan. downloadFlagged = Ieu tutumbu ditumpurkeun alatan ngarumpak katangtuan layanan. downloadConfirmTitle = Hiji deui downloadConfirmDescription = Sing yakin yén anjeun percaya ka jalma nu ngirim ieu berkas kusabab kami teu bisa mariksa kaamanan ieu berkas. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] Kami percaya ka jalma nu ngirim ieu berkas } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] Laporkeun ieu berkas salaku picurigaeun } reportDescription = Béjakeun ka kami masalahna. Naon anu sakirana salah dina ieu berkas? reportUnknownDescription = Mangga buka url tutumbu anu rék dilaporkeun sarta klik “{ reportFile }”. reportButton = Laporkeun reportReasonMalware = Ieu berkas ngandung malwér atawa bagian ti tarajang pising. reportReasonPii = Ieu berkas ngandung émbaran pribadi kami. reportReasonAbuse = Ieu berkas ngandung kontén ilégal atawa panyalahgunaan. reportReasonCopyright = Pikeun ngalaporkeun rumpakan hak cipta atawa mérk dagang, paké prosés anu diécéskeun di dieu. reportedTitle = Berkas Dilaporkeun reportedDescription = Nuhun. Laporan anjeun ngeunaan ieu berkas geus katampa. ================================================ FILE: public/locales/sv-SE/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Importerar… encryptingFile = Krypterar… decryptingFile = Avkodar… downloadCount = { $num -> [one] 1 nedladdning *[other] { $num } nedladdningar } timespanHours = { $num -> [one] 1 timme *[other] { $num } timmar } copiedUrl = Kopierad! unlockInputPlaceholder = Lösenord unlockButtonLabel = Lås upp downloadButtonLabel = Ladda ner downloadFinish = Nedladdning klar fileSizeProgress = ({ $partialSize } av { $totalSize }) sendYourFilesLink = Testa Send errorPageHeader = Något gick fel! fileTooBig = Den filen är för stor för att ladda upp. Det ska vara mindre än { $size }. linkExpiredAlt = Länk upphörd notSupportedHeader = Din webbläsare stöds inte. notSupportedLink = Varför stöds inte min webbläsare? notSupportedOutdatedDetail = Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Send. Du måste uppdatera din webbläsare. updateFirefox = Uppdatera Firefox deletePopupCancel = Avbryt deleteButtonHover = Ta bort footerLinkLegal = Juridisk information footerLinkPrivacy = Sekretess footerLinkCookies = Kakor passwordTryAgain = Felaktigt lösenord. Försök igen. javascriptRequired = Send kräver JavaScript whyJavascript = Varför kräver Send JavaScript? enableJavascript = Aktivera JavaScript och försök igen. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Maximal lösenordslängd: { $length } # A short status message shown when there was an error setting the password passwordSetError = Det här lösenordet kunde inte ställas in ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Enkel, privat fildelning introDescription = { -send-brand } låter dig dela filer med end-to-end-kryptering och en länk som automatiskt upphör. Så att du kan behålla det du delar privat och se till att dina saker inte stannar online för alltid. notifyUploadEncryptDone = Din fil är krypterad och redo att skickas # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Förfaller efter { $downloadCount } eller { $timespan } timespanMinutes = { $num -> [one] 1 minut *[other] { $num } minuter } timespanDays = { $num -> [one] 1 dag *[other] { $num } dagar } timespanWeeks = { $num -> [one] 1 vecka *[other] { $num } veckor } fileCount = { $num -> [one] 1 fil *[other] { $num } filer } # byte abbreviation bytes = B # kibibyte abbreviation kb = kB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Total storlek: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopiera länken för att dela din fil: copyLinkButton = Kopiera länk downloadTitle = Ladda ner filer downloadDescription = Den här filen delades via { -send-brand } med end-to-end-kryptering och en länk som automatiskt upphör. trySendDescription = Prova { -send-brand } för enkel, säker fildelning. # count will always be > 10 tooManyFiles = { $count -> [one] Endast 1 fil kan laddas upp i taget. *[other] Endast { $count } filer kan laddas upp i taget. } # count will always be > 10 tooManyArchives = { $count -> [one] Endast 1 arkiv är tillåten. *[other] Endast { $count } arkiv är tillåtna. } expiredTitle = Den här länken har upphört. notSupportedDescription = { -send-brand } fungerar inte med den här webbläsaren. { -send-short-brand } fungerar bäst med den senaste versionen av { -firefox } och kommer att fungera med den nuvarande versionen av de flesta webbläsare. downloadFirefox = Hämta { -firefox } legalTitle = { -send-short-brand } sekretesspolicy legalDateStamp = Version 1.0, daterad den 12 mars 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m addFilesButton = Välj filer som ska laddas upp trustWarningMessage = Se till att du litar på din mottagare när du delar känslig information. uploadButton = Ladda upp # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Dra och släpp filer # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = eller klicka för att skicka upp till { $size } addPassword = Skydda med lösenord emailPlaceholder = Ange din e-postadress # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Logga in för att skicka upp till { $size } signInOnlyButton = Logga in accountBenefitTitle = Skapa ett { -firefox }-konto eller logga in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Dela filer upp till { $size } accountBenefitDownloadCount = Dela filer med fler personer accountBenefitTimeLimit = { $count -> [one] Håll länk aktiv i upp till 1 dag *[other] Håll länkar aktiva i upp till { $count } dagar } accountBenefitSync = Hantera delade filer från vilken enhet som helst accountBenefitMoz = Läs om andra { -mozilla }-tjänster signOut = Logga ut okButton = OK downloadingTitle = Laddar ner noStreamsWarning = Den här webbläsaren kanske inte kan dekryptera en så stor fil. noStreamsOptionCopy = Kopiera länken för att öppna i en annan webbläsare noStreamsOptionFirefox = Prova vår favoritwebbläsare noStreamsOptionDownload = Fortsätt med den här webbläsaren downloadFirefoxPromo = { -send-short-brand } presenteras för dig av den helt nya { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Dela länken till din fil: shareLinkButton = Dela länk # $name is the name of the file shareMessage = Ladda ner "{ $name }" med { -send-brand }: enkel, säker fildelning trailheadPromo = Det finns ett sätt att skydda din integritet. Gå med i Firefox. learnMore = Läs mer. downloadFlagged = Den här länken har inaktiverats pga brott mot användarvillkoren. downloadConfirmTitle = En sak till downloadConfirmDescription = Se till att du litar på personen som skickade dig den här filen eftersom vi inte kan verifiera att den inte skadar din enhet. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Jag litar på personen som skickade denna filen *[other] Jag litar på personen som skickade dessa filer } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Rapportera denna filen som misstänkt *[other] Rapportera dessa filer som misstänkta } reportDescription = Hjälp oss att förstå vad som händer. Vad tycker du är fel med dessa filer? reportUnknownDescription = Gå till den url till länken du vill rapportera och klicka på "{ reportFile }". reportButton = Rapportera reportReasonMalware = Dessa filer innehåller skadlig kod eller är en del av en nätfiskeattack. reportReasonPii = Dessa filer innehåller personlig identifierbar information om mig. reportReasonAbuse = Dessa filer innehåller olagligt eller våldsamt innehåll. reportReasonCopyright = För att rapportera intrång i upphovsrätt eller varumärke, använd processen som beskrivs på den här sidan. reportedTitle = Rapporterade filer reportedDescription = Tack. Vi har fått din rapport om dessa filer. ================================================ FILE: public/locales/te/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = దిగుమతవుతోంది... encryptingFile = గుప్తీకరిస్తోంది... decryptingFile = వ్యక్తపరుస్తోంది... downloadCount = { $num -> [one] 1 దింపుకోలు *[other] { $num } దింపుకోళ్ళు } timespanHours = { $num -> [one] 1 గంట *[other] { $num } గంటలు } copiedUrl = నకలు చేయబడింది! unlockInputPlaceholder = సంకేతపదం unlockButtonLabel = తాళం తీయి downloadButtonLabel = దిగుమతి downloadFinish = దిగుమతి పూర్తయింది fileSizeProgress = { $totalSize }) యొక్క ({ $partialSize } sendYourFilesLink = Firefox sendను ప్రయత్నించండి errorPageHeader = ఏదో తప్పిదం జరిగింది! fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి. linkExpiredAlt = లంకె గడువు ముగిసింది notSupportedHeader = మీ విహారిణికి మద్దతు లేదు. notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు? notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి. updateFirefox = Firefoxను నవీకరించు deletePopupCancel = రద్దుచేయి deleteButtonHover = తొలగించు footerLinkLegal = చట్టపరమైన footerLinkPrivacy = గోప్యత footerLinkCookies = కుకీలు passwordTryAgain = సరికాని సంకేతపదం. మళ్ళీ ప్రయత్నించండి. javascriptRequired = Sendకి జావాస్క్రిప్టు కావాలి whyJavascript = Sendకి జావాస్క్రిప్టు ఎందుకు కావాలి? enableJavascript = జావాస్క్రిప్టు చేతనంచేసి మళ్ళీ ప్రయత్నించండి. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }గం { $minutes }ని # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ని # A short status message shown when the user enters a long password maxPasswordLength = సంకేతపదం గరిష్ఠ పొడవు: { $length } # A short status message shown when there was an error setting the password passwordSetError = ఈ సంకేతపదం పెట్టలేకపోయాం ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = పంపించు -firefox = Firefox -mozilla = Mozilla notifyUploadEncryptDone = మీ ఫైలు గుప్తీకరించబడింది, పంపడానికి సిద్ధంగా ఉంది # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } లేదా { $timespan } తర్వాత కాలంచెల్లుతుంది timespanMinutes = { $num -> [one] 1 నిమిషం *[other] { $num } నిమిషాలు } timespanDays = { $num -> [one] 1 రోజు *[other] { $num } రోజులు } timespanWeeks = { $num -> [one] 1 వారం *[other] { $num } వారాలు } fileCount = { $num -> [one] 1 ఫైలు *[other] { $num } ఫైళ్లు } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = మొత్తం పరిమాణం: { $size } # the next line after the colon contains a file name copyLinkDescription = మీ ఫైలును భాగస్వామ్యం చేయడానికి ఈ లంకెను నకలు చేయండి: copyLinkButton = లంకెను నకలుతీయి downloadTitle = ఫైళ్లను దింపుకోండి expiredTitle = ఈ లంకె గడువు ముగిసింది. downloadFirefox = { -firefox } ను దింపుకోండి legalTitle = { -send-short-brand } గోప్యతా నోటీసు legalDateStamp = వెర్షన్ 1.0, మార్చి 12, 2019 నాటిది # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = ఎక్కించడానికి ఫైళ్ళను ఎంచుకోండి uploadButton = ఎక్కించు # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ఫైళ్ళను లాగండి మరియు వదలండి # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = లేదా { $size } వరకు పంపడానికి నొక్కండి addPassword = సంకేతపదంతో రక్షించండి emailPlaceholder = ఈ ఈమెయిలును ఇవ్వండి # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = { $size } వరకు పంపడానికి ప్రవేశించండి signInOnlyButton = ప్రవేశించండి accountBenefitTitle = ఒక { -firefox } ఖాతాని సృష్టించండి లేదా ప్రవేశించండి # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = { $size } పరిమాణం ఫైళ్ళ వరకు పంచుకోండి accountBenefitDownloadCount = ఫైళ్లను ఎక్కువ మందితో పంచుకోండి accountBenefitTimeLimit = { $count -> *[other] లంకెలను { $count } రోజుల వరకు చేతనంగా ఉంచు } accountBenefitSync = ఏదైనా పరికరం నుండి పంచుకున్న ఫైళ్ళను నిర్వహించండి accountBenefitMoz = ఇతర { -mozilla } సేవల గురించి తెలుసుకోండి signOut = నిష్క్రమించు okButton = సరే downloadingTitle = దింపుకుంటోంది noStreamsWarning = ఈ బ్రౌజర్ ఈ ఫైలును పెద్దగా డీక్రిప్ట్ చేయలేకపోవచ్చు. noStreamsOptionCopy = మరొక బ్రౌజర్‌లో తెరవడానికి లంకెను నకలు చేయండి noStreamsOptionFirefox = మా అభిమాన బ్రౌజర్‌ను ప్రయత్నించండి noStreamsOptionDownload = ఈ బ్రౌజర్‌తో కొనసాగించండి downloadFirefoxPromo = { -send-short-brand } క్రొత్త { -firefox } ద్వారా మీ ముందుకు తీసుకురాబడుతుంది. # the next line after the colon contains a file name shareLinkDescription = మీ ఫైలుకు లంకెను పంచుకోండి: shareLinkButton = లంకెను పంచుకోండి # $name is the name of the file shareMessage = “{ $name }”‌ని { -send-brand }తో దించుకోండి: తేలికైన, సురక్షితమైన ఫైలు పంచుకోలు సేవ trailheadPromo = మీ అంతరంగికతను కాపాడుకోడానికి ఓ మార్గం ఉంది. Firefoxతో చేరండి. learnMore = ఇంకా తెలుసుకోండి. ================================================ FILE: public/locales/th/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = กำลังนำเข้า… encryptingFile = กำลังเข้ารหัส… decryptingFile = กำลังถอดรหัส… downloadCount = { $num -> *[other] { $num } การดาวน์โหลด } timespanHours = { $num -> *[other] { $num } ชั่วโมง } copiedUrl = คัดลอกแล้ว! unlockInputPlaceholder = รหัสผ่าน unlockButtonLabel = ปลดล็อก downloadButtonLabel = ดาวน์โหลด downloadFinish = การดาวน์โหลดเสร็จสมบูรณ์ fileSizeProgress = ({ $partialSize } จาก { $totalSize }) sendYourFilesLink = ลองใช้ Send errorPageHeader = มีบางอย่างผิดพลาด! fileTooBig = ไฟล์นั้นใหญ่เกินกว่าจะอัปโหลดได้ ไฟล์ที่จะอัปโหลดควรมีขนาดน้อยกว่า { $size } linkExpiredAlt = ลิงก์หมดอายุแล้ว notSupportedHeader = ไม่รองรับเบราว์เซอร์ของคุณ notSupportedLink = ทำไมจึงไม่รองรับเบราว์เซอร์ของฉัน? notSupportedOutdatedDetail = น่าเสียดายที่ Firefox รุ่นนี้ไม่สนับสนุนเทคโนโลยีเว็บที่ขับเคลื่อน Send คุณจะต้องอัปเดตเบราว์เซอร์ของคุณ updateFirefox = อัปเดต Firefox deletePopupCancel = ยกเลิก deleteButtonHover = ลบ footerLinkLegal = ข้อกฎหมาย footerLinkPrivacy = ความเป็นส่วนตัว footerLinkCookies = คุกกี้ passwordTryAgain = รหัสผ่านไม่ถูกต้อง ลองอีกครั้ง javascriptRequired = Send จำเป็นต้องใช้ JavaScript whyJavascript = ทำไม Send จึงจำเป็นต้องใช้ JavaScript? enableJavascript = โปรดเปิดใช้งาน JavaScript แล้วลองอีกครั้ง # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } ชม. { $minutes } นาที # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } นาที # A short status message shown when the user enters a long password maxPasswordLength = ความยาวรหัสผ่านสูงสุด: { $length } # A short status message shown when there was an error setting the password passwordSetError = ไม่สามารถตั้งรหัสผ่านนี้ได้ ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว introDescription = { -send-brand } ให้คุณแบ่งปันไฟล์ด้วยการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ คุณจึงสามารถเก็บสิ่งที่คุณแบ่งปันไว้เป็นส่วนตัวและตรวจสอบให้แน่ใจว่าข้อมูลของคุณจะไม่ออนไลน์ตลอดไป notifyUploadEncryptDone = ไฟล์ของคุณได้รับการเข้ารหัสและพร้อมส่ง # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = หมดอายุหลังจาก { $downloadCount } หรือ { $timespan } timespanMinutes = { $num -> *[other] { $num } นาที } timespanDays = { $num -> *[other] { $num } วัน } timespanWeeks = { $num -> *[other] { $num } สัปดาห์ } fileCount = { $num -> *[other] { $num } ไฟล์ } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = ขนาดรวม: { $size } # the next line after the colon contains a file name copyLinkDescription = คัดลอกลิงก์เพื่อแบ่งปันไฟล์ของคุณ: copyLinkButton = คัดลอกลิงก์ downloadTitle = ดาวน์โหลดไฟล์ downloadDescription = ไฟล์นี้ถูกแบ่งปันผ่าน { -send-brand } พร้อมการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ trySendDescription = ลองใช้ { -send-brand } สำหรับการแบ่งปันไฟล์ที่ง่ายและปลอดภัย # count will always be > 10 tooManyFiles = { $count -> *[other] สามารถอัปโหลดได้ครั้งละ { $count } ไฟล์เท่านั้น } # count will always be > 10 tooManyArchives = { $count -> *[other] สามารถอัปโหลดไฟล์เก็บถาวรได้เพียง { $count } ไฟล์เท่านั้น } expiredTitle = ลิงก์นี้หมดอายุแล้ว notSupportedDescription = { -send-brand } จะไม่ทำงานกับเบราว์เซอร์นี้ { -send-short-brand } จะทำงานได้ดีที่สุดกับ { -firefox } รุ่นล่าสุด และจะทำงานกับเบราว์เซอร์ส่วนใหญ่ที่เป็นรุ่นปัจจุบัน downloadFirefox = ดาวน์โหลด { -firefox } legalTitle = ประกาศความเป็นส่วนตัวของ { -send-short-brand } legalDateStamp = รุ่น 1.0 วันที่ 12 มีนาคม 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } วัน { $hours } ชม. { $minutes } นาที addFilesButton = เลือกไฟล์ที่จะอัปโหลด trustWarningMessage = ตรวจสอบให้แน่ใจว่าคุณเชื่อใจผู้รับของคุณขณะที่คุณแบ่งปันข้อมูลที่ละเอียดอ่อน uploadButton = อัปโหลด # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ลากแล้วปล่อยไฟล์ # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = หรือคลิกเพื่อส่งได้ถึง { $size } addPassword = ปกป้องด้วยรหัสผ่าน emailPlaceholder = ป้อนอีเมลของคุณ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = ลงชื่อเข้าเพื่อส่งได้ถึง { $size } signInOnlyButton = ลงชื่อเข้า accountBenefitTitle = สร้างบัญชี { -firefox } หรือลงชื่อเข้า # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = แบ่งปันไฟล์สูงสุดถึง { $size } accountBenefitDownloadCount = แบ่งปันไฟล์กับผู้คนมากขึ้น accountBenefitTimeLimit = { $count -> *[other] ให้ลิงก์ใช้งานได้นานถึง { $count } วัน } accountBenefitSync = จัดการไฟล์ที่แบ่งปันจากอุปกรณ์ใด ๆ accountBenefitMoz = เรียนรู้เกี่ยวกับบริการ { -mozilla } อื่น ๆ signOut = ลงชื่อออก okButton = ตกลง downloadingTitle = กำลังดาวน์โหลด noStreamsWarning = เบราว์เซอร์นี้อาจไม่สามารถถอดรหัสไฟล์ขนาดใหญ่เท่านี้ได้ noStreamsOptionCopy = คัดลอกลิงก์เพื่อเปิดในเบราว์เซอร์อื่น noStreamsOptionFirefox = ลองเบราว์เซอร์โปรดของเรา noStreamsOptionDownload = ดำเนินการต่อด้วยเบราว์เซอร์นี้ downloadFirefoxPromo = { -send-short-brand } สนับสนุนโดย { -firefox } โฉมใหม่ # the next line after the colon contains a file name shareLinkDescription = แบ่งปันลิงก์ไปยังไฟล์ของคุณ: shareLinkButton = แบ่งปันลิงก์ # $name is the name of the file shareMessage = ดาวน์โหลด “{ $name }” ด้วย { -send-brand }: การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว trailheadPromo = มีวิธีปกป้องความเป็นส่วนตัวของคุณ เข้าร่วม Firefox learnMore = เรียนรู้เพิ่มเติม downloadFlagged = ลิงก์นี้ถูกปิดการใช้งานเนื่องจากละเมิดข้อกำหนดในการให้บริการ downloadConfirmTitle = อีกหนึ่งอย่าง downloadConfirmDescription = ตรวจสอบให้แน่ใจว่าคุณเชื่อถือคนที่ส่งไฟล์นี้ให้คุณ เพราะเราไม่สามารถยืนยันได้ว่าไฟล์นี้จะไม่เป็นอันตรายต่ออุปกรณ์ของคุณ # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] ฉันเชื่อใจคนที่ส่งไฟล์เหล่านี้ } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] รายงานไฟล์เหล่านี้ว่าน่าสงสัย } reportDescription = ช่วยให้เราเข้าใจสิ่งที่เกิดขึ้น คุณคิดอย่างไรว่าไฟล์เหล่านี้ผิดปกติ? reportUnknownDescription = โปรดไปที่ URL ของลิงก์ที่คุณต้องการรายงานและคลิก “{ reportFile }” reportButton = รายงาน reportReasonMalware = ไฟล์เหล่านี้มีมัลแวร์หรือเป็นส่วนหนึ่งของการโจมตีแบบฟิชชิ่ง reportReasonPii = ไฟล์เหล่านี้มีข้อมูลที่สามารถระบุตัวบุคคลได้เกี่ยวกับฉัน reportReasonAbuse = ไฟล์เหล่านี้มีเนื้อหาที่ผิดกฎหมายหรือไม่เหมาะสม reportReasonCopyright = หากต้องการรายงานการละเมิดลิขสิทธิ์หรือเครื่องหมายการค้าให้ใช้กระบวนการที่อธิบายไว้ใน หน้านี้ reportedTitle = ไฟล์ถูกรายงานแล้ว reportedDescription = ขอบคุณ เราได้รับรายงานของคุณเกี่ยวกับไฟล์เหล่านี้แล้ว ================================================ FILE: public/locales/tl/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send siteFeedback = Feedback importingFile = Importing… encryptingFile = Encrypting… decryptingFile = Decrypting… downloadCount = { $num -> [one] 1 pag-download *[other] { $num } na mga pag-download } copiedUrl = Naikopya! unlockInputPlaceholder = Password unlockButtonLabel = I-unlock downloadButtonLabel = I-download downloadFinish = Kumpleto ang Download fileSizeProgress = ({ $partialSize } ng { $totalSize }) sendYourFilesLink = Subukan ang Firefox Ipadala errorPageHeader = May nagkamali! fileTooBig = Ang file na iyon ay masyadong malaki upang mag-upload. Dapat itong mas mababa sa { $size }. linkExpiredAlt = Nag-expire na ang link notSupportedHeader = Ang iyong browser ay hindi suportado. notSupportedLink = Bakit hindi suportado ang aking browser? notSupportedOutdatedDetail = Sa kasamaang palad ang bersyon na ito ng Firefox ay hindi sumusuporta sa teknolohiya ng web na nagpapagana ng Send. Kailangan mong i-update ang iyong browser. updateFirefox = I-update ang Firefox deletePopupCancel = Kanselahin deleteButtonHover = I-delete footerLinkLegal = Legal footerLinkPrivacy = Privacy footerLinkCookies = Mga cookie passwordTryAgain = Maling password. Subukan muli. javascriptRequired = Nangangailangan ang Send ng JavaScript whyJavascript = Bakit ang Send ay nangangailangan ng JavaScript? enableJavascript = Mangyaring paganahin ang JavaScript at subukan muli. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Pinakamataas na haba ng password: { $length } # A short status message shown when there was an error setting the password passwordSetError = Hindi maitakda ang password na ito ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Firefox send -send-short-brand = I-send -firefox = Firefox -mozilla = Mozilla introTitle = Simple, pribadong pagbabahagi ng file notifyUploadEncryptDone = Ang iyong file ay naka-encrypt at handa na i-send # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = mag-e-expire pagkatapos { $downloadCount } o { $timespan } timespanMinutes = { $num -> [one] 1 minuto *[other] { $num } mga minuto } timespanDays = { $num -> [one] 1 araw *[other] { $num } mga araw } timespanWeeks = { $num -> [one] 1 linggo *[other] { $num } mga linggo } fileCount = { $num -> [one] 1 file *[other] { $num } mga file } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Kabuuang sukat: { $size } # the next line after the colon contains a file name copyLinkDescription = Kopyahin ang link upang ibahagi ang iyong file: copyLinkButton = Kopyahin ang link downloadTitle = I-download ang mga file expiredTitle = Ang link na ito ay nag-expire. downloadFirefox = I-download { -firefox } legalTitle = { -send-short-brand } Abiso sa Privacy legalDateStamp = Bersyon 1.0, petsa ng Marso 12, 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m addFilesButton = Piliin ang mga file na mai-upload uploadButton = I-upload # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = I-drag at i-drop ang mga file addPassword = Protektahan gamit ang password emailPlaceholder = Ipasok ang iyong email # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Mag-sign in upang magpadala ng hanggang sa { $size } signInOnlyButton = Mag sign-in # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Ibahagi ang mga file hanggang sa { $size } accountBenefitDownloadCount = Ibahagi ang mga file sa ibang tao accountBenefitMoz = Alamin ang tungkol sa iba pang mga serbisyo ng { -mozilla } signOut = Mag sign-out okButton = OK downloadingTitle = Pag-download noStreamsWarning = Maaaring hindi mai-decrypt ng browser na ito ang isang file na malaki. noStreamsOptionCopy = Kopyahin ang link upang buksan sa isa pang browser noStreamsOptionFirefox = Subukan ang aming paboritong browser noStreamsOptionDownload = Magpatuloy sa browser na ito shareLinkButton = Ibahagi ang link learnMore = Matuto ng higit pa. ================================================ FILE: public/locales/tr/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = İçe aktarılıyor… encryptingFile = Şifreleniyor… decryptingFile = Şifre çözülüyor… downloadCount = { $num } indirme timespanHours = { $num -> [one] 1 saat *[other] { $num } saat } copiedUrl = Kopyalandı! unlockInputPlaceholder = Parola unlockButtonLabel = Kilidi aç downloadButtonLabel = İndir downloadFinish = İndirme tamamlandı fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = Send’i deneyin errorPageHeader = Bir şeyler ters gitti! fileTooBig = Dosyanız çok büyük. En fazla { $size } boyutunda olmalı. linkExpiredAlt = Bağlantı zaman aşımına uğramış notSupportedHeader = Tarayıcınız desteklenmiyor. notSupportedLink = Tarayıcım neden desteklenmiyor? notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor. updateFirefox = Firefox’u güncelle deletePopupCancel = Vazgeç deleteButtonHover = Sil footerLinkLegal = Yasal Bilgiler footerLinkPrivacy = Gizlilik footerLinkCookies = Çerezler passwordTryAgain = Yanlış parola. Yeniden deneyin. javascriptRequired = Send için JavaScript gerekir whyJavascript = Send neden JavaScript kullanıyor? enableJavascript = Lütfen JavaScript'i etkinleştirip yeniden deneyin. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } sa { $minutes } dk # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } dk # A short status message shown when the user enters a long password maxPasswordLength = Maksimum parola uzunluğu: { $length } # A short status message shown when there was an error setting the password passwordSetError = Parola ayarlanamadı ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Basit ve gizli dosya paylaşımı introDescription = { -send-brand } ile dosyalarınızı uçtan uca şifreleme ve otomatik olarak silinen bir bağlantıyla paylaşın. Böylece özel dosyalarınız güvenle saklanır, bir süre sonra kendi kendine silinir. notifyUploadEncryptDone = Dosyanız şifrelendi ve gönderilmeye hazır # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } veya { $timespan } sonra silinecek timespanMinutes = { $num -> [one] 1 dakika *[other] { $num } dakika } timespanDays = { $num -> [one] 1 gün *[other] { $num } gün } timespanWeeks = { $num -> [one] 1 hafta *[other] { $num } hafta } fileCount = { $num -> [one] 1 dosya *[other] { $num } dosya } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Toplam boyut: { $size } # the next line after the colon contains a file name copyLinkDescription = Dosyanızı paylaşmak için bağlantıyı kopyalayın: copyLinkButton = Bağlantıyı kopyala downloadTitle = Dosyaları indir downloadDescription = Bu dosya { -send-brand } üzerinden paylaşıldı. Uçtan uca şifreleme ve kendiliğinden silinen bağlantı koruması { -send-brand }’de. trySendDescription = Basit ve güvenli dosya paylaşımı için { -send-brand }’i deneyin. # count will always be > 10 tooManyFiles = { $count -> [one] Bir kerede en fazla 1 dosya yükleyebilirsiniz. *[other] Bir kerede en fazla { $count } dosya yükleyebilirsiniz. } # count will always be > 10 tooManyArchives = { $count -> [one] En fazla 1 arşive izin veriliyor. *[other] En fazla { $count } arşive izin veriliyor. } expiredTitle = Bu bağlantının süresi doldu. notSupportedDescription = { -send-brand } bu tarayıcıyı desteklemiyor. { -send-short-brand } en iyi şekilde { -firefox }’un son sürümüyle ve çoğu tarayıcının güncel sürümüyle çalışır. downloadFirefox = { -firefox }’u indir legalTitle = { -send-short-brand } Gizlilik Bildirimi legalDateStamp = Sürüm 1.0, 12 Mart 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } g { $hours } sa { $minutes } dk addFilesButton = Yüklenecek dosyaları seçin trustWarningMessage = Hassas verileri paylaşırken alıcıya güvendiğinizden emin olun. uploadButton = Yükle # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Dosyaları sürükleyip bırakarak # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = veya buraya tıklayarak { $size }’ye kadar dosyalarınızı gönderebilirsiniz addPassword = Parola koruması ekle emailPlaceholder = E-posta adresinizi yazın # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = { $size }’ye kadar dosya göndermek için giriş yapın signInOnlyButton = Giriş yap accountBenefitTitle = { -firefox } Hesabı açın veya giriş yapın # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = { $size } boyutlu dosyaları paylaşma accountBenefitDownloadCount = Daha fazla kişiyle dosya paylaşma accountBenefitTimeLimit = { $count -> [one] Bağlantıları 1 güne kadar aktif tutma *[other] Bağlantıları { $count } güne kadar aktif tutma } accountBenefitSync = Paylaştığınız dosyaları başka cihazlardan yönetebilme accountBenefitMoz = Diğer { -mozilla } servisleri hakkında bilgi alma signOut = Çıkış yap okButton = Tamam downloadingTitle = İndiriliyor noStreamsWarning = Bu tarayıcı bu kadar büyük bir dosyanın şifresini çözemeyebilir. noStreamsOptionCopy = Bağlantıyı başka bir tarayıcıda açmak için kopyala noStreamsOptionFirefox = En sevdiğimiz tarayıcıyı deneyin noStreamsOptionDownload = Bu tarayıcıyla devam edin downloadFirefoxPromo = { -send-short-brand }, yepyeni { -firefox } tarafından sunulmaktadır. # the next line after the colon contains a file name shareLinkDescription = Dosyanızın bağlantısını paylaşın: shareLinkButton = Bağlantıyı paylaş # $name is the name of the file shareMessage = “{ $name }” dosyasını { -send-brand } ile indirin: basit ve güvenli dosya paylaşımı trailheadPromo = Gizliliğinizi korumanın bir yolu var. Firefox’a katılın. learnMore = Daha fazla bilgi alın. downloadFlagged = Bu bağlantı hizmet koşullarımızı ihlal ettiği için devre dışı bırakıldı. downloadConfirmTitle = Bir şey daha downloadConfirmDescription = Bu dosyayı gönderen kişiye güvendiğinizden emin olun. Dosyanın cihazınıza zarar vermeyeceğini garanti edemeyiz. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Bu dosyayı gönderen kişiye güveniyorum *[other] Bu dosyaları gönderen kişiye güveniyorum } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Bu dosyanın şüpheli olduğunu bildir *[other] Bu dosyaların şüpheli olduğunu bildir } reportDescription = Meseleyi anlamamıza yardımcı olun. Bu dosyalardaki sorun nedir? reportUnknownDescription = Lütfen rapor etmek istediğiniz bağlantının adresine girip “{ reportFile }” bağlantısına tıklayın. reportButton = Şikâyet et reportReasonMalware = Bu dosyalar kötü amaçlı yazılım içeriyor veya kimlik avı saldırında kullanılıyor. reportReasonPii = Bu dosyalar benim hakkımda kişisel bilgiler içeriyor. reportReasonAbuse = Bu dosyalar yasa dışı veya istismar amaçlı içerik içeriyor. reportReasonCopyright = Telif hakkı veya ticari marka ihlallerini bildirmek için bu sayfadaki adımları izlemelisiniz. reportedTitle = Dosyalar rapor edildi reportedDescription = Teşekkür ederiz. Bu dosyalarla ilgili şikâyetinizi aldık. ================================================ FILE: public/locales/trs/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Hìaj a'nïn huan'ānj… encryptingFile = Nagi'iaj hùij… decryptingFile = Hìaj nâ'nïn… downloadCount = { $num -> [one] 1 sa nadunin *[other] { $num } nej sa nadunin } timespanHours = { $num -> [one] 1 ôra *[other] { $num } nej ôra } copiedUrl = Ngà gisîj guxunj! unlockInputPlaceholder = Da'nga' huìi unlockButtonLabel = Na'nïn riñanj downloadButtonLabel = Nadunïnj downloadFinish = Ngà nahui nanïnj fileSizeProgress = ({ $partialSize } guendâ { $totalSize }) sendYourFilesLink = Garahuè dàj 'iaj sun Send errorPageHeader = Huā sa gahui a'nan'! fileTooBig = Ûta yachìj hua archibô dan. Da'ui gā li doj ga da' { $size } linkExpiredAlt = Nitāj si ni'ñānj lînk gà' notSupportedHeader = Nitāj si huā hue'ê riña sa nana'uî't. notSupportedLink = Nù huin saj nitāj si huā hue'ê riña sa nana'uí? notSupportedOutdatedDetail = Nu unùkuaj Firefox nan gi'iaj sunj ngà sa 'iaj sun ngà Send. Da'uît nāgi'iaj nakàt riña sa nana'uî't han. updateFirefox = Nagi'iaj nakà Firefox deletePopupCancel = Duyichin' deleteButtonHover = Dure' footerLinkLegal = Nuguan' a'nï'ïn footerLinkPrivacy = Sa hùii footerLinkCookies = Nej kôki passwordTryAgain = Sê da'nga' huì dan huin. Ginù huin ñû. javascriptRequired = Ni'ñānj Send JavaScript whyJavascript = Nù huin saj ni'ñānj Send JavaScript rà'aj? enableJavascript = Gi'iaj sunūj u ga'nïn gi'iaj sun JavaScript nī yakāj da'nga' ñû. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m # A short status message shown when the user enters a long password maxPasswordLength = Dānaj gā yachìj da'nga huìi: { $length } # A short status message shown when there was an error setting the password passwordSetError = Na'ue gārayinaj da'nga huìi ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Hìo nī huì ga’ue duyingâ’t archîbo introDescription = { -send-brand } a’nïn duyingâ’t archîbo ngà ‘ngō da’nga’rán hia nī ngà ‘ngō lînk nare’ man‘an. Dànanj nī ‘ngō rïnt ni’in sa duyingâ’t nī si lînk si ginu yitïn riña lînia. notifyUploadEncryptDone = Ngà huā ran si archibôt nī ngà huā yugui da’ ga’nïnjt gan’an # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Narè’ man ne’ rukù { $downloadCount } asi { $timespan } timespanMinutes = { $num -> [one] 1 minûtu *[other] { $num } minûtu } timespanDays = { $num -> [one] 1 gui *[other] { $num } gui } timespanWeeks = { $num -> [one] 1 semâna *[other] { $num } semâna } fileCount = { $num -> [one] 1 archîbo *[other] { $num } archîbo } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Dàj nìko yàchi: { $size } # the next line after the colon contains a file name copyLinkDescription = Guxūn lînk da' ga'ue duyingâ't archibô: copyLinkButton = Guxûn lînk downloadTitle = Nadunïnj nej archîbo downloadFirefox = Nadunïnj { -firefox } legalTitle = Nuguan huì nikāj { -send-short-brand } uploadButton = Nādusîj addPassword = Dugumî da’nga’ huìi man emailPlaceholder = Gāchrūn si korreot signInOnlyButton = Gāyi'ì sēsiûn signOut = Narun' sesiôn okButton = Ga'ue downloadingTitle = Hìaj nadunīnj man shareLinkButton = Duguachîn enlâse learnMore = Gāhuin chrūn doj. ================================================ FILE: public/locales/uk/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Імпортуємо... encryptingFile = Шифруємо... decryptingFile = Розшифровуємо... downloadCount = { $num -> [one] 1 завантаження [few] { $num } завантаження *[other] { $num } завантажень } timespanHours = { $num -> [one] 1 година [few] { $num } години *[other] { $num } годин } copiedUrl = Скопійовано! unlockInputPlaceholder = Пароль unlockButtonLabel = Розблокувати downloadButtonLabel = Завантажити downloadFinish = Завантаження завершено fileSizeProgress = ({ $partialSize } з { $totalSize }) sendYourFilesLink = Спробуйте Send errorPageHeader = Щось пішло не так! fileTooBig = Цей файл завеликий для вивантаження. Він має бути меншим за { $size }. linkExpiredAlt = Час дії посилання минув notSupportedHeader = Ваш браузер не підтримується. notSupportedLink = Чому мій браузер не підтримується? notSupportedOutdatedDetail = На жаль, ця версія Firefox не підтримує веб-технологію, завдяки якій працює Send. Вам потрібно оновити свій браузер. updateFirefox = Оновити Firefox deletePopupCancel = Скасувати deleteButtonHover = Видалити footerLinkLegal = Права footerLinkPrivacy = Приватність footerLinkCookies = Куки passwordTryAgain = Невірний пароль. Спробуйте знову. javascriptRequired = Send потребує JavaScript whyJavascript = Чому для Send потрібен JavaScript? enableJavascript = Будь ласка, увімкніть JavaScript та спробуйте знову. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } год. { $minutes } хв. # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } хв. # A short status message shown when the user enters a long password maxPasswordLength = Найбільша довжина паролю: { $length } # A short status message shown when there was an error setting the password passwordSetError = Неможливо встановити цей пароль ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Простий, приватний обмін файлами introDescription = { -send-brand } дозволяє обмінюватися файлами з використанням наскрізного шифрування та посиланнями з обмеженим терміном дії. Отже, ви можете бути певними, що ваші дані зберігаються приватно і не залишаться в мережі назавжди. notifyUploadEncryptDone = Ваш файл зашифрований і готовий до надсилання # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Термін зберігання завершується після { $downloadCount } або { $timespan } timespanMinutes = { $num -> [one] 1 хвилина [few] { $num } хвилини *[other] { $num } хвилин } timespanDays = { $num -> [one] 1 день [few] { $num } дні *[other] { $num } днів } timespanWeeks = { $num -> [one] 1 тиждень [few] { $num } тижні *[other] { $num } тижнів } fileCount = { $num -> [one] 1 файл [few] { $num } файли *[other] { $num } файлів } # byte abbreviation bytes = Б # kibibyte abbreviation kb = КБ # mebibyte abbreviation mb = МБ # gibibyte abbreviation gb = ГБ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Загальний розмір: { $size } # the next line after the colon contains a file name copyLinkDescription = Скопіюйте посилання для спільного доступу: copyLinkButton = Копіювати посилання downloadTitle = Завантажити файли downloadDescription = Цей файл було надіслано через { -send-brand } з використанням наскрізного шифрування і посиланням, що має обмежений термін дії. trySendDescription = Спробуйте { -send-brand } для простого, захищеного обміну файлами. # count will always be > 10 tooManyFiles = { $count -> [one] Лише 1 файл можна вивантажити за один раз. [few] Лише { $count } файли можна вивантажити за один раз. *[other] Лише { $count } файлів можна вивантажити за один раз. } # count will always be > 10 tooManyArchives = { $count -> [one] Дозволяється лише 1 архів. [few] Дозволяється лише { $count } архіви. *[other] Дозволяється лише { $count } архівів. } expiredTitle = Термін дії цього посилання завершився. notSupportedDescription = { -send-brand } не працюватиме з цим браузером. { -send-short-brand } найкраще працює з найновішою версією { -firefox }, а також з більшістю інших браузерів. downloadFirefox = Завантажити { -firefox } legalTitle = Повідомлення про приватність { -send-short-brand } legalDateStamp = Версія 1.0 від 12 березня 2019 року # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }д { $hours }г { $minutes }хв addFilesButton = Оберіть файли для вивантаження trustWarningMessage = Переконайтеся, що довіряєте одержувачу коли ділитеся вразливими даними. uploadButton = Вивантажити # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Перетягуйте файли # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = або натисніть, щоб надіслати до { $size } addPassword = Захист паролем emailPlaceholder = Введіть свою електронну пошту # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Увійдіть, щоб надсилати файли розміром до { $size } signInOnlyButton = Увійти accountBenefitTitle = Створіть обліковий запис { -firefox } або увійдіть # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Обмінюйтесь файлами розміром до { $size } accountBenefitDownloadCount = Обмінюйтесь файлами з більшою кількістю людей accountBenefitTimeLimit = { $count -> [one] Термін дії посилання 1 день [few] Термін дії посилання { $count } дні *[many] Термін дії посилання { $count } днів } accountBenefitSync = Керуйте спільними файлами з буль-якого пристрою accountBenefitMoz = Дізнайтеся про інші сервіси { -mozilla } signOut = Вийти okButton = Гаразд downloadingTitle = Завантаження noStreamsWarning = Цьому браузеру може не вдатися розшифрувати такий великий файл. noStreamsOptionCopy = Скопіюйте посилання, щоб відкрити його в іншому браузері noStreamsOptionFirefox = Спробуйте наш улюблений браузер noStreamsOptionDownload = Продовжити в цьому браузері downloadFirefoxPromo = { -send-short-brand } доступний для вас в цілком новому { -firefox }. # the next line after the colon contains a file name shareLinkDescription = Надішліть посилання на свій файл: shareLinkButton = Поділитись посиланням # $name is the name of the file shareMessage = Завантажте “{ $name }” з { -send-brand }: простий та безпечний обмін файлами trailheadPromo = Існує спосіб захистити вашу приватність. Приєднуйтесь до Firefox. learnMore = Докладніше. downloadFlagged = Це посилання вимкнено через порушення умов надання послуг. downloadConfirmTitle = Ще порада downloadConfirmDescription = Переконайтеся, що довіряєте відправнику цього файлу, оскільки ми не можемо перевірити, чи він не зашкодить вашому пристрою. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] Я довіряю відправнику цього файлу [few] Я довіряю відправнику цих файлів *[many] Я довіряю відправнику цих файлів } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] Повідомити, що цей файл є підозрілим [few] Повідомити, що ці файли є підозрілими *[many] Повідомити, що ці файли є підозрілими } reportDescription = Допоможіть нам зрозуміти, що відбувається. Що, на вашу думку, з цими файлами не так? reportUnknownDescription = Перейдіть до url-адреси посилання, про яке хочете надіслати звіт, та натисніть “{ reportFile }”. reportButton = Надіслати звіт reportReasonMalware = Ці файли містять зловмисне програмне забезпечення або є частиною фішинг-атаки. reportReasonPii = Ці файли містять мої особисті дані. reportReasonAbuse = Ці файли містять незаконний або образливий вміст. reportReasonCopyright = Щоб повідомити про порушення авторських прав або торговельних марок, скористайтеся настановами з цієї сторінки. reportedTitle = Звіт про файли надіслано reportedDescription = Дякуємо. Ми отримали ваш звіт про ці файли. ================================================ FILE: public/locales/vi/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = Đang nhập... encryptingFile = Đang mã hóa... decryptingFile = Đang giải mã... downloadCount = { $num -> *[other] { $num } lượt tải } timespanHours = { $num -> *[other] { $num } giờ } copiedUrl = Đã sao chép! unlockInputPlaceholder = Mật khẩu unlockButtonLabel = Mở khóa downloadButtonLabel = Tải xuống downloadFinish = Tải xuống hoàn tất fileSizeProgress = ({ $partialSize } trong { $totalSize }) sendYourFilesLink = Dùng thử Send errorPageHeader = Có gì đó không ổn! fileTooBig = Tập tin này quá lớn để tải lên. Kích thước tập tin phải nhỏ hơn { $size }. linkExpiredAlt = Liên kết đã hết hạn notSupportedHeader = Trình duyệt của bạn không được hỗ trợ. notSupportedLink = Tại sao trình duyệt của tôi không được hỗ trợ? notSupportedOutdatedDetail = Thật không may là phiên bản Firefox này không hỗ trợ công nghệ được sử dụng trong Send. Bạn cần cập nhật trình duyệt của bạn. updateFirefox = Cập nhật Firefox deletePopupCancel = Hủy bỏ deleteButtonHover = Xóa footerLinkLegal = Pháp lý footerLinkPrivacy = Quyền riêng tư footerLinkCookies = Cookie passwordTryAgain = Sai mật khẩu. Vui lòng thử lại. javascriptRequired = Send cần JavaScript whyJavascript = Tại sao Send cần JavaScript? enableJavascript = Vui lòng kích hoạt JavaScript và thử lại. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } giờ { $minutes } phút # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } phút # A short status message shown when the user enters a long password maxPasswordLength = Độ dài mật khẩu tối đa: { $length } # A short status message shown when there was an error setting the password passwordSetError = Không thể đặt mật khẩu này ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = Chia sẻ tập tin đơn giản, riêng tư introDescription = { -send-brand } cho phép bạn chia sẻ các tập tin với mã hóa đầu cuối và một liên kết tự động hết hạn. Vì vậy, bạn có thể giữ những gì bạn chia sẻ riêng tư và đảm bảo dữ liệu của bạn không trực tuyến vĩnh viễn. notifyUploadEncryptDone = Tập tin của bạn được mã hóa và sẵn sàng để gửi # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = Hết hạn sau { $downloadCount } hoặc { $timespan } timespanMinutes = { $num -> *[other] { $num } phút } timespanDays = { $num -> *[other] { $num } ngày } timespanWeeks = { $num -> *[other] { $num } tuần } fileCount = { $num -> *[other] { $num } tập tin } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = Tổng kích thước: { $size } # the next line after the colon contains a file name copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn: copyLinkButton = Sao chép liên kết downloadTitle = Tải xuống tập tin downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn. trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn. # count will always be > 10 tooManyFiles = { $count -> *[other] Chỉ { $count } tập tin có thể tải lên mỗi lần. } # count will always be > 10 tooManyArchives = { $count -> *[other] Chỉ cho phép { $count } lưu trữ. } expiredTitle = Liên kết này đã hết hạn. notSupportedDescription = { -send-brand } sẽ không hoạt động với trình duyệt này. { -send-short-brand } hoạt động tốt nhất với phiên bản { -firefox } mới nhất và sẽ hoạt động với phiên bản hiện tại của hầu hết các trình duyệt. downloadFirefox = Tải xuống { -firefox } legalTitle = Thông báo bảo mật { -send-short-brand } legalDateStamp = Phiên bản 1.0, ngày 12 tháng 3 năm 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } ngày { $hours } giờ { $minutes } phút addFilesButton = Chọn tập tin để tải lên trustWarningMessage = Hãy chắc chắn rằng bạn tin tưởng người nhận khi chia sẻ dữ liệu nhạy cảm. uploadButton = Tải lên # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = Kéo và thả tập tin # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = hoặc nhấp để gửi tối đa { $size } addPassword = Bảo vệ bằng mật khẩu emailPlaceholder = Nhập email của bạn # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = Đăng nhập để gửi tối đa { $size } signInOnlyButton = Đăng nhập accountBenefitTitle = Tạo tài khoản { -firefox } hoặc đăng nhập # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = Chia sẻ tập tin lên tới { $size } accountBenefitDownloadCount = Chia sẻ tập tin với nhiều người hơn accountBenefitTimeLimit = { $count -> *[other] Giữ liên kết hoạt động tối đa { $count } ngày } accountBenefitSync = Quản lý tập tin được chia sẻ từ mọi thiết bị accountBenefitMoz = Tìm hiểu về các dịch vụ khác của { -mozilla } signOut = Đăng xuất okButton = OK downloadingTitle = Đang tải xuống noStreamsWarning = Trình duyệt này có khả năng không thể giải mã một tập tin lớn này. noStreamsOptionCopy = Sao chép liên kết để mở trong một trình duyệt khác noStreamsOptionFirefox = Hãy dùng thử trình duyệt yêu thích của chúng tôi noStreamsOptionDownload = Tiếp tục với trình duyệt này downloadFirefoxPromo = { -send-short-brand } được mang đến cho bạn bởi { -firefox } hoàn toàn mới. # the next line after the colon contains a file name shareLinkDescription = Chia sẻ liên kết đến tập tin của bạn: shareLinkButton = Chia sẻ liên kết # $name is the name of the file shareMessage = Tải xuống “{ $name }“ với { -send-brand }: chia sẻ tập tin đơn giản, an toàn trailheadPromo = Đây là một cách để bảo vệ sự riêng tư của bạn. Tham gia Firefox. learnMore = Tìm hiểu thêm. downloadFlagged = Liên kết này đã bị vô hiệu hóa do vi phạm các điều khoản dịch vụ. downloadConfirmTitle = Một điều nữa downloadConfirmDescription = Hãy chắc chắn rằng bạn tin tưởng người đã gửi cho bạn tập tin này vì chúng tôi không thể xác minh rằng nó sẽ không gây hại cho thiết bị của bạn. # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] Tôi tin tưởng người đã gửi những tập tin này } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] Báo cáo các tập tin này là đáng ngờ } reportDescription = Hãy giúp chúng tôi hiểu những gì đang diễn ra. Bạn nghĩ gì có gì không đúng với những tập tin này? reportUnknownDescription = Vui lòng truy cập url của liên kết bạn muốn báo cáo và nhấp vào “{ reportFile }”. reportButton = Báo cáo reportReasonMalware = Những tập tin này chứa phần mềm độc hại hoặc là một phần của cuộc tấn công lừa đảo. reportReasonPii = Những tập tin này chứa thông tin cá nhân về tôi. reportReasonAbuse = Những tập tin này chứa nội dung bất hợp pháp hoặc lạm dụng. reportReasonCopyright = Để báo cáo vi phạm bản quyền hoặc nhãn hiệu, hãy sử dụng quy trình được mô tả tại trang này. reportedTitle = Đã báo cáo tập tin reportedDescription = Cảm ơn bạn. Chúng tôi đã nhận được báo cáo của bạn về các tập tin này. ================================================ FILE: public/locales/yo/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send je oruko ile-ise kan, kò sì ye ki a so di ibile. importingFile = akowọle… encryptingFile = Fifi ọrọ ṣiṣẹ… decryptingFile = Ti nkọ nkan… downloadCount = { $num -> [one] ìsíwá kan… *[other] ọ̀pọ̀ ìsíwá… } timespanHours = { $num -> [one] Wákàtí kan *[other] Ọ̀pọ wákàtí } copiedUrl = dakọ unlockInputPlaceholder = aṣínà ọ̀rọ̀-aṣínà ọ̀rọ̀-agbaniwọlé unlockButtonLabel = ṣí downloadButtonLabel = Ìgbasílẹ̀ downloadFinish = Ìsíwá parí Ìgbasílẹ̀ parí sendYourFilesLink = Gbìyànjúu Send Gbìyànjú lo Send Dán Send wò errorPageHeader = Nnkan o lo daadaa! fileTooBig = Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré sí { $size } Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré ju { $size } lọ linkExpiredAlt = Ojú-òpó ti kásẹ̀ Ojú-òpó ti pajújé Ọ̀nà-òpó ti kásẹ̀ Ọ̀nà-òpó ti pajújé notSupportedHeader = Èrọ-ìfarakọ́ra rẹ ò ní ìbátan Ojú-òpó ìfarakọ́ra rẹ ò ní ìbátan notSupportedLink = Kí ló ṣe tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? Kí ló ṣe tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? Kí nìdí tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? Kí nìdí tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? notSupportedOutdatedDetail = Ó ṣe, wípé ẹ̀dà Firefox yí ò ní àtìlẹyìn ẹ̀rọ-alátagbà tí ó ń mú Send ṣiṣẹ́. O ní láti ṣe àgbéga èdà ẹ̀rọ-aṣàwárí rẹ kó bágbàmu. updateFirefox = Mú Firefox bágbàmu deletePopupCancel = Nù kúrò Parẹ́ deleteButtonHover = Mú kúrò Parẹ́ footerLinkLegal = b’ófin mu n’ílànà òfin footerLinkPrivacy = Ibi ìkọ̀kọ̀ Ibi ìpamọ́ footerLinkCookies = Cookie Àmì-ẹ̀rọ aránṣẹ́-jíṣẹ́ passwordTryAgain = Ọ̀rọ̀-aṣínà kò tọ́. Gbìyànjú síi Ọ̀rọ̀-aṣíde kò tọ́. Gbìyànjú síi javascriptRequired = Send nílòo JavaScript whyJavascript = Kí nìdí tí Firefox fi nílòo JavaScript? Kí nìdí tí Firefox ṣe nílòo JavaScript? enableJavascript = Jọ̀wọ́ tán JavaScript sílẹ̀ kí o sì gbìyànjú si. Jọ̀wọ́ ṣí JavaScript sílẹ̀ kí o sì gbìyànjú si. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }w { $minutes }i { $hours }wákàtí { $minutes }iṣẹ́jú # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }i # A short status message shown when the user enters a long password maxPasswordLength = Ìdíwọ̀n ọ̀rọ̀-aṣínà: { $length } # A short status message shown when there was an error setting the password passwordSetError = Ọ̀rọ̀-aṣínà yí kò ṣeé gbé kalẹ̀ Ọ̀rọ̀-aṣínà yí kò leè fẹsẹ̀ múlẹ̀ ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Fi ránṣẹ́ Firánṣẹ́ -firefox = Firefox -mozilla = Mozilla introTitle = Fáìlì pípín níkọ̀kọ̀ tó dẹrùn Fáìlì pípín níkọ̀kọ̀ onírọ̀rùn # byte abbreviation bytes = B # kibibyte abbreviation kb = Kilobaiti # mebibyte abbreviation mb = Megabaiti # gibibyte abbreviation gb = Gigabaiti downloadTitle = Se igabisile faili addFilesButton = E yan awon faili lati gbasoke # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = E mu awon faili ki ede ju si bi emailPlaceholder = E fi imeli si accountBenefitDownloadCount = E pin faili pelu awon eyan si okButton = O DA downloadingTitle = N se igabsile noStreamsOptionFirefox = E gbiyanju asawakiri to je ayanfe wa noStreamsOptionDownload = Tesiwaju pelu aṣàwákiri yi trailheadPromo = Ona wa lati dabobo ipamo re. Darapo mo Firefox learnMore = Keeko si ================================================ FILE: public/locales/yua/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m ## Send version 2 strings -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } ================================================ FILE: public/locales/zgh/send.ftl ================================================ # Send is a brand name and should not be localized. title = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ siteFeedback = ⵜⴰⵙⴷⵎⵉⵔⵜ importingFile = ⴰⵙⴽⵛⵎ... encryptingFile = ⴰⵙⵙⵏⵜⵍ... decryptingFile = ⵜⵓⴽⴽⵙⴰ ⵏ ⵓⵙⵙⵏⵜⵍ... downloadCount = { $num -> [one] { $num } ⵜⴰⴳⴰⵎⵜ *[other] { $num } ⵜⴰⴳⴰⵎⵉⵏ } timespanHours = { $num -> [one] { $num } ⵜⵙⵔⴰⴳⵜ *[other] { $num } ⵜⵙⵔⴰⴳⵉⵏ } copiedUrl = ⵉⵏⵖⵍ! unlockInputPlaceholder = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ unlockButtonLabel = ⴽⴽⵙ ⴰⵔⴳⴰⵍ downloadButtonLabel = ⴰⴳⵎ downloadFinish = ⵉⵎⴷⴰ ⵡⴰⴳⴰⵎ fileSizeProgress = ({ $partialSize } ⵙⴳ { $totalSize }) sendYourFilesLink = ⴰⵔⵎ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ errorPageHeader = ⵜⵙⴰⵔ ⴽⵔⴰ ⵏ ⵜⵣⴳⴰⵍⵜ! fileTooBig = ⵉⵎⵇⵇⵓⵔ ⴱⴰⵀⵔⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵖⴼ ⵓⵙⵙⴽⵜⵔ. ⵉⵅⵚⵚⴰ ⵜ ⴰⴷ ⵢⵉⵍⵉ ⴷⴷⴰⵡ ⵏ { $size } linkExpiredAlt = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ notSupportedHeader = ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. notSupportedLink = ⵎⴰⵖⴼ ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵉⵏⵓ? notSupportedOutdatedDetail = ⵙ ⵜⵎⴳⵕⵥⴰ, ⵜⴰⵍⵇⵇⵎⵜ ⴰ ⵏ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵓⵔ ⴷⴰ ⵜⴻⵜⵜⵏⴰⵍ ⵜⴰⵜⵉⴽⵏⵓⵍⵓⵊⵉⵜ ⵏ ⵓⵡⵉⴱ ⵏⵏⴰ ⵙ ⵉⵙⵡⵓⵔⵓⵢ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ. ⵔⴰⴷ ⵜⴰⵙⵔⵎ ⴰⴷ ⵜⵙⴷⵖⵉⵎ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. updateFirefox = ⵙⴷⵖⵉ ⴼⴰⵢⵔⴼⵓⴽⵙ deletePopupCancel = ⵙⵔ deleteButtonHover = ⴽⴽⵙ footerLinkLegal = ⵓⵙⴹⵉⴼ footerLinkPrivacy = ⵜⵉⵏⵏⵓⵜⵍⴰ footerLinkCookies = ⵉⴽⵓⴽⵉⵜⵏ passwordTryAgain = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵢⵓⵖⵉⴷⵏ. ⴰⵔⵎ ⴷⴰⵖ. javascriptRequired = ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ whyJavascript = ⵎⴰⵖⴼ ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ? enableJavascript = ⵎⴽ ⵜⵓⴼⴰⵎ, ⵙⵏⵓⵛⵛⴳⴰⵜ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ, ⵜⴰⵔⵎⵎ ⴷⴰⵖ. # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ⵙⴷ # A short status message shown when the user enters a long password maxPasswordLength = ⵜⵉⵖⵣⵉ ⵜⴰⵎⵓⵣⵣⵓⵔⵜ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ: { $length } # A short status message shown when there was an error setting the password passwordSetError = ⵓⵔ ⵜⵣⵎⵉⵔ ⵜⴳⵓⵔⵉ ⴰ ⵏ ⵓⵣⵔⴰⵢ ⴰⴷ ⵜⴻⵜⵜⵓⵙⵖⵍ ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ -send-short-brand = ⵙⵉⵏⴷ -firefox = ⴼⴰⵢⵔⴼⵓⴽⵙ -mozilla = ⵎⵓⵣⵉⵍⴰ introTitle = ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ introDescription = ⴷⴰ ⴽⵯⵏ ⵉⵜⵜⴰⵊⵊⴰ { -send-brand } ⴰⴷ ⵜⴱⴹⵓⵎ ⵉⴼⵓⵢⵍⴰ ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. ⵙ ⵓⵢⴰ, ⵜⵣⵎⵔⵎ ⴰⴷ ⵜⴰⵊⵊⵎ ⴰⵢⵏⵏⴰ ⵜⴱⵟⵟⵓⵎ ⴷ ⵓⵙⵍⵉⴳ, ⵜⵙⵙⵉⵖⵥⵉⵏⵎ ⵎⴰⵙ ⵓⵔ ⵔⴰⴷ ⴰⴱⴷⴰ ⵉⵇⵇⵉⵎ ⵡⴰⵏⵏⴰⴷ ⵏⵏⵓⵏ ⴳ ⵉⴼⵉⵍⵉ. notifyUploadEncryptDone = ⵉⵏⵜⵍ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ, ⵉⵃⵢⵢⵍ ⵉ ⵡⴰⵣⴰⵏ # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = ⴰⴷ ⵉⵎⵎⵜ ⴷⴼⴼⵉⵔ { $downloadCount } ⵏⵉⵖ ⴷ { $timespan } timespanMinutes = { $num -> [one] { $num } ⵜⵓⵙⴷⵉⴷⵜ *[other] { $num } ⵜⵓⵙⴷⵉⴷⵉⵏ } timespanDays = { $num -> [one] { $num } ⵡⴰⵙⵙ *[other] { $num } ⵡⵓⵙⵙⴰⵏ } timespanWeeks = { $num -> [one] { $num } ⵉⵎⴰⵍⴰⵙⵙ *[other] { $num } ⵉⵎⴰⵍⴰⵙⵙⵏ } fileCount = { $num -> [one] { $num } ⵓⴼⴰⵢⵍⵓ *[other] { $num } ⵉⴼⵓⵢⵍⴰ } # byte abbreviation bytes = ⵜ # kibibyte abbreviation kb = ⴽⵜ # mebibyte abbreviation mb = ⵎⵜ # gibibyte abbreviation gb = ⵊⵜ # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = ⵜⵉⴷⴷⵉ ⵉⵎⵎⵓⵜⵜⵔⵏ: { $size } # the next line after the colon contains a file name copyLinkDescription = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜⴱⴹⵓⵎ ⴰⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: copyLinkButton = ⵙⵙⵏⵖⵍ ⴰⵙⵖⵏ downloadTitle = ⴰⴳⵎ ⵉⴼⵓⵢⵍⴰ downloadDescription = ⵉⵜⵜⵓⴱⴹⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵙⴳ { -send-brand } ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. trySendDescription = ⴰⵔⵎⴰⵜ { -send-brand } ⵉ ⵓⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⴼⵔⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ. # count will always be > 10 tooManyFiles = { $count -> [one] ⵖⴰⵙ { $count } ⵓⴼⴰⵢⵍⵓ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⵉⴽⵜⵔ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. *[other] ⵖⴰⵙ { $count } ⵉⴼⵓⵢⵍⴰ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⴽⵜⵔⵏ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. } # count will always be > 10 tooManyArchives = { $count -> [one] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⵉⵜ ⴰⵢ ⵉⵔⵔⴳⵏ. *[other] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⴰⵢ ⴰⵢ ⵉⵔⵔⴳⵏ. } expiredTitle = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ ⴰ. notSupportedDescription = ⵓⵔ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ { -send-brand } ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ. ⴷⴰ ⵉⵙⵡⵓⵔⵓⵢ { -send-short-brand } ⵎⵍⵉⵃ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⵏ { -firefox }, ⴷ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⵉⵔⴰⵏⵜ ⵏ ⵓⵎⴰⵜⴰ ⵏ ⵉⵎⵙⵙⴰⵔⴰⵜⵏ. downloadFirefox = ⴰⴳⵎ { -firefox } legalTitle = ⵜⵓⵙⵎⵉⵔⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏ { -send-short-brand } legalDateStamp = ⵜⴰⵍⵇⵇⵎⵜ 1.0, ⵜⵉⵏ 12 ⵎⴰⵕⵚ 2019 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days }ⵙ { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ addFilesButton = ⵙⵜⵢ ⵉⴼⵓⵢⵍⴰ ⵉ ⵓⵙⵙⴽⵜⵔ uploadButton = ⵙⵙⴽⵜⵔ # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = ⵙⵓⵛⵛⴹⴰⵜ, ⵜⵙⵔⵙⵎ ⵉⴼⵓⵢⵍⴰ # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = ⵏⵉⵖ ⵜⴽⵍⵉⴽⵉⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⵎ ⴰⵔ { $size } addPassword = ⴰⵔⵢ ⵙ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ emailPlaceholder = ⵙⵙⴽⵛⵎⴰⵜ ⵉⵎⴰⵢⵍ ⵏⵏⵓⵏ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = ⴽⵛⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⴷ ⴰⵔ { $size } signInOnlyButton = ⴽⵛⵎ accountBenefitTitle = ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ ⵏ { -firefox } ⵏⵉⵖ ⵜⵣⵎⵎⴻⵎⴷ # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⵔ { $size } accountBenefitDownloadCount = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⴽⴷ ⵡⵓⴳⴳⴰⵔ ⵏ ⵎⴷⴷⵏ accountBenefitTimeLimit = { $count -> [one] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⴰⵙⵙ *[other] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⵓⵙⵙⴰⵏ } accountBenefitSync = ⵙⵡⵓⴷⴷⵡⴰⵜ ⵉⴼⵓⵢⵍⴰ ⵜⵜⵓⴱⴹⴰⵏⵉⵏ ⵙⴳ ⴽⵓ ⴰⵍⵍⴰⵍ accountBenefitMoz = ⵍⵎⴷ ⵖⴼ ⵜⵏⵓⴼⴰ ⵢⴰⴹⵏⵉⵏ ⵏ { -mozilla } signOut = ⴼⴼⵖ okButton = ⵡⴰⵅⵅⴰ downloadingTitle = ⴰⴳⴰⵎ noStreamsWarning = ⵉⵣⵎⵔ ⵓⵎⵙⵙⴰⵔⴰ ⴰ ⴰⴷ ⵓⵔ ⵉⵖⴰⵢ ⴰⴷ ⵉⴽⴽⵙ ⴰⵙⵙⵏⵜⵍ ⵉ ⵢⴰⵏ ⵓⴼⴰⵢⵍⵓ ⵉⵎⵇⵇⵓⵔⵏ ⵙ ⵡⴰⵏⵛⵜ ⴰ. noStreamsOptionCopy = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ ⵜⵕⵥⵎⵎ ⴳ ⴽⵔⴰ ⵏ ⵓⵎⵙⵙⴰⵔⴰ ⵢⴰⴹⵏ noStreamsOptionFirefox = ⴰⵔⵎⴰⵜ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵖ ⴰⵎⵓⴼⴰⵢ noStreamsOptionDownload = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ downloadFirefoxPromo = ⵉⵜⵜⵓⵙⵓⵎⵔ ⴰⵡⵏ { -send-short-brand } ⵙⴳ ⵖⵓⵔ { -firefox } ⴰⵎⴰⵢⵏⵓ ⴰⴽⴽⵯ. # the next line after the colon contains a file name shareLinkDescription = ⴱⴹⵓⵢⴰⵜ ⴰⵙⵖⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: shareLinkButton = ⴱⴹⵓ ⴰⵙⵖⵏ # $name is the name of the file shareMessage = ⴰⴳⵎⴰⵜ "{ $name }" ⵙ { -send-brand }: ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ trailheadPromo = ⵜⵍⵍⴰ ⵢⴰⵜ ⵜⵖⴰⵔⴰⵙⵜ ⴰⴼⴰⴷ ⴰⴷ ⵜⴼⵔⴳⵎ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏⵏⵓⵏ. ⵍⴽⵎⴰⵜ ⴼⴰⵢⵔⴼⵓⴽⵙ. learnMore = ⵙⵙⵏ ⵓⴳⴳⴰⵔ. ================================================ FILE: public/locales/zh-CN/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = 正在导入… encryptingFile = 正在加密… decryptingFile = 正在解密… downloadCount = { $num -> *[other] { $num } 次下载 } timespanHours = { $num -> *[other] { $num } 小时 } copiedUrl = 已复制! unlockInputPlaceholder = 密码 unlockButtonLabel = 解锁 downloadButtonLabel = 下载 downloadFinish = 下载完成 fileSizeProgress = ({ $partialSize } / { $totalSize }) sendYourFilesLink = 试试 Send errorPageHeader = 我们遇到错误。 fileTooBig = 此文件太大。文件大小上限为 { $size }。 linkExpiredAlt = 链接已过期 notSupportedHeader = 不支持您的浏览器。 notSupportedLink = 为什么不支持我的浏览器? notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Send 所使用的 Web 技术。您需要更新浏览器才能使用它。 updateFirefox = 更新 Firefox deletePopupCancel = 取消 deleteButtonHover = 删除 footerLinkLegal = 法律 footerLinkPrivacy = 隐私 footerLinkCookies = Cookie passwordTryAgain = 密码不正确。请重试。 javascriptRequired = Send 需要 JavaScript whyJavascript = 为什么 Send 需要 JavaScript? enableJavascript = 请启用 JavaScript 并重试。 # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } 小时 { $minutes } 分钟 # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } 分钟 # A short status message shown when the user enters a long password maxPasswordLength = 最大密码长度:{ $length } # A short status message shown when there was an error setting the password passwordSetError = 未能设置此密码 ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = 简单、私密的文件分享服务 introDescription = 使用 { -send-brand } 端到端加密分享文件,链接到期即焚。分享更私密,文件到期真正无痕迹。 notifyUploadEncryptDone = 您的文件已加密,现在可以发送 # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount }或 { $timespan }后过期 timespanMinutes = { $num -> [one] 1 分钟 *[other] { $num } 分钟 } timespanDays = { $num -> [one] 1 天 *[other] { $num } 天 } timespanWeeks = { $num -> [one] 1 周 *[other] { $num } 周 } fileCount = { $num -> [one] 1 个文件 *[other] { $num } 个文件 } # byte abbreviation bytes = B # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num }{ $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = 总大小:{ $size } # the next line after the colon contains a file name copyLinkDescription = 复制链接以分享文件: copyLinkButton = 复制链接 downloadTitle = 下载文件 downloadDescription = 此文件通过端到端加密的 { -send-brand } 与您分享,链接到期即焚。 trySendDescription = 试试 { -send-brand },简单、私密的文件分享服务。 # count will always be > 10 tooManyFiles = { $count -> [one] 一次只可上传 1 个文件。 *[other] 一次只可上传 { $count } 个文件。 } # count will always be > 10 tooManyArchives = { $count -> *[other] 只可上传 { $count } 个压缩文件。 } expiredTitle = 此链接已过期。 notSupportedDescription = { -send-brand } 无法在此浏览器上正常工作。{ -send-short-brand } 与最新版本 { -firefox } 配合使用体验最佳,也适用于目前的大多数浏览器。 downloadFirefox = 下载 { -firefox } legalTitle = { -send-short-brand } 隐私声明 legalDateStamp = 版本 1.0,于 2019年3月12日 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } 天 { $hours } 小时 { $minutes } 分钟 addFilesButton = 选择要上传的文件 trustWarningMessage = 分享敏感数据时,请确保您信任接收人。 uploadButton = 上传 # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = 拖放文件 # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = 或点此传送最大 { $size } 的文件 addPassword = 密码保护 emailPlaceholder = 请输入您的电子邮件地址 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = 登录以传送最大 { $size } 文件 signInOnlyButton = 登录 accountBenefitTitle = 创建一个 { -firefox } 账户或登录 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = 分享最大 { $size } 文件 accountBenefitDownloadCount = 可以与更多人分享 accountBenefitTimeLimit = { $count -> [one] 链接有效期延至 1 天 *[other] 链接有效期延至 { $count } 天 } accountBenefitSync = 任何设备上都能管理分享的文件 accountBenefitMoz = 了解其他 { -mozilla } 服务 signOut = 退出 okButton = 确定 downloadingTitle = 正在下载 noStreamsWarning = 此浏览器可能无法解密这么大的文件。 noStreamsOptionCopy = 复制链接以在其他浏览器中打开 noStreamsOptionFirefox = 试试大家最爱的浏览器 noStreamsOptionDownload = 使用此浏览器继续 downloadFirefoxPromo = { -send-short-brand } 由焕然一新的 { -firefox } 为您奉上。 # the next line after the colon contains a file name shareLinkDescription = 您的文件链接: shareLinkButton = 分享链接 # $name is the name of the file shareMessage = 使用 { -send-brand } 下载“{ $name }”:简单、安全的文件分享服务 trailheadPromo = 捍卫隐私不是幻想。加入 Firefox 一同抗争。 learnMore = 详细了解。 downloadFlagged = 由于违反服务条款,此链接已被禁用。 downloadConfirmTitle = 除此之外 downloadConfirmDescription = 请确保您信任发送此文件的人,因为我们无法验证该文件是否会损坏您的设备。 # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> [one] 我信任发送此文件的人 *[other] 我信任发送这些文件的人 } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> [one] 举报此可疑文件 *[other] 举报这些可疑文件 } reportDescription = 帮助我们了解发生了什么。您认为这些文件存在什么问题? reportUnknownDescription = 请转至您要举报的链接 URL,然后点击 “{ reportFile }”。 reportButton = 举报 reportReasonMalware = 这些文件包含恶意软件或是网络钓鱼攻击的一环。 reportReasonPii = 这些文件包含我的个人身份信息。 reportReasonAbuse = 这些文件包含非法或滥用内容。 reportReasonCopyright = 要举报版权或商标侵权,请按照此页面中所述步骤。 reportedTitle = 文件已举报 reportedDescription = 感谢,我们已收到您关于这些文件的举报。 ================================================ FILE: public/locales/zh-TW/send.ftl ================================================ # Send is a brand name and should not be localized. title = Send importingFile = 匯入中… encryptingFile = 加密中… decryptingFile = 解密中… downloadCount = { $num -> *[other] { $num } 次下載 } timespanHours = { $num -> *[other] { $num } 小時 } copiedUrl = 已複製! unlockInputPlaceholder = 密碼 unlockButtonLabel = 解鎖 downloadButtonLabel = 下載 downloadFinish = 下載完成 fileSizeProgress = ({ $partialSize },共 { $totalSize }) sendYourFilesLink = 試用 Send errorPageHeader = 有些東西不對勁! fileTooBig = 檔案太大無法上傳。檔案大小限制為 { $size }。 linkExpiredAlt = 鏈結已過期 notSupportedHeader = 不支援您的瀏覽器。 notSupportedLink = 為什麼我的瀏覽器不支援? notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Send 所需的 Web 技術。請更新瀏覽器後再使用。 updateFirefox = 更新 Firefox deletePopupCancel = 取消 deleteButtonHover = 刪除 footerLinkLegal = 法律資訊 footerLinkPrivacy = 隱私權 footerLinkCookies = Cookie passwordTryAgain = 密碼不正確,請再試一次。 javascriptRequired = Send 需要開啟 JavaScript 功能 whyJavascript = 為什麼 Send 需要 JavaScript 才能使用? enableJavascript = 請開啟 JavaScript 功能後再試一次。 # A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } 時 { $minutes } 分 # A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } 分鐘 # A short status message shown when the user enters a long password maxPasswordLength = 最大密碼長度: { $length } # A short status message shown when there was an error setting the password passwordSetError = 無法設定此密碼 ## Send version 2 strings # Send, Send, Firefox, Mozilla are proper names and should not be localized -send-brand = Send -send-short-brand = Send -firefox = Firefox -mozilla = Mozilla introTitle = 簡單而私密的檔案共享服務 introDescription = { -send-brand } 讓您可透過點對點加密的方式來分享檔案,並提供會自動失效的鏈結。這樣一來就可以保留分享時的隱私,也確保檔案不會永久保存於網路上。 notifyUploadEncryptDone = 已加密您的檔案,可以傳送 # downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' archiveExpiryInfo = { $downloadCount } 或 { $timespan } 後失效 timespanMinutes = { $num -> *[other] { $num } 分鐘 } timespanDays = { $num -> *[other] { $num } 天 } timespanWeeks = { $num -> *[other] { $num } 週 } fileCount = { $num -> *[other] { $num } 個檔案 } # byte abbreviation bytes = 位元組 # kibibyte abbreviation kb = KB # mebibyte abbreviation mb = MB # gibibyte abbreviation gb = GB # localized number and byte abbreviation. example "2.5MB" fileSize = { $num } { $units } # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") totalSize = 總大小: { $size } # the next line after the colon contains a file name copyLinkDescription = 複製鏈結即可分享您的檔案: copyLinkButton = 複製鏈結 downloadTitle = 下載檔案 downloadDescription = 此檔案是透過 { -send-brand } 進行分享,以點對點加密的方式來分享檔案,並提供會自動失效的鏈結。 trySendDescription = 快試試 { -send-brand },簡單安全的檔案分享機制。 # count will always be > 10 tooManyFiles = { $count -> *[other] 一次僅能上傳 { $count } 個檔案。 } # count will always be > 10 tooManyArchives = { $count -> *[other] 僅允許 { $count } 個壓縮檔。 } expiredTitle = 此鏈結已經失效。 notSupportedDescription = 無法於此瀏覽器使用 { -send-brand }。在最新版的 { -firefox } 中使用 { -send-short-brand } 會有最佳效果,也可在大部分瀏覽器的最新版本當中使用。 downloadFirefox = 下載 { -firefox } legalTitle = { -send-short-brand } 隱私權公告 legalDateStamp = 1.0 版,2019 年 3 月 12 日生效 # A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" expiresDaysHoursMinutes = { $days } 天 { $hours } 小時 { $minutes } 分鐘 addFilesButton = 選擇要上傳的檔案 trustWarningMessage = 分享敏感資料時,請務必確認收件者是可信任的人。 uploadButton = 上傳 # the first part of the string 'Drag and drop files or click to send up to 1GB' dragAndDropFiles = 拖放檔案到此處 # the second part of the string 'Drag and drop files or click to send up to 1GB' # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") orClickWithSize = 或點擊即可傳送最大 { $size } 的檔案 addPassword = 使用密碼保護 emailPlaceholder = 輸入您的電子郵件地址 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") signInSizeBump = 登入後即可傳送最大 { $size } 的檔案 signInOnlyButton = 登入 accountBenefitTitle = 註冊 { -firefox } 帳號或登入 # $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") accountBenefitLargeFiles = 分享最大 { $size } 的檔案 accountBenefitDownloadCount = 分享檔案給更多人 accountBenefitTimeLimit = { $count -> *[other] 將檔案鏈結保留 { $count } 天有效 } accountBenefitSync = 從任何裝置管理分享的檔案 accountBenefitMoz = 了解其他 { -mozilla } 服務的更多資訊 signOut = 登出 okButton = 確定 downloadingTitle = 下載中 noStreamsWarning = 此瀏覽器無法解密這麼大的檔案。 noStreamsOptionCopy = 複製鏈結,用其他瀏覽器開啟 noStreamsOptionFirefox = 試試我們最愛的瀏覽器 noStreamsOptionDownload = 繼續使用目前的瀏覽器 downloadFirefoxPromo = { -send-short-brand } 是由全新的 { -firefox } 提供。 # the next line after the colon contains a file name shareLinkDescription = 您的檔案鏈結: shareLinkButton = 分享鏈結 # $name is the name of the file shareMessage = 使用 { -send-brand } 下載「{ $name }」: 簡單安全的檔案分享機制 trailheadPromo = 有種方法可以保護您的隱私,加入 Firefox。 learnMore = 了解更多。 downloadFlagged = 由於違反了服務條款,已停用此鏈結。 downloadConfirmTitle = 還有一件事 downloadConfirmDescription = 因為我們無法檢查此檔案是否會傷害您的裝置,請務必確認發送者是否可受信任。 # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. downloadTrustCheckbox = { $count -> *[other] 我信任傳送檔案給我的人 } # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$count} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. reportFile = { $count -> *[other] 回報檔案為可疑檔案 } reportDescription = 請幫助我們釐清發生了什麼事。您覺得這些檔案有什麼問題? reportUnknownDescription = 請到想要回報的鏈結網址點擊「{ reportFile }」。 reportButton = 回報 reportReasonMalware = 這些檔案包含惡意軟體,或是釣魚攻擊的一部分。 reportReasonPii = 這些檔案包含我的個人資訊。 reportReasonAbuse = 這些檔案包含非法或濫用內容。 reportReasonCopyright = 若檔案內容侵犯了著作權或商標,請根據此頁面當中描述的方式進行回報。 reportedTitle = 已回報檔案問題 reportedDescription = 感謝您。我們已經收到您對這些檔案的問題回報。 ================================================ FILE: scripts/.eslintrc.yml ================================================ rules: node/shebang: off security/detect-child-process: off no-console: off no-process-exit: off ================================================ FILE: scripts/bin/run-integration-test-circleci.sh ================================================ #!/bin/bash set -ex GECKODRIVER_URL=$( curl -s 'https://api.github.com/repos/mozilla/geckodriver/releases/latest' | python -c "import sys, json; r = json.load(sys.stdin); print([a for a in r['assets'] if 'linux64' in a['name']][0]['browser_download_url']);" ); curl -L -o geckodriver.tar.gz $GECKODRIVER_URL gunzip -c geckodriver.tar.gz | tar xopf - chmod +x geckodriver sudo mv geckodriver /bin geckodriver --version # Install pip sudo apt-get install python-pip sudo pip install --upgrade pip sudo pip install mozdownload mozinstall==1.15 mkdir -p ~/project/firefox-downloads/ find ~/project/firefox-downloads/ -type f -mtime +90 -delete mozdownload --version latest --type daily --destination ~/project/firefox-downloads/firefox_nightly/ export PATH=~/project/firefox:$PATH mozinstall $(ls -t firefox-downloads/firefox_nightly/*.tar.bz2 | head -1) firefox --version npm run circleci-test-integration ================================================ FILE: scripts/get-prod-locales.js ================================================ #!/usr/bin/env node const cp = require('child_process'); const { promisify } = require('util'); const fs = require('fs'); const pkg = require('../package.json'); const availableLanguages = pkg.availableLanguages.sort(); const exec = promisify(cp.exec); const arrayDiff = (current, package) => current.filter(locale => !package.includes(locale)); const cmd = 'compare-locales l10n.toml . `ls public/locales` --data=json'; exec(cmd) .then(({ stdout }) => JSON.parse(stdout)) .then(({ summary }) => { const locales = Object.keys(summary) .filter(locale => { const loc = summary[locale]; const hasMissing = Object.prototype.hasOwnProperty.call(loc, 'missing'); const hasErrors = Object.prototype.hasOwnProperty.call(loc, 'errors'); return !hasMissing && !hasErrors; }) .sort(); if (locales.join(',') !== availableLanguages.join(',')) { const missingLanguages = arrayDiff(locales, availableLanguages); console.log('current 100%:', JSON.stringify(locales)); console.log('package.json:', JSON.stringify(availableLanguages)); console.log('missing prod:', JSON.stringify(missingLanguages)); if (process.argv.includes('--write')) { const pkgPath = require.resolve('../package.json'); pkg.availableLanguages = locales; const str = JSON.stringify(pkg, null, 2) + '\n'; console.log('Updating /package.json availableLanguages'); fs.writeFileSync(pkgPath, str, 'utf-8'); } } else { console.log('Production locales are up to date!'); } }) .catch(err => { console.error(err); process.exit(1); }); ================================================ FILE: scripts/lint-locales.js ================================================ #!/usr/bin/env node const cp = require('child_process'); const { promisify } = require('util'); const pkg = require('../package.json'); const conf = require('../server/config'); const exec = promisify(cp.exec); const cmd = `compare-locales l10n.toml . ${getLocales()} --data=json`; console.log(cmd); exec(cmd) .then(({ stdout }) => JSON.parse(stdout)) .then(({ details }) => filterErrors(details)) .then(results => { if (results.length) { results.forEach(({ locale, data }) => { console.log(locale); data.forEach(msg => console.log(`- ${msg}`)); console.log(''); }); process.exit(2); } }) .catch(err => { console.error(err); process.exit(1); }); function filterErrors(details) { return Object.keys(details) .sort() .map(locale => { const data = details[locale] .filter(item => Object.prototype.hasOwnProperty.call(item, 'error')) .map(({ error }) => error); return { locale, data }; }) .filter(({ data }) => data.length); } function getLocales() { // If we're in a "production" env (or passed the `--production` flag), only // check the locales from the package.json file's `availableLanguages` array. if (conf.env === 'production' || process.argv.includes('--production')) { return pkg.availableLanguages.sort().join(' '); } // Lint all the locales. return '`ls public/locales`'; } ================================================ FILE: scripts/sync-npm-dependencies.sh ================================================ #!/bin/bash echo "checking package-lock.json for changes" IFS=' ' read -ra G_PARAMS <<< "$HUSKY_GIT_PARAMS" PREV=${G_PARAMS[0]} NEXT=${G_PARAMS[1]} if [ "$PREV" != "$NEXT" ]; then DIFF=$(git diff $PREV $NEXT package-lock.json) if [ "$DIFF" != "" ]; then npm install fi fi ================================================ FILE: server/amplitude.js ================================================ const crypto = require('crypto'); const fetch = require('node-fetch'); const config = require('./config'); const pkg = require('../package.json'); const HOUR = 1000 * 60 * 60; function truncateToHour(timestamp) { return Math.floor(timestamp / HOUR) * HOUR; } function orderOfMagnitude(n) { return Math.floor(Math.log10(n)); } function userId(fileId, ownerId) { const hash = crypto.createHash('sha256'); hash.update(fileId); hash.update(ownerId); return hash.digest('hex').substring(32); } function statUploadEvent(data) { const event = { session_id: -1, country: data.country, region: data.state, user_id: userId(data.id, data.owner), app_version: pkg.version, time: truncateToHour(Date.now()), event_type: 'server_upload', user_properties: { download_limit: data.dlimit, time_limit: data.timeLimit, size: orderOfMagnitude(data.size), anonymous: data.anonymous }, event_properties: { agent: data.agent }, event_id: 0 }; return sendBatch([event]); } function statDownloadEvent(data) { const event = { session_id: -1, country: data.country, region: data.state, user_id: userId(data.id, data.owner), app_version: pkg.version, time: truncateToHour(Date.now()), event_type: 'server_download', event_properties: { agent: data.agent, download_count: data.download_count, ttl: data.ttl }, event_id: data.download_count }; return sendBatch([event]); } function statDeleteEvent(data) { const event = { session_id: -1, country: data.country, region: data.state, user_id: userId(data.id, data.owner), app_version: pkg.version, time: truncateToHour(Date.now()), event_type: 'server_delete', event_properties: { agent: data.agent, download_count: data.download_count, ttl: data.ttl }, event_id: data.download_count + 1 }; return sendBatch([event]); } function statReportEvent(data) { const event = { session_id: -1, country: data.country, region: data.state, user_id: userId(data.id, data.owner), app_version: pkg.version, time: truncateToHour(Date.now()), event_type: 'server_report', event_properties: { reason: data.reason, agent: data.agent, download_limit: data.dlimit, download_count: data.download_count, ttl: data.ttl }, event_id: data.download_count + 1 }; return sendBatch([event]); } function clientEvent( event, ua, language, session_id, deltaT, platform, country, state ) { const ep = event.event_properties || {}; const up = event.user_properties || {}; const event_properties = { browser: ua.browser.name, browser_version: ua.browser.version, status: ep.status, age: ep.age, downloaded: ep.downloaded, download_limit: ep.download_limit, duration: ep.duration, entrypoint: ep.entrypoint, file_count: ep.file_count, password_protected: ep.password_protected, referrer: ep.referrer, size: ep.size, time_limit: ep.time_limit, trigger: ep.trigger, ttl: ep.ttl, utm_campaign: ep.utm_campaign, utm_content: ep.utm_content, utm_medium: ep.utm_medium, utm_source: ep.utm_source, utm_term: ep.utm_term, experiment: ep.experiment, variant: ep.variant }; const user_properties = { active_count: up.active_count, anonymous: up.anonymous, experiments: up.experiments, first_action: up.first_action }; return { app_version: pkg.version, country: country, device_id: event.device_id, event_properties, event_type: event.event_type, language, os_name: ua.os.name, os_version: ua.os.version, platform, region: state, session_id, time: event.time + deltaT, user_id: event.user_id, user_properties }; } async function sendBatch(events, timeout = 1000) { if (!config.amplitude_id) { return 200; } try { const result = await fetch('https://api.amplitude.com/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ api_key: config.amplitude_id, events }), timeout }); return result.status; } catch (e) { return 500; } } module.exports = { statUploadEvent, statDownloadEvent, statDeleteEvent, statReportEvent, clientEvent, sendBatch }; ================================================ FILE: server/bin/dev.js ================================================ const assets = require('../../common/assets'); const routes = require('../routes'); const pages = require('../routes/pages'); const tests = require('../../test/frontend/routes'); const express = require('express'); const expressWs = require('@dannycoates/express-ws'); const morgan = require('morgan'); const config = require('../config'); const ID_REGEX = '([0-9a-fA-F]{10, 16})'; module.exports = function(app, devServer) { const wsapp = express(); expressWs(wsapp, null, { perMessageDeflate: false }); routes(wsapp); wsapp.ws('/api/ws', require('../routes/ws')); wsapp.listen(1338, config.listen_address); assets.setMiddleware(devServer.middleware); app.use(morgan('dev', { stream: process.stderr })); function android(req, res) { const index = devServer.middleware.fileSystem .readFileSync(devServer.middleware.getFilenameFromUrl('/android.html')) .toString() .replace( '', '' ); res.set('Content-Type', 'text/html'); res.send(index); } if (process.env.ANDROID) { // map all html routes to the android index.html app.get('/', android); app.get(`/share/:id${ID_REGEX}`, android); app.get('/completed', android); app.get('/preferences', android); app.get('/options', android); app.get('/oauth', android); } routes(app); tests(app); // webpack-dev-server routes haven't been added yet // so wait for next tick to add 404 handler process.nextTick(() => app.use(pages.notfound)); }; ================================================ FILE: server/bin/prod.js ================================================ const express = require('express'); const path = require('path'); const Sentry = require('@sentry/node'); const config = require('../config'); const routes = require('../routes'); const pages = require('../routes/pages'); const expressWs = require('@dannycoates/express-ws'); if (config.sentry_dsn) { Sentry.init({ dsn: config.sentry_dsn }); } const app = express(); expressWs(app, null, { perMessageDeflate: false }); routes(app); app.ws('/api/ws', require('../routes/ws')); app.use( express.static(path.resolve(__dirname, '../../dist/'), { setHeaders: function(res, path) { if (!/serviceWorker\.js$/.test(path)) { res.set('Cache-Control', 'public, max-age=31536000, immutable'); } res.removeHeader('Pragma'); } }) ); app.use(pages.notfound); app.listen(config.listen_port, config.listen_address); ================================================ FILE: server/bin/test.js ================================================ const assets = require('../../common/assets'); const routes = require('../routes'); const pages = require('../routes/pages'); const tests = require('../../test/frontend/routes'); const expressWs = require('@dannycoates/express-ws'); module.exports = function(app, devServer) { assets.setMiddleware(devServer.middleware); expressWs(app, null, { perMessageDeflate: false }); routes(app); app.ws('/api/ws', require('../routes/ws')); tests(app); // webpack-dev-server routes haven't been added yet // so wait for next tick to add 404 handler process.nextTick(() => app.use(pages.notfound)); }; ================================================ FILE: server/clientConstants.js ================================================ const config = require('./config'); module.exports = { LIMITS: { ANON: { MAX_FILE_SIZE: config.anon_max_file_size, MAX_DOWNLOADS: config.anon_max_downloads, MAX_EXPIRE_SECONDS: config.anon_max_expire_seconds }, MAX_FILE_SIZE: config.max_file_size, MAX_DOWNLOADS: config.max_downloads, MAX_EXPIRE_SECONDS: config.max_expire_seconds, MAX_FILES_PER_ARCHIVE: config.max_files_per_archive, MAX_ARCHIVES_PER_USER: config.max_archives_per_user }, DEFAULTS: { DOWNLOAD_COUNTS: config.download_counts, EXPIRE_TIMES_SECONDS: config.expire_times_seconds, EXPIRE_SECONDS: config.default_expire_seconds } }; ================================================ FILE: server/config.js ================================================ const convict = require('convict'); const { tmpdir } = require('os'); const path = require('path'); const { randomBytes } = require('crypto'); const conf = convict({ s3_bucket: { format: String, default: '', env: 'S3_BUCKET' }, s3_endpoint: { format: String, default: '', env: 'S3_ENDPOINT' }, s3_use_path_style_endpoint: { format: Boolean, default: false, env: 'S3_USE_PATH_STYLE_ENDPOINT' }, gcs_bucket: { format: String, default: '', env: 'GCS_BUCKET' }, expire_times_seconds: { format: Array, default: [300, 3600, 86400, 604800], env: 'EXPIRE_TIMES_SECONDS' }, default_expire_seconds: { format: Number, default: 86400, env: 'DEFAULT_EXPIRE_SECONDS' }, max_expire_seconds: { format: Number, default: 86400 * 7, env: 'MAX_EXPIRE_SECONDS' }, anon_max_expire_seconds: { format: Number, default: 86400, env: 'ANON_MAX_EXPIRE_SECONDS' }, download_counts: { format: Array, default: [1, 2, 3, 4, 5, 20, 50, 100], env: 'DOWNLOAD_COUNTS' }, max_downloads: { format: Number, default: 100, env: 'MAX_DOWNLOADS' }, anon_max_downloads: { format: Number, default: 5, env: 'ANON_MAX_DOWNLOADS' }, max_files_per_archive: { format: Number, default: 64, env: 'MAX_FILES_PER_ARCHIVE' }, max_archives_per_user: { format: Number, default: 16, env: 'MAX_ARCHIVES_PER_USER' }, redis_host: { format: String, default: 'mock', env: 'REDIS_HOST' }, redis_event_expire: { format: Boolean, default: false, env: 'REDIS_EVENT_EXPIRE' }, redis_retry_time: { format: Number, default: 10000, env: 'REDIS_RETRY_TIME' }, redis_retry_delay: { format: Number, default: 500, env: 'REDIS_RETRY_DELAY' }, listen_address: { format: 'ipaddress', default: '0.0.0.0', env: 'IP_ADDRESS' }, listen_port: { format: 'port', default: 1443, arg: 'port', env: 'PORT' }, amplitude_id: { format: String, default: '', env: 'AMPLITUDE_ID' }, analytics_id: { format: String, default: '', env: 'GOOGLE_ANALYTICS_ID' }, sentry_id: { format: String, default: '', env: 'SENTRY_CLIENT' }, sentry_dsn: { format: String, default: '', env: 'SENTRY_DSN' }, sentry_host: { format: String, default: 'https://sentry.prod.mozaws.net', env: 'SENTRY_HOST' }, env: { format: ['production', 'development', 'test'], default: 'development', env: 'NODE_ENV' }, max_file_size: { format: Number, default: 1024 * 1024 * 1024 * 2.5, env: 'MAX_FILE_SIZE' }, anon_max_file_size: { format: Number, default: 1024 * 1024 * 1024, env: 'ANON_MAX_FILE_SIZE' }, l10n_dev: { format: Boolean, default: false, env: 'L10N_DEV' }, base_url: { format: 'url', default: 'https://send.firefox.com', env: 'BASE_URL' }, file_dir: { format: 'String', default: `${tmpdir()}${path.sep}send-${randomBytes(4).toString('hex')}`, env: 'FILE_DIR' }, fxa_required: { format: Boolean, default: false, env: 'FXA_REQUIRED' }, fxa_url: { format: 'url', default: 'http://localhost:3030', env: 'FXA_URL' }, fxa_client_id: { format: String, default: '', // disabled env: 'FXA_CLIENT_ID' }, fxa_key_scope: { format: String, default: 'https://identity.mozilla.com/apps/send', env: 'FXA_KEY_SCOPE' }, fxa_csp_oauth_url: { format: String, default: '', env: 'FXA_CSP_OAUTH_URL' }, fxa_csp_content_url: { format: String, default: '', env: 'FXA_CSP_CONTENT_URL' }, fxa_csp_profile_url: { format: String, default: '', env: 'FXA_CSP_PROFILE_URL' }, fxa_csp_profileimage_url: { format: String, default: '', env: 'FXA_CSP_PROFILEIMAGE_URL' }, survey_url: { format: String, default: '', env: 'SURVEY_URL' }, ip_db: { format: String, default: '', env: 'IP_DB' } }); // Perform validation conf.validate({ allowed: 'strict' }); const props = conf.getProperties(); module.exports = props; ================================================ FILE: server/fxa.js ================================================ const fetch = require('node-fetch'); const config = require('./config'); const KEY_SCOPE = config.fxa_key_scope; let fxaConfig = null; let lastConfigRefresh = 0; async function getFxaConfig() { if (fxaConfig && Date.now() - lastConfigRefresh < 1000 * 60 * 5) { return fxaConfig; } try { const res = await fetch( `${config.fxa_url}/.well-known/openid-configuration`, { timeout: 3000 } ); fxaConfig = await res.json(); fxaConfig.key_scope = KEY_SCOPE; lastConfigRefresh = Date.now(); } catch (e) { // continue with previous fxaConfig } return fxaConfig; } module.exports = { getFxaConfig, verify: async function(token) { if (!token) { return null; } const c = await getFxaConfig(); try { const verifyUrl = c.jwks_uri.replace('jwks', 'verify'); //HACK const result = await fetch(verifyUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) }); const info = await result.json(); if ( info.scope && Array.isArray(info.scope) && info.scope.includes(KEY_SCOPE) ) { return info.user; } } catch (e) { // gulp } return null; } }; ================================================ FILE: server/initScript.js ================================================ const html = require('choo/html'); const raw = require('choo/html/raw'); const config = require('./config'); const clientConstants = require('./clientConstants'); let sentry = ''; if (config.sentry_id) { //eslint-disable-next-line node/no-missing-require const version = require('../dist/version.json'); sentry = ` var SENTRY_CONFIG = { dsn: '${config.sentry_id}', release: '${version.version}', beforeSend: function (data) { var hash = window.location.hash; if (hash) { return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); } return data; } } `; } module.exports = function(state) { const authConfig = state.authConfig ? `var AUTH_CONFIG = ${JSON.stringify(state.authConfig)};` : ''; /* eslint-disable no-useless-escape */ const jsconfig = ` var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); if (isIE && !isUnsupportedPage) { window.location.assign('/unsupported/ie'); } if ( // Firefox < 50 /firefox/i.test(navigator.userAgent) && parseInt(navigator.userAgent.match(/firefox\\/*([^\\n\\r]*)\./i)[1], 10) < 50 ) { window.location.assign('/unsupported/outdated'); } var LIMITS = ${JSON.stringify(clientConstants.LIMITS)}; var DEFAULTS = ${JSON.stringify(clientConstants.DEFAULTS)}; var PREFS = ${JSON.stringify(state.prefs)}; var downloadMetadata = ${ state.downloadMetadata ? raw(JSON.stringify(state.downloadMetadata)) : '{}' }; ${authConfig}; ${sentry} `; return state.cspNonce ? html` ` : ''; }; ================================================ FILE: server/keychain.js ================================================ const { Crypto } = require('@peculiar/webcrypto'); const crypto = new Crypto(); const encoder = new TextEncoder(); const decoder = new TextDecoder(); module.exports = class Keychain { constructor(secretKeyB64) { if (secretKeyB64) { this.rawSecret = new Uint8Array(Buffer.from(secretKeyB64, 'base64')); } else { throw new Error('key is required'); } this.secretKeyPromise = crypto.subtle.importKey( 'raw', this.rawSecret, 'HKDF', false, ['deriveKey'] ); this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) { return crypto.subtle.deriveKey( { name: 'HKDF', salt: new Uint8Array(), info: encoder.encode('metadata'), hash: 'SHA-256' }, secretKey, { name: 'AES-GCM', length: 128 }, false, ['decrypt'] ); }); } async decryptMetadata(ciphertext) { const metaKey = await this.metaKeyPromise; const plaintext = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: new Uint8Array(12), tagLength: 128 }, metaKey, ciphertext ); return JSON.parse(decoder.decode(plaintext)); } }; ================================================ FILE: server/layout.js ================================================ const html = require('choo/html'); const assets = require('../common/assets'); const initScript = require('./initScript'); module.exports = function(state, body = '') { return html` ${state.title} ${body} ${initScript(state)} `; }; ================================================ FILE: server/limiter.js ================================================ const { Transform } = require('stream'); class Limiter extends Transform { constructor(limit) { super(); this.limit = limit; this.length = 0; } _transform(chunk, encoding, callback) { this.length += chunk.length; this.push(chunk); if (this.length > this.limit) { console.error('LIMIT', this.length, this.limit); return callback(new Error('limit')); } callback(); } } module.exports = Limiter; ================================================ FILE: server/locale.js ================================================ const fs = require('fs'); const path = require('path'); const { FluentBundle } = require('@fluent/bundle'); const localesPath = path.resolve(__dirname, '../public/locales'); const locales = fs.readdirSync(localesPath); function makeBundle(locale) { const bundle = new FluentBundle(locale, { useIsolating: false }); bundle.addMessages( fs.readFileSync(path.resolve(localesPath, locale, 'send.ftl'), 'utf8') ); return [locale, bundle]; } const bundles = new Map(locales.map(makeBundle)); module.exports = function getTranslator(locale) { const defaultBundle = bundles.get('en-US'); const bundle = bundles.get(locale) || defaultBundle; return function(id, data) { if (bundle.hasMessage(id)) { return bundle.format(bundle.getMessage(id), data); } return defaultBundle.format(defaultBundle.getMessage(id), data); }; }; ================================================ FILE: server/log.js ================================================ const conf = require('./config'); const isProduction = conf.env === 'production'; const mozlog = require('mozlog')({ app: 'FirefoxSend', level: isProduction ? 'INFO' : 'verbose', fmt: isProduction ? 'heka' : 'pretty', debug: !isProduction }); module.exports = mozlog; ================================================ FILE: server/metadata.js ================================================ const crypto = require('crypto'); function makeToken(secret, counter) { const hmac = crypto.createHmac('sha256', secret); hmac.update(String(counter)); return hmac.digest('hex'); } class Metadata { constructor(obj, storage) { this.id = obj.id; this.dl = +obj.dl || 0; this.dlToken = +obj.dlToken || 0; this.dlimit = +obj.dlimit || 1; this.pwd = !!+obj.pwd; this.owner = obj.owner; this.metadata = obj.metadata; this.auth = obj.auth; this.nonce = obj.nonce; this.flagged = !!obj.flagged; this.dead = !!obj.dead; this.fxa = !!+obj.fxa; this.storage = storage; } async getDownloadToken() { if (this.dlToken >= this.dlimit) { throw new Error('limit'); } this.dlToken = await this.storage.incrementField(this.id, 'dlToken'); // another request could have also incremented if (this.dlToken > this.dlimit) { throw new Error('limit'); } return makeToken(this.owner, this.dlToken); } async verifyDownloadToken(token) { const validTokens = Array.from({ length: this.dlToken }, (_, i) => makeToken(this.owner, i + 1) ); return validTokens.includes(token); } } module.exports = Metadata; ================================================ FILE: server/middleware/auth.js ================================================ const assert = require('assert'); const crypto = require('crypto'); const storage = require('../storage'); const fxa = require('../fxa'); module.exports = { hmac: async function(req, res, next) { const id = req.params.id; const authHeader = req.header('Authorization'); if (id && authHeader) { try { const auth = req.header('Authorization').split(' ')[1]; const meta = await storage.metadata(id); if (!meta) { return res.sendStatus(404); } const hmac = crypto.createHmac( 'sha256', Buffer.from(meta.auth, 'base64') ); hmac.update(Buffer.from(meta.nonce, 'base64')); const verifyHash = hmac.digest(); if (crypto.timingSafeEqual(verifyHash, Buffer.from(auth, 'base64'))) { req.nonce = crypto.randomBytes(16).toString('base64'); storage.setField(id, 'nonce', req.nonce); res.set('WWW-Authenticate', `send-v1 ${req.nonce}`); req.authorized = true; req.meta = meta; } else { res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); req.authorized = false; } } catch (e) { req.authorized = false; } } if (req.authorized) { next(); } else { res.sendStatus(401); } }, owner: async function(req, res, next) { const id = req.params.id; const ownerToken = req.body.owner_token; if (id && ownerToken) { try { req.meta = await storage.metadata(id); if (!req.meta || req.meta.dead) { return res.sendStatus(404); } const metaOwner = Buffer.from(req.meta.owner, 'utf8'); const owner = Buffer.from(ownerToken, 'utf8'); assert(metaOwner.length > 0); assert(metaOwner.length === owner.length); req.authorized = crypto.timingSafeEqual(metaOwner, owner); } catch (e) { req.authorized = false; } } if (req.authorized) { next(); } else { res.sendStatus(401); } }, fxa: async function(req, res, next) { const authHeader = req.header('Authorization'); if (authHeader && /^Bearer\s/i.test(authHeader)) { const token = authHeader.split(' ')[1]; req.user = await fxa.verify(token); } if (req.user) { next(); } else { res.sendStatus(401); } }, dlToken: async function(req, res, next) { const authHeader = req.header('Authorization'); if (authHeader && /^Bearer\s/i.test(authHeader)) { const token = authHeader.split(' ')[1]; const id = req.params.id; req.meta = await storage.metadata(id); if (!req.meta || req.meta.dead) { return res.sendStatus(404); } req.authorized = await req.meta.verifyDownloadToken(token); } if (req.authorized) { next(); } else { res.sendStatus(401); } } }; ================================================ FILE: server/middleware/language.js ================================================ const { availableLanguages } = require('../../package.json'); const config = require('../config'); const fs = require('fs'); const path = require('path'); const { negotiateLanguages } = require('@fluent/langneg'); const langData = require('cldr-core/supplemental/likelySubtags.json'); // We return early in the middleware if the lang header is long. // If that ever changes we should re-evaluate this regex. // eslint-disable-next-line security/detect-unsafe-regex const acceptLanguages = /(([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?/g; function allLangs() { return fs.readdirSync(path.join(__dirname, '..', '..', 'public', 'locales')); } const languages = config.l10n_dev ? allLangs() : availableLanguages; module.exports = function(req, res, next) { const header = req.headers['accept-language'] || 'en-US'; if (header.length > 255) { req.language = 'en-US'; return next(); } const langs = header.replace(/\s/g, '').match(acceptLanguages) || ['en-US']; const preferred = langs .map(l => { const parts = l.split(';'); return { locale: parts[0], q: parts[1] ? parseFloat(parts[1].split('=')[1]) : 1 }; }) .sort((a, b) => b.q - a.q) .map(x => x.locale); req.language = negotiateLanguages(preferred, languages, { strategy: 'lookup', likelySubtags: langData.supplemental.likelySubtags, defaultLocale: 'en-US' })[0]; next(); }; ================================================ FILE: server/readme.md ================================================ # Server Code The server provides the API, serves static assets, and renders the pages for Send. The production entrypoint is [prod.js](./bin/prod.js) and the development entrypoint is [dev.js](./bin/dev.js) via `webpack-dev-server`. ## Server configuration [config.js](./config.js) contains the schema for our configuration options. Environment variables are the preferred method for setting configuration. ## Middleware Contains authentication and localization middleware. ## Routes Contains all the server routes and handlers for the API and pages ## Storage Contains implementations of possible storage engines for the files and metadata ================================================ FILE: server/routes/delete.js ================================================ const storage = require('../storage'); const { statDeleteEvent } = require('../amplitude'); module.exports = async function(req, res) { try { const id = req.params.id; const meta = req.meta; const ttl = await storage.ttl(id); await storage.kill(id); res.sendStatus(200); statDeleteEvent({ id, ip: req.ip, country: req.geo.country, state: req.geo.state, owner: meta.owner, download_count: meta.dl, ttl, agent: req.ua.browser.name || req.ua.ua.substring(0, 6) }); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/done.js ================================================ const storage = require('../storage'); const { statDownloadEvent } = require('../amplitude'); module.exports = async function(req, res) { try { const id = req.params.id; const meta = req.meta; const ttl = await storage.ttl(id); statDownloadEvent({ id, ip: req.ip, owner: meta.owner, download_count: meta.dl, ttl, agent: req.ua.browser.name || req.ua.ua.substring(0, 6) }); await storage.incrementField(id, 'dl'); if (meta.dl + 1 >= meta.dlimit) { // Only dlimit number of tokens will be issued // after which /download/token will return 403 // however the protocol doesn't prevent one token // from making all the downloads and assumes // clients are well behaved. If this becomes // a problem we can keep track of used tokens. await storage.kill(id); } res.sendStatus(200); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/download.js ================================================ const storage = require('../storage'); module.exports = async function(req, res) { const id = req.params.id; try { const { length, stream } = await storage.get(id); res.writeHead(200, { 'Content-Type': 'application/octet-stream', 'Content-Length': length }); stream.pipe(res); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/exists.js ================================================ const storage = require('../storage'); module.exports = async (req, res) => { try { const meta = await storage.metadata(req.params.id); if (!meta || meta.dead) { return res.sendStatus(404); } res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); res.send({ requiresPassword: meta.pwd }); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/filelist.js ================================================ const crypto = require('crypto'); const config = require('../config'); const storage = require('../storage'); const Limiter = require('../limiter'); function id(user, kid) { const sha = crypto.createHash('sha256'); sha.update(user); sha.update(kid); const hash = sha.digest('hex'); return `filelist-${hash}`; } module.exports = { async get(req, res) { const kid = req.params.id; try { const fileId = id(req.user, kid); const { length, stream } = await storage.get(fileId); res.writeHead(200, { 'Content-Type': 'application/octet-stream', 'Content-Length': length }); stream.pipe(res); } catch (e) { res.sendStatus(404); } }, async post(req, res) { const kid = req.params.id; try { const limiter = new Limiter(1024 * 1024 * 10); const fileStream = req.pipe(limiter); await storage.set( id(req.user, kid), fileStream, null, config.max_expire_seconds ); res.sendStatus(200); } catch (e) { if (e.message === 'limit') { return res.sendStatus(413); } res.sendStatus(500); } } }; ================================================ FILE: server/routes/index.js ================================================ const crypto = require('crypto'); const bodyParser = require('body-parser'); const helmet = require('helmet'); const uaparser = require('ua-parser-js'); const storage = require('../storage'); const config = require('../config'); const auth = require('../middleware/auth'); const language = require('../middleware/language'); const pages = require('./pages'); const filelist = require('./filelist'); const clientConstants = require('../clientConstants'); const IS_DEV = config.env === 'development'; const ID_REGEX = '([0-9a-fA-F]{10,16})'; module.exports = function(app) { app.set('trust proxy', true); app.use(helmet()); app.use( helmet.hsts({ maxAge: 31536000, force: !IS_DEV }) ); app.use(function(req, res, next) { req.ua = uaparser(req.header('user-agent')); next(); }); app.use(function(req, res, next) { req.cspNonce = crypto.randomBytes(16).toString('hex'); next(); }); if (!IS_DEV) { let csp = { directives: { defaultSrc: ["'self'"], connectSrc: [ "'self'", config.base_url.replace(/^https:\/\//, 'wss://') ], imgSrc: ["'self'"], scriptSrc: [ "'self'", function(req) { return `'nonce-${req.cspNonce}'`; } ], formAction: ["'none'"], frameAncestors: ["'none'"], objectSrc: ["'none'"], reportUri: '/__cspreport__' } }; if (config.fxa_client_id) { csp.directives.connectSrc.push('https://accounts.firefox.com'); csp.directives.connectSrc.push('https://*.accounts.firefox.com'); csp.directives.imgSrc.push('https://firefoxusercontent.com'); csp.directives.imgSrc.push('https://secure.gravatar.com'); } if (config.sentry_id) { csp.directives.connectSrc.push(config.sentry_host); } if ( /^https:\/\/.*\.dev\.lcip\.org$/.test(config.base_url) || /^https:\/\/.*\.send\.nonprod\.cloudops\.mozgcp\.net$/.test( config.base_url ) ) { csp.directives.connectSrc.push('https://*.dev.lcip.org'); csp.directives.imgSrc.push('https://*.dev.lcip.org'); } if (config.fxa_csp_oauth_url != '') { csp.directives.connectSrc.push(config.fxa_csp_oauth_url); } if (config.fxa_csp_content_url != '') { csp.directives.connectSrc.push(config.fxa_csp_content_url); } if (config.fxa_csp_profile_url != '') { csp.directives.connectSrc.push(config.fxa_csp_profile_url); } if (config.fxa_csp_profileimage_url != '') { csp.directives.imgSrc.push(config.fxa_csp_profileimage_url); } app.use(helmet.contentSecurityPolicy(csp)); } app.use(function(req, res, next) { res.set('Pragma', 'no-cache'); res.set( 'Cache-Control', 'private, no-cache, no-store, must-revalidate, max-age=0' ); next(); }); app.use(function(req, res, next) { try { // set by the load balancer const [country, state] = req.header('X-Client-Geo-Location').split(','); req.geo = { country, state }; } catch (e) { req.geo = {}; } next(); }); app.use(bodyParser.json()); app.use(bodyParser.text()); app.get('/', language, pages.index); app.get('/config', function(req, res) { res.json(clientConstants); }); app.get('/error', language, pages.blank); app.get('/oauth', language, pages.blank); app.get('/login', language, pages.index); app.get('/report', language, pages.blank); app.get('/app.webmanifest', language, require('./webmanifest')); app.get(`/download/:id${ID_REGEX}`, language, pages.download); app.get('/unsupported/:reason', language, pages.unsupported); app.get(`/api/download/token/:id${ID_REGEX}`, auth.hmac, require('./token')); app.get(`/api/download/:id${ID_REGEX}`, auth.dlToken, require('./download')); app.get( `/api/download/blob/:id${ID_REGEX}`, auth.dlToken, require('./download') ); app.post( `/api/download/done/:id${ID_REGEX}`, auth.dlToken, require('./done.js') ); app.get(`/api/exists/:id${ID_REGEX}`, require('./exists')); app.get(`/api/metadata/:id${ID_REGEX}`, auth.hmac, require('./metadata')); app.get('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.get); app.post('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.post); // app.post('/api/upload', auth.fxa, require('./upload')); app.post(`/api/delete/:id${ID_REGEX}`, auth.owner, require('./delete')); app.post(`/api/password/:id${ID_REGEX}`, auth.owner, require('./password')); app.post(`/api/params/:id${ID_REGEX}`, auth.owner, require('./params')); app.post(`/api/info/:id${ID_REGEX}`, auth.owner, require('./info')); app.post(`/api/report/:id${ID_REGEX}`, auth.hmac, require('./report')); app.post('/api/metrics', require('./metrics')); app.get('/__version__', function(req, res) { // eslint-disable-next-line node/no-missing-require res.sendFile(require.resolve('../../dist/version.json')); }); app.get('/__lbheartbeat__', function(req, res) { res.sendStatus(200); }); app.get('/__heartbeat__', async (req, res) => { try { await storage.ping(); res.sendStatus(200); } catch (e) { res.sendStatus(500); } }); }; ================================================ FILE: server/routes/info.js ================================================ const storage = require('../storage'); module.exports = async function(req, res) { try { const ttl = await storage.ttl(req.params.id); return res.send({ dlimit: +req.meta.dlimit, dtotal: +req.meta.dl, ttl }); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/metadata.js ================================================ const storage = require('../storage'); module.exports = async function(req, res) { const id = req.params.id; const meta = req.meta; try { if (meta.dead && !meta.flagged) { return res.sendStatus(404); } const ttl = await storage.ttl(id); res.send({ metadata: meta.metadata, flagged: !!meta.flagged, finalDownload: meta.dlToken + 1 === meta.dlimit, ttl }); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/metrics.js ================================================ const { sendBatch, clientEvent } = require('../amplitude'); module.exports = async function(req, res) { try { const data = JSON.parse(req.body); // see http://crbug.com/490015 const deltaT = Date.now() - data.now; const events = data.events.map(e => clientEvent( e, req.ua, data.lang, data.session_id + deltaT, deltaT, data.platform, req.geo.country, req.geo.state ) ); const status = await sendBatch(events); res.sendStatus(status); } catch (e) { res.sendStatus(500); } }; ================================================ FILE: server/routes/pages.js ================================================ const routes = require('../../app/routes'); const storage = require('../storage'); const state = require('../state'); function stripEvents(str) { // For CSP we need to remove all the event handler placeholders. // It's ok, app.js will add them when it attaches to the DOM. return str.replace(/\son\w+=""/g, ''); } module.exports = { index: async function(req, res) { const appState = await state(req); res.send(stripEvents(routes().toString('/blank', appState))); }, blank: async function(req, res) { const appState = await state(req); res.send(stripEvents(routes().toString('/blank', appState))); }, download: async function(req, res, next) { const id = req.params.id; const appState = await state(req); try { const { nonce, pwd, dead, flagged } = await storage.metadata(id); if (dead && !flagged) { return next(); } res.set('WWW-Authenticate', `send-v1 ${nonce}`); res.send( stripEvents( routes().toString( `/download/${id}`, Object.assign(appState, { downloadMetadata: { nonce, pwd, flagged } }) ) ) ); } catch (e) { next(); } }, unsupported: async function(req, res) { const appState = await state(req); res.send( stripEvents( routes().toString(`/unsupported/${req.params.reason}`, appState) ) ); }, notfound: async function(req, res) { const appState = await state(req); res .status(404) .send( stripEvents( routes().toString( '/404', Object.assign(appState, { downloadMetadata: { status: 404 } }) ) ) ); } }; ================================================ FILE: server/routes/params.js ================================================ const config = require('../config'); const storage = require('../storage'); module.exports = function(req, res) { const max = req.meta.fxa ? config.max_downloads : config.anon_max_downloads; const dlimit = req.body.dlimit; if (!dlimit || dlimit > max) { return res.sendStatus(400); } try { storage.setField(req.params.id, 'dlimit', dlimit); res.sendStatus(200); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/password.js ================================================ const storage = require('../storage'); module.exports = function(req, res) { const id = req.params.id; const auth = req.body.auth; if (!auth) { return res.sendStatus(400); } try { storage.setField(id, 'auth', auth); storage.setField(id, 'pwd', 1); res.sendStatus(200); } catch (e) { return res.sendStatus(404); } }; ================================================ FILE: server/routes/report.js ================================================ const storage = require('../storage'); const { statReportEvent } = require('../amplitude'); module.exports = async function(req, res) { try { const id = req.params.id; const meta = await storage.metadata(id); storage.flag(id); statReportEvent({ id, ip: req.ip, country: req.geo.country, state: req.geo.state, owner: meta.owner, reason: req.body.reason, download_limit: meta.dlimit, download_count: meta.dl, agent: req.ua.browser.name || req.ua.ua.substring(0, 6) }); res.sendStatus(200); } catch (e) { res.sendStatus(404); } }; ================================================ FILE: server/routes/token.js ================================================ module.exports = async function(req, res) { const meta = req.meta; try { if (meta.dead || meta.flagged) { return res.sendStatus(404); } const token = await meta.getDownloadToken(); res.send({ token }); } catch (e) { if (e.message === 'limit') { return res.sendStatus(403); } res.sendStatus(404); } }; ================================================ FILE: server/routes/upload.js ================================================ const crypto = require('crypto'); const storage = require('../storage'); const config = require('../config'); const mozlog = require('../log'); const Limiter = require('../limiter'); const { encryptedSize } = require('../../app/utils'); const log = mozlog('send.upload'); module.exports = async function(req, res) { const newId = crypto.randomBytes(8).toString('hex'); const metadata = req.header('X-File-Metadata'); const auth = req.header('Authorization'); if (!metadata || !auth) { return res.sendStatus(400); } const owner = crypto.randomBytes(10).toString('hex'); const meta = { owner, metadata, auth: auth.split(' ')[1], nonce: crypto.randomBytes(16).toString('base64') }; try { const limiter = new Limiter(encryptedSize(config.max_file_size)); const fileStream = req.pipe(limiter); //this hasn't been updated to expiration time setting yet //if you want to fallback to this code add this await storage.set(newId, fileStream, meta, config.default_expire_seconds); const protocol = config.env === 'production' ? 'https' : req.protocol; const url = `${protocol}://${req.get('host')}/download/${newId}/`; res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); res.json({ url, owner: meta.owner, id: newId }); } catch (e) { if (e.message === 'limit') { return res.sendStatus(413); } log.error('upload', e); res.sendStatus(500); } }; ================================================ FILE: server/routes/webmanifest.js ================================================ const assets = require('../../common/assets'); module.exports = function(req, res) { const manifest = { name: 'Firefox Send', short_name: 'Send', lang: req.language, icons: [ { src: assets.get('android-chrome-192x192.png'), type: 'image/png', sizes: '192x192' }, { src: assets.get('android-chrome-512x512.png'), type: 'image/png', sizes: '512x512' } ], start_url: '/', display: 'standalone', orientation: 'portrait', theme_color: '#220033', background_color: 'white' }; res.set('Content-Type', 'application/manifest+json'); res.json(manifest); }; ================================================ FILE: server/routes/ws.js ================================================ const crypto = require('crypto'); const storage = require('../storage'); const config = require('../config'); const mozlog = require('../log'); const Limiter = require('../limiter'); const fxa = require('../fxa'); const { statUploadEvent } = require('../amplitude'); const { encryptedSize } = require('../../app/utils'); const { Transform } = require('stream'); const log = mozlog('send.upload'); module.exports = function(ws, req) { let fileStream; ws.on('close', e => { if (e !== 1000 && fileStream !== undefined) { fileStream.destroy(); } }); ws.once('message', async function(message) { try { const newId = crypto.randomBytes(8).toString('hex'); const owner = crypto.randomBytes(10).toString('hex'); const fileInfo = JSON.parse(message); const timeLimit = fileInfo.timeLimit || config.default_expire_seconds; const dlimit = fileInfo.dlimit || 1; const metadata = fileInfo.fileMetadata; const auth = fileInfo.authorization; const user = await fxa.verify(fileInfo.bearer); const maxFileSize = user ? config.max_file_size : config.anon_max_file_size; const maxExpireSeconds = user ? config.max_expire_seconds : config.anon_max_expire_seconds; const maxDownloads = user ? config.max_downloads : config.anon_max_downloads; if (config.fxa_required && !user) { ws.send( JSON.stringify({ error: 401 }) ); return ws.close(); } if ( !metadata || !auth || timeLimit <= 0 || timeLimit > maxExpireSeconds || dlimit > maxDownloads ) { ws.send( JSON.stringify({ error: 400 }) ); return ws.close(); } const meta = { owner, fxa: user ? 1 : 0, metadata, dlimit, auth: auth.split(' ')[1], nonce: crypto.randomBytes(16).toString('base64') }; const protocol = config.env === 'production' ? 'https' : req.protocol; const url = `${protocol}://${req.get('host')}/download/${newId}/`; ws.send( JSON.stringify({ url, ownerToken: meta.owner, id: newId }) ); const limiter = new Limiter(encryptedSize(maxFileSize)); const eof = new Transform({ transform: function(chunk, encoding, callback) { if (chunk.length === 1 && chunk[0] === 0) { this.push(null); } else { this.push(chunk); } callback(); } }); const wsStream = ws.constructor.createWebSocketStream(ws); fileStream = wsStream.pipe(eof).pipe(limiter); // limiter needs to be the last in the chain await storage.set(newId, fileStream, meta, timeLimit); if (ws.readyState === 1) { // if the socket is closed by a cancelled upload the stream // ends without an error so we need to check the state // before sending a reply. // TODO: we should handle cancelled uploads differently // in order to avoid having to check socket state and clean // up storage, possibly with an exception that we can catch. ws.send(JSON.stringify({ ok: true })); statUploadEvent({ id: newId, ip: req.ip, country: req.geo.country, state: req.geo.state, owner, dlimit, timeLimit, anonymous: !user, size: limiter.length, agent: req.ua.browser.name || req.ua.ua.substring(0, 6) }); } } catch (e) { log.error('upload', e); if (ws.readyState === 1) { ws.send( JSON.stringify({ error: e === 'limit' ? 413 : 500 }) ); } } ws.close(); }); }; ================================================ FILE: server/state.js ================================================ const config = require('./config'); const layout = require('./layout'); const assets = require('../common/assets'); const getTranslator = require('./locale'); const { getFxaConfig } = require('./fxa'); module.exports = async function(req) { const locale = req.language || 'en-US'; let authConfig = null; let robots = 'none'; if (req.route && req.route.path === '/') { robots = 'all'; } if (config.fxa_client_id) { try { authConfig = await getFxaConfig(); authConfig.client_id = config.fxa_client_id; authConfig.fxa_required = config.fxa_required; } catch (e) { if (config.auth_required) { throw new Error('fxa_required is set but no config was found'); } // continue without accounts } } const prefs = {}; if (config.survey_url) { prefs.surveyUrl = config.survey_url; } return { archive: { numFiles: 0 }, locale, capabilities: { account: false }, translate: getTranslator(locale), title: 'Firefox Send', description: 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.', baseUrl: config.base_url, ui: {}, storage: { files: [] }, fileInfo: {}, cspNonce: req.cspNonce, user: { avatar: assets.get('user.svg'), loggedIn: false }, robots, authConfig, prefs, layout }; }; ================================================ FILE: server/storage/fs.js ================================================ const fss = require('fs'); const fs = fss.promises; const path = require('path'); const mkdirp = require('mkdirp'); class FSStorage { constructor(config, log) { this.log = log; this.dir = config.file_dir; mkdirp.sync(this.dir); } async length(id) { const result = await fs.stat(path.join(this.dir, id)); return result.size; } getStream(id) { return fss.createReadStream(path.join(this.dir, id)); } set(id, file) { return new Promise((resolve, reject) => { const filepath = path.join(this.dir, id); const fstream = fss.createWriteStream(filepath); file.pipe(fstream); file.on('error', err => { fstream.destroy(err); }); fstream.on('error', err => { this.del(id); reject(err); }); fstream.on('finish', resolve); }); } async del(id) { try { await fs.unlink(path.join(this.dir, id)); } catch (e) { // ignore local fs issues } } ping() { return Promise.resolve(); } } module.exports = FSStorage; ================================================ FILE: server/storage/gcs.js ================================================ const { Storage } = require('@google-cloud/storage'); const storage = new Storage(); class GCSStorage { constructor(config, log) { this.bucket = storage.bucket(config.gcs_bucket); this.log = log; } async length(id) { const data = await this.bucket.file(id).getMetadata(); return data[0].size; } getStream(id) { return this.bucket.file(id).createReadStream({ validation: false }); } set(id, file) { return new Promise((resolve, reject) => { file .pipe( this.bucket.file(id).createWriteStream({ validation: false, resumable: true }) ) .on('error', reject) .on('finish', resolve); }); } del(id) { return this.bucket.file(id).delete(); } ping() { return this.bucket.exists(); } } module.exports = GCSStorage; ================================================ FILE: server/storage/index.js ================================================ const config = require('../config'); const Metadata = require('../metadata'); const mozlog = require('../log'); const createRedisClient = require('./redis'); function getPrefix(seconds) { return Math.max(Math.floor(seconds / 86400), 1); } class DB { constructor(config) { let Storage = null; if (config.s3_bucket) { Storage = require('./s3'); } else if (config.gcs_bucket) { Storage = require('./gcs'); } else { Storage = require('./fs'); } this.log = mozlog('send.storage'); this.storage = new Storage(config, this.log); this.redis = createRedisClient(config); this.redis.on('error', err => { this.log.error('Redis:', err); }); } async ttl(id) { const result = await this.redis.ttlAsync(id); return Math.ceil(result) * 1000; } async getPrefixedInfo(id) { const [prefix, dead, flagged] = await this.redis.hmgetAsync( id, 'prefix', 'dead', 'flagged' ); return { filePath: `${prefix}-${id}`, flagged, dead }; } async length(id) { const { filePath } = await this.getPrefixedInfo(id); return this.storage.length(filePath); } async get(id) { const info = await this.getPrefixedInfo(id); if (info.dead || info.flagged) { throw new Error(info.flagged ? 'flagged' : 'dead'); } const length = await this.storage.length(info.filePath); return { length, stream: this.storage.getStream(info.filePath) }; } async set(id, file, meta, expireSeconds = config.default_expire_seconds) { const prefix = getPrefix(expireSeconds); const filePath = `${prefix}-${id}`; await this.storage.set(filePath, file); if (meta) { this.redis.hmset(id, { prefix, ...meta }); } else { this.redis.hset(id, 'prefix', prefix); } this.redis.expire(id, expireSeconds); } setField(id, key, value) { this.redis.hset(id, key, value); } async incrementField(id, key, increment = 1) { return await this.redis.hincrbyAsync(id, key, increment); } async kill(id) { const { filePath, dead } = await this.getPrefixedInfo(id); if (!dead) { this.redis.hset(id, 'dead', 1); this.storage.del(filePath); } } async flag(id) { await this.kill(id); this.redis.hset(id, 'flagged', 1); } async del(id) { const { filePath } = await this.getPrefixedInfo(id); this.redis.del(id); this.storage.del(filePath); } async ping() { await this.redis.pingAsync(); await this.storage.ping(); } async metadata(id) { const result = await this.redis.hgetallAsync(id); return result && new Metadata({ id, ...result }, this); } } module.exports = new DB(config); ================================================ FILE: server/storage/redis.js ================================================ const promisify = require('util').promisify; module.exports = function(config) { const redis_lib = config.env === 'development' && config.redis_host === 'mock' ? 'redis-mock' : 'redis'; //eslint-disable-next-line security/detect-non-literal-require const redis = require(redis_lib); const client = redis.createClient({ host: config.redis_host, retry_strategy: options => { if (options.total_retry_time > config.redis_retry_time) { client.emit('error', 'Retry time exhausted'); return new Error('Retry time exhausted'); } return config.redis_retry_delay; } }); client.ttlAsync = promisify(client.ttl); client.hgetallAsync = promisify(client.hgetall); client.hgetAsync = promisify(client.hget); client.hincrbyAsync = promisify(client.hincrby); client.hmgetAsync = promisify(client.hmget); client.pingAsync = promisify(client.ping); client.existsAsync = promisify(client.exists); return client; }; ================================================ FILE: server/storage/s3.js ================================================ const AWS = require('aws-sdk'); class S3Storage { constructor(config, log) { this.bucket = config.s3_bucket; this.log = log; const cfg = {}; if (config.s3_endpoint != '') { cfg['endpoint'] = config.s3_endpoint; } cfg['s3ForcePathStyle'] = config.s3_use_path_style_endpoint AWS.config.update(cfg); this.s3 = new AWS.S3(); } async length(id) { const result = await this.s3 .headObject({ Bucket: this.bucket, Key: id }) .promise(); return Number(result.ContentLength); } getStream(id) { return this.s3.getObject({ Bucket: this.bucket, Key: id }).createReadStream(); } set(id, file) { const upload = this.s3.upload({ Bucket: this.bucket, Key: id, Body: file }); file.on('error', () => upload.abort()); return upload.promise(); } del(id) { return this.s3.deleteObject({ Bucket: this.bucket, Key: id }).promise(); } ping() { return this.s3.headBucket({ Bucket: this.bucket }).promise(); } } module.exports = S3Storage; ================================================ FILE: tailwind.config.js ================================================ const colors = { transparent: 'transparent', black: '#000000', 'grey-90': '#0c0c0d', 'grey-80': '#2a2a2e', 'grey-70': '#38383d', 'grey-60': '#4a4a4f', 'grey-50': '#737373', grey: '#b1b1b3', 'grey-40': '#b1b1b3', 'grey-30': '#d7d7db', 'grey-banner': '#f0f0f4', 'grey-transparent': 'hsla(250, 13%, 9%, .2)', 'grey-20': '#ededf0', 'grey-10': '#f9f9fa', white: '#ffffff', 'red-90': '#3e0200', 'red-80': '#5a0002', 'red-70': '#a4000f', 'red-60': '#d70022', red: '#d70022', 'red-50': '#ff0039', // unspec 'red-40': '#ff3363', 'red-30': '#ff99aa', 'orange-90': '#3e1300', 'orange-80': '#712b00', 'orange-70': '#a44900', 'orange-60': '#d76e00', 'orange-50': '#ff9400', // unspec 'orange-40': '#ffb24c', 'orange-30': '#ffd399', 'yellow-90': '#3e2800', 'yellow-80': '#715100', 'yellow-70': '#a47f00', 'yellow-60': '#d7b600', yellow: '#d7b600', 'yellow-50': '#ffe900', 'yellow-40': '#ffed4c', 'yellow-30': '#fff599', // 'green-darkest': '#003706', // 'green-darker': '#006504', // 'green-dark': '#058b00', // green: '#12bc00', // 'green-light': '#51d88a', // 'green-lighter': '#a2f5bf', // 'green-lightest': '#e3fcec', // 'teal-darkest': '#0d3331', // 'teal-darker': '#20504f', // 'teal-dark': '#38a89d', // teal: '#4dc0b5', // 'teal-light': '#64d5ca', // 'teal-lighter': '#a0f0ed', // 'teal-lightest': '#e8fffe', 'blue-90': '#000f40', 'blue-80': '#002275', 'blue-70': '#003eaa', 'blue-60': '#0060df', 'blue-50': '#0a84ff', blue: '#0a84ff', 'blue-40': '#45a1ff', 'blue-30': '#99ccff', 'blue-20': '#cce6ff', 'ink-90': '#0f1126', 'ink-80': '#202340', 'ink-70': '#363959', // 'indigo-darkest': '#191e38', // 'indigo-darker': '#2f365f', // 'indigo-dark': '#5661b3', // indigo: '#6574cd', // 'indigo-light': '#7886d7', // 'indigo-lighter': '#b2b7ff', // 'indigo-lightest': '#e6e8ff', 'purple-90': '#25003e', 'purple-80': '#440071', 'purple-70': '#6200a4', 'purple-60': '#8000d7', 'purple-50': '#9400ff', 'purple-40': '#ad3bff', 'purple-30': '#c069ff', 'purple-20': '#d7a3ff', // 'pink-darkest': '#451225', // 'pink-darker': '#6f213f', // 'pink-dark': '#eb5286', // pink: '#f66d9b', // 'pink-light': '#fa7ea8', // 'pink-lighter': '#ffbbca', // 'pink-lightest': '#ffebef', cloud: 'rgba(255, 255, 255, 0.8)', violet: 'hsl(258, 57%, 35%)' }; module.exports = { theme: { colors: colors, screens: { sm: '576px', md: '768px', lg: '992px', xl: '1200px', dark: { raw: '(prefers-color-scheme: dark)' } }, fontFamily: { sans: [ 'Inter', 'system-ui', 'BlinkMacSystemFont', '-apple-system', 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'sans-serif' ], serif: [ 'Constantia', 'Lucida Bright', 'Lucidabright', 'Lucida Serif', 'Lucida', 'DejaVu Serif', 'Bitstream Vera Serif', 'Liberation Serif', 'Georgia', 'serif' ], mono: [ 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace' ] }, fontSize: { xs: '.75rem', // 12px sm: '.875rem', // 14px base: '1rem', // 16px lg: '1.125rem', // 18px xl: '1.25rem', // 20px '2xl': '1.5rem', // 24px '3xl': '2rem', // 32px '4xl': '2.25rem', // 36px '5xl': '3rem' // 48px }, fontWeight: { hairline: 100, thin: 200, light: 300, normal: 400, medium: 500, semibold: 600, bold: 700, extrabold: 800, black: 900 }, lineHeight: { none: 1, tight: 1.25, normal: 1.5, loose: 1.75 }, letterSpacing: { tight: '-0.05em', normal: '0', wide: '0.05em' }, textColor: colors, backgroundColor: colors, backgroundSize: { auto: 'auto', cover: 'cover', contain: 'contain' }, borderWidth: { default: '1px', '0': '0', '2': '2px', '4': '4px', '8': '8px' }, borderColor: global.Object.assign({ default: colors['grey-30'] }, colors), borderRadius: { none: '0', sm: '.125rem', default: '.25rem', lg: '.5rem', xl: '1rem', full: '9999px' }, width: { auto: 'auto', px: '1px', '0': '0', '1': '0.25rem', '2': '0.5rem', '3': '0.75rem', '4': '1rem', '5': '1.25rem', '6': '1.5rem', '8': '2rem', '10': '2.5rem', '12': '3rem', '16': '4rem', '24': '6rem', '32': '8rem', '48': '12rem', '64': '16rem', '128': '32rem', '1/2': '50%', '1/3': '33.33333%', '2/3': '66.66667%', '1/4': '25%', '3/4': '75%', '1/5': '20%', '2/5': '40%', '3/5': '60%', '4/5': '80%', '1/6': '16.66667%', '5/6': '83.33333%', full: '100%', screen: '100vw' }, height: { auto: 'auto', px: '1px', '0': '0', '1': '0.25rem', '2': '0.5rem', '3': '0.75rem', '4': '1rem', '5': '1.25rem', '6': '1.5rem', '8': '2rem', '10': '2.5rem', '12': '3rem', '16': '4rem', '24': '6rem', '32': '8rem', '48': '12rem', '64': '16rem', full: '100%', screen: '100vh' }, flex: { '1': '1 1 0%', auto: '1 1 auto', initial: '0 1 auto', none: 'none', half: '0 0 50%', full: '0 0 100%' }, minWidth: { '0': '0', full: '100%' }, minHeight: { '0': '0', full: '100%', screen: '100vh' }, maxWidth: { xs: '20rem', sm: '30rem', md: '40rem', lg: '50rem', xl: '60rem', '2xl': '70rem', '3xl': '80rem', '4xl': '90rem', '5xl': '100rem', full: '100%' }, maxHeight: { full: '100%', 'half-screen': '50vh', screen: '100vh' }, padding: { px: '1px', '0': '0', '1': '0.25rem', '2': '0.5rem', '3': '0.75rem', '4': '1rem', '5': '1.25rem', '6': '1.5rem', '8': '2rem', '10': '2.5rem', '12': '3rem', '16': '4rem', '20': '5rem', '24': '6rem', '32': '8rem' }, margin: { auto: 'auto', px: '1px', '0': '0', '1': '0.25rem', '2': '0.5rem', '3': '0.75rem', '4': '1rem', '5': '1.25rem', '6': '1.5rem', '8': '2rem', '10': '2.5rem', '12': '3rem', '16': '4rem', '20': '5rem', '24': '6rem', '32': '8rem', '-px': '-1px', '-1': '-0.25rem', '-2': '-0.5rem', '-3': '-0.75rem', '-4': '-1rem', '-5': '-1.25rem', '-6': '-1.5rem', '-8': '-2rem', '-10': '-2.5rem', '-12': '-3rem', '-16': '-4rem', '-20': '-5rem', '-24': '-6rem', '-32': '-8rem' }, boxShadow: { default: '0 2px 4px 0 rgba(0,0,0,0.10)', md: '0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08)', lg: '0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08)', inner: 'inset 0 2px 4px 0 rgba(0,0,0,0.06)', outline: '0 0 0 3px rgba(52,144,220,0.5)', none: 'none', cloud: '0 0 5rem 5rem white', btn: 'inset 0 -6px 12px 0 rgba(0,70,144,0.25), 0 4px 6px 0 rgba(34,0,51,0.04), 0 1px 10px 0 rgba(7,48,114,0.12), 0 2px 8px -1px rgba(14,13,26,0.08)' }, opacity: { '0': '0', '25': '.25', '50': '.5', '75': '.75', '100': '1' }, fill: { current: 'currentColor' }, stroke: { current: 'currentColor' }, zIndex: { auto: 'auto', '0': 0, '10': 10, '20': 20, '30': 30, '40': 40, '50': 50 } }, variants: { appearance: ['responsive'], backgroundAttachment: ['responsive'], backgroundColor: ['responsive', 'hover', 'focus'], backgroundPosition: ['responsive'], backgroundRepeat: ['responsive'], backgroundSize: ['responsive'], borderCollapse: [], borderColor: ['responsive', 'hover', 'focus'], borderRadius: ['responsive'], borderStyle: ['responsive'], borderWidth: ['responsive'], cursor: ['responsive'], display: ['responsive'], flexDirection: ['responsive'], flexWrap: ['responsive'], alignItems: ['responsive'], alignSelf: ['responsive'], alignContent: ['responsive'], justifyContent: ['responsive'], flex: ['responsive'], flexGrow: ['responsive'], flexShrink: ['responsive'], float: ['responsive'], fontFamily: ['responsive'], fontWeight: ['responsive', 'hover', 'focus'], height: ['responsive'], lineHeight: ['responsive'], listStylePosition: ['responsive'], listStyleType: ['responsive'], margin: ['responsive'], maxHeight: ['responsive'], maxWidth: ['responsive'], minHeight: ['responsive'], minWidth: ['responsive'], negativeMargin: ['responsive'], opacity: ['responsive', 'hover'], outline: ['focus'], overflow: ['responsive'], padding: ['responsive'], pointerEvents: ['responsive'], position: ['responsive'], inset: ['responsive'], resize: ['responsive'], boxShadow: ['responsive', 'hover', 'focus'], fill: [], stroke: [], tableLayout: ['responsive'], textAlign: ['responsive'], textColor: ['responsive', 'hover', 'focus'], fontSize: ['responsive'], fontStyle: ['responsive', 'hover', 'focus'], fontSmoothing: ['responsive', 'hover', 'focus'], textDecoration: ['responsive', 'hover', 'focus'], textTransform: ['responsive', 'hover', 'focus'], letterSpacing: ['responsive'], userSelect: ['responsive'], verticalAlign: ['responsive'], visibility: ['responsive'], whitespace: ['responsive'], wordBreak: ['responsive'], width: ['responsive'], zIndex: ['responsive'] }, corePlugins: { container: false }, plugins: [] }; ================================================ FILE: test/.eslintrc.yml ================================================ env: mocha: true extends: - plugin:mocha/recommended plugins: - mocha - node rules: node/no-unpublished-require: off mocha/handle-done-callback: error mocha/no-exclusive-tests: error mocha/no-identical-title: warn mocha/no-mocha-arrows: error mocha/no-nested-tests: error mocha/no-pending-tests: error mocha/no-return-and-callback: warn mocha/no-skipped-tests: error mocha/no-setup-in-describe: off mocha/no-hooks-for-single-case: off no-console: off # ¯\_(ツ)_/¯ ================================================ FILE: test/backend/auth-tests.js ================================================ const assert = require('assert'); const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { metadata: sinon.stub(), setField: sinon.stub() }; function request(id, auth) { return { params: { id }, header: sinon.stub().returns(auth) }; } function response() { return { sendStatus: sinon.stub(), set: sinon.stub() }; } const next = sinon.stub(); const storedMeta = { auth: 'r9uFxEs9GEVaQR9CJJ0uTKFGhFSOTRjOY2FCLFlCIZ0Cr-VGTVpMGlXDbNR8RMT55trMpSrzWtBVKq1LffOT2g', nonce: 'FL4oxA7IE1PW8shwFN9qZw==' }; const authMiddleware = proxyquire('../../server/middleware/auth', { '../storage': storage }).hmac; describe('Owner Middleware', function() { afterEach(function() { storage.metadata.reset(); storage.setField.reset(); next.reset(); }); it('sends a 401 when no auth header is set', async function() { const req = request('x'); const res = response(); await authMiddleware(req, res, next); sinon.assert.calledWith(res.sendStatus, 401); sinon.assert.notCalled(next); }); it('sends a 404 when metadata is not found', async function() { const req = request('x', 'y'); const res = response(); await authMiddleware(req, res, next); sinon.assert.calledWith(res.sendStatus, 404); sinon.assert.notCalled(next); }); it('sends a 401 when the auth header is invalid base64', async function() { storage.metadata.returns(Promise.resolve(storedMeta)); const req = request('x', '1'); const res = response(); await authMiddleware(req, res, next); sinon.assert.calledWith(res.sendStatus, 401); sinon.assert.notCalled(next); }); it('authenticates when the hashes match', async function() { storage.metadata.returns(Promise.resolve(storedMeta)); const req = request( 'x', 'send-v1 R7nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' ); const res = response(); await authMiddleware(req, res, next); sinon.assert.calledOnce(next); sinon.assert.calledWith(storage.setField, 'x', 'nonce', req.nonce); sinon.assert.calledWith( res.set, 'WWW-Authenticate', `send-v1 ${req.nonce}` ); sinon.assert.notCalled(res.sendStatus); assert.equal(req.authorized, true); assert.equal(req.meta, storedMeta); assert.notEqual(req.nonce, storedMeta.nonce); }); it('sends a 401 when the hashes do not match', async function() { storage.metadata.returns(Promise.resolve(storedMeta)); const req = request( 'x', 'send-v1 R8nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' ); const res = response(); await authMiddleware(req, res, next); sinon.assert.calledWith(res.sendStatus, 401); sinon.assert.calledWith( res.set, 'WWW-Authenticate', `send-v1 ${storedMeta.nonce}` ); sinon.assert.notCalled(next); }); }); ================================================ FILE: test/backend/delete-tests.js ================================================ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { kill: sinon.stub(), ttl: sinon.stub() }; function request(id) { return { params: { id } }; } function response() { return { sendStatus: sinon.stub() }; } const delRoute = proxyquire('../../server/routes/delete', { '../storage': storage }); describe('/api/delete', function() { afterEach(function() { storage.kill.reset(); }); it('calls storage.kill with the id parameter', async function() { const req = request('x'); const res = response(); await delRoute(req, res); sinon.assert.calledWith(storage.kill, 'x'); sinon.assert.calledWith(res.sendStatus, 200); }); it('sends a 404 on failure', async function() { storage.kill.returns(Promise.reject(new Error())); const res = response(); await delRoute(request('x'), res); sinon.assert.calledWith(res.sendStatus, 404); }); }); ================================================ FILE: test/backend/info-tests.js ================================================ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { ttl: sinon.stub() }; function request(id, meta) { return { params: { id }, meta }; } function response() { return { sendStatus: sinon.stub(), send: sinon.stub() }; } const infoRoute = proxyquire('../../server/routes/info', { '../storage': storage }); describe('/api/info', function() { afterEach(function() { storage.ttl.reset(); }); it('calls storage.ttl with the id parameter', async function() { const req = request('x'); const res = response(); await infoRoute(req, res); sinon.assert.calledWith(storage.ttl, 'x'); }); it('sends a 404 on failure', async function() { storage.ttl.returns(Promise.reject(new Error())); const res = response(); await infoRoute(request('x'), res); sinon.assert.calledWith(res.sendStatus, 404); }); it('returns a json object', async function() { storage.ttl.returns(Promise.resolve(123)); const meta = { dlimit: '1', dl: '0' }; const res = response(); await infoRoute(request('x', meta), res); sinon.assert.calledWithMatch(res.send, { dlimit: 1, dtotal: 0, ttl: 123 }); }); }); ================================================ FILE: test/backend/language-tests.js ================================================ const assert = require('assert'); const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const config = { l10n_dev: false // prod configuration }; const pkg = { availableLanguages: ['en-US', 'fr', 'it', 'es-ES'] }; function request(acceptLang) { return { headers: { 'accept-language': acceptLang } }; } const langMiddleware = proxyquire('../../server/middleware/language', { '../config': config, '../../package.json': pkg }); describe('Language Middleware', function() { it('defaults to en-US when no header is present', function() { const req = request(); const next = sinon.stub(); langMiddleware(req, null, next); assert.equal(req.language, 'en-US'); sinon.assert.calledOnce(next); }); it('sets req.language to en-US when accept-language > 255 chars', function() { const accept = Array(257).join('a'); assert.equal(accept.length, 256); const req = request(accept); const next = sinon.stub(); langMiddleware(req, null, next); assert.equal(req.language, 'en-US'); sinon.assert.calledOnce(next); }); it('defaults to en-US when no accept-language is available', function() { const req = request('fa,cs,ja'); const next = sinon.stub(); langMiddleware(req, null, next); assert.equal(req.language, 'en-US'); sinon.assert.calledOnce(next); }); it('prefers higher q values', function() { const req = request('fa;q=0.5, it;q=0.9'); const next = sinon.stub(); langMiddleware(req, null, next); assert.equal(req.language, 'it'); sinon.assert.calledOnce(next); }); it('uses likely subtags', function() { const req = request('es-MX'); const next = sinon.stub(); langMiddleware(req, null, next); assert.equal(req.language, 'es-ES'); sinon.assert.calledOn(next); }); }); ================================================ FILE: test/backend/metadata-tests.js ================================================ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { ttl: sinon.stub(), length: sinon.stub() }; function request(id, meta = {}) { return { params: { id }, meta }; } function response() { return { sendStatus: sinon.stub(), send: sinon.stub() }; } const metadataRoute = proxyquire('../../server/routes/metadata', { '../storage': storage }); describe('/api/metadata', function() { afterEach(function() { storage.ttl.reset(); storage.length.reset(); }); it('calls storage.ttl with the id parameter', async function() { const req = request('x'); const res = response(); await metadataRoute(req, res); sinon.assert.calledWith(storage.ttl, 'x'); }); it('sends a 404 on failure', async function() { storage.ttl.returns(Promise.reject(new Error())); const res = response(); await metadataRoute(request('x'), res); sinon.assert.calledWith(res.sendStatus, 404); }); it('returns a json object', async function() { storage.ttl.returns(Promise.resolve(123)); const meta = { dlimit: 1, dlToken: 0, metadata: 'foo' }; const res = response(); await metadataRoute(request('x', meta), res); sinon.assert.calledWithMatch(res.send, { metadata: 'foo', finalDownload: true, ttl: 123 }); }); }); ================================================ FILE: test/backend/owner-tests.js ================================================ const assert = require('assert'); const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { metadata: sinon.stub() }; function request(id, owner_token) { return { params: { id }, body: { owner_token } }; } function response() { return { sendStatus: sinon.stub() }; } const ownerMiddleware = proxyquire('../../server/middleware/auth', { '../storage': storage }).owner; describe('Owner Middleware', function() { afterEach(function() { storage.metadata.reset(); }); it('sends a 404 when the id is not found', async function() { const next = sinon.stub(); storage.metadata.returns(Promise.resolve(null)); const res = response(); await ownerMiddleware(request('a', 'y'), res, next); sinon.assert.notCalled(next); sinon.assert.calledWith(res.sendStatus, 404); }); it('sends a 401 when the owner_token is missing', async function() { const next = sinon.stub(); const meta = { owner: 'y' }; storage.metadata.returns(Promise.resolve(meta)); const res = response(); await ownerMiddleware(request('b', null), res, next); sinon.assert.notCalled(next); sinon.assert.calledWith(res.sendStatus, 401); }); it('sends a 401 when the owner_token does not match', async function() { const next = sinon.stub(); const meta = { owner: 'y' }; storage.metadata.returns(Promise.resolve(meta)); const res = response(); await ownerMiddleware(request('c', 'z'), res, next); sinon.assert.notCalled(next); sinon.assert.calledWith(res.sendStatus, 401); }); it('sends a 401 if the metadata call fails', async function() { const next = sinon.stub(); storage.metadata.returns(Promise.reject(new Error())); const res = response(); await ownerMiddleware(request('d', 'y'), res, next); sinon.assert.notCalled(next); sinon.assert.calledWith(res.sendStatus, 401); }); it('sets req.meta and req.authorized on successful auth', async function() { const next = sinon.stub(); const meta = { owner: 'y' }; storage.metadata.returns(Promise.resolve(meta)); const req = request('e', 'y'); const res = response(); await ownerMiddleware(req, res, next); assert.equal(req.meta, meta); assert.equal(req.authorized, true); sinon.assert.notCalled(res.sendStatus); sinon.assert.calledOnce(next); }); }); ================================================ FILE: test/backend/params-tests.js ================================================ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { setField: sinon.stub() }; function request(id) { return { params: { id }, meta: { fxa: false }, body: {} }; } function response() { return { sendStatus: sinon.stub() }; } const paramsRoute = proxyquire('../../server/routes/params', { '../storage': storage }); describe('/api/params', function() { afterEach(function() { storage.setField.reset(); }); it('calls storage.setField with the correct parameter', function() { const req = request('x'); const dlimit = 2; req.body.dlimit = dlimit; const res = response(); paramsRoute(req, res); sinon.assert.calledWith(storage.setField, 'x', 'dlimit', dlimit); sinon.assert.calledWith(res.sendStatus, 200); }); it('sends a 400 if dlimit is too large', function() { const req = request('x'); const res = response(); req.body.dlimit = 201; paramsRoute(req, res); sinon.assert.calledWith(res.sendStatus, 400); }); it('sends a 404 on failure', function() { storage.setField.throws(new Error()); const req = request('x'); const res = response(); req.body.dlimit = 2; paramsRoute(req, res); sinon.assert.calledWith(res.sendStatus, 404); }); }); ================================================ FILE: test/backend/password-tests.js ================================================ const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); const storage = { setField: sinon.stub() }; function request(id, body) { return { params: { id }, body }; } function response() { return { sendStatus: sinon.stub() }; } const passwordRoute = proxyquire('../../server/routes/password', { '../storage': storage }); describe('/api/password', function() { afterEach(function() { storage.setField.reset(); }); it('calls storage.setField with the correct parameter', function() { const req = request('x', { auth: 'z' }); const res = response(); passwordRoute(req, res); sinon.assert.calledWith(storage.setField, 'x', 'auth', 'z'); sinon.assert.calledWith(storage.setField, 'x', 'pwd', 1); sinon.assert.calledWith(res.sendStatus, 200); }); it('sends a 400 if auth is missing', function() { const req = request('x', {}); const res = response(); passwordRoute(req, res); sinon.assert.calledWith(res.sendStatus, 400); }); it('sends a 404 on failure', function() { storage.setField.throws(new Error()); const req = request('x', { auth: 'z' }); const res = response(); passwordRoute(req, res); sinon.assert.calledWith(res.sendStatus, 404); }); }); ================================================ FILE: test/backend/s3-tests.js ================================================ const assert = require('assert'); const sinon = require('sinon'); const proxyquire = require('proxyquire').noCallThru(); function resolvedPromise(val) { return { promise: () => Promise.resolve(val) }; } function rejectedPromise(err) { return { promise: () => Promise.reject(err) }; } const s3Stub = { headObject: sinon.stub(), getObject: sinon.stub(), upload: sinon.stub(), deleteObject: sinon.stub() }; const awsStub = { config: { update: sinon.stub() }, S3: function() { return s3Stub; } }; const S3Storage = proxyquire('../../server/storage/s3', { 'aws-sdk': awsStub }); describe('S3Storage', function() { it('uses config.s3_bucket', function() { const s = new S3Storage({ s3_bucket: 'foo' }); assert.equal(s.bucket, 'foo'); }); describe('length', function() { it('returns the ContentLength', async function() { s3Stub.headObject = sinon .stub() .returns(resolvedPromise({ ContentLength: 123 })); const s = new S3Storage({ s3_bucket: 'foo' }); const len = await s.length('x'); assert.equal(len, 123); sinon.assert.calledWithMatch(s3Stub.headObject, { Bucket: 'foo', Key: 'x' }); }); it('throws when id not found', async function() { const err = new Error(); s3Stub.headObject = sinon.stub().returns(rejectedPromise(err)); const s = new S3Storage({ s3_bucket: 'foo' }); try { await s.length('x'); assert.fail(); } catch (e) { assert.equal(e, err); } }); }); describe('getStream', function() { it('returns a Stream object', function() { const stream = {}; s3Stub.getObject = sinon .stub() .returns({ createReadStream: () => stream }); const s = new S3Storage({ s3_bucket: 'foo' }); const result = s.getStream('x'); assert.equal(result, stream); sinon.assert.calledWithMatch(s3Stub.getObject, { Bucket: 'foo', Key: 'x' }); }); }); describe('set', function() { it('calls s3.upload', async function() { const file = { on: sinon.stub() }; s3Stub.upload = sinon.stub().returns(resolvedPromise()); const s = new S3Storage({ s3_bucket: 'foo' }); await s.set('x', file); sinon.assert.calledWithMatch(s3Stub.upload, { Bucket: 'foo', Key: 'x', Body: file }); }); it('aborts upload if limit is hit', async function() { const file = { on: (ev, fn) => fn() }; const abort = sinon.stub(); const err = new Error('limit'); s3Stub.upload = sinon.stub().returns({ promise: () => Promise.reject(err), abort }); const s = new S3Storage({ s3_bucket: 'foo' }); try { await s.set('x', file); assert.fail(); } catch (e) { assert.equal(e.message, 'limit'); sinon.assert.calledOnce(abort); } }); it('throws when s3.upload fails', async function() { const file = { on: sinon.stub() }; const err = new Error(); s3Stub.upload = sinon.stub().returns(rejectedPromise(err)); const s = new S3Storage({ s3_bucket: 'foo' }); try { await s.set('x', file); assert.fail(); } catch (e) { assert.equal(e, err); } }); }); describe('del', function() { it('calls s3.deleteObject', async function() { s3Stub.deleteObject = sinon.stub().returns(resolvedPromise(true)); const s = new S3Storage({ s3_bucket: 'foo' }); const result = await s.del('x'); assert.equal(result, true); sinon.assert.calledWithMatch(s3Stub.deleteObject, { Bucket: 'foo', Key: 'x' }); }); }); describe('ping', function() { it('calls s3.headBucket', async function() { s3Stub.headBucket = sinon.stub().returns(resolvedPromise(true)); const s = new S3Storage({ s3_bucket: 'foo' }); const result = await s.ping(); assert.equal(result, true); sinon.assert.calledWithMatch(s3Stub.headBucket, { Bucket: 'foo' }); }); }); }); ================================================ FILE: test/backend/storage-tests.js ================================================ const assert = require('assert'); const proxyquire = require('proxyquire').noCallThru(); const stream = {}; class MockStorage { length() { return Promise.resolve(12); } getStream() { return stream; } set() { return Promise.resolve(); } del() { return Promise.resolve(); } ping() { return Promise.resolve(); } } const config = { s3_bucket: 'foo', default_expire_seconds: 20, expire_times_seconds: [10, 20, 30], env: 'development', redis_host: 'mock' }; const storage = proxyquire('../../server/storage', { '../config': config, '../log': () => {}, './s3': MockStorage }); describe('Storage', function() { describe('ttl', function() { it('returns milliseconds remaining', async function() { const time = 40; await storage.set('x', null, { foo: 'bar' }, time); const ms = await storage.ttl('x'); await storage.del('x'); assert.equal(ms, time * 1000); }); }); describe('length', function() { it('returns the file size', async function() { const len = await storage.length('x'); assert.equal(len, 12); }); }); describe('get', function() { it('returns a stream', async function() { const { stream: s } = await storage.get('x'); assert.equal(s, stream); }); }); describe('set', function() { it('sets expiration to expire time', async function() { const seconds = 100; await storage.set('x', null, { foo: 'bar' }, seconds); const s = await storage.redis.ttlAsync('x'); await storage.del('x'); assert.equal(Math.ceil(s), seconds); }); it('adds right prefix based on expire time', async function() { await storage.set('x', null, { foo: 'bar' }, 300); const { filePath: path_x } = await storage.getPrefixedInfo('x'); assert.equal(path_x, '1-x'); await storage.del('x'); await storage.set('y', null, { foo: 'bar' }, 86400); const { filePath: path_y } = await storage.getPrefixedInfo('y'); assert.equal(path_y, '1-y'); await storage.del('y'); await storage.set('z', null, { foo: 'bar' }, 86400 * 7); const { filePath: path_z } = await storage.getPrefixedInfo('z'); assert.equal(path_z, '7-z'); await storage.del('z'); }); it('sets metadata', async function() { const m = { foo: 'bar' }; await storage.set('x', null, m); const meta = await storage.redis.hgetallAsync('x'); delete meta.prefix; await storage.del('x'); assert.deepEqual(meta, m); }); }); describe('setField', function() { it('works', async function() { await storage.set('x', null); storage.setField('x', 'y', 'z'); const z = await storage.redis.hgetAsync('x', 'y'); assert.equal(z, 'z'); await storage.del('x'); }); }); describe('del', function() { it('works', async function() { await storage.set('x', null, { foo: 'bar' }); await storage.del('x'); const meta = await storage.metadata('x'); assert.equal(meta, null); }); }); describe('ping', function() { it('works', async function() { await storage.ping(); }); }); describe('metadata', function() { it('returns all metadata fields', async function() { const m = { id: 'a1', pwd: 0, dl: 1, dlimit: 1, fxa: 1, auth: 'foo', metadata: 'bar', nonce: 'baz', owner: 'bmo' }; await storage.set('x', null, m); const meta = await storage.metadata('x'); assert.deepEqual( { ...meta, storage: 'excluded' }, { ...m, dead: false, flagged: false, dlToken: 0, fxa: true, pwd: false, storage: 'excluded' } ); }); }); }); ================================================ FILE: test/frontend/.eslintrc.yml ================================================ env: browser: true parserOptions: sourceType: module rules: node/no-unsupported-features: off ================================================ FILE: test/frontend/index.js ================================================ const fs = require('fs'); const path = require('path'); function kv(f) { return `require('./tests/${f}')`; } module.exports = function() { const files = fs .readdirSync(path.join(__dirname, 'tests')) .filter(p => /\.js$/.test(p)); const code = "require('fast-text-encoding');\n" + files.map(kv).join(';\n'); return { code, dependencies: files.map(f => require.resolve('./tests/' + f)), cacheable: true }; }; ================================================ FILE: test/frontend/routes.js ================================================ const html = require('choo/html'); const assets = require('../../common/assets'); const initScript = require('../../server/initScript'); module.exports = function(app) { app.get('/mocha.css', function(req, res) { res.sendFile(require.resolve('mocha/mocha.css')); }); app.get('/mocha.js', function(req, res) { res.sendFile(require.resolve('mocha/mocha.js')); }); app.get('/test', function(req, res) { res.send( html` ${initScript({ cspNonce: 'test', locale: 'en-US' })}
    `.toString() ); }); }; ================================================ FILE: test/frontend/runner.js ================================================ /* eslint-disable no-undef, no-process-exit */ const fs = require('fs'); const path = require('path'); const mkdirp = require('mkdirp'); const puppeteer = require('puppeteer'); const webpack = require('webpack'); const config = require('../../webpack.config'); const middleware = require('webpack-dev-middleware'); const express = require('express'); const devRoutes = require('../../server/bin/test'); const app = express(); const wpm = middleware(webpack(config(null, { mode: 'development' })), { logLevel: 'silent' }); app.use(wpm); devRoutes(app, { middleware: wpm }); // eslint-disable-next-line no-unused-vars function onConsole(msg) { // uncomment to debug // console.error(msg.text()); } const server = app.listen(async function() { let exitCode = -1; const browser = await puppeteer.launch({ args: [ // puppeteer >= 1.10.0 crashes on Circle CI without this flag set '--no-sandbox' ] }); try { const page = await browser.newPage(); page.on('console', onConsole); page.on('pageerror', console.log.bind(console)); await page.goto(`http://127.0.0.1:${server.address().port}/test`); await page.waitFor(() => typeof runner.testResults !== 'undefined', { polling: 1000, timeout: 15000 }); const results = await page.evaluate(() => runner.testResults); const coverage = await page.evaluate(() => __coverage__); if (coverage) { const dir = path.resolve(__dirname, '../../.nyc_output'); mkdirp.sync(dir); fs.writeFileSync( path.resolve(dir, 'frontend.json'), JSON.stringify(coverage) ); } const stats = results.stats; exitCode = stats.failures; console.log(`${stats.passes} passing (${stats.duration}ms)\n`); if (stats.failures) { console.log('Failures:\n'); for (const f of results.failures) { console.log(`${f.fullTitle}`); console.log(` ${f.err.stack}\n`); } } } catch (e) { console.log(e); } finally { browser.close(); server.close(() => { process.exit(exitCode); }); } }); ================================================ FILE: test/frontend/tests/api-tests.js ================================================ /* global DEFAULTS */ import assert from 'assert'; import Archive from '../../../app/archive'; import * as api from '../../../app/api'; import Keychain from '../../../app/keychain'; const encoder = new TextEncoder(); const plaintext = new Archive([new Blob([encoder.encode('hello world!')])]); const metadata = { name: 'test.txt', type: 'text/plain' }; describe('API', function() { describe('websocket upload', function() { it('returns file info on success', async function() { const keychain = new Keychain(); const enc = await keychain.encryptStream(plaintext.stream); const meta = await keychain.encryptMetadata(metadata); const verifierB64 = await keychain.authKeyB64(); const p = function() {}; const up = api.uploadWs( enc, meta, verifierB64, DEFAULTS.EXPIRE_SECONDS, 1, null, p ); const result = await up.result; assert.ok(result.url); assert.ok(result.id); assert.ok(result.ownerToken); }); it('can be cancelled', async function() { const keychain = new Keychain(); const enc = await keychain.encryptStream(plaintext.stream); const meta = await keychain.encryptMetadata(metadata); const verifierB64 = await keychain.authKeyB64(); const p = function() {}; const up = api.uploadWs( enc, meta, verifierB64, DEFAULTS.EXPIRE_SECONDS, null, p ); up.cancel(); try { await up.result; assert.fail('not cancelled'); } catch (e) { assert.equal(e.message, '0'); } }); }); }); ================================================ FILE: test/frontend/tests/auth-tests.js ================================================ import assert from 'assert'; import storage from '../../../app/storage'; import { decryptBundle, prepareScopedBundleKey } from '../../../app/fxa'; import { b64ToArray } from '../../../app/utils'; const decoder = new TextDecoder(); describe('user auth', function() { it('prepares ECDH keys for PKCE auth', async function() { const empty = storage.get('scopedBundlePrivateKey'); assert.equal(empty, undefined); const publicKeyB64 = await prepareScopedBundleKey(storage); const publicKey = JSON.parse(decoder.decode(b64ToArray(publicKeyB64))); assert(!publicKey.d, 'not a public key'); assert(publicKey.x); assert(publicKey.y); assert.equal(publicKey.kty, 'EC'); assert.equal(publicKey.crv, 'P-256'); const privateKey = JSON.parse(storage.get('scopedBundlePrivateKey')); storage.remove('scopedBundlePrivateKey'); assert.equal(privateKey.kty, 'EC'); assert.equal(privateKey.crv, 'P-256'); assert(privateKey.d, 'not a private key'); }); it('decrypts the PKCE auth bundle', async function() { storage.set( 'scopedBundlePrivateKey', '{"kty":"EC","kid":"cV9_thVX9XRa-R2nVZF9rFdwrcR_eST4UZuUCx03ebI","crv":"P-256","x":"-0OOb6SPdYBz0CkQLWRu8ojDUhRe-VoKnwLEBi97KAk","y":"U3fXgj1LV7KhiO5O60niMjPpDqToh15-R6C22NnmNXY","d":"KfIQCxZrqSI6j69rAC6fEiGIYKwYv2buQG9NTcKOiGc"}' ); const jwks = await decryptBundle( storage, 'eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiRUNESC1FUyIsImtpZCI6ImNWOV90aFZYOVhSYS1SMm5WWkY5ckZkd3JjUl9lU1Q0VVp1VUN4MDNlYkkiLCJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJqckcwajNFODNodDZJcDE1YmtuZWRUV3kwZmR1WnR0V3NtMkFybUNoQU5rIiwieSI6Ijl3SmNQUDRrQmQ5amtCbEJJcWRhclQ2NjVIQU00SndUX0FSSFc0aTN4QUUifX0..Dkf-FXtakCiPuXjW.-KfVQEntYjUe3f5OxslSQwjLFauc50RurLQHDV75sUixNTlsjTIldCZVb6WUKpQkpOdFHOUYFX9_Cvk2ENKdfcVm2eTuyomlKklHF3q5209KwJz8lDK3gOQuAlz79eDou0k_Z3JNGu-qZ8IiDhZZ9iNSgBrsq0BZwVXZ9ViSFEW-YzJBQlKmildscXhp_-Lf6-qiJJrPbZCXFD3PZmzcule3kyBOarg_fjjHLFlIpdjP1lI5wBETqdjk7iBKeO2isSQO7-8.q5EzqP6OPg9yb5BcJH2oFg' ); assert.deepEqual(jwks, { 'https://identity.mozilla.com/apps/send': { kty: 'oct', scope: 'https://identity.mozilla.com/apps/send', k: '5_jrbS76RzJ4EwlKSl527vqz3BDqf5DM4sNsoEK_hoA', kid: '1414456160-n6yE-eL-ADvnsJo_huq3DA' } }); }); }); ================================================ FILE: test/frontend/tests/crypto-tests.js ================================================ import assert from 'assert'; import { arrayToB64, b64ToArray } from '../../../app/utils'; describe('webcrypto', function() { it('can do it', async function() { const encoder = new TextEncoder(); const x = b64ToArray('SPIfAlwbnncIFw3hEHYihw'); const a = await crypto.subtle.importKey('raw', x, 'PBKDF2', false, [ 'deriveKey' ]); const ad = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('metadata'), iterations: 100, hash: 'SHA-256' }, a, { name: 'AES-GCM', length: 128 }, false, ['encrypt', 'decrypt'] ); const ae = await crypto.subtle.encrypt( { name: 'AES-GCM', iv: new Uint8Array(12), tagLength: 128 }, ad, encoder.encode('hello world!') ); assert.equal( arrayToB64(new Uint8Array(ae)), 'UXQQ4yVf55TRk9AZtz5QCwFofRvh-HdWJyxSCQ' ); const ah = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('authentication'), iterations: 100, hash: 'SHA-256' }, a, { name: 'HMAC', hash: { name: 'SHA-256' } }, true, ['sign'] ); const ahx = await crypto.subtle.exportKey('raw', ah); assert.equal( arrayToB64(new Uint8Array(ahx)), 'wxXDmHgmMgrcDVD8zbDLRl2yNa8jSAQgsaeIBZ4vueygpxzaTK6ZE_6X-XHvllBly6pSuFNbSxcve0ZHhVdcEA' ); // const jwk = await crypto.subtle.exportKey('jwk', ah) // console.error(jwk) const as = await crypto.subtle.sign( { name: 'HMAC' }, ah, encoder.encode('test') ); assert.equal( arrayToB64(new Uint8Array(as)), 'AOi4HcoCJxQ4nUYxlmHB1rlcxQBn-zVjrSHz-VW7S-I' ); const b = await crypto.subtle.importKey('raw', x, 'HKDF', false, [ 'deriveKey' ]); const bd = await crypto.subtle.deriveKey( { name: 'HKDF', salt: new Uint8Array(), info: encoder.encode('encryption'), hash: 'SHA-256' }, b, { name: 'AES-GCM', length: 128 }, true, ['encrypt', 'decrypt'] ); const bdx = await crypto.subtle.exportKey('raw', bd); assert.equal(arrayToB64(new Uint8Array(bdx)), 'g7okjWWO9yueDz16-owShQ'); const bh = await crypto.subtle.deriveKey( { name: 'HKDF', salt: new Uint8Array(), info: encoder.encode('authentication'), hash: 'SHA-256' }, b, { name: 'HMAC', hash: { name: 'SHA-256' } }, true, ['sign'] ); const bhx = await crypto.subtle.exportKey('raw', bh); assert.equal( arrayToB64(new Uint8Array(bhx)), 'TQOGtmQ8-ZfnWu6Iq-U1IAVBVREFuI17xqsW1shiC8eMCa-a5qeYTvoX3-5kCoCha8R59ycnPDnTz75clLBmbQ' ); }); }); ================================================ FILE: test/frontend/tests/fileSender-tests.js ================================================ import assert from 'assert'; import FileSender from '../../../app/fileSender'; import Archive from '../../../app/archive'; // FileSender uses a File in real life but a Blob works for testing const blob = new Blob(['hello world!'], { type: 'text/plain' }); blob.name = 'text.txt'; const archive = new Archive([blob]); describe('FileSender', function() { describe('upload', function() { it('returns an OwnedFile on success', async function() { const fs = new FileSender(); const file = await fs.upload(archive); assert.ok(file.id); assert.equal(file.name, archive.name); }); }); }); ================================================ FILE: test/frontend/tests/keychain-tests.js ================================================ import assert from 'assert'; import Keychain from '../../../app/keychain'; describe('Keychain', function() { describe('setPassword', function() { it('changes the authKey', async function() { const k = new Keychain(); const original = await k.authKeyB64(); k.setPassword('foo', 'some://url'); const pwd = await k.authKeyB64(); assert.notEqual(pwd, original); }); }); describe('encrypt / decrypt metadata', function() { it('can decrypt metadata it encrypts', async function() { const k = new Keychain(); const meta = { name: 'foo', type: 'bar/baz' }; const ciphertext = await k.encryptMetadata(meta); const result = await k.decryptMetadata(ciphertext); assert.equal(result.name, meta.name); assert.equal(result.type, meta.type); }); }); }); ================================================ FILE: test/frontend/tests/streaming-tests.js ================================================ const ece = require('http_ece'); import assert from 'assert'; import Archive from '../../../app/archive'; import { b64ToArray } from '../../../app/utils'; import { blobStream, concatStream } from '../../../app/streams'; import { decryptStream, encryptStream } from '../../../app/ece.js'; import { encryptedSize, concat } from '../../../app/utils'; const rs = 36; const str = 'You are the dancing queen, young and sweet, only seventeen.'; const testSalt = 'I1BsxtFttlv3u_Oo94xnmw'; const keystr = 'yqdlZ-tYemfogSmv7Ws5PQ'; const buffer = Buffer.from(str); const params = { version: 'aes128gcm', rs: rs, salt: testSalt, keyid: '', key: keystr }; const encrypted = ece.encrypt(buffer, params); const decrypted = ece.decrypt(encrypted, params); describe('Streaming', function() { describe('blobStream', function() { it('reads the entire blob', async function() { const len = 12345; const chunkSize = 1024; const blob = new Blob([new Uint8Array(len)]); const stream = blobStream(blob, chunkSize); const reader = stream.getReader(); let bytes = 0; let data = await reader.read(); while (!data.done) { bytes += data.value.byteLength; assert.ok(data.value.byteLength <= chunkSize, 'chunk too big'); data = await reader.read(); } assert.equal(bytes, len); }); }); describe('concatStream', function() { it('reads all the streams', async function() { const count = 5; const len = 12345; const streams = Array.from({ length: count }, () => blobStream(new Blob([new Uint8Array(len)])) ); const concat = concatStream(streams); const reader = concat.getReader(); let bytes = 0; let data = await reader.read(); while (!data.done) { bytes += data.value.byteLength; data = await reader.read(); } assert.equal(bytes, len * count); }); }); //testing against http_ece's implementation describe('ECE', function() { const key = b64ToArray(keystr); const salt = b64ToArray(testSalt).buffer; it('can encrypt', async function() { const stream = new Archive([new Blob([str], { type: 'text/plain' })]) .stream; const encStream = encryptStream(stream, key, rs, salt); const reader = encStream.getReader(); let result = new Uint8Array(0); let state = await reader.read(); while (!state.done) { result = concat(result, state.value); state = await reader.read(); } assert.deepEqual(result, new Uint8Array(encrypted)); }); it('can decrypt', async function() { const stream = new Archive([new Blob([encrypted])]).stream; const decStream = decryptStream(stream, key, rs); const reader = decStream.getReader(); let result = new Uint8Array(0); let state = await reader.read(); while (!state.done) { result = concat(result, state.value); state = await reader.read(); } assert.deepEqual(result, new Uint8Array(decrypted)); }); }); describe('encryptedSize', function() { it('matches the size of an encrypted buffer', function() { assert.equal(encryptedSize(buffer.length, rs), encrypted.length); }); }); }); ================================================ FILE: test/frontend/tests/workflow-tests.js ================================================ import assert from 'assert'; import Archive from '../../../app/archive'; import FileSender from '../../../app/fileSender'; import FileReceiver from '../../../app/fileReceiver'; import storage from '../../../app/storage'; const headless = /Headless/.test(navigator.userAgent); // TODO: save on headless doesn't work as it used to since it now // follows a link instead of fetch. Maybe there's a way to make it // work? For now always set noSave. const options = { noSave: true || !headless, stream: true, storage }; // only run the saveFile code if headless // FileSender uses a File in real life but a Blob works for testing const blob = new Blob([new ArrayBuffer(1024 * 128)], { type: 'text/plain' }); blob.name = 'test.txt'; const archive = new Archive([blob]); navigator.serviceWorker.register('/serviceWorker.js'); describe('Upload / Download flow', function() { this.timeout(0); it('can only download once by default', async function() { const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await fr.getMetadata(); await fr.download(options); try { await fr.download(options); assert.fail('downloaded again'); } catch (e) { assert.equal(e.message, '404'); } }); it('downloads with the correct password', async function() { const fs = new FileSender(); const file = await fs.upload(archive); await file.setPassword('magic'); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, url: file.url, nonce: file.keychain.nonce, requiresPassword: true, password: 'magic' }); await fr.getMetadata(); await fr.download(options); assert.equal(fr.state, 'complete'); }); it('blocks invalid passwords from downloading', async function() { const fs = new FileSender(); const file = await fs.upload(archive); await file.setPassword('magic'); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, url: file.url, nonce: file.keychain.nonce, requiresPassword: true, password: 'password' }); try { await fr.getMetadata(); assert.fail('got metadata with bad password'); } catch (e) { assert.equal(e.message, '401'); } try { // We can't decrypt without IV from metadata // but let's try to download anyway await fr.download(options); assert.fail('downloaded file with bad password'); } catch (e) { assert.equal(e.message, '401'); } }); it('retries a bad nonce', async function() { const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: null, // oops requiresPassword: false }); await fr.getMetadata(); assert.equal(fr.fileInfo.name, archive.name); }); it('can cancel the upload', async function() { const fs = new FileSender(); const up = fs.upload(archive); fs.cancel(); // before encrypting try { await up; assert.fail('not cancelled 1'); } catch (e) { assert.equal(e.message, '0'); } fs.reset(); fs.once('encrypting', () => fs.cancel()); try { await fs.upload(archive); assert.fail('not cancelled 2'); } catch (e) { assert.equal(e.message, '0'); } fs.reset(); fs.once('progress', () => fs.cancel()); try { await fs.upload(archive); assert.fail('not cancelled 3'); } catch (e) { assert.equal(e.message, '0'); } }); it('can cancel the download', async function() { const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await fr.getMetadata(); fr.once('progress', () => fr.cancel()); try { await fr.download(options); assert.fail('not cancelled'); } catch (e) { assert.equal(e.message, '0'); } }); it('can increase download count on download', async function() { this.timeout(0); const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await fr.getMetadata(); await fr.download(options); await file.updateDownloadCount(); assert.equal(file.dtotal, 1); }); it('does not increase download count when download cancelled', async function() { const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await fr.getMetadata(); fr.once('progress', () => fr.cancel()); try { await fr.download(options); assert.fail('not cancelled'); } catch (e) { await file.updateDownloadCount(); assert.equal(file.dtotal, 0); } }); it('can allow multiple downloads', async function() { const fs = new FileSender(); const a = new Archive([blob]); a.dlimit = 2; const file = await fs.upload(a); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await fr.getMetadata(); await fr.download(options); await file.updateDownloadCount(); assert.equal(file.dtotal, 1); await fr.download(options); await file.updateDownloadCount(); assert.equal(file.dtotal, 2); try { await fr.download(options); assert.fail('downloaded too many times'); } catch (e) { assert.equal(e.message, '404'); } }); it('can delete the file before download', async function() { const fs = new FileSender(); const file = await fs.upload(archive); const fr = new FileReceiver({ secretKey: file.toJSON().secretKey, id: file.id, nonce: file.keychain.nonce, requiresPassword: false }); await file.del(); try { await fr.getMetadata(); assert.fail('file still exists'); } catch (e) { assert.equal(e.message, '404'); } }); }); ================================================ FILE: test/integration/README.md ================================================ # Integration Tests for [Firefox Send](https://send.firefox.com/). ## How to run the tests locally ### Clone the repository If you have cloned this project already then you can skip this, otherwise you'll need to clone this repo using Git. If you do not know how to clone a GitHub repository, check out this [help page][git-clone] from GitHub. If you think you would like to contribute to the tests by writing or maintaining them in the future, it would be a good idea to create a fork of this repository first, and then clone that. GitHub also has great instructions for [forking a repository][git-fork]. ### App Setup Please view the README at the root directory of the project. ### Run the tests Included in the docker-compose file is an image containing Firefox Nightly. [tox][Tox] is our test environment manager and [pytest][pytest] is the test runner. To run the tests, execute the commands below: ```sh npm run build npm run test-integration ``` ### Adding a test The tests are written in Python using a POM, or Page Object Model. The plugin we use for this is called [pypom][pypom]. Please read the documentation there for good examples on how to use the Page Object Model when writing tests. The pytest plugin that we use for running tests has a number of advanced command line options available too. The full documentation for the plugin can be found [here][pytest-selenium]. ### Watching a test run (within the docker container) The tests are run on a live version of Firefox, but they are run headless. To access the container where the tests are run to view them follow these steps: 1. Make sure all of the containers are running: ```sh docker-compose ps ``` If not start them detached: ```sh docker-compose up -d ``` 2. Open your favorite VNC viewer and type in `localhost:5900`. 3. The password is ```secret```. 4. The viewer should open a window with a Ubuntu logo. If that happens you are connected to the ```selenium-firefox``` image and if you start the test, you should see a Firefox window open and the tests running. ### Debugging a failure Whether a test passes or fails will result in a HTML report being created. This report will have detailed information of the test run and if a test does fail, it will provide geckodriver logs, terminal logs, as well as a screenshot of the browser when the test failed. We use a pytest plugin called [pytest-html][pytest-html] to create this report. The report can be found at ```coverage/send-test.html```. It should be viewed within a browser. [flake8]: http://flake8.pycqa.org/en/latest/ [git-clone]: https://help.github.com/articles/cloning-a-repository/ [git-fork]: https://help.github.com/articles/fork-a-repo/ [geckodriver]: https://github.com/mozilla/geckodriver/releases/tag/v0.19.1 [pypom]: http://pypom.readthedocs.io/en/latest/ [pytest]: https://docs.pytest.org/en/latest/ [pytest-html]: https://github.com/pytest-dev/pytest-html [pytest-selenium]: http://pytest-selenium.readthedocs.org/ [Selenium]: http://selenium-python.readthedocs.io/index.html [selenium-api]: http://selenium-python.readthedocs.io/locating-elements.html [Tox]: http://tox.readthedocs.io/ ================================================ FILE: test/integration/download-tests.js ================================================ /* global browser */ const assert = require('assert'); const fs = require('fs'); const path = require('path'); const DownloadPage = require('./pages/desktop/download_page'); const HomePage = require('./pages/desktop/home_page'); describe('Firefox Send', function() { const homePage = new HomePage(); const downloadDir = browser.desiredCapabilities['moz:firefoxOptions']['prefs'][ 'browser.download.dir' ]; const testFilesPath = path.join(__dirname, 'fixtures'); const testFiles = fs.readdirSync(testFilesPath); beforeEach(function() { homePage.open(); }); testFiles.forEach(file => { it(`should upload and download files, file: ${file}`, function() { browser.chooseFile(homePage.uploadInput, `${testFilesPath}/${file}`); browser.waitForExist(homePage.uploadButton); browser.click(homePage.uploadButton); browser.waitForExist(homePage.shareUrl); const downloadPage = new DownloadPage( browser.getValue(homePage.shareUrl) ); downloadPage.open(); downloadPage.download(); browser.waitForExist(downloadPage.downloadComplete); assert.ok(fs.existsSync(path.join(downloadDir, file))); }); }); it('should update the download count on home page after 1 download', function() { browser.chooseFile( homePage.uploadInput, `${testFilesPath}/${testFiles[0]}` ); browser.waitForExist(homePage.uploadButton); browser.waitForExist(homePage.downloadCountSelect); browser.selectByIndex(homePage.downloadCountSelect, 1); browser.click(homePage.uploadButton); browser.waitForExist(homePage.shareUrl); const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); downloadPage.open(); downloadPage.download(); browser.waitForExist(downloadPage.downloadComplete); browser.back(); browser.waitForExist('send-archive'); assert( browser .getText('send-archive > div:first-of-type') .includes('Expires after 1 download') ); }); it('should ensure that the downloaded file size matches the uploaded file size', function() { browser.chooseFile( homePage.uploadInput, `${testFilesPath}/${testFiles[0]}` ); // get the file size for upload const uploadSize = fs.statSync(`${testFilesPath}/${testFiles[0]}`).size; browser.waitForExist(homePage.uploadButton); browser.click(homePage.uploadButton); browser.waitForExist(homePage.shareUrl); const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); downloadPage.open(); downloadPage.download(); browser.waitForExist(downloadPage.downloadComplete); // get the file size for download const downloadFile = path.join(downloadDir, `${testFiles[0]}`); const downloadSize = fs.statSync(downloadFile).size; // check if upload and download file sizes are equal assert.equal(uploadSize, downloadSize); }); it(`should upload and download file with added tracking parameter`, function() { const trackingUrl = '?fbclid=IaMFak3Tr4ck1ng1d_SDlP0shBk8SM2EN3cCLFKpHVl-k-Pvv0sf9Zy0tnTu9srqVY'; const password = 'strongpassword'; browser.chooseFile( homePage.uploadInput, `${testFilesPath}/${testFiles[0]}` ); browser.waitForExist(homePage.addPassword); browser.click(homePage.addPassword); browser.waitForExist(homePage.passwordInput); browser.setValue(homePage.passwordInput, password); browser.click(homePage.uploadButton); browser.waitForExist(homePage.shareUrl); const shareUrl = browser.getValue(homePage.shareUrl); const downloadPage = new DownloadPage( shareUrl.replace('#', `${trackingUrl}#`) ); downloadPage.open(); downloadPage.downloadUsingPassword(password); browser.waitForExist(downloadPage.downloadComplete); assert.ok(fs.existsSync(path.join(downloadDir, testFiles[0]))); }); }); ================================================ FILE: test/integration/fixtures/txt-larger-testfile.txt ================================================ THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST! ================================================ FILE: test/integration/fixtures/txt-small-testfile.txt ================================================ THIS IS A TEST! ================================================ FILE: test/integration/homepage-tests.js ================================================ /* global browser */ const assert = require('assert'); const HomePage = require('./pages/desktop/home_page'); describe('Firefox Send homepage', function() { this.retries(2); const homePage = new HomePage(); const baseUrl = browser.options['baseUrl']; const footerLinks = ['mozilla', 'cookies', 'github']; beforeEach(function() { homePage.open(); if (process.env.ANDROID) { this.skip(); } }); it('should have the right title', function() { assert.equal(browser.getTitle(), 'Firefox Send'); }); footerLinks.forEach((link, i) => { it(`should navigate to the correct page: ${link}`, function() { // Click links on bottom of page const els = browser.elements(homePage.footerLinks); browser.elementIdClick(els.value[i].ELEMENT); // Wait for page to load browser.waitUntil(() => { const url = browser.getUrl(); return url !== baseUrl; }); assert.ok(browser.getUrl().includes(link)); }); }); }); ================================================ FILE: test/integration/pages/desktop/download_page.js ================================================ /* global browser */ const Page = require('./page'); class DownloadPage extends Page { constructor(path) { super(path); this.fileId = /download\/(\w+)\/\??.*#/.exec(path)[1]; this.downloadButton = '#download-btn'; this.downloadComplete = '#download-complete'; this.passwordInput = '#password-input'; this.passwordButton = '#password-btn'; } downloadUsingPassword(password) { browser.waitForExist(this.passwordInput); browser.setValue(this.passwordInput, password); browser.click(this.passwordButton); return browser.click(this.downloadButton); } download() { browser.waitForExist(this.downloadButton); return browser.click(this.downloadButton); } } module.exports = DownloadPage; ================================================ FILE: test/integration/pages/desktop/home_page.js ================================================ /* global browser document */ const Page = require('./page'); class HomePage extends Page { constructor() { super('/'); this.footerLinks = 'footer a'; this.uploadInput = '#file-upload'; this.uploadButton = '#upload-btn'; this.progress = 'progress'; this.shareUrl = '#share-url'; this.downloadCountSelect = '#expire-after-dl-count-select'; this.addPassword = '#add-password'; this.passwordInput = '#password-input'; this.passwordButton = '#password-btn'; } waitForPageToLoad() { super.waitForPageToLoad(); browser.waitForExist(this.uploadInput); this.showUploadInput(); return this; } showUploadInput() { browser.execute(() => { document.getElementById('file-upload').style.display = 'block'; }); } } module.exports = HomePage; ================================================ FILE: test/integration/pages/desktop/page.js ================================================ /* global browser window */ class Page { constructor(path) { this.path = path; } open() { browser.url(this.path); this.waitForPageToLoad(); } /** * @function waitForPageToLoad * @returns {Object} An object representing the page. * @throws ElementNotFound */ waitForPageToLoad() { browser.waitUntil(function() { return browser.execute(function() { return typeof window.app !== 'undefined'; }); }, 3000); browser.pause(100); return this; } } module.exports = Page; ================================================ FILE: test/integration/progress-tests.js ================================================ /* global browser */ const assert = require('assert'); const HomePage = require('./pages/desktop/home_page'); describe('Firefox Send progress page', function() { const homePage = new HomePage(); beforeEach(function() { homePage.open(); }); it('should show progress when a file is uploading', function() { browser.chooseFile(homePage.uploadInput, __filename); browser.waitForExist(homePage.uploadButton); browser.click(homePage.uploadButton); assert.ok(browser.waitForExist(homePage.progress)); }); }); ================================================ FILE: test/integration/send-test.html ================================================ Test Report

    send-test.html

    Report generated on 14-Jun-2018 at 14:20:27 by pytest-html v1.19.0

    Environment

    Base URL http://localhost:1443
    Driver Firefox
    JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    Packages {'pytest': '3.6.1', 'py': '1.5.3', 'pluggy': '0.6.0'}
    Platform Darwin-17.5.0-x86_64-i386-64bit
    Plugins {'xdist': '1.22.2', 'variables': '1.7.1', 'selenium': '1.13.0', 'metadata': '1.7.0', 'html': '1.19.0', 'forked': '0.2', 'base-url': '1.4.1'}
    Python 3.6.5

    Summary

    3 tests ran in 20.54 seconds.

    3 passed, 0 skipped, 0 failed, 0 errors, 0 expected failures, 0 unexpected passes

    Results

    Result Test Duration Links
    Passed test_download.py::test_download 0.00
    No log output captured.
    Passed test_progress.py::test_progress 0.00
    No log output captured.
    Passed test_upload.py::test_upload 0.01
    No log output captured.
    ================================================ FILE: test/readme.md ================================================ # Tests To run all the tests use `npm test`. This will run the tests and produce a code coverage report at [coverage/index.html](../coverage/index.html). The full test suite is run as a hook on each `git push`. [Mocha](https://mochajs.org) is our preferred test runner. ## Frontend Unit tests reside in `test/frontend/tests`. Frontend tests can be ran in the browser by running `npm start` and then browsing to http://localhost:8080/test. Doing it this way will watch for changes and rerun the suite automatically. You can also run them in headless Chrome by using `npm run test:frontend`. The results will be printed to the console. ## Backend Unit tests reside in `test/backend` Backend test can be run with `npm run test:backend`. [Sinon](http://sinonjs.org/) and [proxyquire](https://github.com/thlorenz/proxyquire) are used for mocking. ## Integration Integration tests include UI tests that run with Selenium. The preferred way to run these locally is with `npm run test-integration` which requires docker. To watch the tests connect with VNC. On mac enter `vnc://localhost:5900` in Safari and use the password `secret` to connect. For info on debugging a test see the [wdio debug docs](http://webdriver.io/api/utility/debug.html). ================================================ FILE: test/testServer.js ================================================ let server = null; module.exports = { onPrepare: function() { return new Promise(function(resolve) { const webpack = require('webpack'); const middleware = require('webpack-dev-middleware'); const express = require('express'); const expressWs = require('@dannycoates/express-ws'); const assets = require('../common/assets'); const routes = require('../server/routes'); const tests = require('./frontend/routes'); const app = express(); const config = require('../webpack.config'); const wpm = middleware(webpack(config(null, { mode: 'development' })), { logLevel: 'silent' }); app.use(wpm); assets.setMiddleware(wpm); expressWs(app, null, { perMessageDeflate: false }); routes(app); app.ws('/api/ws', require('../server/routes/ws')); tests(app); wpm.waitUntilValid(() => { server = app.listen(8000, resolve); }); }); }, onComplete: function() { server.close(); } }; ================================================ FILE: test/wdio.circleci.conf.js ================================================ // eslint-disable-next-line node/no-extraneous-require const ip = require('ip'); const common = require('./wdio.common.conf'); /*/ Config for running selenium from a circleci docker container against localhost /*/ exports.config = Object.assign({}, common.config, { baseUrl: `http://${ip.address()}:8000`, maxInstances: 1, bail: 1, services: [require('./testServer'), 'selenium-standalone'] }); ================================================ FILE: test/wdio.common.conf.js ================================================ const path = require('path'); const mkdirp = require('mkdirp'); const rimraf = require('rimraf'); const dir = path.join(__dirname, 'integration', 'downloads'); mkdirp.sync(dir); rimraf.sync(`${dir}${path.sep}*`); exports.config = { specs: [path.join(__dirname, './integration/**/*-tests.js')], exclude: [], maxInstances: 10, capabilities: [ { browserName: 'firefox', 'moz:firefoxOptions': { log: { level: 'trace' }, prefs: { 'browser.download.panel.shown': false, 'browser.helperApps.neverAsk.openFile': 'text/plain', 'browser.helperApps.neverAsk.saveToDisk': 'text/plain', 'browser.download.folderList': 2, 'browser.download.dir': dir } } } ], pageLoadStrategy: 'normal', watch: false, async: true, logLevel: 'error', coloredLogs: true, deprecationWarnings: true, bail: 0, screenshotOnReject: false, baseUrl: 'http://localhost:8000', waitforTimeout: 20000, connectionRetryTimeout: 90000, connectionRetryCount: 3, services: ['firefox-profile'], framework: 'mocha', reporters: ['dot', 'spec'], mochaOpts: { ui: 'bdd', timeout: 30000, retries: 1 } }; ================================================ FILE: test/wdio.docker.conf.js ================================================ // eslint-disable-next-line node/no-extraneous-require const ip = require('ip'); const common = require('./wdio.common.conf'); const dir = common.config.capabilities[0]['moz:firefoxOptions'].prefs[ 'browser.download.dir' ]; /*/ Config for running selenium in a new docker container against localhost /*/ exports.config = Object.assign({}, common.config, { baseUrl: `http://${ip.address()}:8000`, maxInstances: 1, services: ['docker', require('./testServer')], dockerOptions: { image: 'selenium/standalone-firefox-debug', healthCheck: 'http://localhost:4444', options: { p: ['4444:4444', '5900:5900'], mount: `type=bind,source=${dir},destination=${dir},consistency=delegated`, shmSize: '2g' } } }); ================================================ FILE: test/wdio.local.conf.js ================================================ // eslint-disable-next-line node/no-extraneous-require const ip = require('ip'); const common = require('./wdio.common.conf'); /*/ Config for running selenium against localhost /*/ exports.config = Object.assign({}, common.config, { baseUrl: `http://${ip.address()}:8000`, maxInstances: 1, bail: 1, services: [require('./testServer')] }); ================================================ FILE: test/wdio.remote.config.js ================================================ const common = require('./wdio.common.conf'); const path = require('path'); /*/ Config for running saucelabs against a hosted server /*/ exports.config = Object.assign({}, common.config, { baseUrl: process.env.TEST_SERVER || 'https://send.dev.mozaws.net', exclude: [ // the /test endpoint only exists on localhost path.join(__dirname, './integration/unit-tests.js'), // we don't have access to the fs in this context path.join(__dirname, './integration/download-tests.js') ], capabilities: [ { browserName: 'firefox' }, { browserName: 'chrome' }, { browserName: 'MicrosoftEdge' }, { browserName: 'safari' } ], services: ['sauce'], user: process.env.SAUCE_USERNAME, key: process.env.SAUCE_ACCESS_KEY }); ================================================ FILE: test/wdio.saucelabs.config.js ================================================ const common = require('./wdio.common.conf'); const path = require('path'); /*/ Config for running saucelabs against localhost /*/ exports.config = Object.assign({}, common.config, { maxInstances: 2, exclude: [path.join(__dirname, './integration/download-tests.js')], capabilities: [ { browserName: 'firefox' }, { browserName: 'chrome' }, { browserName: 'MicrosoftEdge' }, { browserName: 'safari' } ], services: ['sauce', require('./testServer')], sauceConnect: true, sauceConnectOpts: { // uncomment to debug // logfile: __dirname + '/sc.log', // verbose: true }, user: process.env.SAUCE_USERNAME, key: process.env.SAUCE_ACCESS_KEY }); ================================================ FILE: webpack.config.js ================================================ const path = require('path'); const webpack = require('webpack'); const CopyPlugin = require('copy-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const VersionPlugin = require('./build/version_plugin'); const AndroidIndexPlugin = require('./build/android_index_plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const webJsOptions = { babelrc: false, presets: [ [ '@babel/preset-env', { bugfixes: true, useBuiltIns: 'entry', corejs: 3 } ] ], plugins: [ '@babel/plugin-syntax-dynamic-import', 'module:nanohtml', ['@babel/plugin-proposal-class-properties', { loose: false }] ] }; const serviceWorker = { target: 'webworker', entry: { serviceWorker: './app/serviceWorker.js' }, output: { filename: '[name].js', path: path.resolve(__dirname, 'dist'), publicPath: '/' }, devtool: 'source-map', module: { rules: [ { test: /\.(png|jpg)$/, loader: 'file-loader', options: { name: '[name].[contenthash:8].[ext]' } }, { test: /\.svg$/, use: [ { loader: 'file-loader', options: { name: '[name].[contenthash:8].[ext]' } }, { loader: 'svgo-loader', options: { plugins: [ { removeViewBox: false }, // true causes stretched images { convertStyleToAttrs: true }, // for CSP, no unsafe-eval { removeTitle: true } // for smallness ] } } ] }, { // loads all assets from assets/ for use by common/assets.js test: require.resolve('./common/generate_asset_map.js'), use: ['babel-loader', 'val-loader'] } ] }, plugins: [new webpack.IgnorePlugin(/\.\.\/dist/)] }; const web = { target: 'web', entry: { app: ['./app/main.js'] // android: ['./android/android.js'], // ios: ['./ios/ios.js'] }, output: { chunkFilename: '[name].[contenthash:8].js', filename: '[name].[contenthash:8].js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.js$/, oneOf: [ { loader: 'babel-loader', include: [ path.resolve(__dirname, 'app'), path.resolve(__dirname, 'common'), // some dependencies need to get re-babeled because we // have different targets than their default configs path.resolve( __dirname, 'node_modules/@dannycoates/webcrypto-liner' ), path.resolve(__dirname, 'node_modules/@fluent'), path.resolve(__dirname, 'node_modules/intl-pluralrules') ], options: webJsOptions }, { // Strip asserts from our deps, mainly choojs family include: [path.resolve(__dirname, 'node_modules')], exclude: [ path.resolve(__dirname, 'node_modules/crc'), path.resolve(__dirname, 'node_modules/@fluent'), path.resolve(__dirname, 'node_modules/@sentry'), path.resolve(__dirname, 'node_modules/tslib'), path.resolve(__dirname, 'node_modules/webcrypto-core') ], loader: 'webpack-unassert-loader' } ] }, { test: /\.(png|jpg)$/, loader: 'file-loader', options: { name: '[name].[contenthash:8].[ext]' } }, { test: /\.svg$/, use: [ { loader: 'file-loader', options: { name: '[name].[contenthash:8].[ext]' } }, { loader: 'svgo-loader', options: { plugins: [ { cleanupIDs: false }, { removeViewBox: false }, // true causes stretched images { convertStyleToAttrs: true }, // for CSP, no unsafe-eval { removeTitle: true } // for smallness ] } } ] }, { // creates style.css with all styles test: /\.css$/, use: ExtractTextPlugin.extract({ use: [ { loader: 'css-loader', options: { importLoaders: 1 } }, 'postcss-loader' ] }) }, { test: /\.ftl$/, use: 'raw-loader' }, { // creates test.js for /test test: require.resolve('./test/frontend/index.js'), use: ['babel-loader', 'val-loader'] }, { // loads all assets from assets/ for use by common/assets.js test: require.resolve('./common/generate_asset_map.js'), use: ['babel-loader', 'val-loader'] } ] }, plugins: [ new CopyPlugin([ { context: 'public', from: '*.*' } ]), new webpack.EnvironmentPlugin(['NODE_ENV']), new webpack.IgnorePlugin(/\.\.\/dist/), // used in common/*.js new ExtractTextPlugin({ filename: '[name].[md5:contenthash:8].css' }), new VersionPlugin(), // used for the /__version__ route new AndroidIndexPlugin(), new ManifestPlugin() // used by server side to resolve hashed assets ], devtool: 'source-map', devServer: { before: process.env.NODE_ENV === 'development' && require('./server/bin/dev'), compress: true, hot: false, host: '0.0.0.0', proxy: { '/api/ws': { target: 'ws://localhost:1338', ws: true, secure: false } } } }; module.exports = (env, argv) => { const mode = argv.mode || 'production'; // eslint-disable-next-line no-console console.error(`mode: ${mode}`); process.env.NODE_ENV = web.mode = serviceWorker.mode = mode; if (mode === 'development') { // istanbul instruments the source for code coverage webJsOptions.plugins.push('istanbul'); web.entry.tests = ['./test/frontend/index.js']; } return [web, serviceWorker]; };