mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-07 22:50:53 +03:00
Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b798ce36c | ||
|
|
894ad6cb08 | ||
|
|
98c4bd0f50 | ||
|
|
898d152810 | ||
|
|
9c588ed008 | ||
|
|
1da7e1c112 | ||
|
|
19d1f8cf80 | ||
|
|
29f243fdda | ||
|
|
bd58022b08 | ||
|
|
a6fa2c642c | ||
|
|
890642fcff | ||
|
|
74ecb598d2 | ||
|
|
48b5d85904 | ||
|
|
373da3f090 | ||
|
|
4a69ccbe51 | ||
|
|
4c1496e1cd | ||
|
|
0a243dfb52 | ||
|
|
79bd847042 | ||
|
|
2fe5cad9d5 | ||
|
|
fbde75fd66 | ||
|
|
24167161b1 | ||
|
|
eda132832f | ||
|
|
4839ff3584 | ||
|
|
de2d11cc59 | ||
|
|
95779b3243 | ||
|
|
7f76a279c3 | ||
|
|
219b1d6806 | ||
|
|
efea0e5ab0 | ||
|
|
5d19a9d696 | ||
|
|
17a12e3194 | ||
|
|
b71265b0c5 | ||
|
|
4a62048d64 | ||
|
|
acd48cc2f5 | ||
|
|
364778c516 | ||
|
|
d7ca9b4f84 | ||
|
|
b6350c787a | ||
|
|
ee8a672873 | ||
|
|
67b812a538 | ||
|
|
c811cbd34e | ||
|
|
2ed09d1fda | ||
|
|
557ecb196d | ||
|
|
88e8a234d6 | ||
|
|
34eb0fce2a | ||
|
|
995054a2cb | ||
|
|
e70161bfb0 | ||
|
|
ebf62761bc | ||
|
|
cf08b03a6b | ||
|
|
f3be26d5f5 | ||
|
|
03c68b0c58 | ||
|
|
59d460e80b | ||
|
|
87f947c31d | ||
|
|
7ff0a7654c | ||
|
|
9f829e8467 | ||
|
|
b68762da50 | ||
|
|
caef279fed | ||
|
|
0dfda7c610 | ||
|
|
5c2d9d8673 | ||
|
|
be51ae7ac9 | ||
|
|
1ba6aceb1f | ||
|
|
0a3c3d8c51 |
15
CODE_OF_CONDUCT.md
Normal file
15
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Community Participation Guidelines
|
||||
|
||||
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
||||
For more details, please read the
|
||||
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
||||
|
||||
## How to Report
|
||||
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
||||
|
||||
<!--
|
||||
## Project Specific Etiquette
|
||||
|
||||
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
||||
Please update for your project.
|
||||
-->
|
||||
@@ -1,4 +1,4 @@
|
||||
# Firefox Send
|
||||
# [](https://send.firefox.com/)
|
||||
|
||||
[](https://circleci.com/gh/mozilla/send)
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ import share from './pages/share';
|
||||
import preferences from './pages/preferences';
|
||||
import error from './pages/error';
|
||||
import { getTranslator } from '../app/locale';
|
||||
import { setTranslate } from '../app/utils';
|
||||
|
||||
import { delay } from '../app/utils';
|
||||
|
||||
if (navigator.userAgent === 'Send Android') {
|
||||
@@ -69,6 +71,7 @@ function body(main) {
|
||||
}
|
||||
(async function start() {
|
||||
const translate = await getTranslator('en-US');
|
||||
setTranslate(translate);
|
||||
const { LIMITS, DEFAULTS } = await getConstants();
|
||||
app.use(state => {
|
||||
state.LIMITS = LIMITS;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
|
||||
android {
|
||||
@@ -31,7 +29,7 @@ dependencies {
|
||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||
implementation 'com.github.delight-im:Android-AdvancedWebView:v3.0.0'
|
||||
implementation "org.mozilla.components:service-firefox-accounts:${rootProject.ext.android_components_version}"
|
||||
implementation "org.mozilla.components:service-firefox-accounts:$android_components_version"
|
||||
}
|
||||
|
||||
task generateAndLinkBundle(type: Exec, description: 'Generate the android.js bundle and link it into the assets directory') {
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
package org.mozilla.firefoxsend
|
||||
|
||||
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import im.delight.android.webview.AdvancedWebView
|
||||
import android.graphics.Bitmap
|
||||
import android.content.Intent
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ComponentName
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebMessage
|
||||
import android.util.Log
|
||||
import android.os.Bundle
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.webkit.ConsoleMessage
|
||||
import android.webkit.JavascriptInterface
|
||||
import android.webkit.WebChromeClient
|
||||
import android.webkit.*
|
||||
import im.delight.android.webview.AdvancedWebView
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import mozilla.components.service.fxa.Config
|
||||
import mozilla.components.service.fxa.FirefoxAccount
|
||||
import mozilla.components.service.fxa.Profile
|
||||
import mozilla.components.service.fxa.FxaResult
|
||||
import org.json.JSONObject
|
||||
|
||||
internal class LoggingWebChromeClient : WebChromeClient() {
|
||||
override fun onConsoleMessage(cm: ConsoleMessage): Boolean {
|
||||
Log.w("CONTENT", String.format("%s @ %d: %s",
|
||||
Log.d(TAG, String.format("%s @ %d: %s",
|
||||
cm.message(), cm.lineNumber(), cm.sourceId()))
|
||||
return true
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "CONTENT"
|
||||
}
|
||||
}
|
||||
|
||||
class WebAppInterface(private val mContext: MainActivity) {
|
||||
@JavascriptInterface
|
||||
fun beginOAuthFlow() {
|
||||
mContext.beginOAuthFlow();
|
||||
mContext.beginOAuthFlow()
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
@@ -43,176 +43,184 @@ class WebAppInterface(private val mContext: MainActivity) {
|
||||
}
|
||||
|
||||
class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
||||
private var mWebView: AdvancedWebView? = null
|
||||
|
||||
private var mToShare: String? = null
|
||||
private var mToCall: String? = null
|
||||
private var mAccount: FirefoxAccount? = null
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
// https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews
|
||||
// WebView.setWebContentsDebuggingEnabled(true); // TODO only dev builds
|
||||
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG)
|
||||
webView.apply {
|
||||
setListener(this@MainActivity, this@MainActivity)
|
||||
addJavascriptInterface(WebAppInterface(this@MainActivity), JS_INTERFACE_NAME)
|
||||
setLayerType(View.LAYER_TYPE_HARDWARE, null)
|
||||
webChromeClient = LoggingWebChromeClient()
|
||||
|
||||
mWebView = findViewById<WebView>(R.id.webview) as AdvancedWebView
|
||||
mWebView!!.setListener(this, this)
|
||||
mWebView!!.setWebChromeClient(LoggingWebChromeClient())
|
||||
mWebView!!.addJavascriptInterface(WebAppInterface(this), "Android")
|
||||
mWebView!!.setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
||||
settings.apply {
|
||||
userAgentString = "Send Android"
|
||||
allowUniversalAccessFromFileURLs = true
|
||||
javaScriptEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
val webSettings = mWebView!!.getSettings()
|
||||
webSettings.setUserAgentString("Send Android")
|
||||
webSettings.setAllowUniversalAccessFromFileURLs(true)
|
||||
webSettings.setJavaScriptEnabled(true)
|
||||
|
||||
val intent = getIntent()
|
||||
val action = intent.getAction()
|
||||
val type = intent.getType()
|
||||
|
||||
if (Intent.ACTION_SEND.equals(action) && type != null) {
|
||||
if (type.equals("text/plain")) {
|
||||
val type = intent.type
|
||||
if (Intent.ACTION_SEND == intent.action && type != null) {
|
||||
if (type == "text/plain") {
|
||||
val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
|
||||
Log.w("INTENT", "text/plain " + sharedText)
|
||||
// Log.d(TAG_INTENT, "text/plain $sharedText")
|
||||
mToShare = "data:text/plain;base64," + Base64.encodeToString(sharedText.toByteArray(), 16).trim()
|
||||
} else if (type.startsWith("image/")) {
|
||||
val imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri
|
||||
Log.w("INTENT", "image/ " + imageUri)
|
||||
// Log.d(TAG_INTENT, "image/ $imageUri")
|
||||
mToShare = "data:text/plain;base64," + Base64.encodeToString(imageUri.path.toByteArray(), 16).trim()
|
||||
}
|
||||
}
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
}
|
||||
|
||||
fun beginOAuthFlow() {
|
||||
Config.release().then(fun (value: Config): FxaResult<Unit> {
|
||||
Config.release().then { value ->
|
||||
mAccount = FirefoxAccount(value, "20f7931c9054d833", "https://send.firefox.com/fxa/android-redirect.html")
|
||||
mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)?.then(fun (url: String): FxaResult<Unit> {
|
||||
Log.w("CONFIG", "GOT A URL " + url)
|
||||
this@MainActivity.runOnUiThread({
|
||||
mWebView!!.loadUrl(url)
|
||||
})
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
Log.w("CONFIG", "CREATED FIREFOXACCOUNT")
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true)
|
||||
?.then { url ->
|
||||
// Log.d(TAG_CONFIG, "GOT A URL $url")
|
||||
this@MainActivity.runOnUiThread {
|
||||
webView.loadUrl(url)
|
||||
}
|
||||
FxaResult.fromValue(Unit)
|
||||
}
|
||||
// Log.d(TAG_CONFIG, "CREATED FIREFOXACCOUNT")
|
||||
FxaResult.fromValue(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
fun shareUrl(url: String) {
|
||||
val shareIntent = Intent()
|
||||
shareIntent.action = Intent.ACTION_SEND
|
||||
shareIntent.type = "text/plain"
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, url)
|
||||
val shareIntent = Intent().apply {
|
||||
action = Intent.ACTION_SEND
|
||||
type = "text/plain"
|
||||
putExtra(Intent.EXTRA_TEXT, url)
|
||||
}
|
||||
|
||||
val components = arrayOf(ComponentName(applicationContext, MainActivity::class.java))
|
||||
val chooser = Intent.createChooser(shareIntent, "")
|
||||
chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, arrayOf(ComponentName(applicationContext, MainActivity::class.java)))
|
||||
.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, components)
|
||||
|
||||
startActivity(chooser)
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mWebView!!.onResume()
|
||||
// ...
|
||||
webView.onResume()
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onPause() {
|
||||
mWebView!!.onPause()
|
||||
// ...
|
||||
webView.onPause()
|
||||
super.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
mWebView!!.onDestroy()
|
||||
// ...
|
||||
webView.onDestroy()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, intent)
|
||||
mWebView!!.onActivityResult(requestCode, resultCode, intent)
|
||||
// ...
|
||||
webView.onActivityResult(requestCode, resultCode, intent)
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (!mWebView!!.onBackPressed()) {
|
||||
if (!webView.onBackPressed()) {
|
||||
return
|
||||
}
|
||||
// ...
|
||||
super.onBackPressed()
|
||||
}
|
||||
|
||||
override fun onPageStarted(url: String, favicon: Bitmap?) {
|
||||
if (url.startsWith("https://send.firefox.com/fxa/android-redirect.html")) {
|
||||
// We load this here so the user doesn't see the android-redirect.html page
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
|
||||
val parsed = Uri.parse(url)
|
||||
val code = parsed.getQueryParameter("code")
|
||||
val state = parsed.getQueryParameter("state")
|
||||
|
||||
code?.let { code ->
|
||||
state?.let { state ->
|
||||
val uri = Uri.parse(url)
|
||||
uri.getQueryParameter("code")?.let { code ->
|
||||
uri.getQueryParameter("state")?.let { state ->
|
||||
mAccount?.completeOAuthFlow(code, state)?.whenComplete { info ->
|
||||
//displayAndPersistProfile(code, state)
|
||||
val profile = mAccount?.getProfile(false)?.then(fun (profile: Profile): FxaResult<Unit> {
|
||||
val accessToken = info.accessToken
|
||||
val keys = info.keys
|
||||
val avatar = profile.avatar
|
||||
val displayName = profile.displayName
|
||||
val email = profile.email
|
||||
val uid = profile.uid
|
||||
val toPass = "{\"accessToken\": \"${accessToken}\", \"keys\": '${keys}', \"avatar\": \"${avatar}\", \"displayName\": \"${displayName}\", \"email\": \"${email}\", \"uid\": \"${uid}\"}"
|
||||
mToCall = "finishLogin(${toPass})"
|
||||
this@MainActivity.runOnUiThread({
|
||||
mAccount?.getProfile(false)?.then { profile ->
|
||||
val profileJsonPayload = JSONObject()
|
||||
.put("accessToken", info.accessToken)
|
||||
.put("keys", info.keys)
|
||||
.put("avatar", profile.avatar)
|
||||
.put("displayName", profile.displayName)
|
||||
.put("email", profile.email)
|
||||
.put("uid", profile.uid).toString()
|
||||
mToCall = "finishLogin($profileJsonPayload)"
|
||||
this@MainActivity.runOnUiThread {
|
||||
// Clear the history so that the user can't use the back button to see broken pages
|
||||
// that were inserted into the history by the login process.
|
||||
mWebView!!.clearHistory()
|
||||
webView.clearHistory()
|
||||
|
||||
// We also reload this here because we need to make sure onPageFinished runs after mToCall has been set.
|
||||
// We can't guarantee that onPageFinished wasn't already called at this point.
|
||||
mWebView!!.loadUrl("file:///android_asset/android.html")
|
||||
})
|
||||
|
||||
|
||||
return FxaResult.fromValue(Unit)
|
||||
})
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
}
|
||||
FxaResult.fromValue(Unit)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Log.w("MAIN", "onPageStarted");
|
||||
if (!url.startsWith("file:///android_asset/") && !url.startsWith("https://accounts.firefox.com/")) {
|
||||
// Don't allow loading anything other than the app in our webview
|
||||
// It should be possible to do this with shouldOverrideUrlLoading
|
||||
// but it didn't seem to be working, so this works as a hack.
|
||||
webView.loadUrl("file:///android_asset/android.html")
|
||||
Log.d(TAG_MAIN, "BAD URL " + url)
|
||||
} else {
|
||||
// Log.d(TAG_MAIN, "onPageStarted " + url)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPageFinished(url: String) {
|
||||
Log.w("MAIN", "onPageFinished")
|
||||
// Log.d(TAG_MAIN, "onPageFinished")
|
||||
if (mToShare != null) {
|
||||
Log.w("INTENT", mToShare)
|
||||
// Log.d(TAG_INTENT, mToShare)
|
||||
|
||||
mWebView?.postWebMessage(WebMessage(mToShare), Uri.EMPTY)
|
||||
webView.postWebMessage(WebMessage(mToShare), Uri.EMPTY)
|
||||
mToShare = null
|
||||
}
|
||||
if (mToCall != null) {
|
||||
this@MainActivity.runOnUiThread({
|
||||
mWebView?.evaluateJavascript(mToCall, fun (value: String) {
|
||||
this@MainActivity.runOnUiThread {
|
||||
webView.evaluateJavascript(mToCall) {
|
||||
mToCall = null
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPageError(errorCode: Int, description: String, failingUrl: String) {
|
||||
Log.w("MAIN", "onPageError " + description)
|
||||
Log.d(TAG_MAIN, "onPageError($errorCode, $description, $failingUrl)")
|
||||
}
|
||||
|
||||
override fun onDownloadRequested(url: String, suggestedFilename: String, mimeType: String, contentLength: Long, contentDisposition: String, userAgent: String) {
|
||||
Log.w("MAIN", "onDownloadRequested")
|
||||
override fun onDownloadRequested(url: String,
|
||||
suggestedFilename: String,
|
||||
mimeType: String,
|
||||
contentLength: Long,
|
||||
contentDisposition: String,
|
||||
userAgent: String) {
|
||||
// Log.d(TAG_MAIN, "onDownloadRequested")
|
||||
}
|
||||
|
||||
override fun onExternalPageRequest(url: String) {
|
||||
Log.w("MAIN", "onExternalPageRequest")
|
||||
// Log.d(TAG_MAIN, "onExternalPageRequest($url)")
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG_MAIN = "MAIN"
|
||||
private const val TAG_INTENT = "INTENT"
|
||||
private const val TAG_CONFIG = "CONFIG"
|
||||
private const val JS_INTERFACE_NAME = "Android"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
<im.delight.android.webview.AdvancedWebView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/webView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<im.delight.android.webview.AdvancedWebView
|
||||
android:id="@+id/webview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
tools:context=".MainActivity" />
|
||||
@@ -8,20 +8,15 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.3.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.20"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
classpath 'com.android.tools.build:gradle:3.3.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
maven {
|
||||
url "https://maven.mozilla.org/maven2"
|
||||
}
|
||||
maven { url "https://maven.mozilla.org/maven2" }
|
||||
jcenter()
|
||||
maven { url "https://jitpack.io" }
|
||||
}
|
||||
|
||||
@@ -18,23 +18,6 @@ export default class Keychain {
|
||||
false,
|
||||
['deriveKey']
|
||||
);
|
||||
this.encryptKeyPromise = this.secretKeyPromise.then(function(secretKey) {
|
||||
return crypto.subtle.deriveKey(
|
||||
{
|
||||
name: 'HKDF',
|
||||
salt: new Uint8Array(),
|
||||
info: encoder.encode('encryption'),
|
||||
hash: 'SHA-256'
|
||||
},
|
||||
secretKey,
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
length: 128
|
||||
},
|
||||
false,
|
||||
['encrypt', 'decrypt']
|
||||
);
|
||||
});
|
||||
this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) {
|
||||
return crypto.subtle.deriveKey(
|
||||
{
|
||||
|
||||
@@ -286,7 +286,7 @@ module.exports.wip = function(state, emit) {
|
||||
>
|
||||
<input
|
||||
id="file-upload"
|
||||
class="opacity-0 w-0 h-0 appearance-none absolute"
|
||||
class="opacity-0 w-0 h-0 appearance-none absolute overflow-hidden"
|
||||
type="file"
|
||||
multiple
|
||||
onfocus="${focus}"
|
||||
|
||||
@@ -7,8 +7,8 @@ Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.m
|
||||
### Uploading
|
||||
|
||||
1. A new secret key is generated with `crypto.getRandomValues`
|
||||
2. The secret key is used to derive 3 more keys via HKDF SHA-256
|
||||
- an encryption key for the file (AES-GCM)
|
||||
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
|
||||
|
||||
3366
package-lock.json
generated
3366
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
59
package.json
59
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "firefox-send",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "3.0.9",
|
||||
"version": "3.0.10",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"repository": "mozilla/send",
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
@@ -27,7 +27,7 @@
|
||||
"test:report": "nyc report --reporter=html",
|
||||
"test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js",
|
||||
"circleci-test-integration": "cross-env NODE_ENV=development wdio test/wdio.circleci.conf.js",
|
||||
"start": "npm run clean && cross-env NODE_ENV=development FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
||||
"start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
|
||||
"android": "cross-env ANDROID=1 npm start",
|
||||
"prod": "node server/bin/prod.js"
|
||||
},
|
||||
@@ -60,27 +60,27 @@
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.3.4",
|
||||
"@babel/plugin-proposal-class-properties": "^7.3.4",
|
||||
"@babel/core": "^7.4.3",
|
||||
"@babel/plugin-proposal-class-properties": "^7.4.0",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||
"@babel/preset-env": "^7.3.4",
|
||||
"@babel/preset-env": "^7.4.3",
|
||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||
"@dannycoates/webpack-dev-server": "^3.1.4",
|
||||
"@fullhuman/postcss-purgecss": "^1.1.0",
|
||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||
"asmcrypto.js": "^0.22.0",
|
||||
"babel-loader": "^8.0.5",
|
||||
"babel-plugin-istanbul": "^5.1.1",
|
||||
"babel-plugin-istanbul": "^5.1.2",
|
||||
"base64-js": "^1.3.0",
|
||||
"content-disposition": "^0.5.3",
|
||||
"copy-webpack-plugin": "^5.0.0",
|
||||
"core-js": "^2.6.5",
|
||||
"copy-webpack-plugin": "^5.0.2",
|
||||
"core-js": "^3.0.1",
|
||||
"crc": "^3.8.0",
|
||||
"cross-env": "^5.2.0",
|
||||
"css-loader": "^2.1.1",
|
||||
"css-mqpacker": "^7.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"eslint": "^5.15.1",
|
||||
"eslint": "^5.16.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
"eslint-plugin-node": "^8.0.1",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
@@ -95,29 +95,29 @@
|
||||
"http_ece": "^1.1.0",
|
||||
"husky": "^1.3.1",
|
||||
"lint-staged": "^8.1.5",
|
||||
"mocha": "^6.0.2",
|
||||
"mocha": "^6.1.3",
|
||||
"morgan": "^1.9.1",
|
||||
"nanobus": "^4.4.0",
|
||||
"nanohtml": "^1.4.0",
|
||||
"nanohtml": "^1.5.0",
|
||||
"nanotiming": "^7.3.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"nyc": "^13.3.0",
|
||||
"nyc": "^14.0.0",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"postcss-preset-env": "^6.6.0",
|
||||
"prettier": "^1.16.4",
|
||||
"prettier": "^1.17.0",
|
||||
"proxyquire": "^2.1.0",
|
||||
"puppeteer": "1.11.0",
|
||||
"raven-js": "^3.27.0",
|
||||
"raw-loader": "^1.0.0",
|
||||
"raw-loader": "^2.0.0",
|
||||
"redis-mock": "^0.43.0",
|
||||
"rimraf": "^2.6.3",
|
||||
"script-loader": "^0.7.2",
|
||||
"sinon": "^7.2.7",
|
||||
"sinon": "^7.3.2",
|
||||
"string-hash": "^1.1.3",
|
||||
"stylelint": "^9.10.1",
|
||||
"stylelint-config-standard": "^18.2.0",
|
||||
"stylelint": "^10.0.1",
|
||||
"stylelint-config-standard": "^18.3.0",
|
||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
||||
"svgo": "^1.2.0",
|
||||
"svgo": "^1.2.2",
|
||||
"svgo-loader": "^2.2.0",
|
||||
"tailwindcss": "^0.7.4",
|
||||
"val-loader": "^1.1.1",
|
||||
@@ -128,26 +128,26 @@
|
||||
"wdio-sauce-service": "^0.4.14",
|
||||
"wdio-selenium-standalone-service": "0.0.12",
|
||||
"wdio-spec-reporter": "^0.1.5",
|
||||
"webdriverio": "^4.14.3",
|
||||
"webdriverio": "^4.14.4",
|
||||
"webpack": "4.28.4",
|
||||
"webpack-cli": "^3.2.3",
|
||||
"webpack-dev-middleware": "^3.6.1",
|
||||
"webpack-cli": "^3.3.0",
|
||||
"webpack-dev-middleware": "^3.6.2",
|
||||
"webpack-manifest-plugin": "^2.0.4",
|
||||
"webpack-unassert-loader": "^1.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@google-cloud/storage": "^2.4.2",
|
||||
"aws-sdk": "^2.417.0",
|
||||
"@google-cloud/storage": "^2.5.0",
|
||||
"aws-sdk": "^2.438.0",
|
||||
"body-parser": "^1.18.3",
|
||||
"choo": "^6.12.1",
|
||||
"cldr-core": "^34.0.0",
|
||||
"choo": "^6.13.3",
|
||||
"cldr-core": "^35.0.0",
|
||||
"convict": "^4.4.1",
|
||||
"express": "^4.16.3",
|
||||
"express-ws": "github:dannycoates/express-ws",
|
||||
"fluent": "^0.11.0",
|
||||
"fluent": "^0.12.0",
|
||||
"fluent-langneg": "^0.1.1",
|
||||
"fxa-geodb": "^1.0.4",
|
||||
"helmet": "^3.15.1",
|
||||
"helmet": "^3.16.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mozlog": "^2.2.0",
|
||||
"node-fetch": "^2.3.0",
|
||||
@@ -155,7 +155,7 @@
|
||||
"redis": "^2.8.0",
|
||||
"selenium-standalone": "^6.15.6",
|
||||
"ua-parser-js": "^0.7.19",
|
||||
"websocket-stream": "^5.1.2"
|
||||
"websocket-stream": "^5.4.0"
|
||||
},
|
||||
"availableLanguages": [
|
||||
"en-US",
|
||||
@@ -186,6 +186,8 @@
|
||||
"it",
|
||||
"ja",
|
||||
"ka",
|
||||
"kab",
|
||||
"ko",
|
||||
"lt",
|
||||
"nl",
|
||||
"nn-NO",
|
||||
@@ -196,6 +198,7 @@
|
||||
"ru",
|
||||
"sk",
|
||||
"sl",
|
||||
"sq",
|
||||
"sr",
|
||||
"sv-SE",
|
||||
"tr",
|
||||
|
||||
@@ -94,15 +94,25 @@ totalSize = Συνολικό μέγεθος: { $size }
|
||||
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 = Επιλέξτε αρχεία για μεταφόρτωση
|
||||
@@ -117,9 +127,21 @@ emailPlaceholder = Εισάγετε το email σας
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size }
|
||||
signInButton = Σύνδεση/εγγραφή
|
||||
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 = Συνέχεια με αυτό το πρόγραμμα περιήγησης
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = web experiment
|
||||
siteFeedback = Feedback
|
||||
uploadPageHeader = Private, Encrypted File Sharing
|
||||
uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
||||
uploadPageLearnMore = Learn more
|
||||
uploadPageDropMessage = Drop your file here to start uploading
|
||||
uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB
|
||||
uploadPageBrowseButton = Select a file on your computer
|
||||
uploadPageBrowseButton1 = Select a file to upload
|
||||
uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported.
|
||||
uploadPageBrowseButtonTitle = Upload file
|
||||
uploadingPageProgress = Uploading { $filename } ({ $size })
|
||||
importingFile = Importing…
|
||||
verifyingFile = Verifying…
|
||||
encryptingFile = Encrypting…
|
||||
decryptingFile = Decrypting…
|
||||
notifyUploadDone = Your upload has finished.
|
||||
uploadingPageMessage = Once your file uploads you will be able to set expiry options.
|
||||
uploadingPageCancel = Cancel upload
|
||||
uploadCancelNotification = Your upload was cancelled.
|
||||
uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight!
|
||||
uploadingFileNotification = Notify me when the upload is complete.
|
||||
uploadSuccessConfirmHeader = Ready to Send
|
||||
uploadSvgAlt = Upload
|
||||
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
|
||||
expireInfo = The link to your file will expire after { $downloadCount } or { $timespan }.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] 1 download
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 hour
|
||||
*[other] { $num } hours
|
||||
}
|
||||
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
|
||||
copyUrlFormButton = Copy to clipboard
|
||||
copiedUrl = Copied!
|
||||
deleteFileButton = Delete file
|
||||
sendAnotherFileLink = Send another file
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = Download
|
||||
downloadsFileList = Downloads
|
||||
# Used as header in a column indicating the amount of time left before a
|
||||
# download link expires (e.g. "10h 5m")
|
||||
timeFileList = Time
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = Download { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
unlockInputLabel = Enter Password
|
||||
unlockInputPlaceholder = Password
|
||||
unlockButtonLabel = Unlock
|
||||
downloadFileTitle = Download Encrypted File
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Download
|
||||
downloadNotification = Your download has completed.
|
||||
downloadFinish = Download Complete
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Try Firefox Send
|
||||
downloadingPageProgress = Downloading { $filename } ({ $size })
|
||||
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
|
||||
errorAltText = Upload error
|
||||
errorPageHeader = Something went wrong!
|
||||
errorPageMessage = There has been an error uploading the file.
|
||||
errorPageLink = Send another file
|
||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
||||
linkExpiredAlt = Link expired
|
||||
expiredPageHeader = This link has expired or never existed in the first place!
|
||||
notSupportedHeader = Your browser is not supported.
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox!
|
||||
notSupportedLink = Why is my browser not supported?
|
||||
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
|
||||
updateFirefox = Update Firefox
|
||||
downloadFirefoxButtonSub = Free Download
|
||||
uploadedFile = File
|
||||
copyFileList = Copy URL
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = Expires In
|
||||
deleteFileList = Delete
|
||||
nevermindButton = Never mind
|
||||
legalHeader = Terms & Privacy
|
||||
legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot <a>Terms of Service</a> and <a>Privacy Notice</a>. You can learn more about this experiment and its data collection <a>here</a>.
|
||||
legalNoticeMozilla = Use of the Firefox Send web site is also subject to Mozilla’s <a>Websites Privacy Notice</a> and <a>Websites Terms of Use</a>.
|
||||
deletePopupText = Delete this file?
|
||||
deletePopupYes = Yes
|
||||
deletePopupCancel = Cancel
|
||||
deleteButtonHover = Delete
|
||||
copyUrlHover = Copy URL
|
||||
footerLinkLegal = Legal
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = About Test Pilot
|
||||
footerLinkPrivacy = Privacy
|
||||
footerLinkTerms = Terms
|
||||
footerLinkCookies = Cookies
|
||||
requirePasswordCheckbox = Require a password to download this file
|
||||
addPasswordButton = Add password
|
||||
changePasswordButton = Change
|
||||
passwordTryAgain = Incorrect password. Try again.
|
||||
reportIPInfringement = Report IP Infringement
|
||||
javascriptRequired = Firefox Send requires JavaScript
|
||||
whyJavascript = Why does Firefox Send require JavaScript?
|
||||
enableJavascript = Please enable JavaScript and try again.
|
||||
@@ -113,14 +41,12 @@ enableJavascript = Please enable JavaScript and try again.
|
||||
expiresHoursMinutes = { $hours }h { $minutes }m
|
||||
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
|
||||
expiresMinutes = { $minutes }m
|
||||
# A short status message shown when a password is successfully set
|
||||
passwordIsSet = Password set
|
||||
# A short status message shown when the user enters a long password
|
||||
maxPasswordLength = Maximum password length: { $length }
|
||||
# A short status message shown when there was an error setting the password
|
||||
passwordSetError = This password could not be set
|
||||
|
||||
## New strings for the vNext version of Firefox Send
|
||||
## Send version 2 strings
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox Send
|
||||
@@ -152,7 +78,17 @@ fileCount =
|
||||
[one] 1 file
|
||||
*[other] { $num } files
|
||||
}
|
||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
||||
# 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:
|
||||
@@ -184,15 +120,15 @@ 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 a localized number followed by a unit of bytes, ex. 2.5GB
|
||||
# $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 a localized number followed by a unit of bytes, ex. 2.5GB
|
||||
# $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 }
|
||||
signInButton = Sign in/up
|
||||
accountBenefitTitle = Create a { -firefox } Account or sign in
|
||||
# size is a localized number followed by a unit of bytes, ex. 2.5GB
|
||||
# $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 =
|
||||
|
||||
@@ -77,6 +77,10 @@ fileCount =
|
||||
[one] 1 archivo
|
||||
*[other] { $num } archivos
|
||||
}
|
||||
# byte abbreviation
|
||||
bytes = B
|
||||
# kibibyte abbreviation
|
||||
kb = KB
|
||||
# mebibyte abbreviation
|
||||
mb = MB
|
||||
# gibibyte abbreviation
|
||||
|
||||
@@ -20,7 +20,7 @@ unlockButtonLabel = Avaa
|
||||
downloadButtonLabel = Lataa
|
||||
downloadFinish = Lataus valmis
|
||||
fileSizeProgress = { $partialSize } / { $totalSize }
|
||||
sendYourFilesLink = Kokeile Firefox Sendiä
|
||||
sendYourFilesLink = Kokeile Firefox 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
|
||||
@@ -38,9 +38,9 @@ javascriptRequired = Firefox-Send vaatii JavaScriptin
|
||||
whyJavascript = Miksi Firefox 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
|
||||
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
|
||||
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
|
||||
@@ -54,11 +54,14 @@ passwordSetError = Tätä salasanaa ei voitu asettaa
|
||||
-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 minuutti
|
||||
*[other] { $num } minuuttia
|
||||
[one] 1 minuutin
|
||||
*[other] { $num } minuutin
|
||||
}
|
||||
timespanDays =
|
||||
{ $num ->
|
||||
@@ -87,9 +90,24 @@ gb = Gt
|
||||
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 }
|
||||
@@ -99,17 +117,31 @@ legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019
|
||||
expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min
|
||||
addFilesButton = Valitse lähetettävät tiedostot
|
||||
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
|
||||
signInButton = Kirjaudu tai rekisteröidy
|
||||
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 tiedostoja, joiden koko on enintään { $size }
|
||||
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
|
||||
|
||||
@@ -54,6 +54,9 @@ passwordSetError = Iste contrasigno non pote ser definite
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Comparti file in maniera confidential
|
||||
notifyUploadEncryptDone = Tu file es cryptate e preste pro ser 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
|
||||
@@ -129,8 +132,11 @@ accountBenefitTimeLimit =
|
||||
[one] Retene active le ligamine pro 1 die
|
||||
*[other] Retene active le ligamine pro { $count } dies
|
||||
}
|
||||
accountBenefitSync = Gere files compartite ab ulle apparato
|
||||
accountBenefitMoz = Discoperi altere servicios de { -mozilla }
|
||||
signOut = Disconnecter
|
||||
okButton = OK
|
||||
downloadingTitle = Discargamento
|
||||
noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator
|
||||
noStreamsOptionFirefox = Prova nostre navigator favorite
|
||||
noStreamsOptionDownload = Continuar con iste navigator
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = Tarmit web
|
||||
siteFeedback = Tikti
|
||||
uploadPageHeader = Beṭṭu n ifuyla s uwgelhen akked tbaḍnit
|
||||
uploadPageExplainer = Azen ifuyla s wudem aɣelsant, s tbaḍnit akked uwgelhen, s useqdec n useɣwen ara yemten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
||||
uploadPageLearnMore = Issin ugar
|
||||
uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali
|
||||
uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ
|
||||
uploadPageBrowseButton = Fren afaylu sef uselkim-ik
|
||||
uploadPageBrowseButton1 = Fren afaylu ad tazneḍ
|
||||
uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan.
|
||||
uploadPageBrowseButtonTitle = Sali ifuyla
|
||||
uploadingPageProgress = Tuzna n { $filename } ({ $size })
|
||||
importingFile = Akter...
|
||||
verifyingFile = Asenqed...
|
||||
encryptingFile = Awgelhen...
|
||||
decryptingFile = Azmek...
|
||||
notifyUploadDone = Asali n ufaylu yemmed.
|
||||
uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara.
|
||||
uploadingPageCancel = Sefsex asali
|
||||
uploadCancelNotification = Asali-ik yefsex.
|
||||
uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi!
|
||||
uploadingFileNotification = Lɣu-yid ticki yemmed usali.
|
||||
uploadSuccessConfirmHeader = Ihegga i walluy
|
||||
uploadSvgAlt = Sali
|
||||
uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen.
|
||||
expireInfo = Aseɣwen icudden ar ufaylu-inek ad yemmet send { $downloadCount } naɣ { $timespan }.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] 1 usider
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 usrag
|
||||
*[other] { $num } isragen
|
||||
}
|
||||
copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename }
|
||||
copyUrlFormButton = Sers ɣef afus
|
||||
copiedUrl = Yenɣel!
|
||||
deleteFileButton = Kkes afaylu
|
||||
sendAnotherFileLink = Azen afaylu-nniḍen
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = Sider
|
||||
downloadsFileList = Isidar
|
||||
# Used as header in a column indicating the amount of time left before a
|
||||
# download link expires (e.g. "10h 5m")
|
||||
timeFileList = Akud
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = Sider { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
unlockInputLabel = Sekcem awal uffir
|
||||
unlockInputPlaceholder = Awal uffir
|
||||
unlockButtonLabel = Serreḥ
|
||||
downloadFileTitle = Sider afaylu awgelhan
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Sider
|
||||
downloadNotification = Asider-ik yemmed.
|
||||
downloadFinish = Asider yemmed
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Ɛreḍ Firefox Send
|
||||
downloadingPageProgress = Asider n { $filename } ({ $size })
|
||||
downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen.
|
||||
errorAltText = Tuccḍa n tuzna
|
||||
errorPageHeader = Yella wayen yeḍran!
|
||||
errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu.
|
||||
errorPageLink = Azen afaylu-nniḍen
|
||||
fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
|
||||
linkExpiredAlt = Aseɣwen yemmut
|
||||
expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara!
|
||||
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox!
|
||||
notSupportedLink = Ayγer iminig inu ur yettwasefrek ara?
|
||||
notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik.
|
||||
updateFirefox = Leqqem Firefox
|
||||
downloadFirefoxButtonSub = Asider ilelli
|
||||
uploadedFile = Afaylu
|
||||
copyFileList = Nɣel URL
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = Ad ifak di
|
||||
deleteFileList = Kkes
|
||||
nevermindButton = Wicqa
|
||||
legalHeader = Tiwtilin &tabaḍnit
|
||||
legalNoticeTestPilot = Firefox Send yettwasekyad akka tura am tarmit Test Pilot, ihi ad yili daw n <a>n tewtilin n useqdec </a> n Test Pilot akked <a>Tasertit n tbaḍnit</a>. Tzemreḍ ad teẓreḍ ugar ɣeef tarmit-agi akked ulqaḍ n isefka<a> dagihere</a>.
|
||||
legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n <a> ilugan tbaḍnit n yismal web </a> n Mozilla akked <a> Tiwtilin n useqdec n yismal Web</a> n Mozilla.
|
||||
deletePopupText = Kkes afaylu-agi?
|
||||
deletePopupYes = Ih
|
||||
deletePopupCancel = Sefsex
|
||||
deleteButtonHover = Kkes
|
||||
copyUrlHover = Nɣel URL.
|
||||
footerLinkLegal = Usḍif
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ɣef Test Pilot
|
||||
footerLinkPrivacy = Tabaḍnit
|
||||
footerLinkTerms = Tiwtilin
|
||||
footerLinkCookies = Inagan n tuqqna
|
||||
requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi
|
||||
addPasswordButton = rnu awal uffir
|
||||
changePasswordButton = Snifel
|
||||
passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen.
|
||||
reportIPInfringement = Neqqes akukel n IP
|
||||
javascriptRequired = Firefox Send yesra JavaScript
|
||||
whyJavascript = Ayɣer firefox Send yesra JavaScript?
|
||||
enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen.
|
||||
@@ -113,9 +41,66 @@ enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍe
|
||||
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 a password is successfully set
|
||||
passwordIsSet = Awal uffir ittwasbaded
|
||||
# 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
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox Send
|
||||
-send-short-brand = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Afessas, beṭṭu n ifuyla s wudem uslig
|
||||
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 ifuyla
|
||||
}
|
||||
# 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
|
||||
expiredTitle = Immut useɣwen.
|
||||
downloadFirefox = Sider { -firefox }
|
||||
legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019
|
||||
addFilesButton = Fren ifuyla ad tessaliḍ
|
||||
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
|
||||
addPassword = Ḥrez s wawal uffir
|
||||
emailPlaceholder = Sekcem imayl inek
|
||||
signInButton = Kcem/jerred
|
||||
signOut = Ffeɣ
|
||||
okButton = IH
|
||||
downloadingTitle = Azdam
|
||||
noStreamsOptionDownload = Kemmel akked iminig-a
|
||||
|
||||
@@ -4,7 +4,7 @@ siteFeedback = 사용자 의견
|
||||
importingFile = 가져오는 중…
|
||||
encryptingFile = 암호화 중…
|
||||
decryptingFile = 복호화 중…
|
||||
downloadCount = 1 다운로드
|
||||
downloadCount = { $num } 다운로드
|
||||
timespanHours = 1 시간
|
||||
copiedUrl = 복사 완료!
|
||||
unlockInputPlaceholder = 비밀번호
|
||||
@@ -18,7 +18,7 @@ fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야
|
||||
linkExpiredAlt = 링크가 만료됨
|
||||
notSupportedHeader = 이 브라우저는 지원되지 않습니다.
|
||||
notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요?
|
||||
notSupportedOutdatedDetail = 안타깝게도 현재 브라우저 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
||||
notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다.
|
||||
updateFirefox = Firefox 업데이트
|
||||
deletePopupCancel = 아니오
|
||||
deleteButtonHover = 삭제
|
||||
@@ -45,7 +45,7 @@ passwordSetError = 이 비밀번호를 설정할 수 없었습니다
|
||||
-send-short-brand = Send
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = 간단하고 안전한 파일 공유
|
||||
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'
|
||||
@@ -82,8 +82,43 @@ totalSize = 전체 크기: { $size }
|
||||
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 } 개인정보 보호 공지
|
||||
# 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 = 업로드
|
||||
addPassword = 비밀번호로 파일 보호
|
||||
emailPlaceholder = 이메일 입력
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인
|
||||
signInButton = 로그인/등록
|
||||
signOut = 로그 아웃
|
||||
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 = 이 브라우저는 이렇게 큰 용량의 파일 암호화를 풀 수 없을 수도 있습니다.
|
||||
noStreamsOptionDownload = 이 브라우저로 계속하기
|
||||
|
||||
@@ -1,31 +1,9 @@
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = eksperiment web
|
||||
siteFeedback = Përshtypje
|
||||
uploadPageHeader = Shkëmbim Privat, i Fshehtëzuar, Kartelash
|
||||
uploadPageExplainer = Dërgoni kartela përmes një lidhjeje të parrezik, private dhe të fshehtëzuar, që skadon automatikisht për të garantuar që gjërat tuaja nuk mbesin në internet përgjithmonë.
|
||||
uploadPageLearnMore = Mësoni më tepër
|
||||
uploadPageDropMessage = Që të fillojë ngarkimi, hidheni kartelën tuaj këtu
|
||||
uploadPageSizeMessage = Për ecurinë më të qëndrueshme, më e mira është t’i mbani kartelat tuaja nën 1GB
|
||||
uploadPageBrowseButton = Përzgjidhni një kartelë nga kompjuteri juaj
|
||||
uploadPageBrowseButton1 = Përzgjidhni një kartelë për ngarkim
|
||||
uploadPageMultipleFilesAlert = Ngarkimi i shumë kartelave njëherësh, ose i një dosjeje, hëpërhë nuk mbulohen.
|
||||
uploadPageBrowseButtonTitle = Ngarkoje kartelën
|
||||
uploadingPageProgress = Po ngarkohet { $filename } ({ $size })
|
||||
importingFile = Po importohet…
|
||||
verifyingFile = Po verifikohet…
|
||||
encryptingFile = Po fshehtëzohet…
|
||||
decryptingFile = Po shfshehtëzohet…
|
||||
notifyUploadDone = Ngarkimi juaj përfundoi.
|
||||
uploadingPageMessage = Do të jeni në gjendje të caktoni parametra skadimi sapo kartela juaj të jetë ngarkuar.
|
||||
uploadingPageCancel = Anuloje ngarkimin
|
||||
uploadCancelNotification = Ngarkimi juaj u anulua.
|
||||
uploadingPageLargeFileMessage = Kjo kartelë është e madhe dhe mund të dojë ca kohë të ngarkohet. Rrini këtu!
|
||||
uploadingFileNotification = Njoftomë kur të jetë plotësuar ngarkimi .
|
||||
uploadSuccessConfirmHeader = Gati për Dërgim
|
||||
uploadSvgAlt = Ngarkoje
|
||||
uploadSuccessTimingHeader = Lidhja për te kartela juaj do të skadojë pas 1 shkarkimi ose pas 24 orësh.
|
||||
expireInfo = Lidhja për te kartela juaj do të skadojë pas { $downloadCount } ose { $timespan }.
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] 1 shkarkimi
|
||||
@@ -36,76 +14,26 @@ timespanHours =
|
||||
[one] 1 ore
|
||||
*[other] { $num } orësh
|
||||
}
|
||||
copyUrlFormLabelWithName = Kopjojeni dhe jepuani të tjerëve lidhje që të dërgoni kartelën tuaj: { $filename }
|
||||
copyUrlFormButton = Kopjoje te e papastra
|
||||
copiedUrl = U kopjua!
|
||||
deleteFileButton = Fshije kartelën
|
||||
sendAnotherFileLink = Dërgoni një kartelë tjetër
|
||||
# Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = Shkarkoje
|
||||
downloadsFileList = Shkarkime
|
||||
# Used as header in a column indicating the amount of time left before a
|
||||
# download link expires (e.g. "10h 5m")
|
||||
timeFileList = Kohë
|
||||
# Used as header in a column indicating the number of times a file has been
|
||||
# downloaded
|
||||
downloadFileName = Shkarkoje { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
unlockInputLabel = Jepni Fjalëkalimin
|
||||
unlockInputPlaceholder = Fjalëkalim
|
||||
unlockButtonLabel = Zhbllokoje
|
||||
downloadFileTitle = Shkarko Kartelën e Fshehtëzuar
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Shoku juaj po ju dërgon një kartelë me Firefox Send, një shërbim që ju lejon të shkëmbeni kartela përmes një lidhjeje të parrezik, private, dhe të fshehtëzuar, që skadon automatikisht, për të garantuar që gjërat tuaja të mos mbeten në internet përgjithmonë.
|
||||
# Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Shkarkoje
|
||||
downloadNotification = Shkarkimi juaj u plotësua.
|
||||
downloadFinish = Shkarkim i Plotësuar
|
||||
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } nga { $totalSize }) gjithsej
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Provoni Firefox Send
|
||||
downloadingPageProgress = Po shkarkohet { $filename } ({ $size })
|
||||
downloadingPageMessage = Ju lutemi, lëreni hapur këtë skedë ndërkohë që ne sjellim dhe shfshehtëzojmë kartelën tuaj.
|
||||
errorAltText = Gabim ngarkimi
|
||||
errorPageHeader = Diç shkoi ters!
|
||||
errorPageMessage = Pati një gabim gjatë ngarkimit të kartelës.
|
||||
errorPageLink = Dërgoni një kartelë tjetër
|
||||
fileTooBig = Kjo kartelë është shumë e madhe për ngarkim. Do të duhej të ishte më pak se { $size }.
|
||||
linkExpiredAlt = Lidhja skadoi
|
||||
expiredPageHeader = Kjo lidhje ka skaduar ose s’ka ekzistuar kurrë!
|
||||
notSupportedHeader = Shfletuesi juaj nuk mbulohet.
|
||||
# Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Mjerisht, ky shfletues nuk mbulon teknologjinë web mbi të cilën bazohet Firefox Send.Do t’ju duhet të provoni një shfletues tjetër. Ju këshillojmë Firefox-in!
|
||||
notSupportedLink = Pse nuk mbulohet ky shfletues?
|
||||
notSupportedOutdatedDetail = Mjerisht, ky version i Firefox-it nuk e mbulon teknologjinë web mbi të cilën bazohet Firefox Send. Do t’ju duhet të përditësoni shfletuesin tuaj.
|
||||
updateFirefox = Përditësojeni Firefox-in
|
||||
downloadFirefoxButtonSub = Shkarkim Falas
|
||||
uploadedFile = Kartelë
|
||||
copyFileList = Kopjo URL-në
|
||||
# expiryFileList is used as a column header
|
||||
expiryFileList = Skadon Më
|
||||
deleteFileList = Fshije
|
||||
nevermindButton = S’prish punë
|
||||
legalHeader = Kushte & Privatësi
|
||||
legalNoticeTestPilot = Firefox Send është një eksperiment Pilot Testesh dhe subjekt i <a>Kushteve të Shërbimit</a> dhe <a>Shënim Privacësie</a> për Pilot Testesh. <a>Këtu</a> mund të mësoni më tepër mbi këtë eksperiment dhe grumbullimit të të dhënave që ai kryen.
|
||||
legalNoticeMozilla = Përdorimi i sajtit Firefox Send është gjithashtu subjekt i <a>Shënimit Mbi Privatësi Sajtesh</a> të Mozilla-s dhe <a>Kushteve të Përdorimit të Sajtit</a>.
|
||||
deletePopupText = Të fshihet kjo kartelë?
|
||||
deletePopupYes = Po
|
||||
deletePopupCancel = Anuloje
|
||||
deleteButtonHover = Fshije
|
||||
copyUrlHover = Kopjoji URL-në
|
||||
footerLinkLegal = Ligjore
|
||||
# Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Rreth Pilot Testesh
|
||||
footerLinkPrivacy = Privatësi
|
||||
footerLinkTerms = Kushte
|
||||
footerLinkCookies = Cookies
|
||||
requirePasswordCheckbox = Kërko doemos një fjalëkalim për shkarkim të kësaj kartele
|
||||
addPasswordButton = Shtoni fjalëkalim
|
||||
changePasswordButton = Ndryshoje
|
||||
passwordTryAgain = Fjalëkalim i pasaktë. Riprovoni.
|
||||
reportIPInfringement = Raportoni Cenim IP-je
|
||||
javascriptRequired = Firefox Send lyp JavaScript
|
||||
whyJavascript = Ç’i duhet Firefox Send-it JavaScript-i?
|
||||
enableJavascript = Ju lutemi, aktivizoni JavaScript-in dhe riprovoni.
|
||||
@@ -113,9 +41,107 @@ enableJavascript = Ju lutemi, aktivizoni JavaScript-in dhe riprovoni.
|
||||
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 = Fjalëkalimi u caktua
|
||||
# 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
|
||||
|
||||
# Firefox Send, Send, Firefox, Mozilla are proper names and should not be localized
|
||||
-send-brand = Firefox 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
|
||||
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 }
|
||||
signInButton = Hyni/Regjistrohuni
|
||||
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
|
||||
|
||||
@@ -55,7 +55,7 @@ passwordSetError = Det här lösenordet kunde inte ställas in
|
||||
-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 skicka
|
||||
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 =
|
||||
|
||||
147
public/locales/zgh/send.ftl
Normal file
147
public/locales/zgh/send.ftl
Normal file
@@ -0,0 +1,147 @@
|
||||
# Firefox 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
|
||||
|
||||
# Firefox 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 }
|
||||
signInButton = ⴽⵛⵎ/ⵣⵎⵎⴻⵎ
|
||||
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 = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ
|
||||
@@ -7,7 +7,7 @@ const expressWs = require('express-ws');
|
||||
const morgan = require('morgan');
|
||||
const config = require('../config');
|
||||
|
||||
const ID_REGEX = '([0-9a-fA-F]{10})';
|
||||
const ID_REGEX = '([0-9a-fA-F]{10, 16})';
|
||||
|
||||
module.exports = function(app, devServer) {
|
||||
const wsapp = express();
|
||||
|
||||
@@ -11,9 +11,7 @@ const langData = require('cldr-core/supplemental/likelySubtags.json');
|
||||
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, '..', '..', 'dist', 'public', 'locales')
|
||||
);
|
||||
return fs.readdirSync(path.join(__dirname, '..', '..', 'public', 'locales'));
|
||||
}
|
||||
|
||||
const languages = config.l10n_dev ? allLangs() : availableLanguages;
|
||||
|
||||
@@ -48,7 +48,8 @@ module.exports = function(app) {
|
||||
imgSrc: [
|
||||
"'self'",
|
||||
'https://*.dev.lcip.org',
|
||||
'https://firefoxusercontent.com'
|
||||
'https://firefoxusercontent.com',
|
||||
'https://secure.gravatar.com'
|
||||
],
|
||||
scriptSrc: [
|
||||
"'self'",
|
||||
|
||||
@@ -12,7 +12,8 @@ const webJsOptions = {
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
useBuiltIns: 'entry'
|
||||
useBuiltIns: 'entry',
|
||||
corejs: 3
|
||||
}
|
||||
]
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user