Merge branch 'development' into 'master'
Time for a new release Closes #103, #104, #114, #118, #123, #119, #78, #115, #22, #126, #58, #129, #127 et #128 See merge request fiat-tux/hat-softwares/lufi!23
This commit is contained in:
commit
c83a33996d
|
@ -1,10 +1,15 @@
|
|||
local/*
|
||||
files/*
|
||||
cover_db/*
|
||||
lufi.conf
|
||||
lufi.db
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
*.bak
|
||||
*.swp
|
||||
script/hypnotoad.pid
|
||||
script/*.pid
|
||||
stop-upload
|
||||
.zanata-cache/
|
||||
themes/*
|
||||
!themes/default
|
||||
!themes/default/*
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
image: hatsoftwares/lufi-test-ci:latest
|
||||
stages:
|
||||
- podcheck
|
||||
- carton
|
||||
- carton_bdd
|
||||
- tests
|
||||
before_script:
|
||||
- rm -f *db
|
||||
variables:
|
||||
POSTGRES_DB: lufi_db
|
||||
POSTGRES_USER: lufi
|
||||
POSTGRES_PASSWORD: lufi_pwd
|
||||
MYSQL_DATABASE: lufi_db
|
||||
MYSQL_USER: lufi
|
||||
MYSQL_PASSWORD: lufi_pwd
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
|
||||
### Jobs templates
|
||||
##
|
||||
#
|
||||
.carton_bdd_template: &carton_bdd_definition
|
||||
stage: carton_bdd
|
||||
retry: 2
|
||||
artifacts:
|
||||
paths:
|
||||
- local/
|
||||
expire_in: 1 week
|
||||
dependencies:
|
||||
- carton
|
||||
.sqlite_template: &sqlite_definition
|
||||
stage: tests
|
||||
retry: 2
|
||||
dependencies:
|
||||
- carton_sqlite
|
||||
services:
|
||||
- name: rroemhild/test-openldap
|
||||
alias: rroemhild-test-openldap
|
||||
coverage: '/Total.* (\d+\.\d+)$/'
|
||||
.pg_template: &pg_definition
|
||||
stage: tests
|
||||
retry: 2
|
||||
dependencies:
|
||||
- carton_postgresql
|
||||
services:
|
||||
- name: postgres:9.6
|
||||
alias: postgres
|
||||
- name: rroemhild/test-openldap
|
||||
alias: rroemhild-test-openldap
|
||||
coverage: '/Total .*(\d+\.\d+)$/'
|
||||
.mysql_template: &mysql_definition
|
||||
stage: tests
|
||||
retry: 2
|
||||
dependencies:
|
||||
- carton_mysql
|
||||
services:
|
||||
- name: mariadb:10.1
|
||||
alias: mariadb
|
||||
- name: rroemhild/test-openldap
|
||||
alias: rroemhild-test-openldap
|
||||
coverage: '/Total .*(\d+\.\d+)$/'
|
||||
|
||||
### Podcheck
|
||||
##
|
||||
#
|
||||
podcheck:
|
||||
stage: podcheck
|
||||
script:
|
||||
- make podcheck
|
||||
|
||||
### Install common dependencies
|
||||
##
|
||||
#
|
||||
carton:
|
||||
stage: carton
|
||||
artifacts:
|
||||
paths:
|
||||
- local/
|
||||
expire_in: 1 week
|
||||
dependencies: []
|
||||
script:
|
||||
- carton install --deployment --without=sqlite --without=postgresql --without=mysql
|
||||
when: always
|
||||
retry: 2
|
||||
|
||||
### Install DB related dependencies
|
||||
##
|
||||
#
|
||||
carton_sqlite:
|
||||
<<: *carton_bdd_definition
|
||||
script:
|
||||
- carton install --deployment --without=postgresql --without=mysql
|
||||
carton_postgresql:
|
||||
<<: *carton_bdd_definition
|
||||
script:
|
||||
- carton install --deployment --without=sqlite --without=mysql
|
||||
carton_mysql:
|
||||
<<: *carton_bdd_definition
|
||||
script:
|
||||
- carton install --deployment --without=sqlite --without=postgresql
|
||||
|
||||
### SQLite tests
|
||||
##
|
||||
#
|
||||
sqlite:
|
||||
<<: *sqlite_definition
|
||||
script:
|
||||
- MOJO_CONFIG=t/sqlite.conf make test
|
||||
- MOJO_CONFIG=t/sqlite.conf make cover
|
||||
|
||||
### PostgreSQL tests
|
||||
##
|
||||
#
|
||||
postgresql:
|
||||
<<: *pg_definition
|
||||
script:
|
||||
- MOJO_CONFIG=t/postgresql.conf make test
|
||||
- MOJO_CONFIG=t/postgresql.conf make cover
|
||||
|
||||
### MySQL tests
|
||||
##
|
||||
#
|
||||
mysql:
|
||||
<<: *mysql_definition
|
||||
script:
|
||||
- MOJO_CONFIG=t/mysql.conf make test
|
||||
- MOJO_CONFIG=t/mysql.conf make cover
|
15
AUTHORS.md
15
AUTHORS.md
|
@ -14,3 +14,18 @@
|
|||
* Yann Le Brech (htpasswd file support)
|
||||
* Jéssica Da Cunha (portuguese translation)
|
||||
* Ilker Kulgu (fix IE11 compatibility, Dutch translation)
|
||||
* Stéphane Baron (bugfix)
|
||||
* Butterfly of Fire (arabic translation)
|
||||
* Frju365 (german translation)
|
||||
|
||||
## Vulnerabilities / bug hunters
|
||||
|
||||
Lufi participated to a [Hackpéro](https://hackpero.com/) (sort of a bug bounty hackathon), thanks to [Bounty factory](https://hackpero.com/).
|
||||
|
||||
Many thanks to those who found bugs and vulnerabilities:
|
||||
|
||||
* joker2a
|
||||
* March
|
||||
* Nicknam3
|
||||
* SaxX
|
||||
* tfairane
|
||||
|
|
25
CHANGELOG
25
CHANGELOG
|
@ -1,5 +1,30 @@
|
|||
Revision history for Lufi
|
||||
|
||||
0.03 2018-??-??
|
||||
- Use Mojo::SQLite instead of ORLite
|
||||
- Use FiatTux plugins
|
||||
- Option to force "Burn after reading" for each uploaded file
|
||||
- Use GzipStatic and StaticCache plugins for speed
|
||||
- Allow to block files by setting an abuse field in DB
|
||||
- Display file size when uploading
|
||||
- Add Content-Security-Policy header
|
||||
- Update sjcl.js
|
||||
- Mitigate genRandomKey exception risk
|
||||
- Add report file link in the navbar
|
||||
- Allow to choose your language
|
||||
- Use a recurrent task to provision shorts
|
||||
- Add a command to migrate data from SQLite to an other database
|
||||
- Add a test suite
|
||||
- MySQL support
|
||||
- Display max size on upload page
|
||||
- Add CSRF token challenge on login
|
||||
- Add CSRF token challenge on logout
|
||||
- Add constraints on mail sending to prevent spam sending (not perfect, but
|
||||
should be good enough)
|
||||
- Add Code of Conduct
|
||||
- Add arabic translation
|
||||
- Add german translation
|
||||
|
||||
0.02.2 2017-09-18
|
||||
- Fix cron tasks bug
|
||||
|
||||
|
|
33
Makefile
33
Makefile
|
@ -1,33 +1,34 @@
|
|||
EXTRACTDIR=-D lib -D themes/default/templates
|
||||
EN=themes/default/lib/Lufi/I18N/en.po
|
||||
FR=themes/default/lib/Lufi/I18N/fr.po
|
||||
IT=themes/default/lib/Lufi/I18N/it.po
|
||||
OC=themes/default/lib/Lufi/I18N/oc.po
|
||||
CA=themes/default/lib/Lufi/I18N/ca.po
|
||||
PT=themes/default/lib/Lufi/I18N/pt.po
|
||||
NL=themes/default/lib/Lufi/I18N/nl.po
|
||||
XGETTEXT=carton exec local/bin/xgettext.pl
|
||||
POT=themes/default/lib/Lufi/I18N/lufi.pot
|
||||
XGETTEXT=carton exec local/bin/xgettext.pl -u
|
||||
CARTON=carton exec
|
||||
REAL_LUFI=script/application
|
||||
LUFI=script/lufi
|
||||
|
||||
locales:
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(EN) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(FR) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(IT) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(OC) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(CA) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(PT) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(NL) 2>/dev/null
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(POT) 2>/dev/null
|
||||
|
||||
push-locales: locales
|
||||
zanata-cli -q -B push --errors --project-version `git branch | grep \* | cut -d ' ' -f2-`
|
||||
|
||||
pull-locales:
|
||||
zanata-cli -q -B pull --min-doc-percent 50 --project-version `git branch | grep \* | cut -d ' ' -f2-`
|
||||
|
||||
stats-locales:
|
||||
zanata-cli -q stats --project-version `git branch | grep \* | cut -d ' ' -f2-`
|
||||
|
||||
podcheck:
|
||||
podchecker lib/Lufi/DB/File.pm lib/Lufi/DB/Slice.pm
|
||||
|
||||
cover:
|
||||
PERL5OPT='-Ilib/' HARNESS_PERL_SWITCHES='-MDevel::Cover' $(CARTON) cover --ignore_re '^local'
|
||||
|
||||
test:
|
||||
$(CARTON) $(REAL_LUFI) test
|
||||
@PERL5OPT='-Ilib/' HARNESS_PERL_SWITCHES='-MDevel::Cover' $(CARTON) prove -l -f -o t/test.t
|
||||
|
||||
clean:
|
||||
rm -rf lufi.db files/
|
||||
|
||||
dev: clean
|
||||
$(CARTON) morbo $(LUFI) --listen http://0.0.0.0:3000 --watch lib/ --watch script/ --watch themes/ --watch lufi.conf
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## What does Lufi mean?
|
||||
|
||||
Lufi means Let's Upload that FIle.
|
||||
Lufi means Let's Upload that FIle. It's a E2E encrypted file sharing software.
|
||||
|
||||
## Which browsers are compatible?
|
||||
|
||||
|
@ -62,9 +62,9 @@ There is the web interface, but you can use a CLI client too! Have a look at <ht
|
|||
|
||||
## Internationalization
|
||||
|
||||
Lufi comes with English and French languages. It will choose the language to display from the browser's settings.
|
||||
Lufi comes with several languages.
|
||||
|
||||
If you want to add a language, merge-requests are welcome.
|
||||
Please, see [this wiki page](https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/contribute#internationalization) to know how to contribute to internationalization.
|
||||
|
||||
## Authors
|
||||
|
||||
|
@ -76,6 +76,8 @@ Please consider contributing, either by [reporting issues](https://framagit.org/
|
|||
|
||||
The details on how to contribute are on the [wiki](https://framagit.org/luc/lufi/wikis/contribute).
|
||||
|
||||
This software uses [Fiat Tux Code of conduct](https://framagit.org/fiat-tux/code-of-conduct/blob/master/README.md).
|
||||
|
||||
## Make a donation
|
||||
|
||||
You can make a donation to the author on [Tipeee](https://www.tipeee.com/fiat-tux) or on [Liberapay](https://liberapay.com/sky/).
|
||||
|
|
50
cpanfile
50
cpanfile
|
@ -1,12 +1,14 @@
|
|||
requires 'inc::Module::Install';
|
||||
requires 'Mojolicious', '>= 7.31';
|
||||
requires 'ORLite';
|
||||
requires 'Mojolicious::Plugin::DebugDumperHelper';
|
||||
requires 'Mojolicious::Plugin::PgURLHelper';
|
||||
requires 'Mojolicious::Plugin::I18N';
|
||||
requires 'Mojolicious::Plugin::Mail';
|
||||
requires 'Mojolicious::Plugin::Authentication';
|
||||
requires 'Mojo::Pg';
|
||||
requires 'EV';
|
||||
requires 'Mojolicious::Plugin::GzipStatic';
|
||||
requires 'Mojolicious::Plugin::StaticCache';
|
||||
requires 'Mojolicious::Plugin::CSPHeader';
|
||||
requires 'Mojolicious::Plugin::FiatTux::Helpers', '== 0.08', url => 'https://framagit.org/fiat-tux/mojolicious/mojolicious-plugin-fiattux-helpers/-/archive/0.08/mojolicious-plugin-fiattux-helpers-0.08.tar.gz';
|
||||
requires 'Mojolicious::Plugin::FiatTux::GrantAccess', '== 0.05', url => 'https://framagit.org/fiat-tux/mojolicious/mojolicious-plugin-fiattux-grantaccess/-/archive/0.05/mojolicious-plugin-fiattux-grantaccess-0.05.tar.gz';
|
||||
requires 'Mojolicious::Plugin::FiatTux::Themes', '== 0.02', url => 'https://framagit.org/fiat-tux/mojolicious/mojolicious-plugin-fiattux-themes/-/archive/0.02/mojolicious-plugin-fiattux-themes-0.02.tar.gz';
|
||||
requires 'Filesys::DiskUsage';
|
||||
requires 'Switch';
|
||||
requires 'Locale::Maketext';
|
||||
|
@ -14,8 +16,40 @@ requires 'Locale::Maketext::Extract';
|
|||
requires 'Email::Valid';
|
||||
requires 'Number::Bytes::Human';
|
||||
requires 'Filesys::DfPortable';
|
||||
requires 'Switch';
|
||||
requires 'Data::Entropy';
|
||||
requires 'Net::LDAP';
|
||||
requires 'Crypt::SaltedHash';
|
||||
requires 'Apache::Htpasswd';
|
||||
requires 'Data::Validate::URI';
|
||||
requires 'Term::ProgressBar';
|
||||
requires 'URI::Find';
|
||||
|
||||
# Mojolicious optional deps
|
||||
feature 'optional_deps' => sub {
|
||||
requires 'Cpanel::JSON::XS';
|
||||
requires 'EV';
|
||||
requires 'IO::Socket::Socks';
|
||||
requires 'Role::Tiny';
|
||||
};
|
||||
|
||||
feature 'test' => sub {
|
||||
requires 'Devel::Cover';
|
||||
};
|
||||
feature 'ldap', 'LDAP authentication support' => sub {
|
||||
requires 'Net::LDAP';
|
||||
requires 'Mojolicious::Plugin::Authentication';
|
||||
};
|
||||
feature 'htpasswd', 'Htpasswd authentication support' => sub {
|
||||
requires 'Apache::Htpasswd';
|
||||
requires 'Mojolicious::Plugin::Authentication';
|
||||
};
|
||||
feature 'postgresql', 'PostgreSQL support' => sub {
|
||||
requires 'Mojo::Pg';
|
||||
requires 'Mojolicious::Plugin::PgURLHelper';
|
||||
};
|
||||
feature 'sqlite', 'SQLite support' => sub {
|
||||
requires 'Mojo::SQLite', '>= 3.000';
|
||||
};
|
||||
feature 'mysql', 'MySQL support' => sub {
|
||||
requires 'DBD::mysql', '== 4.046';
|
||||
requires 'Mojo::mysql';
|
||||
requires 'Mojolicious::Plugin::PgURLHelper';
|
||||
};
|
||||
|
|
1147
cpanfile.snapshot
1147
cpanfile.snapshot
File diff suppressed because it is too large
Load Diff
265
lib/Lufi.pm
265
lib/Lufi.pm
|
@ -3,47 +3,33 @@ package Lufi;
|
|||
use Mojo::Base 'Mojolicious';
|
||||
use Net::LDAP;
|
||||
use Apache::Htpasswd;
|
||||
use Mojolicious::Sessions;
|
||||
use Email::Valid;
|
||||
use Data::Validate::URI qw(is_web_uri);
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
$ENV{MOJO_MAX_WEBSOCKET_SIZE} = 100485760; # 10 * 1024 * 1024 = 10MiB
|
||||
|
||||
# This method will run once at server start
|
||||
sub startup {
|
||||
my $self = shift;
|
||||
my $entry;
|
||||
|
||||
my $config = $self->plugin('Config' => {
|
||||
default => {
|
||||
provisioning => 100,
|
||||
provis_step => 5,
|
||||
length => 10,
|
||||
token_length => 32,
|
||||
secrets => ['hfudsifdsih'],
|
||||
default_delay => 0,
|
||||
max_delay => 0,
|
||||
mail => {
|
||||
how => 'sendmail'
|
||||
},
|
||||
mail_sender => 'no-reply@lufi.io',
|
||||
theme => 'default',
|
||||
upload_dir => 'files',
|
||||
session_duration => 3600,
|
||||
allow_pwd_on_files => 0,
|
||||
dbtype => 'sqlite',
|
||||
}
|
||||
default => $default_config
|
||||
});
|
||||
|
||||
die "You need to provide a contact information in lufi.conf!" unless (defined($self->config('contact')));
|
||||
die 'You need to provide a contact information in lufi.conf!' unless (defined($self->config('contact')));
|
||||
die 'You need to provide a **report** information in lufi.conf!' unless (defined($self->config('report')));
|
||||
|
||||
if (Email::Valid->address($self->config('report'))) {
|
||||
$self->config('report' => 'mailto:'.$self->config('report'));
|
||||
} elsif (!is_web_uri($self->config('report'))) {
|
||||
die 'You need to provide an email address or an URL as report information in lufi.conf!';
|
||||
}
|
||||
|
||||
|
||||
# Themes handling
|
||||
shift @{$self->renderer->paths};
|
||||
shift @{$self->static->paths};
|
||||
if ($config->{theme} ne 'default') {
|
||||
my $theme = $self->home->rel_file('themes/'.$config->{theme});
|
||||
push @{$self->renderer->paths}, $theme.'/templates' if -d $theme.'/templates';
|
||||
push @{$self->static->paths}, $theme.'/public' if -d $theme.'/public';
|
||||
}
|
||||
push @{$self->renderer->paths}, $self->home->rel_file('themes/default/templates');
|
||||
push @{$self->static->paths}, $self->home->rel_file('themes/default/public');
|
||||
$self->plugin('FiatTux::Themes');
|
||||
|
||||
# Mail config
|
||||
my $mail_config = {
|
||||
|
@ -63,88 +49,30 @@ sub startup {
|
|||
# Debug
|
||||
$self->plugin('DebugDumperHelper');
|
||||
|
||||
# Check htpasswd file existence
|
||||
die 'Unable to read '.$self->config('htpasswd') if (defined($self->config('htpasswd')) && !-r $self->config('htpasswd'));
|
||||
# Compress static assets
|
||||
$self->plugin('GzipStatic');
|
||||
|
||||
# Authentication (if configured)
|
||||
$self->plugin('authentication' =>
|
||||
{
|
||||
autoload_user => 1,
|
||||
session_key => 'Dolomon',
|
||||
load_user => sub {
|
||||
my ($c, $username) = @_;
|
||||
# Headers
|
||||
$self->plugin('Lufi::Plugin::Headers');
|
||||
|
||||
return $username;
|
||||
},
|
||||
validate_user => sub {
|
||||
my ($c, $username, $password, $extradata) = @_;
|
||||
# Fiat Tux helpers
|
||||
$self->plugin('FiatTux::Helpers');
|
||||
|
||||
if (defined($c->config('ldap'))) {
|
||||
my $ldap = Net::LDAP->new($c->config->{ldap}->{uri});
|
||||
my $mesg = $ldap->bind($c->config->{ldap}->{bind_user}.$c->config->{ldap}->{bind_dn},
|
||||
password => $c->config->{ldap}->{bind_pwd}
|
||||
);
|
||||
|
||||
$mesg->code && die $mesg->error;
|
||||
|
||||
$mesg = $ldap->search(
|
||||
base => $c->config->{ldap}->{user_tree},
|
||||
filter => "(&(uid=$username)".$c->config->{ldap}->{user_filter}.")"
|
||||
);
|
||||
|
||||
if ($mesg->code) {
|
||||
$c->app->log->error($mesg->error);
|
||||
return undef;
|
||||
}
|
||||
|
||||
# we filtered out, but did we actually get a non-empty result?
|
||||
$entry = $mesg->shift_entry;
|
||||
if (!defined $entry) {
|
||||
$c->app->log->info("[LDAP authentication failed] - User $username filtered out, IP: ".$c->ip);
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Now we know that the user exists, and that he is authorized by the filter
|
||||
$mesg = $ldap->bind('uid='.$username.$c->config->{ldap}->{bind_dn},
|
||||
password => $password
|
||||
);
|
||||
|
||||
if ($mesg->code) {
|
||||
$c->app->log->info("[LDAP authentication failed] login: $username, IP: ".$c->ip);
|
||||
$c->app->log->error("[LDAP authentication failed] ".$mesg->error);
|
||||
return undef;
|
||||
}
|
||||
|
||||
$c->app->log->info("[LDAP authentication successful] login: $username, IP: ".$c->ip);
|
||||
} elsif (defined($c->config('htpasswd'))) {
|
||||
my $htpasswd = new Apache::Htpasswd({passwdFile => $c->config->{htpasswd},
|
||||
ReadOnly => 1}
|
||||
);
|
||||
if (!$htpasswd->htCheckPassword($username, $password)) {
|
||||
return undef;
|
||||
}
|
||||
$c->app->log->info("[Simple authentication successful] login: $username, IP: ".$c->ip);
|
||||
}
|
||||
|
||||
return $username;
|
||||
}
|
||||
}
|
||||
);
|
||||
if (defined($self->config('ldap')) || defined($self->config('htpasswd'))) {
|
||||
$self->app->sessions->default_expiration($self->config('session_duration'));
|
||||
}
|
||||
# Authentication
|
||||
$self->plugin('FiatTux::GrantAccess');
|
||||
|
||||
# Secrets
|
||||
$self->secrets($self->config('secrets'));
|
||||
|
||||
# Helpers
|
||||
$self->plugin('Lufi::Plugin::Helpers');
|
||||
# Hooks
|
||||
$self->hook(
|
||||
after_dispatch => sub {
|
||||
shift->provisioning();
|
||||
}
|
||||
);
|
||||
|
||||
# Recurrent task
|
||||
Mojo::IOLoop->recurring(2 => sub {
|
||||
my $loop = shift;
|
||||
|
||||
$self->provisioning();
|
||||
});
|
||||
|
||||
# For the first launch (after, this isn't really useful)
|
||||
$self->provisioning();
|
||||
|
@ -153,6 +81,12 @@ sub startup {
|
|||
mkdir($self->config('upload_dir'), 0700) unless (-d $self->config('upload_dir'));
|
||||
die ('The upload directory ('.$self->config('upload_dir').') is not writable') unless (-w $self->config('upload_dir'));
|
||||
|
||||
# Configure sessions
|
||||
my $sessions = Mojolicious::Sessions->new;
|
||||
$sessions->cookie_name('lufi');
|
||||
$sessions->cookie_path($self->config('prefix'));
|
||||
$self->sessions($sessions);
|
||||
|
||||
# Default layout
|
||||
$self->defaults(layout => 'default');
|
||||
|
||||
|
@ -160,55 +94,38 @@ sub startup {
|
|||
my $r = $self->routes;
|
||||
|
||||
# Page for files uploading
|
||||
$r->get('/' => sub {
|
||||
my $c = shift;
|
||||
if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {
|
||||
$c->render(template => 'index');
|
||||
} else {
|
||||
$c->redirect_to('login');
|
||||
}
|
||||
})->name('index');
|
||||
$r->get('/')
|
||||
->to('Misc#index')
|
||||
->name('index');
|
||||
|
||||
$r->get('/lang/:l')
|
||||
->to('Misc#change_lang')
|
||||
->name('lang');
|
||||
|
||||
if (defined $self->config('ldap') || defined $self->config('htpasswd')) {
|
||||
# Login page
|
||||
$r->get('/login' => sub {
|
||||
my $c = shift;
|
||||
if ($c->is_user_authenticated) {
|
||||
$c->redirect_to('index');
|
||||
} else {
|
||||
$c->render(template => 'login');
|
||||
}
|
||||
});
|
||||
# Authentication
|
||||
$r->post('/login' => sub {
|
||||
my $c = shift;
|
||||
my $login = $c->param('login');
|
||||
my $pwd = $c->param('password');
|
||||
$r->get('/login')
|
||||
->to('Auth#login_page');
|
||||
|
||||
# Authentication
|
||||
$r->post('/login')
|
||||
->to('Auth#login');
|
||||
|
||||
if($c->authenticate($login, $pwd)) {
|
||||
$c->redirect_to('index');
|
||||
} elsif (defined $entry) {
|
||||
$c->stash(msg => $c->l('Please, check your credentials: unable to authenticate.'));
|
||||
$c->render(template => 'login');
|
||||
} else {
|
||||
$c->stash(msg => $c->l('Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there\'s a glitch in the matrix.'));
|
||||
$c->render(template => 'login');
|
||||
}
|
||||
});
|
||||
# Logout page
|
||||
$r->get('/logout' => sub {
|
||||
my $c = shift;
|
||||
if ($c->is_user_authenticated) {
|
||||
$c->logout;
|
||||
}
|
||||
$c->render(template => 'logout');
|
||||
})->name('logout');
|
||||
$r->post('/logout')
|
||||
->to('Auth#log_out')
|
||||
->name('logout');
|
||||
}
|
||||
|
||||
# About page
|
||||
$r->get('/about' => sub {
|
||||
shift->render(template => 'about');
|
||||
})->name('about');
|
||||
$r->get('/about')
|
||||
->to('Misc#about')
|
||||
->name('about');
|
||||
|
||||
# Generated js files
|
||||
$r->get('/partial/:file')
|
||||
->to('Misc#js_files')
|
||||
->name('partial');
|
||||
|
||||
# Get instance stats
|
||||
$r->get('/fullstats')
|
||||
|
@ -216,58 +133,48 @@ sub startup {
|
|||
->name('fullstats');
|
||||
|
||||
# Get a file
|
||||
$r->get('/r/:short')->
|
||||
to('Files#r')->
|
||||
name('render');
|
||||
$r->get('/r/:short')
|
||||
->to('Files#r')
|
||||
->name('render');
|
||||
|
||||
# List of files (use localstorage, so the server know nothing about files)
|
||||
$r->get('/files' => sub {
|
||||
my $c = shift;
|
||||
if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {
|
||||
$c->render(template => 'files');
|
||||
} else {
|
||||
$c->redirect_to('login');
|
||||
}
|
||||
})->name('files');
|
||||
$r->get('/files')
|
||||
->to('Files#files')
|
||||
->name('files');
|
||||
|
||||
# Get counter informations about a file
|
||||
$r->post('/c')->
|
||||
to('Files#get_counter')->
|
||||
name('counter');
|
||||
$r->post('/c')
|
||||
->to('Files#get_counter')
|
||||
->name('counter');
|
||||
|
||||
# Get counter informations about a file
|
||||
$r->get('/d/:short/:token')->
|
||||
to('Files#delete')->
|
||||
name('delete');
|
||||
$r->get('/d/:short/:token')
|
||||
->to('Files#delete')
|
||||
->name('delete');
|
||||
|
||||
# Get some informations about delays
|
||||
$r->get('/delays' => sub {
|
||||
shift->render(template => 'delays');
|
||||
})->name('delays');
|
||||
$r->get('/delays')
|
||||
->to('Misc#delays')
|
||||
->name('delays');
|
||||
|
||||
# Get mail page
|
||||
$r->get('/m')->
|
||||
to('Mail#render_mail')->
|
||||
name('mail');
|
||||
$r->get('/m')
|
||||
->to('Mail#render_mail')
|
||||
->name('mail');
|
||||
|
||||
# Submit mail
|
||||
$r->post('/m')->
|
||||
to('Mail#send_mail');
|
||||
|
||||
# About page
|
||||
$r->get('/about' => sub {
|
||||
shift->render(template => 'about');
|
||||
})->name('about');
|
||||
$r->post('/m')
|
||||
->to('Mail#send_mail');
|
||||
|
||||
# Upload files websocket
|
||||
$r->websocket('/upload')->
|
||||
to('Files#upload')->
|
||||
name('upload');
|
||||
$r->websocket('/upload')
|
||||
->to('Files#upload')
|
||||
->name('upload');
|
||||
|
||||
# Get files websocket
|
||||
$r->websocket('/download/:short')->
|
||||
to('Files#download')->
|
||||
name('download');
|
||||
$r->websocket('/download/:short')
|
||||
->to('Files#download')
|
||||
->name('download');
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -3,6 +3,7 @@ package Lufi::Command::cron::cleanbdd;
|
|||
use Mojo::Base 'Mojolicious::Command';
|
||||
use Lufi::DB::File;
|
||||
use FindBin qw($Bin);
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
has description => 'Delete IP addresses from database after configured delay.';
|
||||
has usage => sub { shift->extract_usage };
|
||||
|
@ -19,10 +20,7 @@ sub run {
|
|||
}
|
||||
my $config = $c->app->plugin('Config', {
|
||||
file => $cfile,
|
||||
default => {
|
||||
dbtype => 'sqlite',
|
||||
keep_ip_during => 365,
|
||||
}
|
||||
default => $default_config
|
||||
});
|
||||
|
||||
my $separation = time() - $config->{keep_ip_during} * 86400;
|
||||
|
|
|
@ -3,6 +3,7 @@ package Lufi::Command::cron::cleanfiles;
|
|||
use Mojo::Base 'Mojolicious::Command';
|
||||
use Lufi::DB::File;
|
||||
use FindBin qw($Bin);
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
has description => 'Delete expired files.';
|
||||
has usage => sub { shift->extract_usage };
|
||||
|
@ -19,10 +20,7 @@ sub run {
|
|||
}
|
||||
my $config = $c->app->plugin('Config', {
|
||||
file => $cfile,
|
||||
default => {
|
||||
dbtype => 'sqlite',
|
||||
upload_dir => 'files',
|
||||
}
|
||||
default => $default_config
|
||||
});
|
||||
|
||||
my $time = time();
|
||||
|
|
|
@ -4,6 +4,7 @@ use Filesys::DiskUsage qw/du/;
|
|||
use Lufi::DB::File;
|
||||
use Switch;
|
||||
use FindBin qw($Bin);
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
has description => 'Watch the files directory and take action when over quota';
|
||||
has usage => sub { shift->extract_usage };
|
||||
|
@ -20,11 +21,7 @@ sub run {
|
|||
}
|
||||
my $config = $c->app->plugin('Config', {
|
||||
file => $cfile,
|
||||
default => {
|
||||
dbtype => 'sqlite',
|
||||
upload_dir => 'files',
|
||||
policy_when_full => 'warn'
|
||||
}
|
||||
default => $default_config
|
||||
});
|
||||
|
||||
if (defined($config->{max_total_size})) {
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
package Lufi::Command::sqliteToOtherDB;
|
||||
use Mojo::Base 'Mojolicious::Command';
|
||||
use Lufi::DB::File;
|
||||
use Lufi::DB::Slice;
|
||||
use Mojo::SQLite;
|
||||
use FindBin qw($Bin);
|
||||
use Term::ProgressBar;
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
has description => 'Migrate the records from a SQLite db to the currently configured database';
|
||||
has usage => sub { shift->extract_usage };
|
||||
|
||||
sub run {
|
||||
my $c = shift;
|
||||
|
||||
my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');
|
||||
if (defined $ENV{MOJO_CONFIG}) {
|
||||
$cfile = Mojo::File->new($ENV{MOJO_CONFIG});
|
||||
unless (-e $cfile->to_abs) {
|
||||
$cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});
|
||||
}
|
||||
}
|
||||
my $config = $c->app->plugin('Config', {
|
||||
file => $cfile,
|
||||
default => $default_config
|
||||
});
|
||||
|
||||
if ($config->{dbtype} eq 'sqlite') {
|
||||
say 'Please configure `dbtype` to something else than `sqlite` to use this command.';
|
||||
print $c->usage;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my $sqlite = Mojo::SQLite->new('sqlite:'.$config->{db_path});
|
||||
my $files = $sqlite->db->select('files', undef)->hashes;
|
||||
my $slices = $sqlite->db->select('slices', undef)->hashes;
|
||||
|
||||
my $progress = Term::ProgressBar->new({count => $files->size + $slices->size});
|
||||
|
||||
$files->each(sub {
|
||||
my ($file, $num) = @_;
|
||||
|
||||
$progress->update();
|
||||
|
||||
Lufi::DB::File->new(app => $c->app)
|
||||
->short($file->{short})
|
||||
->deleted($file->{deleted})
|
||||
->mediatype($file->{mediatype})
|
||||
->filename($file->{filename})
|
||||
->filesize($file->{filesize})
|
||||
->counter($file->{counter})
|
||||
->delete_at_first_view($file->{delete_at_first_view})
|
||||
->delete_at_day($file->{delete_at_day})
|
||||
->created_at($file->{created_at})
|
||||
->created_by($file->{created_by})
|
||||
->last_access_at($file->{last_access_at})
|
||||
->mod_token($file->{mod_token})
|
||||
->nbslices($file->{nbslices})
|
||||
->complete($file->{complete})
|
||||
->passwd($file->{passwd})
|
||||
->abuse($file->{abuse})
|
||||
->write();
|
||||
});
|
||||
$slices->each(sub {
|
||||
my ($slice, $num) = @_;
|
||||
|
||||
Lufi::DB::Slice->new(app => $c->app)
|
||||
->short($slice->{short})
|
||||
->j($slice->{j})
|
||||
->path($slice->{path})
|
||||
->write();
|
||||
|
||||
$progress->update();
|
||||
});
|
||||
}
|
||||
|
||||
=encoding utf8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Lufi::Command::cron::sqliteToOtherDB Migrate the records from a SQLite db to the currently configured database
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: script/lufi sqliteToOtherDB
|
||||
|
||||
This command needs you to:
|
||||
- set `db_path` in your config file (otherwise, it will use the default path, `lufi.db` to migrate data from)
|
||||
- set `dbtype` to an other database type in your config file
|
||||
- configure the other database access in your config file
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
|
@ -0,0 +1,47 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::Controller::Auth;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
sub login_page {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->is_user_authenticated) {
|
||||
$c->redirect_to('index');
|
||||
} else {
|
||||
$c->render(template => 'login');
|
||||
}
|
||||
}
|
||||
|
||||
sub login {
|
||||
my $c = shift;
|
||||
|
||||
my $login = $c->param('login');
|
||||
my $pwd = $c->param('password');
|
||||
|
||||
if ($c->validation->csrf_protect->has_error('csrf_token')) {
|
||||
$c->stash(msg => $c->l('Bad CSRF token.'));
|
||||
$c->render(template => 'login');
|
||||
} else {
|
||||
if($c->authenticate($login, $pwd)) {
|
||||
$c->redirect_to('index');
|
||||
} else {
|
||||
$c->stash(msg => $c->l('Please, check your credentials or your right to access this service: unable to authenticate.'));
|
||||
$c->render(template => 'login');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub log_out {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->is_user_authenticated) {
|
||||
if ($c->validation->csrf_protect->has_error('csrf_token')) {
|
||||
$c->stash(msg => $c->l('Bad CSRF token.'));
|
||||
} else {
|
||||
$c->logout;
|
||||
}
|
||||
}
|
||||
$c->render(template => 'logout');
|
||||
}
|
||||
|
||||
1;
|
|
@ -11,6 +11,16 @@ use Number::Bytes::Human qw(format_bytes);
|
|||
use Filesys::DfPortable;
|
||||
use Crypt::SaltedHash;
|
||||
|
||||
sub files {
|
||||
my $c = shift;
|
||||
|
||||
if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {
|
||||
$c->render(template => 'files');
|
||||
} else {
|
||||
$c->redirect_to('login');
|
||||
}
|
||||
}
|
||||
|
||||
sub upload {
|
||||
my $c = shift;
|
||||
|
||||
|
@ -111,9 +121,11 @@ sub upload {
|
|||
if (defined($c->config('ldap')) || defined($c->config('htpasswd'))) {
|
||||
$creator = 'User: '.$c->current_user.', IP: '.$creator;
|
||||
}
|
||||
my $delete_at_first_view = ($json->{del_at_first_view}) ? 1 : 0;
|
||||
$delete_at_first_view = 1 if $c->app->config('force_burn_after_reading');
|
||||
$f = Lufi::DB::File->new(app => $c->app)->get_empty()
|
||||
->created_by($creator)
|
||||
->delete_at_first_view(($json->{del_at_first_view}) ? 1 : 0)
|
||||
->delete_at_first_view($delete_at_first_view)
|
||||
->delete_at_day($delay)
|
||||
->mediatype($json->{type})
|
||||
->filename($json->{name})
|
||||
|
@ -153,8 +165,6 @@ sub upload {
|
|||
}
|
||||
}
|
||||
|
||||
$c->provisioning;
|
||||
|
||||
$ws->send(to_json(
|
||||
{
|
||||
success => true,
|
||||
|
@ -190,6 +200,13 @@ sub upload {
|
|||
$c->app->log->debug('Client disconnected');
|
||||
}
|
||||
);
|
||||
} else {
|
||||
$c->on(
|
||||
message => sub {
|
||||
$c->app->log->info(sprintf('Someone unauthenticated tried to upload a file. IP: %s', $c->ip));
|
||||
$c->finish;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,6 +244,20 @@ sub download {
|
|||
)));
|
||||
}
|
||||
);
|
||||
} elsif (defined($ldfile->abuse)) {
|
||||
my $abuse_msg = $c->l('This file has been deactivated by the admins. Contact them to know why.');
|
||||
$abuse_msg = $c->app->config('abuse')->{$ldfile->abuse} if ($c->app->config('abuse') && $c->app->config('abuse')->{$ldfile->abuse});
|
||||
$c->on(
|
||||
message => sub {
|
||||
my ($ws, $json) = @_;
|
||||
$c->send(decode('UTF-8', encode_json(
|
||||
{
|
||||
success => false,
|
||||
msg => $abuse_msg
|
||||
}
|
||||
)));
|
||||
}
|
||||
);
|
||||
} elsif ($ldfile->complete) {
|
||||
my $f = $ldfile;
|
||||
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::Controller::Mail;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Email::Valid;
|
||||
use Mojo::JSON qw(decode_json);
|
||||
use Mojo::URL;
|
||||
use Email::Valid;
|
||||
use URI::Find;
|
||||
|
||||
sub render_mail {
|
||||
my $c = shift;
|
||||
my $links = (defined($c->param('links'))) ? decode_json($c->param('links')) : [];
|
||||
|
||||
$c->redirect_to('/') unless (scalar(@{$links}));
|
||||
|
||||
$c->render(
|
||||
template => 'mail',
|
||||
links => $links
|
||||
|
@ -20,7 +24,34 @@ sub send_mail {
|
|||
my $validation = $c->validation;
|
||||
return $c->render(text => $c->l('Bad CSRF token!'), status => 403) if $validation->csrf_protect->has_error('csrf_token');
|
||||
|
||||
my $emails = $c->param('emails');
|
||||
my $emails = $c->param('emails');
|
||||
my $body = $c->param('body');
|
||||
my $subject = $c->param('subject');
|
||||
my $msg = '';
|
||||
|
||||
my $base_url = $c->req->url->to_abs->path('/r/');
|
||||
my $fixed_url = $base_url;
|
||||
if ($c->config('fixed_domain')) {
|
||||
$fixed_url->host($c->config('fixed_domain'));
|
||||
}
|
||||
my $at_least_one_instance_url = 0;
|
||||
my $finder = URI::Find->new(sub {
|
||||
my ($uri, $orig_uri) = @_;
|
||||
$uri = Mojo::URL->new($uri);
|
||||
if ($uri->host ne $base_url->to_abs->host && $uri->host ne $fixed_url->to_abs->host) {
|
||||
$msg .= $c->l('You can\'t add URLs that are not related to this instance.').'<br>';
|
||||
} elsif (index($orig_uri, $fixed_url->to_abs->to_string) > -1) {
|
||||
$at_least_one_instance_url = 1;
|
||||
}
|
||||
return $orig_uri;
|
||||
});
|
||||
$finder->find(\$body);
|
||||
$finder->find(\$subject);
|
||||
|
||||
$c->debug($at_least_one_instance_url);
|
||||
unless ($at_least_one_instance_url) {
|
||||
$msg .= $c->l('The body of the mail must contain at least one URL pointing to a file hosted on this instance.').'<br>';
|
||||
}
|
||||
|
||||
$emails =~ s/ //g;
|
||||
my @a = split(',', $emails);
|
||||
|
@ -33,23 +64,23 @@ sub send_mail {
|
|||
}
|
||||
}
|
||||
|
||||
my $msg = '';
|
||||
if (scalar(@bad)) {
|
||||
$msg .= $c->l('The following email addresses are not valid: %1', join(', ', @bad))."\n";
|
||||
$msg .= $c->l('The following email addresses are not valid: %1', join(', ', @bad)).'<br>';
|
||||
}
|
||||
|
||||
$msg .= $c->l('You must give email addresses.')."\n" unless (scalar(@a));
|
||||
$msg .= $c->l('The email subject can\'t be empty.')."\n" unless ($c->param('subject'));
|
||||
$msg .= $c->l('The email body can\'t be empty.')."\n" unless ($c->param('body'));
|
||||
$msg .= $c->l('You must give email addresses.').'<br>' unless (scalar(@a));
|
||||
$msg .= $c->l('The email subject can\'t be empty.').'<br>' unless ($subject);
|
||||
$msg .= $c->l('The email body can\'t be empty.').'<br>' unless ($body);
|
||||
|
||||
if ($msg) {
|
||||
return $c->render(
|
||||
template => 'mail',
|
||||
msg => $msg,
|
||||
links => [],
|
||||
values => {
|
||||
emails => $emails,
|
||||
subject => $c->param('subject'),
|
||||
body => $c->param('body')
|
||||
subject => $subject,
|
||||
body => $body
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -57,8 +88,8 @@ sub send_mail {
|
|||
$c->mail(
|
||||
from => $c->config('mail_sender'),
|
||||
bcc => $emails,
|
||||
subject => $c->param('subject'),
|
||||
data => $c->param('body')
|
||||
subject => $subject,
|
||||
data => $body
|
||||
);
|
||||
|
||||
return $c->render(
|
||||
|
|
|
@ -2,8 +2,49 @@
|
|||
package Lufi::Controller::Misc;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Mojo::File;
|
||||
use Mojo::URL;
|
||||
use Lufi::DB::File;
|
||||
|
||||
sub index {
|
||||
my $c = shift;
|
||||
if ((!defined($c->config('ldap')) && !defined($c->config('htpasswd'))) || $c->is_user_authenticated) {
|
||||
$c->render(template => 'index');
|
||||
} else {
|
||||
$c->redirect_to('login');
|
||||
}
|
||||
}
|
||||
|
||||
sub change_lang {
|
||||
my $c = shift;
|
||||
my $l = $c->param('l');
|
||||
|
||||
if ($c->iso639_native_name($l)) {
|
||||
$c->cookie($c->app->moniker.'_lang' => $l, { path => $c->config('prefix') });
|
||||
}
|
||||
|
||||
if ($c->req->headers->referrer
|
||||
&& Mojo::URL->new($c->req->headers->referrer)->host eq $c->req->url->to_abs->host) {
|
||||
return $c->redirect_to($c->req->headers->referrer);
|
||||
} else {
|
||||
return $c->redirect_to('/');
|
||||
}
|
||||
}
|
||||
|
||||
sub about {
|
||||
shift->render(template => 'about');
|
||||
}
|
||||
|
||||
sub js_files {
|
||||
my $c = shift;
|
||||
|
||||
$c->stash($c->req->params->to_hash);
|
||||
$c->render(
|
||||
template => 'partial/'.$c->param('file'),
|
||||
format => 'js',
|
||||
layout => undef,
|
||||
);
|
||||
}
|
||||
|
||||
sub fullstats {
|
||||
my $c = shift;
|
||||
|
||||
|
@ -19,4 +60,8 @@ sub fullstats {
|
|||
);
|
||||
}
|
||||
|
||||
sub delays {
|
||||
shift->render(template => 'delays');
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::File;
|
||||
use Mojo::Base -base;
|
||||
use Mojo::Collection;
|
||||
use Mojo::File;
|
||||
use Mojo::Collection 'c';
|
||||
use Lufi::DB::Slice;
|
||||
|
||||
has 'short';
|
||||
has 'deleted' => 0;
|
||||
|
@ -23,6 +25,8 @@ has 'slices' => sub {
|
|||
return Mojo::Collection->new();
|
||||
};
|
||||
has 'passwd';
|
||||
has 'abuse';
|
||||
has 'record' => 0;
|
||||
has 'app';
|
||||
|
||||
=head1 NAME
|
||||
|
@ -72,6 +76,8 @@ Have a look at Lufi::DB::File::SQLite's code: it's simple and may be more unders
|
|||
|
||||
=item B<passwd> : string
|
||||
|
||||
=item B<abuse> : integer
|
||||
|
||||
=item B<app> : a Mojolicious object
|
||||
|
||||
=back
|
||||
|
@ -109,6 +115,9 @@ sub new {
|
|||
} elsif ($dbtype eq 'postgresql') {
|
||||
use Lufi::DB::File::Pg;
|
||||
$c = Lufi::DB::File::Pg->new(@_);
|
||||
} elsif ($dbtype eq 'mysql') {
|
||||
use Lufi::DB::File::Mysql;
|
||||
$c = Lufi::DB::File::Mysql->new(@_);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -160,6 +169,21 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->record) {
|
||||
$c->app->dbi->db->query('UPDATE files SET short = ?, deleted = ?, mediatype = ?, filename = ?, filesize = ?, counter = ?, delete_at_first_view = ?, delete_at_day = ?, created_at = ?, created_by = ?, last_access_at = ?, mod_token = ?, nbslices = ?, complete = ?, passwd = ?, abuse = ? WHERE short = ?', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->abuse, $c->short);
|
||||
} else {
|
||||
$c->app->dbi->db->query('INSERT INTO files (short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd, abuse) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->abuse);
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
=head2 count_empty
|
||||
|
||||
=over 1
|
||||
|
@ -174,6 +198,14 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub count_empty {
|
||||
my $c = shift;
|
||||
|
||||
return $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NULL')->hashes->first->{count};
|
||||
}
|
||||
|
||||
=head2 already_exists
|
||||
|
||||
=over 1
|
||||
|
@ -188,6 +220,15 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub already_exists {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
return $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE short = ?', $short)->hashes->first->{count};
|
||||
}
|
||||
|
||||
=head2 get_empty
|
||||
|
||||
=over 1
|
||||
|
@ -202,6 +243,16 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub get_empty {
|
||||
my $c = shift;
|
||||
|
||||
my $r = $c->app->dbi->db->query('SELECT * FROM files WHERE created_at IS NULL')->hashes->shuffle->first;
|
||||
|
||||
return $c->_slurp($r)->created_at(time)->write;
|
||||
}
|
||||
|
||||
=head2 get_stats
|
||||
|
||||
=over 1
|
||||
|
@ -216,6 +267,18 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub get_stats {
|
||||
my $c = shift;
|
||||
|
||||
my $files = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NOT null AND deleted = ?', 0)->hashes->first->{count};
|
||||
my $deleted = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS NOT null AND deleted = ?', 1)->hashes->first->{count};
|
||||
my $empty = $c->app->dbi->db->query('SELECT count(short) AS count FROM files WHERE created_at IS null')->hashes->first->{count};
|
||||
|
||||
return { files => $files, deleted => $deleted, empty => $empty };
|
||||
}
|
||||
|
||||
=head2 from_short
|
||||
|
||||
=over 1
|
||||
|
@ -230,6 +293,21 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub from_short {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my $r = $c->app->dbi->db->query('SELECT * FROM files WHERE short = ?', $short)->hashes;
|
||||
|
||||
if ($r->size) {
|
||||
return $c->_slurp($r->first)->record(1);
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
=head2 get_oldest_undeleted_files
|
||||
|
||||
=over 1
|
||||
|
@ -244,6 +322,26 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub get_oldest_undeleted_files {
|
||||
my $c = shift;
|
||||
my $num = shift;
|
||||
|
||||
my @files;
|
||||
my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? ORDER BY created_at ASC LIMIT ?', 0, $num)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
=head2 get_expired
|
||||
|
||||
=over 1
|
||||
|
@ -258,6 +356,27 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub get_expired {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
my @files;
|
||||
## Select only files expired since two days, to be sure that nobody is still downloading it
|
||||
my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', 0, $time)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
=head2 get_no_longer_viewed
|
||||
|
||||
=over 1
|
||||
|
@ -272,6 +391,26 @@ sub delete {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub get_no_longer_viewed {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
my @files;
|
||||
my $records = $c->app->dbi->db->query('SELECT * FROM files WHERE deleted = ? AND last_access_at < ?', 0, $time)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
=head2 delete_creator_before
|
||||
|
||||
=over 1
|
||||
|
@ -288,4 +427,90 @@ sub delete {
|
|||
|
||||
=cut
|
||||
|
||||
sub delete_creator_before {
|
||||
my $c = shift;
|
||||
my $separation = shift;
|
||||
|
||||
$c->app->dbi->db->query('UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?', $separation);
|
||||
}
|
||||
|
||||
=head2 delete_all
|
||||
|
||||
=over 1
|
||||
|
||||
=item B<Usage> : C<$c-E<gt>delete_all()>
|
||||
|
||||
=item B<Arguments> : none
|
||||
|
||||
=item B<Purpose> : delete all file records from database unconditionnally
|
||||
|
||||
=item B<Returns> : nothing
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub delete_all {
|
||||
my $c = shift;
|
||||
|
||||
$c->app->dbi->db->delete('files');
|
||||
}
|
||||
|
||||
=head2 _slurp
|
||||
|
||||
=over 1
|
||||
|
||||
=item B<Usage> : C<$c-E<gt>_slurp>
|
||||
|
||||
=item B<Arguments> : none
|
||||
|
||||
=item B<Purpose> : put a database record's columns into the Lufi::DB::File object's attributes
|
||||
|
||||
=item B<Returns> : the Lufi::DB::File object
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
my $file;
|
||||
if (defined $r) {
|
||||
$file = $r;
|
||||
} else {
|
||||
my $files = $c->app->dbi->db->query('SELECT * FROM files WHERE short = ?', $c->short)->hashes;
|
||||
|
||||
if ($files->size) {
|
||||
$file = $files->first;
|
||||
}
|
||||
}
|
||||
|
||||
if ($file) {
|
||||
$c->short($file->{short});
|
||||
$c->deleted($file->{deleted});
|
||||
$c->mediatype($file->{mediatype});
|
||||
$c->filename($file->{filename});
|
||||
$c->filesize($file->{filesize});
|
||||
$c->counter($file->{counter});
|
||||
$c->delete_at_first_view($file->{delete_at_first_view});
|
||||
$c->delete_at_day($file->{delete_at_day});
|
||||
$c->created_at($file->{created_at});
|
||||
$c->created_by($file->{created_by});
|
||||
$c->last_access_at($file->{last_access_at});
|
||||
$c->mod_token($file->{mod_token});
|
||||
$c->nbslices($file->{nbslices});
|
||||
$c->complete($file->{complete});
|
||||
$c->passwd($file->{passwd});
|
||||
$c->abuse($file->{abuse});
|
||||
|
||||
$c->record(1) unless $c->record;
|
||||
}
|
||||
|
||||
$c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::File::Mysql;
|
||||
use Mojo::Base 'Lufi::DB::File';
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
||||
$c = $c->SUPER::new(@_);
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,11 +1,6 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::File::Pg;
|
||||
use Mojo::Base 'Lufi::DB::File';
|
||||
use Mojo::File;
|
||||
use Mojo::Collection 'c';
|
||||
use Lufi::DB::Slice;
|
||||
|
||||
has 'record' => 0;
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
@ -15,163 +10,4 @@ sub new {
|
|||
return $c;
|
||||
}
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->record) {
|
||||
$c->app->pg->db->query('UPDATE files SET short = ?, deleted = ?, mediatype = ?, filename = ?, filesize = ?, counter = ?, delete_at_first_view = ?, delete_at_day = ?, created_at = ?, created_by = ?, last_access_at = ?, mod_token = ?, nbslices = ?, complete = ?, passwd = ? WHERE short = ?', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd, $c->short);
|
||||
} else {
|
||||
$c->app->pg->db->query('INSERT INTO files (short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $c->short, $c->deleted, $c->mediatype, $c->filename, $c->filesize, $c->counter, $c->delete_at_first_view, $c->delete_at_day, $c->created_at, $c->created_by, $c->last_access_at, $c->mod_token, $c->nbslices, $c->complete, $c->passwd);
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
sub count_empty {
|
||||
my $c = shift;
|
||||
|
||||
return $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NULL')->hashes->first->{count};
|
||||
}
|
||||
|
||||
sub already_exists {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
return $c->app->pg->db->query('SELECT count(short) FROM files WHERE short = ?', $short)->hashes->first->{count};
|
||||
}
|
||||
|
||||
sub get_empty {
|
||||
my $c = shift;
|
||||
|
||||
my $r = $c->app->pg->db->query('SELECT * FROM files WHERE created_at IS NULL')->hashes->shuffle->first;
|
||||
|
||||
return $c->_slurp($r)->created_at(time)->write;
|
||||
}
|
||||
|
||||
sub get_stats {
|
||||
my $c = shift;
|
||||
|
||||
my $files = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NOT null AND deleted = false')->hashes->first->{count};
|
||||
my $deleted = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS NOT null AND deleted = true')->hashes->first->{count};
|
||||
my $empty = $c->app->pg->db->query('SELECT count(short) FROM files WHERE created_at IS null')->hashes->first->{count};
|
||||
|
||||
return { files => $files, deleted => $deleted, empty => $empty };
|
||||
}
|
||||
|
||||
sub from_short {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my $r = $c->app->pg->db->query('SELECT * FROM files WHERE short = ?', $short)->hashes;
|
||||
|
||||
if ($r->size) {
|
||||
return $c->_slurp($r->first)->record(1);
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub get_oldest_undeleted_files {
|
||||
my $c = shift;
|
||||
my $num = shift;
|
||||
|
||||
my @files;
|
||||
my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false ORDER BY created_at ASC LIMIT ?', $num)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
sub get_expired {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
my @files;
|
||||
## Select only files expired since two days, to be sure that nobody is still downloading it
|
||||
my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', $time)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
sub get_no_longer_viewed {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
my @files;
|
||||
my $records = $c->app->pg->db->query('SELECT * FROM files WHERE deleted = false AND last_access_at < ?', $time)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::File->new(app => $c->app);
|
||||
|
||||
push @files, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@files);
|
||||
}
|
||||
|
||||
sub delete_creator_before {
|
||||
my $c = shift;
|
||||
my $separation = shift;
|
||||
|
||||
$c->app->pg->db->query('UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?', $separation);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
my $file;
|
||||
if (defined $r) {
|
||||
$file = $r;
|
||||
} else {
|
||||
my $files = $c->app->pg->db->query('SELECT * FROM files WHERE short = ?', $c->short)->hashes;
|
||||
|
||||
if ($files->size) {
|
||||
$file = $files->first;
|
||||
}
|
||||
}
|
||||
|
||||
if ($file) {
|
||||
$c->short($file->{short});
|
||||
$c->deleted($file->{deleted});
|
||||
$c->mediatype($file->{mediatype});
|
||||
$c->filename($file->{filename});
|
||||
$c->filesize($file->{filesize});
|
||||
$c->counter($file->{counter});
|
||||
$c->delete_at_first_view($file->{delete_at_first_view});
|
||||
$c->delete_at_day($file->{delete_at_day});
|
||||
$c->created_at($file->{created_at});
|
||||
$c->created_by($file->{created_by});
|
||||
$c->last_access_at($file->{last_access_at});
|
||||
$c->mod_token($file->{mod_token});
|
||||
$c->nbslices($file->{nbslices});
|
||||
$c->complete($file->{complete});
|
||||
$c->passwd($file->{passwd});
|
||||
|
||||
$c->record(1) unless $c->record;
|
||||
}
|
||||
|
||||
$c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::File::SQLite;
|
||||
use Mojo::Base 'Lufi::DB::File';
|
||||
use Mojo::File;
|
||||
use Mojo::Collection 'c';
|
||||
use Lufi::DB::SQLite;
|
||||
use Lufi::DB::Slice;
|
||||
|
||||
has 'record';
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
@ -17,172 +11,4 @@ sub new {
|
|||
return $c;
|
||||
}
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if (defined $c->record) {
|
||||
$c->record->update(
|
||||
short => $c->short,
|
||||
deleted => $c->deleted,
|
||||
mediatype => $c->mediatype,
|
||||
filename => $c->filename,
|
||||
filesize => $c->filesize,
|
||||
counter => $c->counter,
|
||||
delete_at_first_view => $c->delete_at_first_view,
|
||||
delete_at_day => $c->delete_at_day,
|
||||
created_at => $c->created_at,
|
||||
created_by => $c->created_by,
|
||||
last_access_at => $c->last_access_at,
|
||||
mod_token => $c->mod_token,
|
||||
nbslices => $c->nbslices,
|
||||
complete => $c->complete,
|
||||
passwd => $c->passwd,
|
||||
);
|
||||
} else {
|
||||
my $record = Lufi::DB::SQLite::Files->create(
|
||||
short => $c->short,
|
||||
deleted => $c->deleted,
|
||||
mediatype => $c->mediatype,
|
||||
filename => $c->filename,
|
||||
filesize => $c->filesize,
|
||||
counter => $c->counter,
|
||||
delete_at_first_view => $c->delete_at_first_view,
|
||||
delete_at_day => $c->delete_at_day,
|
||||
created_at => $c->created_at,
|
||||
created_by => $c->created_by,
|
||||
last_access_at => $c->last_access_at,
|
||||
mod_token => $c->mod_token,
|
||||
nbslices => $c->nbslices,
|
||||
complete => $c->complete,
|
||||
passwd => $c->passwd,
|
||||
);
|
||||
$c->record($record);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
sub count_empty {
|
||||
my $c = shift;
|
||||
|
||||
return Lufi::DB::SQLite::Files->count('WHERE created_at IS NULL');
|
||||
}
|
||||
|
||||
sub already_exists {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
return Lufi::DB::SQLite::Files->count('WHERE short = ?', $short);
|
||||
}
|
||||
|
||||
sub get_empty {
|
||||
my $c = shift;
|
||||
|
||||
my @records = Lufi::DB::SQLite::Files->select('WHERE created_at IS NULL LIMIT 1');
|
||||
|
||||
return $c->record($records[0])->_slurp->created_at(time)->write;
|
||||
}
|
||||
|
||||
sub get_stats {
|
||||
my $c = shift;
|
||||
|
||||
my $files = Lufi::DB::SQLite::Files->count('WHERE created_at IS NOT null AND deleted = 0');
|
||||
my $deleted = Lufi::DB::SQLite::Files->count('WHERE created_at IS NOT null AND deleted = 1');
|
||||
my $empty = Lufi::DB::SQLite::Files->count('WHERE created_at IS null');
|
||||
|
||||
return { files => $files, deleted => $deleted, empty => $empty };
|
||||
}
|
||||
|
||||
sub from_short {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my @records = Lufi::DB::SQLite::Files->select('WHERE short = ?', $short);
|
||||
|
||||
if (scalar @records) {
|
||||
$c->record($records[0]);
|
||||
$c->_slurp;
|
||||
|
||||
return $c;
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub get_oldest_undeleted_files {
|
||||
my $c = shift;
|
||||
my $num = shift;
|
||||
|
||||
my @files = Lufi::DB::SQLite::Files->select('WHERE deleted = 0 ORDER BY created_at ASC LIMIT ?', $num);
|
||||
|
||||
return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
|
||||
}
|
||||
|
||||
sub get_expired {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
## Select only files expired since two days, to be sure that nobody is still downloading it
|
||||
my @files = Lufi::DB::SQLite::Files->select('WHERE deleted = 0 AND ((delete_at_day + 2) * 86400) < (? - created_at) AND delete_at_day != 0', $time);
|
||||
|
||||
return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
|
||||
}
|
||||
|
||||
sub get_no_longer_viewed {
|
||||
my $c = shift;
|
||||
my $time = shift;
|
||||
|
||||
my @files = Lufi::DB::SQLite::Files->select('WHERE deleted = 0 AND last_access_at < ?', $time);
|
||||
|
||||
return c(map { Lufi::DB::File->new(app => $c->app, record => $_) } @files);
|
||||
}
|
||||
|
||||
sub delete_creator_before {
|
||||
my $c = shift;
|
||||
my $separation = shift;
|
||||
|
||||
Lufi::DB::SQLite->do(
|
||||
'UPDATE files SET created_by = NULL WHERE created_by IS NOT NULL AND created_at < ?',
|
||||
{},
|
||||
$separation
|
||||
);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
|
||||
my @files;
|
||||
if ($c->record) {
|
||||
@files = ($c->record);
|
||||
} elsif ($c->short) {
|
||||
@files = Lufi::DB::SQLite::Files->select('WHERE short = ?', $c->short);
|
||||
}
|
||||
|
||||
if (scalar @files) {
|
||||
my $file = $files[0];
|
||||
|
||||
$c->short($file->short);
|
||||
$c->deleted($file->deleted) if defined $file->deleted;
|
||||
$c->mediatype($file->mediatype) if defined $file->mediatype;
|
||||
$c->filename($file->filename) if defined $file->filename;
|
||||
$c->filesize($file->filesize) if defined $file->filesize;
|
||||
$c->counter($file->counter) if defined $file->counter;
|
||||
$c->delete_at_first_view($file->delete_at_first_view) if defined $file->delete_at_first_view;
|
||||
$c->delete_at_day($file->delete_at_day) if defined $file->delete_at_day;
|
||||
$c->created_at($file->created_at) if defined $file->created_at;
|
||||
$c->created_by($file->created_by) if defined $file->created_by;
|
||||
$c->last_access_at($file->last_access_at) if defined $file->last_access_at;
|
||||
$c->mod_token($file->mod_token) if defined $file->mod_token;
|
||||
$c->nbslices($file->nbslices) if defined $file->nbslices;
|
||||
$c->complete($file->complete) if defined $file->complete;
|
||||
$c->passwd($file->passwd) if defined $file->passwd;
|
||||
|
||||
$c->record($file) unless $c->record;
|
||||
}
|
||||
|
||||
$c->slices(Lufi::DB::Slice->new(app => $c->app)->get_slices_of_file($c->short));
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::SQLite;
|
||||
use Mojolicious;
|
||||
use Mojo::File;
|
||||
use FindBin qw($Bin);
|
||||
|
||||
BEGIN {
|
||||
my $m = Mojolicious->new;
|
||||
my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');
|
||||
if (defined $ENV{MOJO_CONFIG}) {
|
||||
$cfile = Mojo::File->new($ENV{MOJO_CONFIG});
|
||||
unless (-e $cfile->to_abs) {
|
||||
$cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});
|
||||
}
|
||||
}
|
||||
our $config = $m->plugin('Config' =>
|
||||
{
|
||||
file => $cfile->to_abs->to_string,
|
||||
default => {
|
||||
db_path => 'lufi.db'
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
# Create database
|
||||
use ORLite {
|
||||
file => $config->{db_path},
|
||||
unicode => 1,
|
||||
create => sub {
|
||||
my $dbh = shift;
|
||||
$dbh->do(
|
||||
'CREATE TABLE files (
|
||||
short TEXT PRIMARY KEY,
|
||||
deleted INTEGER,
|
||||
mediatype TEXT,
|
||||
filename TEXT,
|
||||
filesize INTEGER,
|
||||
counter INTEGER,
|
||||
delete_at_first_view INTEGER,
|
||||
delete_at_day INTEGER,
|
||||
created_at INTEGER,
|
||||
created_by TEXT,
|
||||
last_access_at INTEGER,
|
||||
mod_token TEXT,
|
||||
nbslices INTEGER,
|
||||
complete INTEGER,
|
||||
passwd TEXT)'
|
||||
);
|
||||
$dbh->do(
|
||||
'CREATE TABLE slices (
|
||||
short TEXT,
|
||||
j INTEGER,
|
||||
path TEXT,
|
||||
FOREIGN KEY (short) REFERENCES files(short))'
|
||||
);
|
||||
$dbh->do(
|
||||
'CREATE INDEX slices_idx ON slices(short)'
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
1;
|
|
@ -1,10 +1,12 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::Slice;
|
||||
use Mojo::Base -base;
|
||||
use Mojo::Collection 'c';
|
||||
|
||||
has 'short';
|
||||
has 'j';
|
||||
has 'path';
|
||||
has 'record' => 0;
|
||||
has 'app';
|
||||
|
||||
=head1 NAME
|
||||
|
@ -65,6 +67,9 @@ sub new {
|
|||
} elsif ($dbtype eq 'postgresql') {
|
||||
use Lufi::DB::Slice::Pg;
|
||||
$c = Lufi::DB::Slice::Pg->new(@_);
|
||||
} elsif ($dbtype eq 'mysql') {
|
||||
use Lufi::DB::Slice::Mysql;
|
||||
$c = Lufi::DB::Slice::Mysql->new(@_);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -85,6 +90,21 @@ sub new {
|
|||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->record) {
|
||||
$c->app->dbi->db->query('UPDATE slices SET short = ?, j = ?, path = ? WHERE short = ? AND j = ?', $c->short, $c->j, $c->path, $c->short, $c->j);
|
||||
} else {
|
||||
$c->app->dbi->db->query('INSERT INTO slices (short, j, path) VALUES (?, ?, ?)', $c->short, $c->j, $c->path);
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
=head2 get_slices_of_file
|
||||
|
||||
=over 1
|
||||
|
@ -101,4 +121,86 @@ sub new {
|
|||
|
||||
=cut
|
||||
|
||||
sub get_slices_of_file {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my @slices;
|
||||
my $records = $c->app->dbi->db->query('SELECT * FROM slices WHERE short = ? ORDER BY j ASC', $short)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::Slice->new(app => $c->app);
|
||||
|
||||
push @slices, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@slices);
|
||||
}
|
||||
|
||||
=head2 delete_all
|
||||
|
||||
=over 1
|
||||
|
||||
=item B<Usage> : C<$c-E<gt>delete_all()>
|
||||
|
||||
=item B<Arguments> : none
|
||||
|
||||
=item B<Purpose> : delete all file records from database unconditionnally
|
||||
|
||||
=item B<Returns> : nothing
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub delete_all {
|
||||
my $c = shift;
|
||||
|
||||
$c->app->dbi->db->delete('slices');
|
||||
}
|
||||
|
||||
=head2 _slurp
|
||||
|
||||
=over 1
|
||||
|
||||
=item B<Usage> : C<$c-E<gt>_slurp>
|
||||
|
||||
=item B<Arguments> : none
|
||||
|
||||
=item B<Purpose> : put a database record's columns into the Lufi::DB::Slice object's attributes
|
||||
|
||||
=item B<Returns> : the Lufi::DB::Slice object
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
my $slice;
|
||||
if (defined $r) {
|
||||
$slice = $r;
|
||||
} else {
|
||||
my $slices = $c->app->dbi->db->query('SELECT * FROM slices WHERE short = ? AND j = ?', $c->short, $c->j)->hashes;
|
||||
|
||||
if ($slices->size) {
|
||||
$slice = $slices->first;
|
||||
}
|
||||
}
|
||||
|
||||
if ($slice) {
|
||||
$c->short($slice->{short});
|
||||
$c->j($slice->{j});
|
||||
$c->path($slice->{path});
|
||||
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::Slice::Mysql;
|
||||
use Mojo::Base 'Lufi::DB::Slice';
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
||||
$c = $c->SUPER::new(@_);
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,9 +1,6 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::Slice::Pg;
|
||||
use Mojo::Base 'Lufi::DB::Slice';
|
||||
use Mojo::Collection 'c';
|
||||
|
||||
has 'record' => 0;
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
@ -13,61 +10,4 @@ sub new {
|
|||
return $c;
|
||||
}
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if ($c->record) {
|
||||
$c->app->pg->db->query('UPDATE slices SET short = ?, j = ?, path = ? WHERE short = ? AND j = ?', $c->short, $c->j, $c->path, $c->short, $c->j);
|
||||
} else {
|
||||
$c->app->pg->db->query('INSERT INTO slices (short, j, path) VALUES (?, ?, ?)', $c->short, $c->j, $c->path);
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
sub get_slices_of_file {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my @slices;
|
||||
my $records = $c->app->pg->db->query('SELECT * FROM slices WHERE short = ? ORDER BY j ASC', $short)->hashes;
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lufi::DB::Slice->new(app => $c->app);
|
||||
|
||||
push @slices, $i->_slurp($e);
|
||||
}
|
||||
);
|
||||
|
||||
return c(@slices);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
my $slice;
|
||||
if (defined $r) {
|
||||
$slice = $r;
|
||||
} else {
|
||||
my $slices = $c->app->pg->db->query('SELECT * FROM slices WHERE short = ? AND j = ?', $c->short, $c->j)->hashes;
|
||||
|
||||
if ($slices->size) {
|
||||
$slice = $slices->first;
|
||||
}
|
||||
}
|
||||
|
||||
if ($slice) {
|
||||
$c->short($slice->{short});
|
||||
$c->j($slice->{j});
|
||||
$c->path($slice->{path});
|
||||
|
||||
$c->record(1);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DB::Slice::SQLite;
|
||||
use Mojo::Base 'Lufi::DB::Slice';
|
||||
use Lufi::DB::SQLite;
|
||||
use Mojo::Collection 'c';
|
||||
|
||||
has 'record';
|
||||
|
||||
sub new {
|
||||
my $c = shift;
|
||||
|
@ -16,44 +12,4 @@ sub new {
|
|||
return $c;
|
||||
}
|
||||
|
||||
sub write {
|
||||
my $c = shift;
|
||||
|
||||
if (defined $c->record) {
|
||||
$c->record->update(
|
||||
short => $c->short,
|
||||
j => $c->j,
|
||||
path => $c->path
|
||||
);
|
||||
} else {
|
||||
my $record = Lufi::DB::SQLite::Slices->create(
|
||||
short => $c->short,
|
||||
j => $c->j,
|
||||
path => $c->path
|
||||
);
|
||||
$c->record($record);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
sub get_slices_of_file {
|
||||
my $c = shift;
|
||||
my $short = shift;
|
||||
|
||||
my @slices = Lufi::DB::SQLite::Slices->select('WHERE short = ? ORDER BY j ASC', $short);
|
||||
|
||||
return c(map { Lufi::DB::Slice->new(app => $c->app, record => $_) } @slices);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
|
||||
$c->short($c->record->short) if defined $c->record->short;
|
||||
$c->j($c->record->j) if defined $c->record->j;
|
||||
$c->path($c->record->path) if defined $c->record->path;
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::DefaultConfig;
|
||||
require Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw($default_config);
|
||||
our $default_config = {
|
||||
prefix => '/',
|
||||
provisioning => 100,
|
||||
provis_step => 5,
|
||||
length => 10,
|
||||
token_length => 32,
|
||||
secrets => ['hfudsifdsih'],
|
||||
default_delay => 0,
|
||||
max_delay => 0,
|
||||
mail => {
|
||||
how => 'sendmail'
|
||||
},
|
||||
mail_sender => 'no-reply@lufi.io',
|
||||
theme => 'default',
|
||||
upload_dir => 'files',
|
||||
session_duration => 3600,
|
||||
allow_pwd_on_files => 0,
|
||||
dbtype => 'sqlite',
|
||||
db_path => 'lufi.db',
|
||||
force_burn_after_reading => 0,
|
||||
x_frame_options => 'DENY',
|
||||
x_content_type_options => 'nosniff',
|
||||
x_xss_protection => '1; mode=block',
|
||||
};
|
||||
|
||||
1;
|
|
@ -0,0 +1,52 @@
|
|||
package Lufi::Plugin::Headers;
|
||||
use Mojo::Base 'Mojolicious::Plugin';
|
||||
|
||||
sub register {
|
||||
my ($self, $app) = @_;
|
||||
|
||||
# Assets Cache headers
|
||||
$app->plugin('StaticCache');
|
||||
|
||||
# Add CSP Header
|
||||
if (!defined($app->config('csp')) || (defined($app->config('csp')) && $app->config('csp') ne '')) {
|
||||
my $directives = {
|
||||
'default-src' => "'none'",
|
||||
'script-src' => "'self' 'unsafe-inline' 'unsafe-eval'",
|
||||
'style-src' => "'self' 'unsafe-inline'",
|
||||
'img-src' => "'self' blob:",
|
||||
'media-src' => "blob:",
|
||||
'font-src' => "'self'",
|
||||
'form-action' => "'self'",
|
||||
'base-uri' => "'self'",
|
||||
'connect-src' => "'self'",
|
||||
};
|
||||
|
||||
my $frame_ancestors = '';
|
||||
$frame_ancestors = "'none'" if $app->config('x_frame_options') eq 'DENY';
|
||||
$frame_ancestors = "'self'" if $app->config('x_frame_options') eq 'SAMEORIGIN';
|
||||
if ($app->config('x_frame_options') =~ m#^ALLOW-FROM#) {
|
||||
$frame_ancestors = $app->config('x_frame_options');
|
||||
$frame_ancestors =~ s#ALLOW-FROM +##;
|
||||
}
|
||||
$directives->{'frame-ancestors'} = $frame_ancestors if $frame_ancestors;
|
||||
|
||||
$app->plugin('CSPHeader',
|
||||
csp => $app->config('csp'),
|
||||
directives => $directives
|
||||
);
|
||||
}
|
||||
|
||||
# Add other headers
|
||||
$app->hook(
|
||||
before_dispatch => sub {
|
||||
my $c = shift;
|
||||
|
||||
$c->res->headers->header('X-Frame-Options' => $app->config('x_frame_options')) if $app->config('x_frame_options');
|
||||
$c->res->headers->header('X-Content-Type-Options' => $app->config('x_content_type_options')) if $app->config('x_content_type_options');
|
||||
$c->res->headers->header('X-XSS-Protection' => $app->config('x_xss_protection')) if $app->config('x_xss_protection');
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
1;
|
|
@ -2,52 +2,103 @@
|
|||
package Lufi::Plugin::Helpers;
|
||||
use Mojo::Base 'Mojolicious::Plugin';
|
||||
use Lufi::DB::File;
|
||||
use Data::Entropy qw(entropy_source);
|
||||
|
||||
sub register {
|
||||
my ($self, $app) = @_;
|
||||
|
||||
$app->plugin('PgURLHelper');
|
||||
|
||||
if ($app->config('dbtype') eq 'postgresql') {
|
||||
use Mojo::Pg;
|
||||
$app->helper(pg => \&_pg);
|
||||
|
||||
# Database migration
|
||||
my $migrations = Mojo::Pg::Migrations->new(pg => $app->pg);
|
||||
if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
|
||||
$migrations->from_file('utilities/migrations_pg.sql')->migrate(0)->migrate(1);
|
||||
} else {
|
||||
$migrations->from_file('utilities/migrations_pg.sql')->migrate(1);
|
||||
}
|
||||
} elsif ($app->config('dbtype') eq 'sqlite') {
|
||||
# SQLite database migration if needed
|
||||
use Lufi::DB::SQLite;
|
||||
my $columns = Lufi::DB::SQLite::Files->table_info;
|
||||
my $pwd_col = 0;
|
||||
foreach my $col (@{$columns}) {
|
||||
$pwd_col = 1 if $col->{name} eq 'passwd';
|
||||
}
|
||||
unless ($pwd_col) {
|
||||
Lufi::DB::SQLite->do('ALTER TABLE files ADD COLUMN passwd TEXT;');
|
||||
}
|
||||
# PgURL helper
|
||||
if ($app->config('dbtype') eq 'postgresql' || $app->config('dbtype') eq 'mysql') {
|
||||
$app->plugin('PgURLHelper');
|
||||
}
|
||||
|
||||
$app->helper(provisioning => \&_provisioning);
|
||||
$app->helper(get_empty => \&_get_empty);
|
||||
$app->helper(shortener => \&_shortener);
|
||||
$app->helper(ip => \&_ip);
|
||||
|
||||
if ($app->config('dbtype') eq 'postgresql') {
|
||||
require Mojo::Pg;
|
||||
$app->helper(dbi => \&_pg);
|
||||
|
||||
# Database migration
|
||||
my $migrations = Mojo::Pg::Migrations->new(pg => $app->dbi);
|
||||
if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
|
||||
$migrations->from_file('utilities/migrations/pg.sql')->migrate(0)->migrate(2);
|
||||
} else {
|
||||
$migrations->from_file('utilities/migrations/pg.sql')->migrate(2);
|
||||
}
|
||||
} elsif ($app->config('dbtype') eq 'mysql') {
|
||||
require Mojo::mysql;
|
||||
$app->helper(dbi => \&_mysql);
|
||||
|
||||
# Database migration
|
||||
my $migrations = Mojo::mysql::Migrations->new(mysql => $app->dbi);
|
||||
if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
|
||||
$migrations->from_file('utilities/migrations/mysql.sql')->migrate(0)->migrate(1);
|
||||
} else {
|
||||
$migrations->from_file('utilities/migrations/mysql.sql')->migrate(1);
|
||||
}
|
||||
} elsif ($app->config('dbtype') eq 'sqlite') {
|
||||
require Mojo::SQLite;
|
||||
$app->helper(dbi => \&_sqlite);
|
||||
|
||||
# Database migration
|
||||
# Have to create $sql before using its migrations attribute, otherwise, it won't work
|
||||
my $sql = $app->dbi;
|
||||
my $migrations = $sql->migrations;
|
||||
if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
|
||||
$migrations->from_file('utilities/migrations/sqlite.sql')->migrate(0)->migrate(2);
|
||||
} else {
|
||||
$migrations->from_file('utilities/migrations/sqlite.sql')->migrate(2);
|
||||
}
|
||||
|
||||
# Check if passwd column is missing
|
||||
my $columns = $app->dbi->db->query('PRAGMA table_info(files)')->hashes;
|
||||
my $pwd_col = 0;
|
||||
$columns->each(sub {
|
||||
my ($e, $num) = @_;
|
||||
$pwd_col = 1 if $e->{name} eq 'passwd';
|
||||
});
|
||||
$app->dbi->db->query('ALTER TABLE files ADD COLUMN passwd TEXT') unless $pwd_col;
|
||||
}
|
||||
|
||||
$app->helper(provisioning => \&_provisioning);
|
||||
$app->helper(get_empty => \&_get_empty);
|
||||
$app->helper(ip => \&_ip);
|
||||
$app->helper(default_delay => \&_default_delay);
|
||||
$app->helper(max_delay => \&_max_delay);
|
||||
$app->helper(is_selected => \&_is_selected);
|
||||
$app->helper(stop_upload => \&_stop_upload);
|
||||
$app->helper(max_delay => \&_max_delay);
|
||||
$app->helper(is_selected => \&_is_selected);
|
||||
$app->helper(stop_upload => \&_stop_upload);
|
||||
}
|
||||
|
||||
sub _pg {
|
||||
my $c = shift;
|
||||
|
||||
my $pgdb = $c->config('pgdb');
|
||||
my $port = (defined $pgdb->{port}) ? $pgdb->{port}: 5432;
|
||||
my $addr = $c->pg_url({
|
||||
host => $pgdb->{host}, port => $port, database => $pgdb->{database}, user => $pgdb->{user}, pwd => $pgdb->{pwd}
|
||||
});
|
||||
state $pg = Mojo::Pg->new($addr);
|
||||
$pg->max_connections($pgdb->{max_connections}) if defined $pgdb->{max_connections};
|
||||
return $pg;
|
||||
}
|
||||
|
||||
sub _mysql {
|
||||
my $c = shift;
|
||||
|
||||
state $pg = Mojo::Pg->new($c->app->pg_url($c->app->config('pgdb')));
|
||||
return $pg;
|
||||
my $mysqldb = $c->config('mysqldb');
|
||||
my $port = (defined $mysqldb->{port}) ? $mysqldb->{port}: 3306;
|
||||
my $addr = $c->pg_url({
|
||||
host => $mysqldb->{host}, port => $port, database => $mysqldb->{database}, user => $mysqldb->{user}, pwd => $mysqldb->{pwd}
|
||||
});
|
||||
$addr =~ s/postgresql/mysql/;
|
||||
state $mysql = Mojo::mysql->new($addr);
|
||||
$mysql->max_connections($mysqldb->{max_connections}) if defined $mysqldb->{max_connections};
|
||||
return $mysql;
|
||||
}
|
||||
|
||||
sub _sqlite {
|
||||
my $c = shift;
|
||||
|
||||
state $sqlite = Mojo::SQLite->new('sqlite:'.$c->app->config('db_path'));
|
||||
return $sqlite;
|
||||
}
|
||||
|
||||
sub _provisioning {
|
||||
|
@ -75,18 +126,6 @@ sub _get_empty {
|
|||
return $ldfile;
|
||||
}
|
||||
|
||||
sub _shortener {
|
||||
my $c = shift;
|
||||
my $length = shift;
|
||||
|
||||
my @chars = ('a'..'z','A'..'Z','0'..'9', '-', '_');
|
||||
my $result = '';
|
||||
foreach (1..$length) {
|
||||
$result .= $chars[entropy_source->get_int(scalar(@chars))];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub _ip {
|
||||
my $c = shift;
|
||||
my $proxy = $c->req->headers->header('X-Forwarded-For');
|
||||
|
|
|
@ -2,6 +2,7 @@ package Mounter;
|
|||
use Mojo::Base 'Mojolicious';
|
||||
use FindBin qw($Bin);
|
||||
use File::Spec qw(catfile);
|
||||
use Lufi::DefaultConfig qw($default_config);
|
||||
|
||||
# This method will run once at server start
|
||||
sub startup {
|
||||
|
@ -9,27 +10,31 @@ sub startup {
|
|||
|
||||
push @{$self->commands->namespaces}, 'Lufi::Command';
|
||||
|
||||
my $cfile = Mojo::File->new($Bin, '..' , 'lufi.conf');
|
||||
if (defined $ENV{MOJO_CONFIG}) {
|
||||
$cfile = Mojo::File->new($ENV{MOJO_CONFIG});
|
||||
unless (-e $cfile->to_abs) {
|
||||
$cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});
|
||||
}
|
||||
}
|
||||
my $config = $self->plugin('Config' =>
|
||||
{
|
||||
file => File::Spec->catfile($Bin, '..' ,'lufi.conf'),
|
||||
default => {
|
||||
prefix => '/',
|
||||
theme => 'default',
|
||||
dbtype => 'sqlite',
|
||||
}
|
||||
file => $cfile,
|
||||
default => $default_config
|
||||
}
|
||||
);
|
||||
|
||||
# Compress static assets
|
||||
$self->plugin('GzipStatic');
|
||||
|
||||
# Headers
|
||||
$self->plugin('Lufi::Plugin::Headers');
|
||||
|
||||
# Helpers
|
||||
$self->plugin('Lufi::Plugin::Helpers');
|
||||
|
||||
# Themes handling
|
||||
shift @{$self->static->paths};
|
||||
if ($config->{theme} ne 'default') {
|
||||
my $theme = $self->home->rel_file('themes/'.$config->{theme});
|
||||
push @{$self->static->paths}, $theme.'/public' if -d $theme.'/public';
|
||||
}
|
||||
push @{$self->static->paths}, $self->home->rel_file('themes/default/public');
|
||||
$self->plugin('FiatTux::Themes');
|
||||
|
||||
$self->plugin('Mount' => {$config->{prefix} => File::Spec->catfile($Bin, '..', 'script', 'application')});
|
||||
}
|
||||
|
|
|
@ -6,11 +6,12 @@
|
|||
# see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings
|
||||
hypnotoad => {
|
||||
# array of IP addresses and ports you want to listen to
|
||||
# you can specify a unix socket too, like 'http+unix://%2Ftmp%2Flufi.sock'
|
||||
listen => ['http://127.0.0.1:8081'],
|
||||
# if you use Lufi behind a reverse proxy like Nginx, you want ro set proxy to 1
|
||||
# if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1
|
||||
# if you use Lufi directly, let it commented
|
||||
#proxy => 1,
|
||||
|
||||
|
||||
# Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers
|
||||
# to adjust this to your server
|
||||
workers => 30,
|
||||
|
@ -18,8 +19,14 @@
|
|||
},
|
||||
|
||||
# put a way to contact you here and uncomment it
|
||||
# you can put some HTML in it
|
||||
# MANDATORY
|
||||
#contact => 'admin[at]example.com',
|
||||
#contact => '<a href="https://contact.example.com">Contact page</a>',
|
||||
|
||||
# put an URL or an email address to receive file reports and uncomment it
|
||||
# it's for make reporting illegal files easy for users
|
||||
# MANDATORY
|
||||
#report => 'report@example.com',
|
||||
|
||||
# array of random strings used to encrypt cookies
|
||||
# optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT
|
||||
|
@ -108,7 +115,7 @@
|
|||
#mail_sender => 'no-reply@lufi.io',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# valid choices are sqlite, postgresql and mysql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
#dbtype => 'sqlite',
|
||||
|
||||
|
@ -125,8 +132,28 @@
|
|||
#pgdb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# #user => 'DBUSER',
|
||||
# #pwd => 'DBPASSWORD'
|
||||
# # optional, default is 5432
|
||||
# #port => 5432,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # https://mojolicious.org/perldoc/Mojo/Pg#max_connections
|
||||
# # optional, default is 1
|
||||
# #max_connections => 1,
|
||||
#},
|
||||
|
||||
# MySQL ONLY - only used if dbtype is set to mysql
|
||||
# these are the credentials to access the MySQL database
|
||||
# mandatory if you choosed mysql as dbtype
|
||||
#mysqldb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# # optional, default is 3306
|
||||
# #port => 3306,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # https://metacpan.org/pod/Mojo::mysql#max_connections
|
||||
# # optional, default is 5 (set to 0 to disable persistent connections)
|
||||
# #max_connections => 5,
|
||||
#},
|
||||
|
||||
# define a path to the upload directory, where the uploaded files will be stored
|
||||
|
@ -140,12 +167,18 @@
|
|||
# please note that everybody can still download files
|
||||
# optional, no default
|
||||
#ldap => {
|
||||
# uri => 'ldaps://ldap.example.org',
|
||||
# user_tree => 'ou=users,dc=example,dc=org',
|
||||
# bind_dn => ',ou=users,dc=example,dc=org',
|
||||
# bind_user => 'uid=ldap_user',
|
||||
# bind_pwd => 'secr3t',
|
||||
# user_filter => '!(uid=ldap_user)'
|
||||
# uri => 'ldaps://ldap.example.org', # server URI
|
||||
# user_tree => 'ou=users,dc=example,dc=org', # search base DN
|
||||
# bind_dn => 'uid=ldap_user,ou=users,dc=example,dc=org', # search bind DN
|
||||
# bind_pwd => 'secr3t', # search bind password
|
||||
# user_attr => 'uid', # user attribute (uid, mail, sAMAccountName, etc.)
|
||||
# user_filter => '(!(uid=ldap_user))', # user filter (to exclude some users, etc.)
|
||||
# # optional start_tls configuration. See https://metacpan.org/pod/distribution/perl-ldap/lib/Net/LDAP.pod#start_tls
|
||||
# # don't set or uncomment if you don't want to configure it
|
||||
# start_tls => {
|
||||
# verify => 'optional',
|
||||
# clientcert => '/etc/ssl/certs/ca-bundle.pem'
|
||||
# }
|
||||
#},
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
|
@ -158,9 +191,55 @@
|
|||
#session_duration => 3600,
|
||||
|
||||
# allow to add a password on files, asked before allowing to download files
|
||||
# optional, default to 0
|
||||
# optional, default is 0
|
||||
#allow_pwd_on_files => 0,
|
||||
|
||||
# force all files to be in "Burn after reading mode"
|
||||
# optional, default is 0
|
||||
#force_burn_after_reading => 0,
|
||||
|
||||
# if set, the files' URLs will always use this domain
|
||||
# optional, no default
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# abuse reasons
|
||||
# set an integer in the abuse field of a file in the database and it will not be downloadable anymore
|
||||
# the reason will be displayed to the downloader, according to the reasons you will configure here.
|
||||
# optional, no default
|
||||
#abuse => {
|
||||
# 0 => 'Copyright infringment',
|
||||
# 1 => 'Illegal content',
|
||||
#},
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lufi
|
||||
# Set to '' to disable CSP header
|
||||
# https://content-security-policy.com/ provides a good documentation about CSP.
|
||||
# https://report-uri.com/home/generate provides a tool to generate a CSP header.
|
||||
# optional, default is "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
# the default value is good for `default` and `milligram` themes
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
|
||||
# X-Frame-Options header that will be sent by Lufi
|
||||
# Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'
|
||||
# Set to '' to disable X-Frame-Options header
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
|
||||
# Please note that this will add a "frame-ancestors" directive to the CSP header (see above) accordingly
|
||||
# to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
|
||||
# Set to '' to disable X-Content-Type-Options header
|
||||
# optional, default is 'nosniff'
|
||||
#x_content_type_options => 'nosniff',
|
||||
|
||||
# X-XSS-Protection that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
|
||||
# Set to '' to disable X-XSS-Protection header
|
||||
# optional, default is '1; mode=block'
|
||||
#x_xss_protection => '1; mode=block',
|
||||
|
||||
#########################
|
||||
# Lufi cron jobs settings
|
||||
#########################
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
use Mojo::Base -strict;
|
||||
|
||||
use Test::More;
|
||||
use Test::Mojo;
|
||||
|
||||
my $t = Test::Mojo->new('Lufi');
|
||||
$t->get_ok('/')->status_is(200)->content_like(qr/Lufi/i);
|
||||
|
||||
done_testing();
|
|
@ -0,0 +1 @@
|
|||
luc:$apr1$zG4UAKGa$FqSi4widrkVH/pT3qPawd.
|
|
@ -0,0 +1,251 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
{
|
||||
####################
|
||||
# Hypnotoad settings
|
||||
####################
|
||||
# see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings
|
||||
hypnotoad => {
|
||||
# array of IP addresses and ports you want to listen to
|
||||
listen => ['http://127.0.0.1:8081'],
|
||||
# if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1
|
||||
# if you use Lufi directly, let it commented
|
||||
#proxy => 1,
|
||||
|
||||
# Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers
|
||||
# to adjust this to your server
|
||||
workers => 30,
|
||||
clients => 1,
|
||||
},
|
||||
|
||||
# put a way to contact you here and uncomment it
|
||||
# you can put some HTML in it
|
||||
# MANDATORY
|
||||
contact => '<a href="https://contact.example.com">Contact page</a>',
|
||||
|
||||
# put an URL or an email address to receive file reports and uncomment it
|
||||
# it's for make reporting illegal files easy for users
|
||||
# MANDATORY
|
||||
report => 'report@example.com',
|
||||
|
||||
# array of random strings used to encrypt cookies
|
||||
# optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT
|
||||
#secrets => ['fdjsofjoihrei'],
|
||||
|
||||
# choose a theme. See the available themes in `themes` directory
|
||||
# optional, default is 'default'
|
||||
#theme => 'default',
|
||||
|
||||
# length of the random URL
|
||||
# optional, default is 8
|
||||
#length => 8,
|
||||
|
||||
# how many URLs will be provisioned in a batch ?
|
||||
# optional, default is 5
|
||||
#provis_step => 5,
|
||||
|
||||
# max number of URLs to be provisioned
|
||||
# optional, default is 100
|
||||
#provisioning => 100,
|
||||
|
||||
# length of the modify/delete token
|
||||
# optional, default is 32
|
||||
#token_length => 32,
|
||||
|
||||
# max file size, in octets
|
||||
# you can write it 100*1024*1024
|
||||
# optional, no default
|
||||
#max_file_size => 104857600,
|
||||
|
||||
# if you want to have piwik statistics, provide a piwik image tracker
|
||||
# only the image tracker is allowed, no javascript
|
||||
# optional, no default
|
||||
#piwik_img => 'https://piwik.example.org/piwik.php?idsite=1&rec=1',
|
||||
|
||||
# broadcast_message which will displayed on the index page
|
||||
# optional, no default
|
||||
#broadcast_message => 'Maintenance',
|
||||
|
||||
# default time limit for files
|
||||
# valid values are 0, 1, 7, 30 and 365
|
||||
# optional, default is 0 (no limit)
|
||||
#default_delay => 0,
|
||||
|
||||
# number of days after which the images will be deleted, even if they were uploaded with "no delay" (or value superior to max_delay)
|
||||
# a warning message will be displayed on homepage
|
||||
# optional, default is 0 (no limit)
|
||||
#max_delay => 0,
|
||||
|
||||
# size thresholds: if you want to define max delays for different sizes of file
|
||||
# the keys are size in Bytes, you can't have 10*1000*10000 as key
|
||||
# if a file is smaller than the smallest configured size, it will have a expiration delay of max_delay (see above)
|
||||
# optional, default is using max_delay (see above) for all sizes
|
||||
#delay_for_size => {
|
||||
# 10000000 => 90, # between 10MB and 50MB => max is 90 days, less than 10MB => max is max_delay (see above)
|
||||
# 50000000 => 60, # between 50MB ans 1GB => max is 60 days
|
||||
# 1000000000 => 2, # more than 1GB => max is 2 days
|
||||
#},
|
||||
|
||||
# URL sub-directory in which you want Lufi to be accessible
|
||||
# example: you want to have Lufi under https://example.org/lufi/
|
||||
# => set prefix to '/lufi' or to '/lufi/', it doesn't matter
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# array of authorized domains for API calls.
|
||||
# if you want to authorize everyone to use the API: ['*']
|
||||
# optional, no domains allowed by default
|
||||
#allowed_domains => ['http://1.example.com', 'http://2.example.com'],
|
||||
|
||||
# if set, the shortened URLs will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# Mail configuration
|
||||
# See https://metacpan.org/pod/Mojolicious::Plugin::Mail#EXAMPLES
|
||||
# Optional, default to sendmail method with no arguments
|
||||
#mail => {
|
||||
# # Valid values are 'sendmail' and 'smtp'
|
||||
# how => 'smtp',
|
||||
# howargs => ['smtp.example.org']
|
||||
#},
|
||||
|
||||
# Email sender address
|
||||
# Optional, default to no-reply@lufi.io
|
||||
#mail_sender => 'no-reply@lufi.io',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite, postgresql and mysql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
dbtype => 'mysql',
|
||||
|
||||
# SQLite ONLY - only used if dbtype is set to sqlite
|
||||
# define a path to the SQLite database
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# optional, default is lufi.db
|
||||
#db_path => 'lufi.db',
|
||||
|
||||
# PostgreSQL ONLY - only used if dbtype is set to postgresql
|
||||
# these are the credentials to access the PostgreSQL database
|
||||
# mandatory if you choosed postgresql as dbtype
|
||||
#pgdb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# # optional, default is 5432
|
||||
# #port => 5432,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # optional, default is 1
|
||||
# #max_connections => 1,
|
||||
#},
|
||||
|
||||
# MySQL ONLY - only used if dbtype is set to mysql
|
||||
# these are the credentials to access the MySQL database
|
||||
# mandatory if you choosed mysql as dbtype
|
||||
mysqldb => {
|
||||
database => 'lufi_db',
|
||||
host => 'mariadb',
|
||||
# optional, default is 3306
|
||||
#port => 3306,
|
||||
user => 'lufi',
|
||||
pwd => 'lufi_pwd',
|
||||
# # optional, default is 5 (set to 0 to disable persistent connections)
|
||||
# #max_connections => 5,
|
||||
},
|
||||
|
||||
# define a path to the upload directory, where the uploaded files will be stored
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# DO NOT CHANGE THIS IF FILES HAVE BEEN ALREADY UPLOADED: THEY WILL NOT BE DOWNLOADABLE ANYMORE
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# set `ldap` if you want that only authenticated users can upload files
|
||||
# please note that everybody can still download files
|
||||
# optional, no default
|
||||
#ldap => { uri => 'ldap://rroemhild-test-openldap', user_tree => 'ou=people,dc=planetexpress,dc=com', bind_dn => 'cn=admin,dc=planetexpress,dc=com', bind_pwd => 'GoodNewsEveryone', user_attr => 'uid', user_filter => '' },
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# see 'man htpasswd' to know how to create such file
|
||||
#htpasswd => 't/lstu.passwd',
|
||||
|
||||
# if you've set ldap above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# allow to add a password on files, asked before allowing to download files
|
||||
# optional, default is 0
|
||||
allow_pwd_on_files => 1,
|
||||
|
||||
# force all files to be in "Burn after reading mode"
|
||||
# optional, default is 0
|
||||
#force_burn_after_reading => 0,
|
||||
|
||||
# if set, the files' URLs will always use this domain
|
||||
# optional, no default
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# abuse reasons
|
||||
# set an integer in the abuse field of a file in the database and it will not be downloadable anymore
|
||||
# the reason will be displayed to the downloader, according to the reasons you will configure here.
|
||||
# optional, no default
|
||||
abuse => {
|
||||
0 => 'Copyright infringment',
|
||||
1 => 'Illegal content',
|
||||
},
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lufi
|
||||
# Set to '' to disable CSP header
|
||||
# https://content-security-policy.com/ provides a good documentation about CSP.
|
||||
# https://report-uri.com/home/generate provides a tool to generate a CSP header.
|
||||
# optional, default is "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
# the default value is good for `default` and `milligram` themes
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
|
||||
# X-Frame-Options header that will be sent by Lufi
|
||||
# Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'
|
||||
# Set to '' to disable X-Frame-Options header
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
|
||||
# Please note that this will add a "frame-ancestors" directive to the CSP header (see above) accordingly
|
||||
# to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
|
||||
# Set to '' to disable X-Content-Type-Options header
|
||||
# optional, default is 'nosniff'
|
||||
#x_content_type_options => 'nosniff',
|
||||
|
||||
# X-XSS-Protection that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
|
||||
# Set to '' to disable X-XSS-Protection header
|
||||
# optional, default is '1; mode=block'
|
||||
#x_xss_protection => '1; mode=block',
|
||||
|
||||
#########################
|
||||
# Lufi cron jobs settings
|
||||
#########################
|
||||
|
||||
# number of days senders' IP addresses are kept in database
|
||||
# after that delay, they will be deleted from database (used with script/lufi cron cleanbdd)
|
||||
# optional, default is 365
|
||||
#keep_ip_during => 365,
|
||||
|
||||
# max size of the files directory, in octets
|
||||
# used by script/lufi cron watch to trigger an action
|
||||
# optional, no default
|
||||
#max_total_size => 10*1024*1024*1024,
|
||||
|
||||
# default action when files directory is over max_total_size (used with script/lufi cron watch)
|
||||
# valid values are 'warn', 'stop-upload' and 'delete'
|
||||
# please, see readme
|
||||
# optional, default is 'warn'
|
||||
#policy_when_full => 'warn',
|
||||
|
||||
# images which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task
|
||||
# if delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted
|
||||
# optional, no default
|
||||
#delete_no_longer_viewed_files => 90,
|
||||
};
|
|
@ -0,0 +1,251 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
{
|
||||
####################
|
||||
# Hypnotoad settings
|
||||
####################
|
||||
# see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings
|
||||
hypnotoad => {
|
||||
# array of IP addresses and ports you want to listen to
|
||||
listen => ['http://127.0.0.1:8081'],
|
||||
# if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1
|
||||
# if you use Lufi directly, let it commented
|
||||
#proxy => 1,
|
||||
|
||||
# Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers
|
||||
# to adjust this to your server
|
||||
workers => 30,
|
||||
clients => 1,
|
||||
},
|
||||
|
||||
# put a way to contact you here and uncomment it
|
||||
# you can put some HTML in it
|
||||
# MANDATORY
|
||||
contact => '<a href="https://contact.example.com">Contact page</a>',
|
||||
|
||||
# put an URL or an email address to receive file reports and uncomment it
|
||||
# it's for make reporting illegal files easy for users
|
||||
# MANDATORY
|
||||
report => 'report@example.com',
|
||||
|
||||
# array of random strings used to encrypt cookies
|
||||
# optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT
|
||||
#secrets => ['fdjsofjoihrei'],
|
||||
|
||||
# choose a theme. See the available themes in `themes` directory
|
||||
# optional, default is 'default'
|
||||
#theme => 'default',
|
||||
|
||||
# length of the random URL
|
||||
# optional, default is 8
|
||||
#length => 8,
|
||||
|
||||
# how many URLs will be provisioned in a batch ?
|
||||
# optional, default is 5
|
||||
#provis_step => 5,
|
||||
|
||||
# max number of URLs to be provisioned
|
||||
# optional, default is 100
|
||||
#provisioning => 100,
|
||||
|
||||
# length of the modify/delete token
|
||||
# optional, default is 32
|
||||
#token_length => 32,
|
||||
|
||||
# max file size, in octets
|
||||
# you can write it 100*1024*1024
|
||||
# optional, no default
|
||||
#max_file_size => 104857600,
|
||||
|
||||
# if you want to have piwik statistics, provide a piwik image tracker
|
||||
# only the image tracker is allowed, no javascript
|
||||
# optional, no default
|
||||
#piwik_img => 'https://piwik.example.org/piwik.php?idsite=1&rec=1',
|
||||
|
||||
# broadcast_message which will displayed on the index page
|
||||
# optional, no default
|
||||
#broadcast_message => 'Maintenance',
|
||||
|
||||
# default time limit for files
|
||||
# valid values are 0, 1, 7, 30 and 365
|
||||
# optional, default is 0 (no limit)
|
||||
#default_delay => 0,
|
||||
|
||||
# number of days after which the images will be deleted, even if they were uploaded with "no delay" (or value superior to max_delay)
|
||||
# a warning message will be displayed on homepage
|
||||
# optional, default is 0 (no limit)
|
||||
#max_delay => 0,
|
||||
|
||||
# size thresholds: if you want to define max delays for different sizes of file
|
||||
# the keys are size in Bytes, you can't have 10*1000*10000 as key
|
||||
# if a file is smaller than the smallest configured size, it will have a expiration delay of max_delay (see above)
|
||||
# optional, default is using max_delay (see above) for all sizes
|
||||
#delay_for_size => {
|
||||
# 10000000 => 90, # between 10MB and 50MB => max is 90 days, less than 10MB => max is max_delay (see above)
|
||||
# 50000000 => 60, # between 50MB ans 1GB => max is 60 days
|
||||
# 1000000000 => 2, # more than 1GB => max is 2 days
|
||||
#},
|
||||
|
||||
# URL sub-directory in which you want Lufi to be accessible
|
||||
# example: you want to have Lufi under https://example.org/lufi/
|
||||
# => set prefix to '/lufi' or to '/lufi/', it doesn't matter
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# array of authorized domains for API calls.
|
||||
# if you want to authorize everyone to use the API: ['*']
|
||||
# optional, no domains allowed by default
|
||||
#allowed_domains => ['http://1.example.com', 'http://2.example.com'],
|
||||
|
||||
# if set, the shortened URLs will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# Mail configuration
|
||||
# See https://metacpan.org/pod/Mojolicious::Plugin::Mail#EXAMPLES
|
||||
# Optional, default to sendmail method with no arguments
|
||||
#mail => {
|
||||
# # Valid values are 'sendmail' and 'smtp'
|
||||
# how => 'smtp',
|
||||
# howargs => ['smtp.example.org']
|
||||
#},
|
||||
|
||||
# Email sender address
|
||||
# Optional, default to no-reply@lufi.io
|
||||
#mail_sender => 'no-reply@lufi.io',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite, postgresql and mysql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
dbtype => 'postgresql',
|
||||
|
||||
# SQLite ONLY - only used if dbtype is set to sqlite
|
||||
# define a path to the SQLite database
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# optional, default is lufi.db
|
||||
#db_path => 'lufi.db',
|
||||
|
||||
# PostgreSQL ONLY - only used if dbtype is set to postgresql
|
||||
# these are the credentials to access the PostgreSQL database
|
||||
# mandatory if you choosed postgresql as dbtype
|
||||
pgdb => {
|
||||
database => 'lufi_db',
|
||||
host => 'postgres',
|
||||
# optional, default is 5432
|
||||
#port => 5432,
|
||||
user => 'lufi',
|
||||
pwd => 'lufi_pwd'
|
||||
# # optional, default is 1
|
||||
# #max_connections => 1,
|
||||
},
|
||||
|
||||
# MySQL ONLY - only used if dbtype is set to mysql
|
||||
# these are the credentials to access the MySQL database
|
||||
# mandatory if you choosed mysql as dbtype
|
||||
#mysqldb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# # optional, default is 3306
|
||||
# #port => 3306,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # optional, default is 5 (set to 0 to disable persistent connections)
|
||||
# #max_connections => 5,
|
||||
#},
|
||||
|
||||
# define a path to the upload directory, where the uploaded files will be stored
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# DO NOT CHANGE THIS IF FILES HAVE BEEN ALREADY UPLOADED: THEY WILL NOT BE DOWNLOADABLE ANYMORE
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# set `ldap` if you want that only authenticated users can upload files
|
||||
# please note that everybody can still download files
|
||||
# optional, no default
|
||||
#ldap => { uri => 'ldap://rroemhild-test-openldap', user_tree => 'ou=people,dc=planetexpress,dc=com', bind_dn => 'cn=admin,dc=planetexpress,dc=com', bind_pwd => 'GoodNewsEveryone', user_attr => 'uid', user_filter => '' },
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# see 'man htpasswd' to know how to create such file
|
||||
#htpasswd => 't/lstu.passwd',
|
||||
|
||||
# if you've set ldap above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# allow to add a password on files, asked before allowing to download files
|
||||
# optional, default is 0
|
||||
allow_pwd_on_files => 1,
|
||||
|
||||
# force all files to be in "Burn after reading mode"
|
||||
# optional, default is 0
|
||||
#force_burn_after_reading => 0,
|
||||
|
||||
# if set, the files' URLs will always use this domain
|
||||
# optional, no default
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# abuse reasons
|
||||
# set an integer in the abuse field of a file in the database and it will not be downloadable anymore
|
||||
# the reason will be displayed to the downloader, according to the reasons you will configure here.
|
||||
# optional, no default
|
||||
abuse => {
|
||||
0 => 'Copyright infringment',
|
||||
1 => 'Illegal content',
|
||||
},
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lufi
|
||||
# Set to '' to disable CSP header
|
||||
# https://content-security-policy.com/ provides a good documentation about CSP.
|
||||
# https://report-uri.com/home/generate provides a tool to generate a CSP header.
|
||||
# optional, default is "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
# the default value is good for `default` and `milligram` themes
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
|
||||
# X-Frame-Options header that will be sent by Lufi
|
||||
# Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'
|
||||
# Set to '' to disable X-Frame-Options header
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
|
||||
# Please note that this will add a "frame-ancestors" directive to the CSP header (see above) accordingly
|
||||
# to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
|
||||
# Set to '' to disable X-Content-Type-Options header
|
||||
# optional, default is 'nosniff'
|
||||
#x_content_type_options => 'nosniff',
|
||||
|
||||
# X-XSS-Protection that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
|
||||
# Set to '' to disable X-XSS-Protection header
|
||||
# optional, default is '1; mode=block'
|
||||
#x_xss_protection => '1; mode=block',
|
||||
|
||||
#########################
|
||||
# Lufi cron jobs settings
|
||||
#########################
|
||||
|
||||
# number of days senders' IP addresses are kept in database
|
||||
# after that delay, they will be deleted from database (used with script/lufi cron cleanbdd)
|
||||
# optional, default is 365
|
||||
#keep_ip_during => 365,
|
||||
|
||||
# max size of the files directory, in octets
|
||||
# used by script/lufi cron watch to trigger an action
|
||||
# optional, no default
|
||||
#max_total_size => 10*1024*1024*1024,
|
||||
|
||||
# default action when files directory is over max_total_size (used with script/lufi cron watch)
|
||||
# valid values are 'warn', 'stop-upload' and 'delete'
|
||||
# please, see readme
|
||||
# optional, default is 'warn'
|
||||
#policy_when_full => 'warn',
|
||||
|
||||
# images which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task
|
||||
# if delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted
|
||||
# optional, no default
|
||||
#delete_no_longer_viewed_files => 90,
|
||||
};
|
|
@ -0,0 +1,253 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
{
|
||||
####################
|
||||
# Hypnotoad settings
|
||||
####################
|
||||
# see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings
|
||||
hypnotoad => {
|
||||
# array of IP addresses and ports you want to listen to
|
||||
listen => ['http://127.0.0.1:8081'],
|
||||
# if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1
|
||||
# if you use Lufi directly, let it commented
|
||||
#proxy => 1,
|
||||
|
||||
# Please read http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#workers
|
||||
# to adjust this to your server
|
||||
workers => 30,
|
||||
clients => 1,
|
||||
},
|
||||
|
||||
# put a way to contact you here and uncomment it
|
||||
# you can put some HTML in it
|
||||
# MANDATORY
|
||||
contact => '<a href="https://contact.example.com">Contact page</a>',
|
||||
|
||||
# put an URL or an email address to receive file reports and uncomment it
|
||||
# it's for make reporting illegal files easy for users
|
||||
# MANDATORY
|
||||
report => 'report@example.com',
|
||||
|
||||
# array of random strings used to encrypt cookies
|
||||
# optional, default is ['fdjsofjoihrei'], PLEASE, CHANGE IT
|
||||
#secrets => ['fdjsofjoihrei'],
|
||||
|
||||
# choose a theme. See the available themes in `themes` directory
|
||||
# optional, default is 'default'
|
||||
#theme => 'default',
|
||||
|
||||
# length of the random URL
|
||||
# optional, default is 8
|
||||
#length => 8,
|
||||
|
||||
# how many URLs will be provisioned in a batch ?
|
||||
# optional, default is 5
|
||||
#provis_step => 5,
|
||||
|
||||
# max number of URLs to be provisioned
|
||||
# optional, default is 100
|
||||
#provisioning => 100,
|
||||
|
||||
# length of the modify/delete token
|
||||
# optional, default is 32
|
||||
#token_length => 32,
|
||||
|
||||
# max file size, in octets
|
||||
# you can write it 100*1024*1024
|
||||
# optional, no default
|
||||
#max_file_size => 104857600,
|
||||
|
||||
# if you want to have piwik statistics, provide a piwik image tracker
|
||||
# only the image tracker is allowed, no javascript
|
||||
# optional, no default
|
||||
#piwik_img => 'https://piwik.example.org/piwik.php?idsite=1&rec=1',
|
||||
|
||||
# broadcast_message which will displayed on the index page
|
||||
# optional, no default
|
||||
#broadcast_message => 'Maintenance',
|
||||
|
||||
# default time limit for files
|
||||
# valid values are 0, 1, 7, 30 and 365
|
||||
# optional, default is 0 (no limit)
|
||||
#default_delay => 0,
|
||||
|
||||
# number of days after which the images will be deleted, even if they were uploaded with "no delay" (or value superior to max_delay)
|
||||
# a warning message will be displayed on homepage
|
||||
# optional, default is 0 (no limit)
|
||||
#max_delay => 0,
|
||||
|
||||
# size thresholds: if you want to define max delays for different sizes of file
|
||||
# the keys are size in Bytes, you can't have 10*1000*10000 as key
|
||||
# if a file is smaller than the smallest configured size, it will have a expiration delay of max_delay (see above)
|
||||
# optional, default is using max_delay (see above) for all sizes
|
||||
#delay_for_size => {
|
||||
# 10000000 => 90, # between 10MB and 50MB => max is 90 days, less than 10MB => max is max_delay (see above)
|
||||
# 50000000 => 60, # between 50MB ans 1GB => max is 60 days
|
||||
# 1000000000 => 2, # more than 1GB => max is 2 days
|
||||
#},
|
||||
|
||||
# URL sub-directory in which you want Lufi to be accessible
|
||||
# example: you want to have Lufi under https://example.org/lufi/
|
||||
# => set prefix to '/lufi' or to '/lufi/', it doesn't matter
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# array of authorized domains for API calls.
|
||||
# if you want to authorize everyone to use the API: ['*']
|
||||
# optional, no domains allowed by default
|
||||
#allowed_domains => ['http://1.example.com', 'http://2.example.com'],
|
||||
|
||||
# if set, the shortened URLs will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# Mail configuration
|
||||
# See https://metacpan.org/pod/Mojolicious::Plugin::Mail#EXAMPLES
|
||||
# Optional, default to sendmail method with no arguments
|
||||
#mail => {
|
||||
# # Valid values are 'sendmail' and 'smtp'
|
||||
# how => 'smtp',
|
||||
# howargs => ['smtp.example.org']
|
||||
#},
|
||||
|
||||
# Email sender address
|
||||
# Optional, default to no-reply@lufi.io
|
||||
#mail_sender => 'no-reply@lufi.io',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite, postgresql and mysql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
#dbtype => 'sqlite',
|
||||
|
||||
# SQLite ONLY - only used if dbtype is set to sqlite
|
||||
# define a path to the SQLite database
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# optional, default is lufi.db
|
||||
db_path => 'sqlite.db',
|
||||
|
||||
# PostgreSQL ONLY - only used if dbtype is set to postgresql
|
||||
# these are the credentials to access the PostgreSQL database
|
||||
# mandatory if you choosed postgresql as dbtype
|
||||
#pgdb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# # optional, default is 5432
|
||||
# #port => 5432,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # https://mojolicious.org/perldoc/Mojo/Pg#max_connections
|
||||
# # optional, default is 1
|
||||
# #max_connections => 1,
|
||||
#},
|
||||
|
||||
# MySQL ONLY - only used if dbtype is set to mysql
|
||||
# these are the credentials to access the MySQL database
|
||||
# mandatory if you choosed mysql as dbtype
|
||||
#mysqldb => {
|
||||
# database => 'lufi',
|
||||
# host => 'localhost',
|
||||
# # optional, default is 3306
|
||||
# #port => 3306,
|
||||
# user => 'DBUSER',
|
||||
# pwd => 'DBPASSWORD',
|
||||
# # https://metacpan.org/pod/Mojo::mysql#max_connections
|
||||
# # optional, default is 5 (set to 0 to disable persistent connections)
|
||||
# #max_connections => 5,
|
||||
#},
|
||||
|
||||
# define a path to the upload directory, where the uploaded files will be stored
|
||||
# you can define it relative to lufi directory or set an absolute path
|
||||
# remember that it has to be in a directory writable by Lufi user
|
||||
# DO NOT CHANGE THIS IF FILES HAVE BEEN ALREADY UPLOADED: THEY WILL NOT BE DOWNLOADABLE ANYMORE
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# set `ldap` if you want that only authenticated users can upload files
|
||||
# please note that everybody can still download files
|
||||
# optional, no default
|
||||
#ldap => { uri => 'ldap://rroemhild-test-openldap', user_tree => 'ou=people,dc=planetexpress,dc=com', bind_dn => 'cn=admin,dc=planetexpress,dc=com', bind_pwd => 'GoodNewsEveryone', user_attr => 'uid', user_filter => '' },
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# see 'man htpasswd' to know how to create such file
|
||||
#htpasswd => 't/lstu.passwd',
|
||||
|
||||
# if you've set ldap above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# allow to add a password on files, asked before allowing to download files
|
||||
# optional, default is 0
|
||||
allow_pwd_on_files => 1,
|
||||
|
||||
# force all files to be in "Burn after reading mode"
|
||||
# optional, default is 0
|
||||
#force_burn_after_reading => 0,
|
||||
|
||||
# if set, the files' URLs will always use this domain
|
||||
# optional, no default
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
# abuse reasons
|
||||
# set an integer in the abuse field of a file in the database and it will not be downloadable anymore
|
||||
# the reason will be displayed to the downloader, according to the reasons you will configure here.
|
||||
# optional, no default
|
||||
abuse => {
|
||||
0 => 'Copyright infringment',
|
||||
1 => 'Illegal content',
|
||||
},
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lufi
|
||||
# Set to '' to disable CSP header
|
||||
# https://content-security-policy.com/ provides a good documentation about CSP.
|
||||
# https://report-uri.com/home/generate provides a tool to generate a CSP header.
|
||||
# optional, default is "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
# the default value is good for `default` and `milligram` themes
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' blob:; media-src blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
|
||||
|
||||
# X-Frame-Options header that will be sent by Lufi
|
||||
# Valid values are: 'DENY', 'SAMEORIGIN', 'ALLOW-FROM https://example.com/'
|
||||
# Set to '' to disable X-Frame-Options header
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
|
||||
# Please note that this will add a "frame-ancestors" directive to the CSP header (see above) accordingly
|
||||
# to the chosen setting (See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
|
||||
# Set to '' to disable X-Content-Type-Options header
|
||||
# optional, default is 'nosniff'
|
||||
#x_content_type_options => 'nosniff',
|
||||
|
||||
# X-XSS-Protection that will be sent by Lufi
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
|
||||
# Set to '' to disable X-XSS-Protection header
|
||||
# optional, default is '1; mode=block'
|
||||
#x_xss_protection => '1; mode=block',
|
||||
|
||||
#########################
|
||||
# Lufi cron jobs settings
|
||||
#########################
|
||||
|
||||
# number of days senders' IP addresses are kept in database
|
||||
# after that delay, they will be deleted from database (used with script/lufi cron cleanbdd)
|
||||
# optional, default is 365
|
||||
#keep_ip_during => 365,
|
||||
|
||||
# max size of the files directory, in octets
|
||||
# used by script/lufi cron watch to trigger an action
|
||||
# optional, no default
|
||||
#max_total_size => 10*1024*1024*1024,
|
||||
|
||||
# default action when files directory is over max_total_size (used with script/lufi cron watch)
|
||||
# valid values are 'warn', 'stop-upload' and 'delete'
|
||||
# please, see readme
|
||||
# optional, default is 'warn'
|
||||
#policy_when_full => 'warn',
|
||||
|
||||
# images which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task
|
||||
# if delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted
|
||||
# optional, no default
|
||||
#delete_no_longer_viewed_files => 90,
|
||||
};
|
|
@ -0,0 +1,262 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
use Mojo::Base -strict;
|
||||
use Mojo::File;
|
||||
use Mojo::JSON qw(to_json from_json true);
|
||||
use Mojolicious;
|
||||
|
||||
use Test::More;
|
||||
use Test::Mojo;
|
||||
|
||||
use Lufi::DB::File;
|
||||
use Lufi::DB::Slice;
|
||||
use FindBin qw($Bin);
|
||||
|
||||
my ($m, $cfile, $config_orig, $config_file, $config_content);
|
||||
|
||||
my $msg = to_json {
|
||||
"total" => 1,
|
||||
"part" => 0,
|
||||
"size" => 7,
|
||||
"name" => "foobar.txt",
|
||||
"type" => "text/plain",
|
||||
"delay" => "0",
|
||||
"del_at_first_view" => 1,
|
||||
"id" => undef,
|
||||
"i" => 0
|
||||
};
|
||||
my $encrypted = '"{\\"iv\\":\\"2RGAviAeYybBqcLCmnqlgA==\\",\\"v\\":1,\\"iter\\":10000,\\"ks\\":128,\\"ts\\":64,\\"mode\\":\\"ccm\\",\\"adata\\":\\"\\",\\"cipher\\":\\"aes\\",\\"salt\\":\\"1dvKtbZ8hxA=\\",\\"ct\\":\\"w9wDZCwNSyH/yL7q1GW5fPSdi+w=\\"}"';
|
||||
my $encrypted_rgx = $encrypted;
|
||||
$encrypted_rgx =~ s@\\@\\\\@g;
|
||||
$encrypted_rgx =~ s@\+@\\+@g;
|
||||
$encrypted_rgx =~ s@(\{|\})@\\$1@g;
|
||||
|
||||
BEGIN {
|
||||
use lib 'lib';
|
||||
$m = Mojolicious->new;
|
||||
$cfile = Mojo::File->new($Bin, '..', 'lutim.conf');
|
||||
if (defined $ENV{MOJO_CONFIG}) {
|
||||
$cfile = Mojo::File->new($ENV{MOJO_CONFIG});
|
||||
unless (-e $cfile->to_abs) {
|
||||
$cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});
|
||||
}
|
||||
}
|
||||
my $config = $m->plugin(
|
||||
'Config' => {
|
||||
file => $cfile->to_abs->to_string,
|
||||
default => {
|
||||
prefix => '/',
|
||||
provisioning => 100,
|
||||
provis_step => 5,
|
||||
length => 10,
|
||||
token_length => 32,
|
||||
secrets => ['hfudsifdsih'],
|
||||
default_delay => 0,
|
||||
max_delay => 0,
|
||||
mail => {
|
||||
how => 'sendmail'
|
||||
},
|
||||
mail_sender => 'no-reply@lufi.io',
|
||||
theme => 'default',
|
||||
upload_dir => 'files',
|
||||
session_duration => 3600,
|
||||
allow_pwd_on_files => 0,
|
||||
dbtype => 'sqlite',
|
||||
db_path => 'lufi.db',
|
||||
force_burn_after_reading => 0,
|
||||
x_frame_options => 'DENY',
|
||||
x_content_type_options => 'nosniff',
|
||||
x_xss_protection => '1; mode=block',
|
||||
}
|
||||
}
|
||||
);
|
||||
$m->plugin('Lufi::Plugin::Helpers');
|
||||
$m->plugin('DebugDumperHelper');
|
||||
} ## end BEGIN
|
||||
|
||||
Lufi::DB::Slice->new(app => $m)->delete_all;
|
||||
Lufi::DB::File->new(app => $m)->delete_all;
|
||||
|
||||
my $t = Test::Mojo->new('Lufi');
|
||||
|
||||
## Wait for short generation
|
||||
sleep 3;
|
||||
|
||||
## Let's go
|
||||
$t->get_ok('/')
|
||||
->status_is(200)
|
||||
->content_like(qr@Lufi@i);
|
||||
|
||||
test_upload_file();
|
||||
test_download_file();
|
||||
|
||||
## Test htpasswd
|
||||
switch_to_htpasswd();
|
||||
auth_test_suite('luc', 'toto');
|
||||
restore_config();
|
||||
|
||||
## Test LDAP
|
||||
switch_to_ldap();
|
||||
auth_test_suite('zoidberg', 'zoidberg');
|
||||
restore_config();
|
||||
|
||||
done_testing();
|
||||
|
||||
######
|
||||
### Functions
|
||||
##
|
||||
sub test_upload_file {
|
||||
$t->websocket_ok('/upload/')
|
||||
->send_ok($msg.'XXMOJOXX'.$encrypted)
|
||||
->message_ok
|
||||
->message_like(qr@"created_at":\d+@)
|
||||
->message_like(qr@"del_at_first_view":true@)
|
||||
->message_like(qr@"delay":0@)
|
||||
->message_like(qr@"duration":\d+@)
|
||||
->message_like(qr@"i":0@)
|
||||
->message_like(qr@"j":0@)
|
||||
->message_like(qr@"name":"foobar\.txt"@)
|
||||
->message_like(qr@"parts":1@)
|
||||
->message_like(qr@"sent_delay":0@)
|
||||
->message_like(qr@"short":"[^"]+"@)
|
||||
->message_like(qr@"size":7@)
|
||||
->message_like(qr@"success":true@)
|
||||
->message_like(qr@"token":"[^"]+"}@)
|
||||
->finish_ok;
|
||||
}
|
||||
|
||||
sub test_download_file {
|
||||
my $ws_msg;
|
||||
$t->ua->websocket_p('/upload/')->then(sub {
|
||||
my $tx = shift;
|
||||
my $promise = Mojo::Promise->new;
|
||||
$tx->on(finish => sub { $promise->resolve });
|
||||
$tx->on(message => sub {
|
||||
my $tx = shift;
|
||||
$ws_msg = shift;
|
||||
$tx->finish;
|
||||
});
|
||||
$tx->send($msg.'XXMOJOXX'.$encrypted);
|
||||
return $promise;
|
||||
})->catch(sub {
|
||||
my $err = shift;
|
||||
is($err, undef);
|
||||
})->wait;
|
||||
|
||||
$ws_msg = from_json($ws_msg);
|
||||
$t->websocket_ok('/download/'.$ws_msg->{short})
|
||||
->send_ok(to_json({part => 0}))
|
||||
->message_ok
|
||||
->message_like(qr@"total":1@)
|
||||
->message_like(qr@"part":0@)
|
||||
->message_like(qr@"i":0@)
|
||||
->message_like(qr@"id":null@)
|
||||
->message_like(qr@"del_at_first_view":1@)
|
||||
->message_like(qr@"delay":"0"@)
|
||||
->message_like(qr@"name":"foobar\.txt"@)
|
||||
->message_like(qr@"size":7@)
|
||||
->message_like(qr@"type":"text\\/plain"@)
|
||||
->message_like(qr@XXMOJOXX@)
|
||||
->message_like(qr@$encrypted_rgx@)
|
||||
->send_ok(to_json({ended => true}))
|
||||
->finish_ok;
|
||||
|
||||
# The file is not supposed to be available anymore
|
||||
$t->websocket_ok('/download/'.$ws_msg->{short})
|
||||
->send_ok(to_json({part => 0}))
|
||||
->message_ok
|
||||
->message_like(qr@"msg":"Error: the file existed but was deleted\."@)
|
||||
->message_like(qr@"success":false@)
|
||||
->send_ok(to_json({ended => true}))
|
||||
->finish_ok;
|
||||
}
|
||||
|
||||
sub auth_test_suite {
|
||||
my ($login, $pass) = @_;
|
||||
|
||||
$t->get_ok('/')
|
||||
->status_is(302)
|
||||
->header_is(Location => '/login');
|
||||
|
||||
test_fail_upload();
|
||||
test_login($login, $pass);
|
||||
test_upload_file();
|
||||
test_download_file();
|
||||
|
||||
my $token = '';
|
||||
|
||||
$t->post_ok('/logout' => form => { csrf_token => $token })
|
||||
->status_is(200)
|
||||
->content_like(qr@Bad CSRF token\.@);
|
||||
|
||||
$token = $t->ua->get('/')->res->dom->find('input[name="csrf_token"]')->first->attr('value');
|
||||
|
||||
$t->post_ok('/logout' => form => { csrf_token => $token })
|
||||
->status_is(200)
|
||||
->content_like(qr@You have been successfully logged out\.@);
|
||||
|
||||
test_fail_upload();
|
||||
}
|
||||
|
||||
sub test_fail_upload {
|
||||
# An empty message would make it fail if we were allowed to go in the authenticated part
|
||||
$t->websocket_ok('/upload/')
|
||||
->send_ok('')
|
||||
->finish_ok;
|
||||
}
|
||||
|
||||
sub test_login {
|
||||
my ($login, $pass) = @_;
|
||||
$t->get_ok('/login')
|
||||
->status_is(200)
|
||||
->content_like(qr@Signin@);
|
||||
|
||||
my $token = '';
|
||||
|
||||
$t->post_ok('/login' => form => { login => $login, password => $pass, csrf_token => $token })
|
||||
->status_is(200)
|
||||
->content_like(qr@Bad CSRF token\.@);
|
||||
|
||||
$token = $t->ua->get('/login')->res->dom->find('input[name="csrf_token"]')->first->attr('value');
|
||||
|
||||
$t->post_ok('/login' => form => { login => $login, password => $pass, csrf_token => $token })
|
||||
->status_is(302)
|
||||
->header_is(Location => '/');
|
||||
|
||||
$t->get_ok('/login')
|
||||
->status_is(302)
|
||||
->header_is(Location => '/');
|
||||
}
|
||||
|
||||
sub restore_config {
|
||||
$config_file->spurt($config_orig);
|
||||
}
|
||||
|
||||
sub switch_to_htpasswd {
|
||||
$config_file = Mojo::File->new($cfile->to_abs->to_string);
|
||||
$config_content = $config_file->slurp;
|
||||
$config_orig = $config_content;
|
||||
$config_content =~ s/#?htpasswd.*/htpasswd => 't\/lufi.passwd',/gm;
|
||||
$config_file->spurt($config_content);
|
||||
|
||||
Lufi::DB::Slice->new(app => $m)->delete_all;
|
||||
Lufi::DB::File->new(app => $m)->delete_all;
|
||||
|
||||
$t = Test::Mojo->new('Lufi');
|
||||
|
||||
## Wait for short generation
|
||||
sleep 3;
|
||||
}
|
||||
|
||||
sub switch_to_ldap {
|
||||
$config_content = $config_orig;
|
||||
$config_content =~ s/^( +)#?ldap => \{ uri/$1ldap => { uri/gm;
|
||||
$config_file->spurt($config_content);
|
||||
|
||||
Lufi::DB::Slice->new(app => $m)->delete_all;
|
||||
Lufi::DB::File->new(app => $m)->delete_all;
|
||||
|
||||
$t = Test::Mojo->new('Lufi');
|
||||
|
||||
## Wait for short generation
|
||||
sleep 3;
|
||||
}
|
|
@ -0,0 +1,631 @@
|
|||
# ButterflyOfFire <butterflyoffire@protonmail.com>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 08:31+0000\n"
|
||||
"Last-Translator: ButterflyOfFire <butterflyoffire@protonmail.com>\n"
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Language-Team: Arabic\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 أيام"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(الحجم الأقصى: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "سنة واحدة"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 ساعة"
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ":"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "إلغاء"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "عن البرنامج"
|
||||
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "إضافة كلمة سرية إلى الملف"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr "العودة إلى الصفحة الرئيسة"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "رمز CSRF خاطئ!"
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "رمز CSRF خاطئ."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "اضغط لتحديث الصفحة و إعادة التنزيل."
|
||||
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "اضغط لفتح متصفح الملفات"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr "إغلاق"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "عناوين البريد الإلكترونية مُقسّمة بفاصلة"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "نسخ كافة الروابط إلى الحافظة"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "انسخ إلى الحافظة"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "لا يمكن حذف الملف. إنك لم تقم بتسجيل الدخول."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr "العداد"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "هل تريد أن يُحذَف الملف عند أول تنزيل؟"
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr "حذف الملفات التي تم اختيارها"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "رابط الحذف"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "تنزيل"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "لقد ألغِيَ التنزيل."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "رابط التنزيل"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "قم بوضع الملفات هنا"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "مضمون الرسالة الإلكترونية"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "موضوع الرسالة الإلكترونية"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "عناوين البريد الإلكترونية"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "تعمية الجزء XX1 مِن XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "خطأ: لقد كان الملف موجودا بالفعل و لكن تم حذفه."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "خطأ: لم يتم إرسال الملف كاملا."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "خطأ: غير قادر على العثور على الملف. هل أنت متأكد من العنوان؟"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "تاريخ نهاية الصلاحية:"
|
||||
|
||||
#: themes/default/templates/files.html.ep:31
|
||||
msgid "Expires at"
|
||||
msgstr "تنتهي صلاحيته في"
|
||||
|
||||
#: themes/default/templates/files.html.ep:12
|
||||
msgid "Export localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "تم حذف الملف"
|
||||
|
||||
#: themes/default/templates/files.html.ep:26
|
||||
msgid "File name"
|
||||
msgstr "اسم الملف"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "تم حذف الملفات عند أول تنزيل"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "تحصّل على الملف"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "السلام،\\n\\nها هي بعض الملفات التي أحببتُ مشاركتها معك:\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "ها هي بعض الملفات"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "اضغط على Enter، ثم Ctrl+C لنسخ جميع روابط التحميل"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "اضغط على Enter، ثم Ctrl+C لنسخ رابط التحميل"
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
msgstr "كيف يعمل؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr "كيف يمكنني تثبيت البرنامج على خادومي؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "How to report an illegal file?"
|
||||
msgstr "كيف يمكن الإبلاغ عن ملف غير قانوني؟"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "إذا قمت باختيار تأخير، سيتم حذف الملف بعد ذلك التأخير."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"إذا قمت بإرسال البريد من هذا الخادوم، سيتم إرسال الروابط إلى الخادم، الأمر "
|
||||
"الذي يمكن أن يقلل من حماية خصوصيتك."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "هام: مزيد من المعلومات عن التأخير"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:5
|
||||
msgid "Information about delays"
|
||||
msgstr "معلومات حول التأخير"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"ويبدو أن المفتاح في عنوان URL الخاص بك غير صحيح. الرجاء تحقق من عنوان رابطك."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "الجافا سكريبت غير مفعل. ليس بإمكانك استخدام لوفي Lufi."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "اللغة"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "تسجيل الدخول"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "الخروج"
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr ""
|
||||
"لوفي أو Lufi برنامج حر (كما هو الحال في حرية التعبير) لاستضافة الملفات."
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr "البريد"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "ملفاتي"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "لا توجد مساحة كافية متوفرة على السيرفر لاستضافة الملف (الحجم: %1)."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "دون تاريخ لنهاية الصلاحية"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "الكلمة السرية"
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr "يرجى الاتصال بالمدير: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
msgstr "الخصوصية"
|
||||
|
||||
#: themes/default/templates/files.html.ep:13
|
||||
msgid "Purge expired files from localStorage"
|
||||
msgstr "تطهير الملفات منتهية الصلاحية من مساحة التخزين المحلية"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "الإبلاغ عن ملف"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "تعني الأعمدة باللون الأحمر انتهاء صلاحية الملفات وأنها لم تعد متوفرة."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "إرسال كافة الروابط عبر البريد الإلكتروني"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "إرسال عبر هذا الخادوم"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "إرسال باستخدام برنامج البريد الخاص بك"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "شارك ملفاتك بخصوصية تامة على %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "تسجيل الدخول"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "عذراً، التحميل معطل حاليا. يرجى إعادة المحاولة لاحقًا."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "عذرًا ، التحميل معطل."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "تم استيراد البيانات بنجاح."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "لا يمكن أن يُترك مضمون الرسالة فارغًا."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "لا يمكن أن يُترك موضوع الرسالة فارغًا."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "لقد تم حذف الملف مِن قبلُ"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"يتم تشفير الملفات التي يتم تحميلها على خادوم لوفي قبل تحميلها على الخادم: لا "
|
||||
"يمكن لمدير الخادم الإطلاع على محتوى الملف."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "عناوين البريد الإلكترونية التالية غير صحيحة: %1"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "لقد تم نسخ الرابط أو الروابط إلى الحافظة"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "لقد تم إرسال الرسالة الإلكترونية."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr "لقد تم تعطيل الملف من طرف المشرفين. الرجاء الإتصال بهم لمعرفة السبب."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "تعذر نسخ كافة الروابط إلى الحافظة"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "لا يمكن جلب عداد %1. إن الرمز غير صالح."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "لا يمكن جلب عداد %1. إنك لم تقم بتسجيل الدخول."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "إرسال ملفات"
|
||||
|
||||
#: themes/default/templates/files.html.ep:30
|
||||
msgid "Uploaded at"
|
||||
msgstr "أرسِل بتاريخ"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "الملفات المُرسَلة"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "خطأ في اتصال ويب سوكيت"
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lufi?"
|
||||
msgstr "ماذا نعني بـ لوفي Lufi؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr "من قام بتطوير هذا البرنامج؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"يمكنك عرض قائمة ملفاتك عن طريق النقر على وصلة \"ملفاتي\" في الجزء العلوي "
|
||||
"الأيمن من هذه الصفحة."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"لا تحتاج إلى تسجيل نفسك لإرسال ملفات ولكن انتبه إلى أنه، لأسباب قانونية، "
|
||||
"سيتم تخزين عنوان IP الخاص بك عندما تقوم بإرسال ملف. لا داعي للقلق فهذا شيء "
|
||||
"عادي ينطبق على جميع المواقع التي توفر خدمة إرسال الملفات."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"لقد حاولتَ ترك هذه الصفحة. سيتم إلغاء تنزيل الملف الذي أنت بصدد تنزيله. هل "
|
||||
"أنت متأكد؟"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"لقد حاولتَ ترك هذه الصفحة. سيتم إلغاء إرسال لملف الذي أنت بصدد تحميله. هل "
|
||||
"أنت متأكد؟"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "لقد تم تسجيل خروجك بنجاح."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "يجب إدخال عناوين للبريد الإلكتروني."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr "لا يحتوي متصفحك على قدر كافٍ من الإنتروبيا لإنشاء مفتاح تشفير قوي."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "الملف كبير جدًا: %1 (الحد الأقصى المسموح به للحجم هو: %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr "الكلمة السرية غير صالحة. يرجى تحديث الصفحة لإعادة المحاولة."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "آخر أجل: "
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:26
|
||||
msgid "for %1 and more, the file will be kept %2 day(s)"
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "بلا حدود"
|
||||
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "أو"
|
|
@ -3,61 +3,89 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
# xd <xdrudis@tinet.cat>, 2017.
|
||||
#
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
# Quentí <quentinantonin@free.fr>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Lufi 0.01\n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2017-05-26 06:23-0000\n"
|
||||
"Last-Translator: xd <xdrudis@tinet.cat>\n"
|
||||
"Language-Team: català; valencià <>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 06:24+0000\n"
|
||||
"Last-Translator: Quentí <quentinantonin@free.fr>\n"
|
||||
"Language-Team: català; valencià <>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.6.10\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Language: ca\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 dies"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(mida max: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 any"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 hores"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ":"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Un agraïment amb la foto d'un gatet a <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o a <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> també fa goig ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Un agraïment amb la foto d'un gatet a <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o "
|
||||
"a <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"també fa goig ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Avorta"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "Quant a"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Afegir una contrasenya al(s) fitxer(s)"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Com que Lufi és programari lliure, autoritzat sota els termes de l'<a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, el podeu instal·lar al vostre propi servidor. Pel que fa a com fer-ho, feu un cop d'ull al <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a>."
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Com que Lufi és programari lliure, autoritzat sota els termes de l'<a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, el "
|
||||
"podeu instal·lar al vostre propi servidor. Pel que fa a com fer-ho, feu un "
|
||||
"cop d'ull al <a href=\"https://framagit.org/luc/lufi/wikis/home\" class="
|
||||
"\"classic\">Wiki</a>."
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Demanem la part XX1 de %1 del fitxer"
|
||||
|
||||
|
@ -65,15 +93,19 @@ msgstr "Demanem la part XX1 de %1 del fitxer"
|
|||
msgid "Back to homepage"
|
||||
msgstr "Retorna a la pàgina d'inici"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Mal testimoni CSRF!"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Token CSRF incorrect."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Premeu aquí per tal de refrescar la pàgina i reiniciar la descàrrega"
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Premeu per obrir la selecció de fitxer."
|
||||
|
||||
|
@ -81,27 +113,27 @@ msgstr "Premeu per obrir la selecció de fitxer."
|
|||
msgid "Close"
|
||||
msgstr "Tanca"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Adreces de correu electrònic separades per comes"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copia tots els enllaços al porta-retalls"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copia al porta-retalls"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "No es pot esborrar el fitxer. No esteu autenticat."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "No es troba el fitxer. Esteu segur de la URL i el testimoni?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "No trobo el fitxer. Esteu segurs de la URL?"
|
||||
|
||||
|
@ -109,71 +141,87 @@ msgstr "No trobo el fitxer. Esteu segurs de la URL?"
|
|||
msgid "Counter"
|
||||
msgstr "Comptador"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Eliminar-lo a la primera descàrrega?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
msgstr "Suprimir els fitxers seleccionats"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Enllaç per a eliminació"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "No patiu per si un usuari comença a descarregar el fitxer abans de l'expiració i la descàrrega acaba després de l'expiració, encara podrà obtenir el fitxer."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"No patiu per si un usuari comença a descarregar el fitxer abans de "
|
||||
"l'expiració i la descàrrega acaba després de l'expiració, encara podrà "
|
||||
"obtenir el fitxer."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Descàrrega"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Descàrrega avortada."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Enllaç per a descàrrega"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Arrossegueu i deixeu anar fitxers a l'àrea apropiada o useu el sistema tradicional per enviar fitxers, i seran trossejats, xifrats i enviats al servidor. Obtindreu dos enllaços per a cada fitxer: un enllaç per a la descàrrega, que doneu a la gent amb qui voleu compartir el fitxer, i un enllaç per a l'eliminació, que us permet eliminar el fitxer del servidor quan vulgueu. "
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Arrossegueu i deixeu anar fitxers a l'àrea apropiada o useu el sistema "
|
||||
"tradicional per enviar fitxers, i seran trossejats, xifrats i enviats al "
|
||||
"servidor. Obtindreu dos enllaços per a cada fitxer: un enllaç per a la "
|
||||
"descàrrega, que doneu a la gent amb qui voleu compartir el fitxer, i un "
|
||||
"enllaç per a l'eliminació, que us permet eliminar el fitxer del servidor "
|
||||
"quan vulgueu. "
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Deixeu anar aquí fitxers."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Cos del correu electrònic"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Assumpte del correu electrònic"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "correus electrònics"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "S'està xifrant la part XX1 de XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Error: el fitxer existia però va ser eliminat."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Error: el fitxer no s'ha enviat del tot."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Error: no trobo el fitxer. Esteu segur de la URL ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Expiració:"
|
||||
|
||||
|
@ -185,7 +233,7 @@ msgstr "Expira el"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Exporta dades a l'emmagatzematge local"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Fitxer eliminat"
|
||||
|
||||
|
@ -193,27 +241,38 @@ msgstr "Fitxer eliminat"
|
|||
msgid "File name"
|
||||
msgstr "Nom de fitxer"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Fitxers suprimits a la primera descàrrega"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Obté el fitxer"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Obteniu el codi font al <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">repositori oficial</a> o a la seva <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">rèplica a Github</a>"
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Obteniu el codi font al <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">repositori oficial</a> o a la seva <a href=\"https://github.com/"
|
||||
"ldidry/lufi\" class=\"classic\">rèplica a Github</a>"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Hola,\\n\\nVe't aquí uns fitxers que vull compartir amb tu:"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Ve't aquí uns fitxers"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Prem Retorn, i després Ctrl+C per copiar tots els enllaços de descàrrega"
|
||||
msgstr ""
|
||||
"Prem Retorn, i després Ctrl+C per copiar tots els enllaços de descàrrega"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Prem Retorn, i després Ctrl+C per copiar l'enllaç de descàrrega"
|
||||
|
||||
|
@ -229,20 +288,24 @@ msgstr "Com instal·lo el programari al meu servidor?"
|
|||
msgid "How to report an illegal file?"
|
||||
msgstr "Com informo d'un fitxer iŀlegal?"
|
||||
|
||||
# delay=temps/retard/dilació/demora/moratòria ?
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "Si seleccioneu una moratòria, el fitxer s'eliminarà passada la moratòria."
|
||||
msgstr ""
|
||||
"Si seleccioneu una moratòria, el fitxer s'eliminarà passada la moratòria."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Si envieu el correu des d'aquest servidor, els enllaços s'enviaran al servidor, i això pot minvar la protecció de la vostra privacitat."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Si envieu el correu des d'aquest servidor, els enllaços s'enviaran al "
|
||||
"servidor, i això pot minvar la protecció de la vostra privacitat."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importar dades de l'emmagatzematge local"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Importat: més informació sobre moratòries"
|
||||
|
||||
|
@ -250,19 +313,25 @@ msgstr "Importat: més informació sobre moratòries"
|
|||
msgid "Information about delays"
|
||||
msgstr "Informació sobre moratòries"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Sembla que la clau a l'URL és incorrecta. Si us plau, verifiqueu l'URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Sembla que la clau a l'URL és incorrecta. Si us plau, verifiqueu l'URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Teniu el javascript deactivat. No podreu usar Lufi."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Llengua"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Entrada"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Sortida"
|
||||
|
||||
|
@ -272,26 +341,32 @@ msgstr "Lufi és programari lliure d'allotjament de fitxers."
|
|||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr ""
|
||||
msgstr "Mail"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Els meus fitxers"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "No hi ha prou espai al servidor per a aquest fitxer (mida: %1)"
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Sense moratòria d'expiració"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Aquí només apareixen els fitxers enviats amb aquest navegador. La llista es desa en emmagatzematge local: si netegeu l'emmagatzematge local perdreu aquesta llista."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Aquí només apareixen els fitxers enviats amb aquest navegador. La llista es "
|
||||
"desa en emmagatzematge local: si netegeu l'emmagatzematge local perdreu "
|
||||
"aquesta llista."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Contrasenya"
|
||||
|
||||
|
@ -301,11 +376,17 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Si us plau contacteu amb l'administrador: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Si us plau, espereu mentre obtenim el fitxer. Abans que el tingueu disponible primer cal descarregar i desxifrar tots els trossos."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Si us plau, espereu mentre obtenim el fitxer. Abans que el tingueu "
|
||||
"disponible primer cal descarregar i desxifrar tots els trossos."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
|
@ -316,118 +397,172 @@ msgstr "Privacitat"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Netegeu els fitxers expirats de l'emmagatzematge local."
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "Les files en vermell indiquen que els fitxers han expirat i ja no són disponibles."
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Senyalar un fitxer"
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Les files en vermell indiquen que els fitxers han expirat i ja no són "
|
||||
"disponibles."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Envia tots els enllaços per correu electrònic"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Envia amb aquest servidor"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Envia amb el vostre propi programa de correu"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr "S'està enviant el tros XX1 de XX2. Si us plau, paciència; la barra de progrés pot trigar una mica a bellugar-se. "
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"S'està enviant el tros XX1 de XX2. Si us plau, paciència; la barra de "
|
||||
"progrés pot trigar una mica a bellugar-se. "
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Compartiu fitxers amb total privacitat a %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Autenticació"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "Disculpeu, les pujades estan actualment desactivades. Si us plau proveu-ho més tard."
|
||||
msgstr ""
|
||||
"Disculpeu, les pujades estan actualment desactivades. Si us plau proveu-ho "
|
||||
"més tard."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "Disculpeu, les pujades estan deshabilitades"
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"L'administrador només pot veure el nom del fitxer, la seva mida i el seu\n"
|
||||
"mimetype (quina mena de fitxer és: vídeo, text, etc.)"
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"El cor del mail deu contenir almens una URL menant al fitxer albergat a "
|
||||
"aquesta instància."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "La importació de les dades ha reeixit."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "El cos del correu no pot estar buit."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "L'assumpte dle correu no pot estar buit."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "El fitxer ja ha estat esborrat"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "Els fitxers que es pugen a una instaŀlació de Lufi són xifrats abans de pujar-los al servidor i l'administrador del servidor no pot veure el contingut del fitxer."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Els fitxers que es pugen a una instaŀlació de Lufi són xifrats abans de "
|
||||
"pujar-los al servidor i l'administrador del servidor no pot veure el "
|
||||
"contingut del fitxer."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Les següents adreces de correu electrònic no són vàlides: %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "L'enllaç/ els enllaços ja estan copiats al portaretalls"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "El correu ja està enviat."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "L'autor original (i per ara l'únic) és <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. Si voleu fer una contribució podeu fer-ho via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> o via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"L'autor original (i per ara l'únic) és <a href=\"https://fiat-tux.fr\" class="
|
||||
"\"classic\">Luc Didry</a>. Si voleu fer una contribució podeu fer-ho via <a "
|
||||
"href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> o via "
|
||||
"<a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "El servidor no ha pogut trobar el registre del fitxer per afegir-hi el tros del fitxer. Si us plau, contacteu l'administrador."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"El servidor no ha pogut trobar el registre del fitxer per afegir-hi el tros "
|
||||
"del fitxer. Si us plau, contacteu l'administrador."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"Aquest fitxer es estat desactivat pels administrators. Contacteu-los per "
|
||||
"saber perque."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "Aquest servidor estableix limitacions segons la mida del fitxer. La moratòria d'expiració del fitxer serà el mínim de l'escollida i aquestes limitacions:"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Aquest servidor estableix limitacions segons la mida del fitxer. La "
|
||||
"moratòria d'expiració del fitxer serà el mínim de l'escollida i aquestes "
|
||||
"limitacions:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "No s'han pogut copiar l'enllaç o els enllaços al porta-retalls."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "No he pogut obtenir el comptador de %1. El fitxer no existeix. Serà eliminat del teu emmagatzematge local."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"No he pogut obtenir el comptador de %1. El fitxer no existeix. Serà eliminat "
|
||||
"del teu emmagatzematge local."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "No he pogut obtenir el comptador de %1. El testimoni no és vàlid."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "No he pogut obtenir el comptador de %1. No esteu autenticat."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Pujar fitxers"
|
||||
|
||||
|
@ -435,11 +570,11 @@ msgstr "Pujar fitxers"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Pujat a les"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Fitxers pujats"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Error de comunicacions del websocket"
|
||||
|
||||
|
@ -452,41 +587,75 @@ msgid "Who wrote this software?"
|
|||
msgstr "Qui va escriure aquest programa?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Podeu veure la llista dels vostres fitxers amb a l'enllaç \"Els meus fitxers\" a dalt a la dreta d'aquesta pàgina."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Podeu veure la llista dels vostres fitxers amb a l'enllaç \"Els meus "
|
||||
"fitxers\" a dalt a la dreta d'aquesta pàgina."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr "No podeu pas afegir una URL qu'es pas ligada a aquesta instància."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "No cal que us inscriviu per a pujar fitxers però tingueu en compte, que per raons legals, s'enregistrarà la vostra adreça IP quan envieu un fitxer. No us espanteu, això és el que normalment passa a tots els webs on pugeu fitxers."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"No cal que us inscriviu per a pujar fitxers però tingueu en compte, que per "
|
||||
"raons legals, s'enregistrarà la vostra adreça IP quan envieu un fitxer. No "
|
||||
"us espanteu, això és el que normalment passa a tots els webs on pugeu "
|
||||
"fitxers."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "No sembla que hi hagi una clau a la URL. No podreu desxifrar el fitxer. Descàrrega canceŀlada."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"No sembla que hi hagi una clau a la URL. No podreu desxifrar el fitxer. "
|
||||
"Descàrrega canceŀlada."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr "Heu intentat deixar aquesta pàgina. Es canceŀlarà la descàrrega. N'esteu segur?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Heu intentat deixar aquesta pàgina. Es canceŀlarà la descàrrega. N'esteu "
|
||||
"segur?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr "Heu intentat deixar aquesta pàgina. Es canceŀlarà la pujada. N'esteu segur?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Heu intentat deixar aquesta pàgina. Es canceŀlarà la pujada. N'esteu segur?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Heu sortit correctament."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Heu de donar l'adreça de correu electrònic."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "El fitxer és massa gran: %1 (mida màxima admesa: %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
"La vostra contrasenya es incorrecta. Torneu cargar la pàgina per provar de "
|
||||
"nou."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
|
@ -498,7 +667,7 @@ msgstr "entre %1 i %2, el fitxer es mantindrà %3 dia/es al servidor."
|
|||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "entre %1 i %2, el fitxer es mantindrà per sempre al servidor."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "termini:"
|
||||
|
||||
|
@ -516,6 +685,6 @@ msgstr "a partir de %1, el fitxer es mantindrà per sempre al servidor."
|
|||
msgid "no time limit"
|
||||
msgstr "no hi ha límit de temps"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "o"
|
||||
|
|
|
@ -0,0 +1,706 @@
|
|||
# frju365 <abld@tutanota.com>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 07:34+0000\n"
|
||||
"Last-Translator: frju365 <abld@tutanota.com>\n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 Tag"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(maximale Größe: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 Jahre"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 Stunden"
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ":"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Ein Dankeschön mit einem Foto von Kätzchen von <a href=\"https://framasphere."
|
||||
"org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</"
|
||||
"a> oder von <a href=\"https://framapiaf.org/@framasky\" class="
|
||||
"\"classic\">Mastodon</a> ist auch cool ;)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Ein Passwort zu den Dateien hinzufügen"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
"Das Hinzufügen von URLs, die nicht mit dieser Lufi-Instanz in Verbindung "
|
||||
"stehen, zum Mailtext oder Betreff ist verboten."
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Da es sich bei Lufi um eine kostenlose Software handelt, die unter den "
|
||||
"Bedingungen der <a href=\"https://gnu.org/licenses/agpl.html\" class="
|
||||
"\"classic\">AGPLv3</a> lizenziert ist, können Sie sie auf Ihrem eigenen "
|
||||
"Server installieren. Werfen Sie einen Blick auf die <a href=\"https://"
|
||||
"framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> für das "
|
||||
"Verfahren."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Abfrage des Dateiteils XX1 von %1"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr "Zurück zur Hauptseite"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Schlechtes CSRF-Token!"
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Schlechtes CSRF-Token."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr ""
|
||||
"Klicken Sie hier, um die Seite zu aktualisieren und den Download neu zu "
|
||||
"starten."
|
||||
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Klicken um den Dateibrowser zu öffnen"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Kommagetrennte E-Mail-Adressen"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Alle Links in die Zwischenablage kopieren"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "In die Zwischenablage kopieren"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr ""
|
||||
"Die Datei konnte nicht gelöscht werden. Du bist nicht authentifiziert."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr ""
|
||||
"Die Datei konnte nicht gefunden werden. Sind Sie sich der URL und des Token "
|
||||
"sicher?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Die Datei konnte nicht gefunden werden. Sind Sie sich der URL sicher?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr "Zähler"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Beim ersten Download löschen?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr "Die ausgewählte Dateien löschen"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Link zum Löschen"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Keine Sorge: Wenn ein Benutzer vor Ablauf der Frist mit dem Herunterladen "
|
||||
"der Datei beginnt und der Download nach Ablauf der Frist endet, kann er die "
|
||||
"Datei herunterladen."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Herunterladen"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Herunterladen abgebrochen"
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Link zum Herunterladen"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Ziehen Sie Dateien per Drag-and-Drop in den entsprechenden Bereich oder "
|
||||
"verwenden Sie die traditionelle Methode zum Senden von Dateien und die "
|
||||
"Dateien werden verchromt, verschlüsselt und an den Server gesendet. Sie "
|
||||
"erhalten zwei Links pro Datei: einen Download-Link, den Sie den Personen "
|
||||
"geben, mit denen Sie die Datei teilen möchten, und einen Lösch-Link, mit dem "
|
||||
"Sie die Datei jederzeit löschen können."
|
||||
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Ablegen Sie Dateien hier"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "E-Mail-Body"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "E-Mail-Betreff"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "E-Mails"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Verschlüsselung von Teil XX1 von XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Error: Die Datei existierte, aber es wurde gelöscht."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Error: Die Datei wurde nicht vollständig gesendet."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Error: Datei nicht gefunden. Sind Sie sich Ihrer URL sicher?"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Ablaufdatum:"
|
||||
|
||||
#: themes/default/templates/files.html.ep:31
|
||||
msgid "Expires at"
|
||||
msgstr "Verfallt bei"
|
||||
|
||||
#: themes/default/templates/files.html.ep:12
|
||||
msgid "Export localStorage data"
|
||||
msgstr "Exportieren von localStorage-Daten"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Datei gelöscht"
|
||||
|
||||
#: themes/default/templates/files.html.ep:26
|
||||
msgid "File name"
|
||||
msgstr "Dateiname"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Dateien wurde beim ersten Download gelöcht"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Die Datei herunterladen"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Holen Sie sich den Quellcode auf <a href=\"https://framagit.org/luc/lufi\" "
|
||||
"class=\"classic\">das offizielle Repository</a> oder auf dessen <a href="
|
||||
"\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>."
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Hallo!!\\n\\nHier sind einige Dateien, die ich mit dir teilen möchte:\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Hier sind einige Dateien"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr ""
|
||||
"Drücken Sie Enter und dann Ctrl+C, um alle Download-Links zu kopieren."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Drücken Sie Enter und dann Ctrl+C, um die Download-Links zu kopieren."
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
msgstr "Wie fonktionniert es?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr "Wie kann ich diesen Software auf meine Instanz installieren ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "How to report an illegal file?"
|
||||
msgstr "Wie kann man eine illegale Datei melden?"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr ""
|
||||
"Wenn Sie eine Verzögerung wählen, wird die Datei nach dieser Verzögerung "
|
||||
"gelöscht."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"When Sie der E-Mail von diesem Server schicken, der Links wurde an einen "
|
||||
"Server geschickt, der eine niedrigen Schutz der Privatsphäre haben kann."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importieren von localStorage-Daten"
|
||||
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Wichtig: weitere Informationen zu den Verzögerungen"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:5
|
||||
msgid "Information about delays"
|
||||
msgstr "Informationen über den Verzörgerungen"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Es scheint, dass der Schlüssel in Ihrer URL inkorrekt ist. Bitte überprüfen "
|
||||
"Sie Ihre URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript ist desaktiviert. Du wirst Lufi nicht benutzen können."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Sprache"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Login"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr "Lufi is ein freier (wie in der Redefreiheit) Datei-Hosting-Software."
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr "E-Mail"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Meine Dateien"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr ""
|
||||
"Auf dem Server ist nicht genügend Platz für diese Datei vorhanden (Größe: "
|
||||
"%1)."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Keine Ablaufverzögerung"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Nur die mit diesem Browser geschickten Dateien werden hier aufgelistet. "
|
||||
"Diese Liste wird in localStorage gespeichert: Wenn Sie Ihre localStorage-"
|
||||
"Daten löschen, verlieren Sie diese Liste. "
|
||||
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr "Bitte kontaktieren sie den Administrator: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Bitte warten Sie, bis wir Ihre Datei erhalten. Wir müssen zuerst alle Teile "
|
||||
"herunterladen und entschlüsseln, bevor Sie sie bekommen können."
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
"Bitte überprüffen sie Ihre Zugangsdaten oder Ihr Recht, auf diesen Dienst "
|
||||
"zuzugreifen: keine Authentifizierung möglich."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
msgstr "Privatsphäre"
|
||||
|
||||
#: themes/default/templates/files.html.ep:13
|
||||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Abgelaufener Dateien aus localStorage bereinigen"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Datei melden"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Rot markierte Zeilen bedeuten, dass die Dateien abgelaufen sind und nicht "
|
||||
"mehr verfügbar sind."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Alle Links bei E-Mail schicken"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Mit diesem Server schicken"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Schicken mit Ihrer eigenen Mail-Software"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Senden von Teil XX1 von XX2. Bitte haben Sie Geduld, der Fortschrittsbalken "
|
||||
"kann eine Weile dauern, bis er sich bewegt."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Teilen Sie Ihre Dateien in der absoluten Vertraulichkeit auf %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Einloggen"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "Es tut uns leid, aber das Hochladen ist im Moment deaktiviert"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "Leider ist das Hochladen deaktiviert."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"Der Administrator kann nur den Namen der Datei, ihre Größe und ihren Mimetyp "
|
||||
"(welche Art von Datei es ist: Video, Text, etc.) sehen."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"Der E-Mail-Body muss zu mindestens eine URL enhalten, die auf eine Datei "
|
||||
"verweist, die auf dieser Instanz gehosted wird."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "DIe Daten wurden erfolgreich importiert."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Der E-Mail-Body darf nicht leer sein."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Der E-Mail-Betreff kann nicht leer sein."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Die Datei wurde schon gelöscht."
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Die auf einer Lufi-Instanz hochgeladenen Dateien werden vor dem Hochladen "
|
||||
"auf den Server verschlüsselt: Der Administrator des Servers kann den Inhalt "
|
||||
"der Datei nicht sehen."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Die folgenden E-Mail-Adressen sind nicht gültig: %1"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "Die Links wurde(n) in die Zwischenablage kopiert."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Der E-Mail wurde geschickt."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"Die Originalautor (und vorerst einzige) ist <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. Wenn Sie ihn unterschützen wollen, können "
|
||||
"Sie dies über <a href=\"https://www.tipeee.com/fiat-tux\" class="
|
||||
"\"classic\">Tipeee</a> oder über <a href=\"https://liberapay.com/sky/\" "
|
||||
"class=\"classic\">Liberapay</a> tun."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Der Server konnte den Datensatz nicht finden, zu dem Sie Ihr Dateiteil "
|
||||
"hinzufügen können. Bitte kontaktieren Sie den Administrator."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"Diese Datei wurde von Admins deacktiviert. Kontaktieren SIe sie, um die "
|
||||
"Gründe zu kennen."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Dieser Server setzt Einschränkungen entsprechend der Dateigröße. Die "
|
||||
"Ablaufverzögerung Ihrer Datei ist das Minimum zwischen dem, was Sie wählen, "
|
||||
"und den folgenden Einschränkungen:"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Es ist nicht möglich, die Links in die Zwischenablage zu kopieren."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Der Zähler für %1 konnte nicht ermittelt werden. Die Datei existiert nicht. "
|
||||
"Es wird aus deinem localStorage gelöscht."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr ""
|
||||
"Der Zähler für %1 konnte nicht gefunden werden. Das Token ist ungültig."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr ""
|
||||
"Der Zähler für %1 konnte nicht gefunden werden. Sie sind nicht "
|
||||
"authentifiziert."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Dateien hochladen"
|
||||
|
||||
#: themes/default/templates/files.html.ep:30
|
||||
msgid "Uploaded at"
|
||||
msgstr "Hochgeladen unter"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Hochgeladene Dateien"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Websocket-Kommunikationsfehler"
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lufi?"
|
||||
msgstr "Was ist Lufi?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr "Wer hat diese Software geschrieben?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Sie können die Liste Ihrer Dateien einsehen, indem Sie auf den Link \"Meine "
|
||||
"Dateien\" oben rechts auf dieser Seite klicken."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
"Sie können keine URLs hinzufügen, die nicht mit dieser Instanz verknüpft "
|
||||
"sind."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Sie müssen sich nicht registrieren, um Dateien hochzuladen, aber beachten "
|
||||
"Sie, dass Ihre IP-Adresse aus rechtlichen Gründen beim Senden einer Datei "
|
||||
"gespeichert wird. Keine Panik, dies ist normalerweise der Fall für alle "
|
||||
"Websites, auf denen Sie Dateien senden."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Sie scheinen keinen Schlüssel in Ihrer URL zu besitzen. Du wirst die Datei "
|
||||
"nicht entschlüsseln können. Der Download wurde abgebrochen."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Du hast versucht, diese Seite zu verlassen. Der Download wird abgebrochen. "
|
||||
"Bist du sicher?"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Du hast versucht, diese Seite zu verlassen. Der Hockladen wird abgebrochen. "
|
||||
"Bist du sicher?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Sie wurden erfolgreich ausgeloggt."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Sie müssen E-Mail-Adressen geben."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
"Ihr Browser hat nicht genug Entropie, um einen starken Verschlüsselungscode "
|
||||
"zu erzeugen. Bitte warten Sie einen Moment (es ist besser, wenn Sie Dinge "
|
||||
"auf Ihrem Computer tun, während Sie warten)."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "Ihre Datei ist zu groß: %1 (maximal erlaubte Größe: %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
"Ihr Passwort ist ungültig. Bitte aktualisieren Sie die Seite, um es "
|
||||
"wiederzuversuchen."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr "zwischen %1 und %2, wird die Datei %3 Tag(e) behalten."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "zwischen %1 und %2, wird die Datei für immer aufbewahrt."
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "Abgabetermin:"
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:26
|
||||
msgid "for %1 and more, the file will be kept %2 day(s)"
|
||||
msgstr "für %1 und mehr wird die Datei aufbewahrt %2 Tag(e)"
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr "für %1 und mehr, wird die Datei für immer aufbewahrt."
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "kein Zeitlimit"
|
||||
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "oder"
|
|
@ -1,515 +1,679 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf8\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:53+0000\n"
|
||||
"Last-Translator: Luc Didry <luc@framasoft.org>\n"
|
||||
"Language-Team: English\n"
|
||||
"Language: en\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 days"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(max size: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr ""
|
||||
msgstr "1 year"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr ""
|
||||
msgstr "24 hours"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ""
|
||||
msgstr ":"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr ""
|
||||
msgstr "Abort"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
msgstr "About"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Add a password to file(s)"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr ""
|
||||
msgstr "Asking for file part XX1 of %1"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr ""
|
||||
msgstr "Back to homepage"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr ""
|
||||
msgstr "Bad CSRF token!"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Bad CSRF token."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr ""
|
||||
msgstr "Click here to refresh the page and restart the download."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr ""
|
||||
msgstr "Click to open the file browser"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
msgstr "Close"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr ""
|
||||
msgstr "Comma-separated email addresses"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr ""
|
||||
msgstr "Copy all links to clipboard"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
msgstr "Copy to clipboard"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr ""
|
||||
msgstr "Could not delete the file. You are not authenticated."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr ""
|
||||
msgstr "Could not find the file. Are you sure of the URL and the token?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr ""
|
||||
msgstr "Could not find the file. Are you sure of the URL?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr ""
|
||||
msgstr "Counter"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr ""
|
||||
msgstr "Delete at first download?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
msgstr "Delete selected files"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr ""
|
||||
msgstr "Deletion link"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
msgstr "Download"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr ""
|
||||
msgstr "Download aborted."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr ""
|
||||
msgstr "Download link"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr ""
|
||||
msgstr "Drop files here"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr ""
|
||||
msgstr "Email body"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr ""
|
||||
msgstr "Email subject"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr ""
|
||||
msgstr "Emails"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr ""
|
||||
msgstr "Encrypting part XX1 of XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr ""
|
||||
msgstr "Error: the file existed but was deleted."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr ""
|
||||
msgstr "Error: the file has not been sent entirely."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr ""
|
||||
msgstr "Error: unable to find the file. Are you sure of your URL?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr ""
|
||||
msgstr "Expiration:"
|
||||
|
||||
#: themes/default/templates/files.html.ep:31
|
||||
msgid "Expires at"
|
||||
msgstr ""
|
||||
msgstr "Expires at"
|
||||
|
||||
#: themes/default/templates/files.html.ep:12
|
||||
msgid "Export localStorage data"
|
||||
msgstr ""
|
||||
msgstr "Export localStorage data"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr ""
|
||||
msgstr "File deleted"
|
||||
|
||||
#: themes/default/templates/files.html.ep:26
|
||||
msgid "File name"
|
||||
msgstr ""
|
||||
msgstr "File name"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Files deleted at first download"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr ""
|
||||
msgstr "Get the file"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr ""
|
||||
msgstr "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr ""
|
||||
msgstr "Here's some files"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr ""
|
||||
msgstr "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr ""
|
||||
msgstr "Hit Enter, then Ctrl+C to copy the download link"
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
msgstr ""
|
||||
msgstr "How does it work?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr ""
|
||||
msgstr "How to install the software on my server?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "How to report an illegal file?"
|
||||
msgstr ""
|
||||
msgstr "How to report an illegal file?"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr ""
|
||||
msgstr "If you choose a delay, the file will be deleted after that delay."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr ""
|
||||
msgstr "Import localStorage data"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr ""
|
||||
msgstr "Important: more information on delays"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:5
|
||||
msgid "Information about delays"
|
||||
msgstr ""
|
||||
msgstr "Information about delays"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr ""
|
||||
msgstr "Javascript is disabled. You won't be able to use Lufi."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Language"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Login"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
msgstr "Logout"
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr ""
|
||||
msgstr "Lufi is a free (as in free speech) file hosting software."
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr ""
|
||||
msgstr "Mail"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr ""
|
||||
msgstr "My files"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr ""
|
||||
msgstr "No enough space available on the server for this file (size: %1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr ""
|
||||
msgstr "No expiration delay"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Password"
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr ""
|
||||
msgstr "Please contact the administrator: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
msgstr ""
|
||||
msgstr "Privacy"
|
||||
|
||||
#: themes/default/templates/files.html.ep:13
|
||||
msgid "Purge expired files from localStorage"
|
||||
msgstr ""
|
||||
msgstr "Purge expired files from localStorage"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Report file"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
msgid "Send with this server"
|
||||
msgstr ""
|
||||
msgstr "Send all links by email"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with your own mail software"
|
||||
msgstr ""
|
||||
msgid "Send with this server"
|
||||
msgstr "Send with this server"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Send with your own mail software"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr ""
|
||||
msgstr "Share your files in total privacy on %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr ""
|
||||
msgstr "Signin"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr ""
|
||||
msgstr "Sorry, the uploading is currently disabled. Please try again later."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr ""
|
||||
msgstr "Sorry, uploading is disabled."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr ""
|
||||
msgstr "The data has been successfully imported."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr ""
|
||||
msgstr "The email body can't be empty."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr ""
|
||||
msgstr "The email subject can't be empty."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr ""
|
||||
msgstr "The file has already been deleted"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr ""
|
||||
msgstr "The following email addresses are not valid: %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr ""
|
||||
msgstr "The link(s) has been copied to your clipboard"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr ""
|
||||
msgstr "The mail has been sent."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr ""
|
||||
msgstr "Unable to copy the link(s) to your clipboard"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr ""
|
||||
msgstr "Unable to get counter for %1. The token is invalid."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr ""
|
||||
msgstr "Unable to get counter for %1. You are not authenticated."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr ""
|
||||
msgstr "Upload files"
|
||||
|
||||
#: themes/default/templates/files.html.ep:30
|
||||
msgid "Uploaded at"
|
||||
msgstr ""
|
||||
msgstr "Uploaded at"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr ""
|
||||
msgstr "Uploaded files"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr ""
|
||||
msgstr "Websocket communication error"
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lufi?"
|
||||
msgstr ""
|
||||
msgstr "What is Lufi?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr ""
|
||||
msgstr "Who wrote this software?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr "You can't add URLs that are not related to this instance."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr ""
|
||||
msgstr "You have been successfully logged out."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "You must give email addresses."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
msgstr "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
msgstr "Your password is not valid. Please refresh the page to retry."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr ""
|
||||
msgstr "between %1 and %2, the file will be kept %3 day(s)."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr ""
|
||||
msgstr "between %1 and %2, the file will be kept forever."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr ""
|
||||
msgstr "deadline: "
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:26
|
||||
msgid "for %1 and more, the file will be kept %2 day(s)"
|
||||
msgstr ""
|
||||
msgstr "for %1 and more, the file will be kept %2 day(s)"
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr ""
|
||||
msgstr "for %1 and more, the file will be kept forever."
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr ""
|
||||
msgstr "no time limit"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr ""
|
||||
msgstr "or"
|
||||
|
|
|
@ -2,61 +2,90 @@
|
|||
# Copyright (C) 2015 Luc Didry
|
||||
# This file is distributed under the same license as the Lufi package.
|
||||
# Luc Didry <luc@didry.org>, 2015.
|
||||
#
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2015-10-15 14:00-0400\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:59+0000\n"
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Poedit 1.8.5\n"
|
||||
"Last-Translator: Luc Didry <luc@didry.org>\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Language: fr\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 jours"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(taille max: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 an"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 heures"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr " :"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Un merci avec une photo de chaton sur <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> ou <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> fait aussi l’affaire ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Un merci avec une photo de chaton sur <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> ou "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"fait aussi l’affaire ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Abandonner"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "À propos"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Ajouter un mot de passe au(x) fichier(s)"
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Comme Lufi est un logiciel libre soumis aux termes de la license <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, vous pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> pour voir la procédure."
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
"L’ajout d’URL non liées à cette instance Lufi au corps ou au sujet du mail "
|
||||
"est interdit."
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Comme Lufi est un logiciel libre soumis aux termes de la license <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, vous "
|
||||
"pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href="
|
||||
"\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> pour "
|
||||
"voir la procédure."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Demande de récupération du fragment de fichier XX1 sur %1"
|
||||
|
||||
|
@ -64,15 +93,19 @@ msgstr "Demande de récupération du fragment de fichier XX1 sur %1"
|
|||
msgid "Back to homepage"
|
||||
msgstr "Retour à la page d’accueil"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Mauvais jeton CSRF !"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Jeton CSRF invalide."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Cliquez ici pour rafraîchir la page et redémarrer le téléchargement."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Cliquez pour ouvrir le navigateur de fichiers"
|
||||
|
||||
|
@ -80,35 +113,39 @@ msgstr "Cliquez pour ouvrir le navigateur de fichiers"
|
|||
msgid "Close"
|
||||
msgstr "Fermer"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Adresses mails séparées par des virgules"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copier tous les liens dans le presse-papier"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copier dans le presse-papier"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Impossible de supprimer le fichier. Vous n’êtes pas connecté·e."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL et le jeton sont les bons ?"
|
||||
msgstr ""
|
||||
"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL et le jeton "
|
||||
"sont les bons ?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL est la bonne ?"
|
||||
msgstr ""
|
||||
"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL est la "
|
||||
"bonne ?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr "Compteur"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Supprimer après le premier téléchargement ?"
|
||||
|
||||
|
@ -116,63 +153,79 @@ msgstr "Supprimer après le premier téléchargement ?"
|
|||
msgid "Delete selected files"
|
||||
msgstr "Supprimer les fichiers sélectionnés"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Lien de suppression"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "Ne vous inquiétez pas : si un utilisateur commence à télécharger le fichier avant son expiration et que le téléchargement se termine après l’expiration, l’utilisateur pourra quand même récupérer le fichier."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Ne vous inquiétez pas : si un utilisateur commence à télécharger le fichier "
|
||||
"avant son expiration et que le téléchargement se termine après l’expiration, "
|
||||
"l’utilisateur pourra quand même récupérer le fichier."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Télécharger"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Téléchargement abandonné."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Lien de téléchargement"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Faites glisser des fichiers dans la zone prévue à cet effet ou sélectionnez un fichier de façon classique et les fichiers seront découpés en morceaux, chiffrés et envoyés au serveur. Vous récupérerez deux liens par fichier : un lien de téléchargement et un lien pour supprimer le fichier quand vous le souhaitez."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Faites glisser des fichiers dans la zone prévue à cet effet ou sélectionnez "
|
||||
"un fichier de façon classique et les fichiers seront découpés en morceaux, "
|
||||
"chiffrés et envoyés au serveur. Vous récupérerez deux liens par fichier : un "
|
||||
"lien de téléchargement et un lien pour supprimer le fichier quand vous le "
|
||||
"souhaitez."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Glissez vos fichiers ici"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Corps du mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Sujet du mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "Mails"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Chiffrement du fragment XX1 sur XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Erreur : le fichier existait mais a été supprimé"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Erreur : le fichier n’a pas été envoyé dans son intégralité"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Erreur : impossible de retrouver le fichier. Êtes-vous sûr(e) de l’URL ?"
|
||||
msgstr ""
|
||||
"Erreur : impossible de retrouver le fichier. Êtes-vous sûr(e) de l’URL ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Expiration :"
|
||||
|
||||
|
@ -184,7 +237,7 @@ msgstr "Expire le"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Exporter les données localStorage"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Fichier supprimé"
|
||||
|
||||
|
@ -192,29 +245,44 @@ msgstr "Fichier supprimé"
|
|||
msgid "File name"
|
||||
msgstr "Nom du fichier"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Fichiers supprimés au premier téléchargement"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Récupérer le fichier"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Récupérez le code source sur <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">le dépôt officiel</a> ou sur son <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">miroir Github</a>."
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Récupérez le code source sur <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">le dépôt officiel</a> ou sur son <a href=\"https://github.com/"
|
||||
"ldidry/lufi\" class=\"classic\">miroir Github</a>."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Bonjour,\\n\\nVoici quelques fichiers que je souhaite partager avec toi :\\n"
|
||||
msgstr ""
|
||||
"Bonjour,\\n\\nVoici quelques fichiers que je souhaite partager avec toi :\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Voici quelques fichiers"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Appuyez sur la touche Entrée puis faites Ctrl+C pour copier tous les liens de téléchargement"
|
||||
msgstr ""
|
||||
"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier tous les liens "
|
||||
"de téléchargement"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien de téléchargement"
|
||||
msgstr ""
|
||||
"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien de "
|
||||
"téléchargement"
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
|
@ -233,14 +301,18 @@ msgid "If you choose a delay, the file will be deleted after that delay."
|
|||
msgstr "Si vous choisissez un délai, le fichier sera supprimé après ce délai."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Si vous envoyez le mail depuis ce serveur, les liens seront envoyés au serveur, ce qui peut diminuer la protection de la confidentialité."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Si vous envoyez le mail depuis ce serveur, les liens seront envoyés au "
|
||||
"serveur, ce qui peut diminuer la protection de la confidentialité."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importer des données localStorage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Important : plus d’informations sur les délais"
|
||||
|
||||
|
@ -248,19 +320,26 @@ msgstr "Important : plus d’informations sur les délais"
|
|||
msgid "Information about delays"
|
||||
msgstr "Information sur les délais"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Il semble que la clé dans votre URL soit incorrecte. Veuillez vérifier votre URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Il semble que la clé dans votre URL soit incorrecte. Veuillez vérifier votre "
|
||||
"URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript est désactivé. Lufi ne fonctionnera pas."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Langue"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Identifiant"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Déconnexion"
|
||||
|
||||
|
@ -270,26 +349,34 @@ msgstr "Lufi est un logiciel libre d’hébergement de fichiers."
|
|||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr ""
|
||||
msgstr "Mail"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Mes fichiers"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier : %1)."
|
||||
msgstr ""
|
||||
"Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier :"
|
||||
" %1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Pas de délai d’expiration"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Seuls les fichiers envoyés avec ce navigateur web sont listés ici. Les informations sont stockées en localStorage : si vous supprimez vos données localStorage, vous perdrez ces informations."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Seuls les fichiers envoyés avec ce navigateur web sont listés ici. Les "
|
||||
"informations sont stockées en localStorage : si vous supprimez vos données "
|
||||
"localStorage, vous perdrez ces informations."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Mot de passe"
|
||||
|
||||
|
@ -299,12 +386,21 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Veuillez contacter l’administrateur : %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Veuillez patientez pendant la récupération de votre fichier. Nous devons d’abord récupérer et déchiffrer tous les fragments avant que vous puissiez le télécharger."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Veuillez patientez pendant la récupération de votre fichier. Nous devons "
|
||||
"d’abord récupérer et déchiffrer tous les fragments avant que vous puissiez "
|
||||
"le télécharger."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
msgstr "Veuillez vérifier vos identifiants : impossible de vous authentifier."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
"Veuillez vérifier vos identifiants ou votre droit d’accès à ce service : "
|
||||
"impossible de vous authentifier."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
|
@ -314,116 +410,174 @@ msgstr "Confidentialité"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Supprimer du localStorage les fichiers expirés"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "Les lignes en rouge indiquent que le fichier a expiré et n’est plus disponible."
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Signaler un fichier"
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Les lignes en rouge indiquent que le fichier a expiré et n’est plus "
|
||||
"disponible."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Envoyer tous les liens par mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Envoyer avec ce serveur"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Envoyer avec votre propre logiciel de mail"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr "Envoi du fragment XX1 sur XX2. Veuillez patienter, la barre de progression peut mettre du temps avant d’avancer."
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Envoi du fragment XX1 sur XX2. Veuillez patienter, la barre de progression "
|
||||
"peut mettre du temps avant d’avancer."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Partagez vos fichiers en toute confidentialité sur %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Connexion"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr "Désolé, vous n’êtes pas autorisé à utiliser ce service. Contactez votre administrateur si vous pensez qu’il s’agit d’une erreur."
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "Désolé, l’envoi de fichier est actuellement désactivé. Veuillez réessayer plus tard."
|
||||
msgstr ""
|
||||
"Désolé, l’envoi de fichier est actuellement désactivé. Veuillez réessayer "
|
||||
"plus tard."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "Désolé, l’envoi de fichier est désactivé."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgstr "L’administrateur ne peut voir que le nom du fichier, sa taille et son type mime (son type de fichier : vidéo, texte, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"L’administrateur ne peut voir que le nom du fichier, sa taille et son type "
|
||||
"mime (son type de fichier : vidéo, texte, etc.)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"Le corps du mail doit contenir au moins une URL pointant vers un fichier "
|
||||
"hébergé sur cette instance."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "Les données ont été importées avec succès."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Le corps du mail ne peut être vide."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Le sujet du mail ne peut être vide."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Le fichier a déjà été supprimé"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "Les fichiers envoyés sur une instance de Lufi sont chiffrés avant l’envoi au serveur : l’administrateur du serveur ne peut pas voir le contenu de vos fichiers."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Les fichiers envoyés sur une instance de Lufi sont chiffrés avant l’envoi au "
|
||||
"serveur : l’administrateur du serveur ne peut pas voir le contenu de vos "
|
||||
"fichiers."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Les adresses mail suivantes ne sont pas valides : %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "Le(s) lien(s) a/ont été copié dans votre presse-papier"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Le mail a été envoyé."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "L’auteur originel (et pour l’instant, le seul) est <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. Si vous avez envie de le supporter, vous pouvez le faire via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"L’auteur originel (et pour l’instant, le seul) est <a href=\"https://fiat-"
|
||||
"tux.fr\" class=\"classic\">Luc Didry</a>. Si vous avez envie de le "
|
||||
"supporter, vous pouvez le faire via <a href=\"https://www.tipeee.com/fiat-"
|
||||
"tux\" class=\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/"
|
||||
"sky/\" class=\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "Le serveur a été incapable de retrouver l’enregistrement du fichier auquel ajouter votre fragment de fichier. Veuillez contacter l’administrateur."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Le serveur a été incapable de retrouver l’enregistrement du fichier auquel "
|
||||
"ajouter votre fragment de fichier. Veuillez contacter l’administrateur."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"The fichier a été désactivé par les administrateurs ou administratrices. "
|
||||
"Veuillez les contacter pour savoir pourquoi."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "Ce serveur impose des limitations selon la taille des fichiers. Le délai d’expiration de votre fichier sera le minimum entre ce que vous avez choisi et les limites suivantes :"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Ce serveur impose des limitations selon la taille des fichiers. Le délai "
|
||||
"d’expiration de votre fichier sera le minimum entre ce que vous avez choisi "
|
||||
"et les limites suivantes :"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Impossible de copier le(s) lien(s) dans votre presse-papier"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "Impossible de récupérer le compteur pour %1. Le fichier n’existe pas. Il va être supprimé de votre localStorage."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Impossible de récupérer le compteur pour %1. Le fichier n’existe pas. Il va "
|
||||
"être supprimé de votre localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Impossible de récupérer le compteur pour %1. Le jeton est invalide."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "Impossible de récupérer le compteur pour %1. Vous n’êtes pas connecté·e."
|
||||
msgstr ""
|
||||
"Impossible de récupérer le compteur pour %1. Vous n’êtes pas connecté·e."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Envoyer des fichiers"
|
||||
|
||||
|
@ -431,11 +585,11 @@ msgstr "Envoyer des fichiers"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Envoyé le"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Fichiers envoyés"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Erreur de communication WebSocket"
|
||||
|
||||
|
@ -448,41 +602,78 @@ msgid "Who wrote this software?"
|
|||
msgstr "Qui a écrit ce logiciel ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Vous pouvez voir la liste de vos fichiers en cliquant sur le lien « Mes fichiers » en haut à droite de cette page."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Vous pouvez voir la liste de vos fichiers en cliquant sur le lien « Mes "
|
||||
"fichiers » en haut à droite de cette page."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr "Vous ne pouvez pas ajouter d’URL non relatives à cette instance."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "Vous n’avez pas besoin de vous enregistrer pour envoyer des fichiers mais notez que, pour des raisons légales, votre adresse IP sera enregistrée quand vous envoyez un fichier. Ne paniquez pas, c’est normalement le cas pour tous les sites où vous envoyez des fichiers."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Vous n’avez pas besoin de vous enregistrer pour envoyer des fichiers mais "
|
||||
"notez que, pour des raisons légales, votre adresse IP sera enregistrée quand "
|
||||
"vous envoyez un fichier. Ne paniquez pas, c’est normalement le cas pour tous "
|
||||
"les sites où vous envoyez des fichiers."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "Il semble que vous n’ayez pas de clé dans votre URL. Vous ne serez pas capable de déchiffrer le fichier. Téléchargement annulé."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Il semble que vous n’ayez pas de clé dans votre URL. Vous ne serez pas "
|
||||
"capable de déchiffrer le fichier. Téléchargement annulé."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr "Vous essayez de quitter la page. Le téléchargement sera annulé. Êtes-vous sûr(e) ?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Vous essayez de quitter la page. Le téléchargement sera annulé. Êtes-vous "
|
||||
"sûr(e) ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr "Vous essayez de quitter la page. L’envoi sera annulé. Êtes-vous sûr(e) ?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Vous essayez de quitter la page. L’envoi sera annulé. Êtes-vous sûr(e) ?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Vous avez été déconnecté·e avec succès."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Vous devez envoyer des adresses mail."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "Votre fichier est trop volumineux : %1 (la taille maximum autorisée est %2)"
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
"Votre navigateur n’a pas assez d’entropie pour générer une clé de "
|
||||
"chiffrement forte. Veuillez attendre (il est préférable que vous fassiez "
|
||||
"quelque chose sur votre ordinateur en attendant)."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
"Votre fichier est trop volumineux : %1 (la taille maximum autorisée est %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr "Votre mot de passe est invalide. Veuillez rafraîchir la page pour réessayer."
|
||||
msgstr ""
|
||||
"Votre mot de passe est invalide. Veuillez rafraîchir la page pour réessayer."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
|
@ -494,7 +685,7 @@ msgstr "entre %1 et %2, le fichier sera conservé %3 jour(s) ;"
|
|||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "entre %1 et %2, le fichier sera conservé indéfiniment ;"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "dernier délai pour télécharger : "
|
||||
|
||||
|
@ -510,8 +701,8 @@ msgstr "pour %1 et plus, le fichier sera conservé indéfiniment."
|
|||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "Pas de délai d'expiration"
|
||||
msgstr "Pas de délai d’expiration"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "ou"
|
||||
|
|
|
@ -0,0 +1,708 @@
|
|||
# Lufi FR translation
|
||||
# Copyright (C) 2015 Luc Didry
|
||||
# This file is distributed under the same license as the Lufi package.
|
||||
# Luc Didry <luc@didry.org>, 2015.
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:58+0000\n"
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Language: fr_FR\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 jours"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(taille max: XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 an"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 heures"
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr " :"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Un merci avec une photo de chaton sur <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> ou "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"fait aussi l’affaire ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Abandonner"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "À propos"
|
||||
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Ajouter un mot de passe au(x) fichier(s)"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
"L’ajout d’URL non liées à cette instance Lufi au corps ou au sujet du mail "
|
||||
"est interdit."
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Comme Lufi est un logiciel libre soumis aux termes de la license <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, vous "
|
||||
"pouvez l’installer sur votre propre serveur. Veuillez consulter le <a href="
|
||||
"\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> pour "
|
||||
"voir la procédure."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Demande de récupération du fragment de fichier XX1 sur %1"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr "Retour à la page d’accueil"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Mauvais jeton CSRF !"
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Jeton CSRF invalide."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Cliquez ici pour rafraîchir la page et redémarrer le téléchargement."
|
||||
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Cliquez pour ouvrir le navigateur de fichiers"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr "Fermer"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Adresses mails séparées par des virgules"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copier tous les liens dans le presse-papier"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copier dans le presse-papier"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Impossible de supprimer le fichier. Vous n’êtes pas connecté·e."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr ""
|
||||
"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL et le jeton "
|
||||
"sont les bons ?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr ""
|
||||
"Impossible de retrouver le fichier. Êtes-vous sûr(e) que l’URL est la "
|
||||
"bonne ?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr "Compteur"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Supprimer après le premier téléchargement ?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr "Supprimer les fichiers sélectionnés"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Lien de suppression"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Ne vous inquiétez pas : si un utilisateur commence à télécharger le fichier "
|
||||
"avant son expiration et que le téléchargement se termine après l’expiration, "
|
||||
"l’utilisateur pourra quand même récupérer le fichier."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Télécharger"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Téléchargement abandonné."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Lien de téléchargement"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Faites glisser des fichiers dans la zone prévue à cet effet ou sélectionnez "
|
||||
"un fichier de façon classique et les fichiers seront découpés en morceaux, "
|
||||
"chiffrés et envoyés au serveur. Vous récupérerez deux liens par fichier : un "
|
||||
"lien de téléchargement et un lien pour supprimer le fichier quand vous le "
|
||||
"souhaitez."
|
||||
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Glissez vos fichiers ici"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Corps du mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Sujet du mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "Mails"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Chiffrement du fragment XX1 sur XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Erreur : le fichier existait mais a été supprimé"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Erreur : le fichier n’a pas été envoyé dans son intégralité"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr ""
|
||||
"Erreur : impossible de retrouver le fichier. Êtes-vous sûr(e) de l’URL ?"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Expiration :"
|
||||
|
||||
#: themes/default/templates/files.html.ep:31
|
||||
msgid "Expires at"
|
||||
msgstr "Expire le"
|
||||
|
||||
#: themes/default/templates/files.html.ep:12
|
||||
msgid "Export localStorage data"
|
||||
msgstr "Exporter les données localStorage"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Fichier supprimé"
|
||||
|
||||
#: themes/default/templates/files.html.ep:26
|
||||
msgid "File name"
|
||||
msgstr "Nom du fichier"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Fichiers supprimés au premier téléchargement"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Récupérer le fichier"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Récupérez le code source sur <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">le dépôt officiel</a> ou sur son <a href=\"https://github.com/"
|
||||
"ldidry/lufi\" class=\"classic\">miroir Github</a>."
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr ""
|
||||
"Bonjour,\\n\\nVoici quelques fichiers que je souhaite partager avec toi :\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Voici quelques fichiers"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr ""
|
||||
"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier tous les liens "
|
||||
"de téléchargement"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr ""
|
||||
"Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien de "
|
||||
"téléchargement"
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
msgstr "Comment ça marche ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr "Comment installer le logiciel sur mon serveur ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "How to report an illegal file?"
|
||||
msgstr "Comment signaler un fichier illégal ?"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "Si vous choisissez un délai, le fichier sera supprimé après ce délai."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Si vous envoyez le mail depuis ce serveur, les liens seront envoyés au "
|
||||
"serveur, ce qui peut diminuer la protection de la confidentialité."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importer des données localStorage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Important : plus d’informations sur les délais"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:5
|
||||
msgid "Information about delays"
|
||||
msgstr "Information sur les délais"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Il semble que la clé dans votre URL soit incorrecte. Veuillez vérifier votre "
|
||||
"URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript est désactivé. Lufi ne fonctionnera pas."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Langue"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Identifiant"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Déconnexion"
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr "Lufi est un logiciel libre d’hébergement de fichiers."
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr "Mail"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Mes fichiers"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr ""
|
||||
"Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier :"
|
||||
" %1)."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Pas de délai d’expiration"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Seuls les fichiers envoyés avec ce navigateur web sont listés ici. Les "
|
||||
"informations sont stockées en localStorage : si vous supprimez vos données "
|
||||
"localStorage, vous perdrez ces informations."
|
||||
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Mot de passe"
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr "Veuillez contacter l’administrateur : %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Veuillez patientez pendant la récupération de votre fichier. Nous devons "
|
||||
"d’abord récupérer et déchiffrer tous les fragments avant que vous puissiez "
|
||||
"le télécharger."
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
"Veuillez vérifier vos identifiants ou votre droit d’accès à ce service : "
|
||||
"impossible de vous authentifier."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
msgstr "Confidentialité"
|
||||
|
||||
#: themes/default/templates/files.html.ep:13
|
||||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Supprimer du localStorage les fichiers expirés"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Signaler un fichier"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Les lignes en rouge indiquent que le fichier a expiré et n’est plus "
|
||||
"disponible."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Envoyer tous les liens par mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Envoyer avec ce serveur"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Envoyer avec votre propre logiciel de mail"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Envoi du fragment XX1 sur XX2. Veuillez patienter, la barre de progression "
|
||||
"peut mettre du temps avant d’avancer."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Partagez vos fichiers en toute confidentialité sur %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Connexion"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr ""
|
||||
"Désolé, l’envoi de fichier est actuellement désactivé. Veuillez réessayer "
|
||||
"plus tard."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "Désolé, l’envoi de fichier est désactivé."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"L’administrateur ne peut voir que le nom du fichier, sa taille et son type "
|
||||
"mime (son type de fichier : vidéo, texte, etc.)."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"Le corps du mail doit contenir au moins une URL pointant vers un fichier "
|
||||
"hébergé sur cette instance."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "Les données ont été importées avec succès."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Le corps du mail ne peut être vide."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Le sujet du mail ne peut être vide."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Le fichier a déjà été supprimé"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Les fichiers envoyés sur une instance de Lufi sont chiffrés avant l’envoi au "
|
||||
"serveur : l’administrateur du serveur ne peut pas voir le contenu de vos "
|
||||
"fichiers."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Les adresses mail suivantes ne sont pas valides : %1"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "Le(s) lien(s) a/ont été copié dans votre presse-papier"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Le mail a été envoyé."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"L’auteur originel (et pour l’instant, le seul) est <a href=\"https://fiat-"
|
||||
"tux.fr\" class=\"classic\">Luc Didry</a>. Si vous avez envie de le "
|
||||
"supporter, vous pouvez le faire via <a href=\"https://www.tipeee.com/fiat-"
|
||||
"tux\" class=\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/"
|
||||
"sky/\" class=\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Le serveur a été incapable de retrouver l’enregistrement du fichier auquel "
|
||||
"ajouter votre fragment de fichier. Veuillez contacter l’administrateur."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"The fichier a été désactivé par les administrateurs ou administratrices. "
|
||||
"Veuillez les contacter pour savoir pourquoi."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Ce serveur impose des limitations selon la taille des fichiers. Le délai "
|
||||
"d’expiration de votre fichier sera le minimum entre ce que vous avez choisi "
|
||||
"et les limites suivantes :"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Impossible de copier le(s) lien(s) dans votre presse-papier"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Impossible de récupérer le compteur pour %1. Le fichier n’existe pas. Il va "
|
||||
"être supprimé de votre localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Impossible de récupérer le compteur pour %1. Le jeton est invalide."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr ""
|
||||
"Impossible de récupérer le compteur pour %1. Vous n’êtes pas connecté·e."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Envoyer des fichiers"
|
||||
|
||||
#: themes/default/templates/files.html.ep:30
|
||||
msgid "Uploaded at"
|
||||
msgstr "Envoyé le"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Fichiers envoyés"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Erreur de communication WebSocket"
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lufi?"
|
||||
msgstr "Qu’est-ce que Lufi ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr "Qui a écrit ce logiciel ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Vous pouvez voir la liste de vos fichiers en cliquant sur le lien « Mes "
|
||||
"fichiers » en haut à droite de cette page."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr "Vous ne pouvez pas ajouter d’URL non relatives à cette instance."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Vous n’avez pas besoin de vous enregistrer pour envoyer des fichiers mais "
|
||||
"notez que, pour des raisons légales, votre adresse IP sera enregistrée quand "
|
||||
"vous envoyez un fichier. Ne paniquez pas, c’est normalement le cas pour tous "
|
||||
"les sites où vous envoyez des fichiers."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Il semble que vous n’ayez pas de clé dans votre URL. Vous ne serez pas "
|
||||
"capable de déchiffrer le fichier. Téléchargement annulé."
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Vous essayez de quitter la page. Le téléchargement sera annulé. Êtes-vous "
|
||||
"sûr(e) ?"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Vous essayez de quitter la page. L’envoi sera annulé. Êtes-vous sûr(e) ?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Vous avez été déconnecté·e avec succès."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Vous devez envoyer des adresses mail."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
"Votre navigateur n’a pas assez d’entropie pour générer une clé de "
|
||||
"chiffrement forte. Veuillez attendre (il est préférable que vous fassiez "
|
||||
"quelque chose sur votre ordinateur en attendant)."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
"Votre fichier est trop volumineux : %1 (la taille maximum autorisée est %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
"Votre mot de passe est invalide. Veuillez rafraîchir la page pour réessayer."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr "entre %1 et %2, le fichier sera conservé %3 jour(s) ;"
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "entre %1 et %2, le fichier sera conservé indéfiniment ;"
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "dernier délai pour télécharger : "
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:26
|
||||
msgid "for %1 and more, the file will be kept %2 day(s)"
|
||||
msgstr "pour %1 et plus, le fichier sera conservé %2 jour(s)."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr "pour %1 et plus, le fichier sera conservé indéfiniment."
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "Pas de délai d’expiration"
|
||||
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "ou"
|
|
@ -2,61 +2,87 @@
|
|||
# Copyright (C) 2015 Luc Didry
|
||||
# This file is distributed under the same license as the Lufi package.
|
||||
# Luc Didry <luc@didry.org>, 2015.
|
||||
#
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2015-10-15 14:00-0400\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:57+0000\n"
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Poedit 1.8.5\n"
|
||||
"Last-Translator: Nikos Filopoulos \n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Language: it\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 giorni"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 anno"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 ore"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr "A :"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Un grazie con una foto di un gattino sur <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> è forte;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Un grazie con una foto di un gattino sur <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"è forte;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "A proposito"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Poiché Lufi è un software libero soggetto ai termini della licenza <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, potete installarlo sul vostro server. Si consulti <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> per vedere la procedura."
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Poiché Lufi è un software libero soggetto ai termini della licenza <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, potete "
|
||||
"installarlo sul vostro server. Si consulti <a href=\"https://framagit.org/"
|
||||
"luc/lufi/wikis/home\" class=\"classic\">Wiki</a> per vedere la procedura."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Recupero della porzione del file XX1 su %1"
|
||||
|
||||
|
@ -64,15 +90,19 @@ msgstr "Recupero della porzione del file XX1 su %1"
|
|||
msgid "Back to homepage"
|
||||
msgstr "Ritorna all'homepage"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Token CSRF errato!"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Click qui per aggiornare la pagina e ricominciare il download."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Click per aprire il file browser"
|
||||
|
||||
|
@ -80,27 +110,28 @@ msgstr "Click per aprire il file browser"
|
|||
msgid "Close"
|
||||
msgstr "Chiudi"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Indirizzi email separati da virgole"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copiare tutti i link negli appunti"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copiare negli appunti"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Impossibile cancellare il file. Non siete autenticati."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "Impossibile trovare il file. Sei sicuro che URL e token siano corretti ?"
|
||||
msgstr ""
|
||||
"Impossibile trovare il file. Sei sicuro che URL e token siano corretti ?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Impossibile trovare il file. Sei sicuro che l'URL sia corretto?"
|
||||
|
||||
|
@ -108,7 +139,7 @@ msgstr "Impossibile trovare il file. Sei sicuro che l'URL sia corretto?"
|
|||
msgid "Counter"
|
||||
msgstr "Contatore"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Cancellare al primo download?"
|
||||
|
||||
|
@ -116,63 +147,77 @@ msgstr "Cancellare al primo download?"
|
|||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Link per l'eliminazione"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "Non preoccuparti: se un utente cominciasse il download del file prima della scadenza ed il download terminasse dopo la scadenza, potrebbe ottenere il file."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Non preoccuparti: se un utente cominciasse il download del file prima della "
|
||||
"scadenza ed il download terminasse dopo la scadenza, potrebbe ottenere il "
|
||||
"file."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Download"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Download annullato."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Link per il download"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Trascinare e lasciare il file nell'are prevista o selezionare i file nel modo classico ed i file saranno divisi,cifrati ed inviati al server. Otterrete 2 link per ogni file : uno per il download ed uno per eliminare il file quando vorrete."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Trascinare e lasciare il file nell'are prevista o selezionare i file nel "
|
||||
"modo classico ed i file saranno divisi,cifrati ed inviati al server. "
|
||||
"Otterrete 2 link per ogni file : uno per il download ed uno per eliminare il "
|
||||
"file quando vorrete."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Lasciare i file qui"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Corpo dell'email"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Oggetto dell'email"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "Email"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Cifratura della parte XX1 di XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Errore: il file esisteva ma è stato eliminato"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Errore: il file non è stato inviato completamente"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Errore: impossibile trovare il file. Sei certo dell'URL ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Scadenza:"
|
||||
|
||||
|
@ -184,7 +229,7 @@ msgstr "Scadrà il"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Esportare i dati del localStorage"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "File cancellato"
|
||||
|
||||
|
@ -192,27 +237,37 @@ msgstr "File cancellato"
|
|||
msgid "File name"
|
||||
msgstr "Nome del file"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Ottenere il file"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Ottenere il codice sorgente su <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">le dépôt officiel</a> ou sur son <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">miroir Github</a>."
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Ottenere il codice sorgente su <a href=\"https://framagit.org/luc/lufi\" "
|
||||
"class=\"classic\">le dépôt officiel</a> ou sur son <a href=\"https://"
|
||||
"github.com/ldidry/lufi\" class=\"classic\">miroir Github</a>."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Buongiorno,\\n\\necco qualche file che vorrei condividere con te:\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Ecco qualche file"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Premere Enter, poi Ctrl+C per copiare tutti i link di download"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Premere Enter, poi Ctrl+C per copiare il link di download"
|
||||
|
||||
|
@ -230,17 +285,22 @@ msgstr "Come segnalare un file illegale?"
|
|||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "Se sceglieste una scadenza, il file sarebbe cancellato dopo tale scadenza."
|
||||
msgstr ""
|
||||
"Se sceglieste una scadenza, il file sarebbe cancellato dopo tale scadenza."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Se inviaste l'email da questo server, i link sarebbero inviati al server, e questo potrebbe diminuire la protezione della riservatezza."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Se inviaste l'email da questo server, i link sarebbero inviati al server, e "
|
||||
"questo potrebbe diminuire la protezione della riservatezza."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importare i dati del localStorage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Importante : più informazioni sulle scadenze"
|
||||
|
||||
|
@ -248,19 +308,24 @@ msgstr "Importante : più informazioni sulle scadenze"
|
|||
msgid "Information about delays"
|
||||
msgstr "Informazione sulle scadenze"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Sembra che la chiave nel tuo URL sia errata. Controllare il tuo URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript è disattivato. Lufi non può funzionare."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Login"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Logout"
|
||||
|
||||
|
@ -272,24 +337,31 @@ msgstr "Lufi è un software libero di file hosting."
|
|||
msgid "Mail"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "I miei file"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "Spazio disco insufficiente sul server per questo file (dimensione: %1)."
|
||||
msgstr ""
|
||||
"Spazio disco insufficiente sul server per questo file (dimensione: %1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Nessun ritardo per la scadenza"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Solo i file inviati con questo browser web sono nella lista. Le informazioni sono memorizzate nel localStorage: se cancellaste i dati dal vostro localStorage, perdereste questa lista."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Solo i file inviati con questo browser web sono nella lista. Le informazioni "
|
||||
"sono memorizzate nel localStorage: se cancellaste i dati dal vostro "
|
||||
"localStorage, perdereste questa lista."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
|
@ -299,11 +371,17 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Contattare l'amministratore : %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Attendere mentre otteniamo il vostro file. Dobbiamo prima scaricare e decifrare tutte le parti prima che possiate averlo."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Attendere mentre otteniamo il vostro file. Dobbiamo prima scaricare e "
|
||||
"decifrare tutte le parti prima che possiate averlo."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
|
@ -314,124 +392,162 @@ msgstr "Riservatezza"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Eliminare dal localStorage i file scaduti"
|
||||
|
||||
#:
|
||||
msgid "Rows in purple mean that the files have expired and are no longer available."
|
||||
msgstr "Le righe in viola indicano che il file è scaduto e non è più disponibile."
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Inviare tutti i link tramite email"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Inviare tramite questo server"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Inviare tramite il vostro programma di posta"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr "Invio della parte XX1 su XX2. Prego attendere, la barra di avanzamento può impiegare del tempo prima di colorarsi."
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Invio della parte XX1 su XX2. Prego attendere, la barra di avanzamento può "
|
||||
"impiegare del tempo prima di colorarsi."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Condividi tutti i file in totale riservatezza su %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Autenticazione"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "L'invio del file è attualemente disattivato. Riprovare più tardi."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "L'invio del file è attualemente disattivato."
|
||||
|
||||
#:
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc)."
|
||||
msgstr "L'amministratore pu vedere solo il nome del file, la sua dimensione e il suo mimetype (video, testo, etc)."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "I dati sono stati importati correttamente."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Il corpo dell'email non può essere vuoto."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Il soggetto dell'email non può essere vuoto."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Il file è già stato cancellato"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "I file inviati su un istanza di Lufi sono cifrati prima dell'invio al server: l'amministratore del server non può vedere il contenuto dei vostri file."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"I file inviati su un istanza di Lufi sono cifrati prima dell'invio al server:"
|
||||
" l'amministratore del server non può vedere il contenuto dei vostri file."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "I seguenti indirizzi email non sono validi: %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "I link sono stati copiati negli appunti"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Email inviata."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "L'autore ( e per ora l'unico) è <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. Se aveste voglia di aiutarlo, potreste farlo tramite <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"L'autore ( e per ora l'unico) è <a href=\"https://fiat-tux.fr\" class="
|
||||
"\"classic\">Luc Didry</a>. Se aveste voglia di aiutarlo, potreste farlo "
|
||||
"tramite <a href=\"https://www.tipeee.com/fiat-tux\" class="
|
||||
"\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/sky/\" class="
|
||||
"\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "Il server non è stato in grado di trovare il file record a cui aggiungere la vostra porzione di file. Prego contattare l'amministratore."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Il server non è stato in grado di trovare il file record a cui aggiungere la "
|
||||
"vostra porzione di file. Prego contattare l'amministratore."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "Questo server pone delle limitazioni in base alla dimensione del file.La data di scadenza del tuo file sarà la minore tra quella scelta e queste limitazioni:"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Questo server pone delle limitazioni in base alla dimensione del file.La "
|
||||
"data di scadenza del tuo file sarà la minore tra quella scelta e queste "
|
||||
"limitazioni:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Impossibile copiare i link negli appunti"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "Impossibile recuperare il contatore per %1. Il file non esiste. Il file sarà eliminato dal tuo localStorage."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Impossibile recuperare il contatore per %1. Il file non esiste. Il file sarà "
|
||||
"eliminato dal tuo localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Impossibile recuperare il contatore per %1. Il token non è valido."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "Impossibile recuperare il contatore per %1. Non sei autenticato."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Invio dei file"
|
||||
|
||||
|
@ -439,11 +555,11 @@ msgstr "Invio dei file"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Invio il"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "File inviati"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Errore di comunicazione WebSocket"
|
||||
|
||||
|
@ -456,39 +572,71 @@ msgid "Who wrote this software?"
|
|||
msgstr "Chi ha scritto questo software?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Puoi consultare la lista dei vostri file cliccando sul link « I miei file » in alto a destra in questa pagina."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Puoi consultare la lista dei vostri file cliccando sul link « I miei file » "
|
||||
"in alto a destra in questa pagina."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "Non hai bisogno di registrarti per inviare i file ma devi essere consapevole che, per motivi legali, il tuo indirizzo IP sarà registrato quando invierai un file. Non ti preoccupare, avviene in tutti i siti su cui invii dei file."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Non hai bisogno di registrarti per inviare i file ma devi essere consapevole "
|
||||
"che, per motivi legali, il tuo indirizzo IP sarà registrato quando invierai "
|
||||
"un file. Non ti preoccupare, avviene in tutti i siti su cui invii dei file."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "Sembra che non ci sia una chiave nel tuo URL. Non sarai in grado di decifrare il file. Download annullato."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Sembra che non ci sia una chiave nel tuo URL. Non sarai in grado di "
|
||||
"decifrare il file. Download annullato."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr "Hai cercato di uscire da questa pagina. Il download sarà cancellato. Sei sicuro?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Hai cercato di uscire da questa pagina. Il download sarà cancellato. Sei "
|
||||
"sicuro?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr "Hai cercato di uscire da questa pagina. L'invio sarà cancellato. Sei sicuro?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Hai cercato di uscire da questa pagina. L'invio sarà cancellato. Sei sicuro?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Logout avvenuto con successo."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Devi fornire gli indirizzi email."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "Il vostro file è troppo grande : %1 (la dimensione massima permessa è %2)"
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
"Il vostro file è troppo grande : %1 (la dimensione massima permessa è %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
|
||||
|
@ -502,7 +650,7 @@ msgstr "tra %1 e %2, il file sarà conservato %3 giorno(i);"
|
|||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "tra %1 e %2, il file sarà conservato per sempre;"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "scadenza: "
|
||||
|
||||
|
@ -520,6 +668,6 @@ msgstr "per %1 e più, il file sarà conservato per sempre."
|
|||
msgid "no time limit"
|
||||
msgstr "nessuna limitazione temporale"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "o"
|
||||
|
|
|
@ -0,0 +1,551 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:49 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid "Adding URLs not related to this Lufi instance to the mail body or subject is prohibited."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:18
|
||||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:31
|
||||
msgid "Expires at"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:12
|
||||
msgid "Export localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:26
|
||||
msgid "File name"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "How to report an illegal file?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:5
|
||||
msgid "Information about delays"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:42 themes/default/templates/layouts/default.html.ep:69 themes/default/templates/layouts/default.html.ep:71
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:54 themes/default/templates/layouts/default.html.ep:80
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:63
|
||||
msgid "My files"
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid "Please, check your credentials or your right to access this service: unable to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:13
|
||||
msgid "Purge expired files from localStorage"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:60
|
||||
msgid "Report file"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr ""
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:65 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid "The body of the mail must contain at least one URL pointing to a file hosted on this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid "This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "Upload files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:30
|
||||
msgid "Uploaded at"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lufi?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid "Your browser has not enough entropy to generate a strong encryption key. Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:26
|
||||
msgid "for %1 and more, the file will be kept %2 day(s)"
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr ""
|
|
@ -1,49 +1,85 @@
|
|||
# Lufi Dutch translation.
|
||||
# Copyright (C) 2015 Luc Didry
|
||||
# This file is distributed under the same license as the LUFI package.
|
||||
# Ilker Kulgu <i.kulgu@gmail.com>, 2017.
|
||||
#
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:56+0000\n"
|
||||
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 dagen"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 jaar"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 uur"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr ":"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Een bedankt foto met een katje op <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> of <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is ook goed ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Een bedankt foto met een katje op <a href=\"https://framasphere.org/people/"
|
||||
"b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> of <a "
|
||||
"href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is "
|
||||
"ook goed ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Annuleren"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "Over"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Aangezien Lufi een gratis software id die gelicentieerd staat onder de voorwaarden van <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, kan je het installeren op je eigen server. Bekijk <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> voor de procedure."
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Aangezien Lufi een gratis software id die gelicentieerd staat onder de "
|
||||
"voorwaarden van <a href=\"https://gnu.org/licenses/agpl.html\" class="
|
||||
"\"classic\">AGPLv3</a>, kan je het installeren op je eigen server. Bekijk <a "
|
||||
"href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> "
|
||||
"voor de procedure."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Deel XX1 van %1 wordt opgehaald"
|
||||
|
||||
|
@ -51,15 +87,19 @@ msgstr "Deel XX1 van %1 wordt opgehaald"
|
|||
msgid "Back to homepage"
|
||||
msgstr "Terug naar home"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Verkeerde CSRF token!"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Klik hier om de pagina te verversen en opnieuw te downloaden."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Klik voor bestandbrowser"
|
||||
|
||||
|
@ -67,27 +107,27 @@ msgstr "Klik voor bestandbrowser"
|
|||
msgid "Close"
|
||||
msgstr "Sluiten"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Komma gescheiden email adressen"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Kopieer alle links naar klembord"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Kopieer naar klembord"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Kan het bestand niet verwijderen. Je bent niet geautoriseerd."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "Kan het bestand niet vinden. Klopt de URL en token wel?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Kan het bestand niet vinden. Klopt de URL?"
|
||||
|
||||
|
@ -95,7 +135,7 @@ msgstr "Kan het bestand niet vinden. Klopt de URL?"
|
|||
msgid "Counter"
|
||||
msgstr "Teller"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Verwijder na eerste download?"
|
||||
|
||||
|
@ -103,63 +143,77 @@ msgstr "Verwijder na eerste download?"
|
|||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Verwijderingslink"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "Geen zorgen: als een gebruiker de download start voor de vervaldatum, dan zal die het bestand kunnen binnenhalen."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Geen zorgen: als een gebruiker de download start voor de vervaldatum, dan "
|
||||
"zal die het bestand kunnen binnenhalen."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Download"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Download geannuleerd."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Download link"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Drag and drop bestanden in de daarvoor bestemde locatie of gebruik de traditionele weg om bestanden encrypted op te sturen naar server. Je zal 2 linkjes per bestand krijgen: een download link, die stuur je naar personen waarmee je het bestand wilt delen en een verwijderings link, waarmee je het bestand kan verwijderen wanneer je dat wilt."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Drag and drop bestanden in de daarvoor bestemde locatie of gebruik de "
|
||||
"traditionele weg om bestanden encrypted op te sturen naar server. Je zal 2 "
|
||||
"linkjes per bestand krijgen: een download link, die stuur je naar personen "
|
||||
"waarmee je het bestand wilt delen en een verwijderings link, waarmee je het "
|
||||
"bestand kan verwijderen wanneer je dat wilt."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Sleep bestand(en) naar dit venster"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Email inhoud"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Onderwerp"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "Emails"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Encrypten deel XX1 van XX2 "
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Fout: het bestand bestond wel maar is verwijderd."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Fout: het bestand is niet volledig opgestuurd."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Fout: kan het bestand niet vinden. Is de URL juist?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Vervaldatum:"
|
||||
|
||||
|
@ -171,7 +225,7 @@ msgstr "Vervalt op"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Exporteer opgeslagen data"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Bestand verwijderd"
|
||||
|
||||
|
@ -179,27 +233,37 @@ msgstr "Bestand verwijderd"
|
|||
msgid "File name"
|
||||
msgstr "Bestandsnaam"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Download bestand"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Krijg de broncode op <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">de officiële repository</a> of op <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Krijg de broncode op <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">de officiële repository</a> of op <a href=\"https://github.com/"
|
||||
"ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Hallo,\\n\\nHier zijn enkele bestanden die ik met je wil delen:\\n\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Hier zijn enkele bestanden"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Druk Enter, vervolgens CTRL+C om alle download links te kopieeren"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Druk Enter, vervolgens CTRL+C om de download link te kopieeren"
|
||||
|
||||
|
@ -217,17 +281,23 @@ msgstr "Hoe rapporteer ik een verdachte bestand?"
|
|||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "Als je een uitstel kiest, zal het bestand na die uitstel tijd verwijderd worden."
|
||||
msgstr ""
|
||||
"Als je een uitstel kiest, zal het bestand na die uitstel tijd verwijderd "
|
||||
"worden."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Als je een mail via de server verstuurt, zullen links naar de server verstuurd worden waardoor je lagere privacy protection zal hebben."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Als je een mail via de server verstuurt, zullen links naar de server "
|
||||
"verstuurd worden waardoor je lagere privacy protection zal hebben."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importeer opgeslagen data"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Belangrijk: meer informatie over uitstel"
|
||||
|
||||
|
@ -235,19 +305,25 @@ msgstr "Belangrijk: meer informatie over uitstel"
|
|||
msgid "Information about delays"
|
||||
msgstr "Informatie over uitstel"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Het lijkt er op dat de sleutel in je URL niet klopt. Controleer je URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Het lijkt er op dat de sleutel in je URL niet klopt. Controleer je URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript is uitgeschakeld. Je kan geen gebruik maken van Lufi."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Login"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Logout"
|
||||
|
||||
|
@ -259,24 +335,30 @@ msgstr "Lufi is een gratis bestand hosting software."
|
|||
msgid "Mail"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Mijn bestanden"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "Geen genoeg ruimte op de server voor deze bestand (grootte: %1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Geen verloop uitstel"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Alleen bestanden die via deze browser zijn verstuurd zijn hier zichtbaar. Deze lijst is opgeslagen: als je opgeslagen data verwijderd, zal je deze lijst verlizen."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Alleen bestanden die via deze browser zijn verstuurd zijn hier zichtbaar. "
|
||||
"Deze lijst is opgeslagen: als je opgeslagen data verwijderd, zal je deze "
|
||||
"lijst verlizen."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Wachtwoord"
|
||||
|
||||
|
@ -286,11 +368,17 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Neem contact op met administrator: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Een ogenblik geduld, we pakken je bestand er bij. We moeten alle delen downloaden en decrypten voordat je het kan downloaden."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Een ogenblik geduld, we pakken je bestand er bij. We moeten alle delen "
|
||||
"downloaden en decrypten voordat je het kan downloaden."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
|
@ -301,120 +389,162 @@ msgstr "Privacy"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Verwijder verlopen data"
|
||||
|
||||
#:
|
||||
msgid "Register"
|
||||
msgstr "Registreer"
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "Rode rijen betekenen dat deze bestanden verlopen en verwijderd zijn."
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Verstuur alle links via mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Verstuur via deze server"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Verstuur via eigen mail software"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr "Versturen deel XX1 van XX2. Een ogenblik geduld..."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Deel je bestanden met volledige privacy op %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Inloggen"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "Sorry, uploaden is momenteel uitgeschakeld. Probeer het later nogmaals."
|
||||
msgstr ""
|
||||
"Sorry, uploaden is momenteel uitgeschakeld. Probeer het later nogmaals."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "SOrry, uploaden is uitgeschakeld."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgstr "Beheerders zien alleen bestandsnamen, grootte en mimetype (wat voor soort bestand het is: video, tekst etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"Beheerders zien alleen bestandsnamen, grootte en mimetype (wat voor soort "
|
||||
"bestand het is: video, tekst etc.)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "Data is succesvol geimporteerd."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Mail inhoud kan niet leeg zijn."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Onderwerp kan niet leeg zijn."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Bestand is reeds verwijderd"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "Bestanden die geupload zijn naar Lufi worden voor de upload versleuteld: beheerders van de server kunnen de inhoud van het bestand niet zien."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Bestanden die geupload zijn naar Lufi worden voor de upload versleuteld: "
|
||||
"beheerders van de server kunnen de inhoud van het bestand niet zien."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Volgende email adressen zijn niet geldig: %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "De link is gekopieerd naar je klembord"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Email is verzonden."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "De oorspronkelijke auteur is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. Als je hem wilt ondersteunen, dan kan dat via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> of via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"De oorspronkelijke auteur is <a href=\"https://fiat-tux.fr\" class="
|
||||
"\"classic\">Luc Didry</a>. Als je hem wilt ondersteunen, dan kan dat via <a "
|
||||
"href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> of via "
|
||||
"<a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "Server kon een deel van het bestand niet vinden. Neem contact op met beheerder."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Server kon een deel van het bestand niet vinden. Neem contact op met "
|
||||
"beheerder."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "Deze server stelt beperkingen vast volgens de bestandsgrootte. De vervaldatum van uw bestand zal het minimum zijn tussen wat u kiest en de volgende beperkingen:"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Deze server stelt beperkingen vast volgens de bestandsgrootte. De "
|
||||
"vervaldatum van uw bestand zal het minimum zijn tussen wat u kiest en de "
|
||||
"volgende beperkingen:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Kan de link(s) niet naar je klembord kopieeren"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "Kan geen teller verkrijgen voor %1. Bestand bestaat niet. Het zal verwijderd worden van opgeslagen data."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Kan geen teller verkrijgen voor %1. Bestand bestaat niet. Het zal verwijderd "
|
||||
"worden van opgeslagen data."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Kan geen teller verkrijgen voor %1. De token is ongeldig."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "Kan geen teller verkrijgen voor %1. Je bent niet geauthenticeerd."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Upload bestanden"
|
||||
|
||||
|
@ -422,11 +552,11 @@ msgstr "Upload bestanden"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Geupload op"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Geuploade bestanden"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Websocket communicatie fout"
|
||||
|
||||
|
@ -439,85 +569,84 @@ msgid "Who wrote this software?"
|
|||
msgstr "Wie heeft deze software geschreven?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Je kan een lijst van je eigen bestanden zien door op \"Mijn bestanden\" link rechts boven te klikken."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Je kan een lijst van je eigen bestanden zien door op \"Mijn bestanden\" link "
|
||||
"rechts boven te klikken."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "U hoeft zich niet te registreren om bestanden te uploaden, maar wees ervan bewust dat uw IP-adres om juridische redenen zal worden opgeslagen wanneer u een bestand verzendt. Geen paniek, dit is normaal gesproken het geval voor alle sites waarnaar u bestanden verzendt."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"U hoeft zich niet te registreren om bestanden te uploaden, maar wees ervan "
|
||||
"bewust dat uw IP-adres om juridische redenen zal worden opgeslagen wanneer u "
|
||||
"een bestand verzendt. Geen paniek, dit is normaal gesproken het geval voor "
|
||||
"alle sites waarnaar u bestanden verzendt."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "Je hebt geen sleutel in je URL. Je kan het bestand niet decrypten. Download geannuleerd."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Je hebt geen sleutel in je URL. Je kan het bestand niet decrypten. Download "
|
||||
"geannuleerd."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr "Je verlaat deze pagina. Download zal geannuleerd worden. Weet je het zeker?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Je verlaat deze pagina. Download zal geannuleerd worden. Weet je het zeker?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr "Je verlaat deze pagina. Upload zal geannuleerd worden. Weet je het zeker? "
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Je verlaat deze pagina. Upload zal geannuleerd worden. Weet je het zeker? "
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Je bent succesvol uitgelogd."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Je moet een mail adres opgeven."
|
||||
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "Je bestand is te groot: %1 (max: %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
|
||||
#:
|
||||
msgid "__Content-Transfer-Encoding"
|
||||
msgstr "8bit"
|
||||
|
||||
#:
|
||||
msgid "__Content-Type"
|
||||
msgstr "text/plain; charset=utf8"
|
||||
|
||||
#:
|
||||
msgid "__Language-Team"
|
||||
msgstr "LANGUAGE <LL@li.org>"
|
||||
|
||||
#:
|
||||
msgid "__Last-Translator"
|
||||
msgstr "FULL NAME <EMAIL@ADDRESS>"
|
||||
|
||||
#:
|
||||
msgid "__MIME-Version"
|
||||
msgstr "1.0"
|
||||
|
||||
#:
|
||||
msgid "__PO-Revision-Date"
|
||||
msgstr "YEAR-MO-DA HO:MI+ZONE"
|
||||
|
||||
#:
|
||||
msgid "__POT-Creation-Date"
|
||||
msgstr "YEAR-MO-DA HO:MI+ZONE"
|
||||
|
||||
#:
|
||||
msgid "__Project-Id-Version"
|
||||
msgstr "PACKAGE VERSION"
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
msgid "between %1 and %2, the file will be kept %3 day(s)."
|
||||
msgstr "tussen %1 en %1, bestand zal bewaard worden voor %3 dag(en)."
|
||||
msgstr "tussen %1 en %2, bestand zal bewaard worden voor %3 dag(en)."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:22
|
||||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "tussen %1 en %2, bestand zal voor altijd bewaard worden."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "deadline: "
|
||||
|
||||
|
@ -535,6 +664,6 @@ msgstr "voor %1 en meer, bestand zal voor altijd bewaard worden."
|
|||
msgid "no time limit"
|
||||
msgstr "geen tijdslimiet"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "of"
|
||||
|
|
|
@ -3,104 +3,142 @@
|
|||
# This file is distributed under the same license as the Lufi package.
|
||||
# Luc Didry <luc@didry.org>, 2015.
|
||||
# Cédric VALMARY <cvalmary@yahoo.fr>, 2016.
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
# Quentí, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2016-11-09 09:09+0200\n"
|
||||
"Last-Translator: Cédric VALMARY <cvalmary@yahoo.fr>\n"
|
||||
"Language-Team: Tot en òc (totenoc.eu)\n"
|
||||
"Language: oc\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 06:34+0000\n"
|
||||
"Last-Translator: Quentí <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Tot en òc (totenoc.eu)\n"
|
||||
"Language: oc\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 jorns"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr "(talha max : XXX)"
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 an"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 oras"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr " :"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Un mercé amb una fotografia de caton sus <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> conven tanben ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Un mercé amb una fotografia de caton sus <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> o "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"conven tanben ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Anullar"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "A prepaus"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr "Apondre un senhal al(s) fichièr(s)"
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Ja que Lufi es un logicial liure somés als tèrmes de la licéncia <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, podètz l’installar sus vòstre pròpri servidor. Mercés de consultar lo <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> per veire la procedura."
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
"Ajustar d’URL pas ligadas a aquesta instància pel còr o subjècte d’un "
|
||||
"corrièl es defendut."
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Ja que Lufi es un logicial liure somés als tèrmes de la licéncia <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, podètz "
|
||||
"l’installar sus vòstre pròpri servidor. Mercés de consultar lo <a href="
|
||||
"\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> per "
|
||||
"veire la procedura."
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Demanda del tròç XX1 sus %1 del fichièr"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Back to homepage"
|
||||
msgstr "Retorn a la pagina d’acuèlh"
|
||||
msgstr "Tornar a la pagina d’acuèlh"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Marrit geton CSRF !"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Clicatz aquí per actualizar la pagina e tornar començar lo telecargament."
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr "Marrit geton CSRF."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr ""
|
||||
"Clicatz aquí per actualizar la pagina e tornar començar lo telecargament."
|
||||
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Clicatz per dobrir lo navigator de fichièr"
|
||||
msgstr "Clicatz per dobrir lo navigador de fichièr"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:38
|
||||
msgid "Close"
|
||||
msgstr "Tampar"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Adreças de corrièl separadas per de virgulas"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copiar totes los ligams al quicha-papièrs"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copiar al quicha-papièrs"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Impossible de suprimir lo fichièr. Sètz pas connectat-ada."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "Impossible de trobar lo fichièr. Sètz segur-a que l’URL e lo geton son bons ?"
|
||||
msgstr ""
|
||||
"Impossible de trobar lo fichièr. Sètz segur-a que l’URL e lo geton son "
|
||||
"bons ?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Impossible de trobar lo fichièr. Sètz segur-a que l’URL es bona ?"
|
||||
|
||||
|
@ -108,7 +146,7 @@ msgstr "Impossible de trobar lo fichièr. Sètz segur-a que l’URL es bona ?"
|
|||
msgid "Counter"
|
||||
msgstr "Comptador"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Suprimir aprèp lo primièr telecargament ?"
|
||||
|
||||
|
@ -116,63 +154,77 @@ msgstr "Suprimir aprèp lo primièr telecargament ?"
|
|||
msgid "Delete selected files"
|
||||
msgstr "Suprimir los fichièrs seleccionats"
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Ligam de supression"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "Vos copetz pas lo cap : se un utilizaire comença a telecargar lo fichièr abans son expiracion e que lo telecargament s’acaba aprèp l’expiracion, utilizaire poirà recuperar lo fichièr."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Vos copetz pas lo cap : se un utilizaire comença a telecargar lo fichièr "
|
||||
"abans son expiracion e que lo telecargament s’acaba aprèp l’expiracion, "
|
||||
"utilizaire poirà recuperar lo fichièr."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Telecargar"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Telecargament abandonat."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Ligam de telecargament"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Fasètz lisar de fichièrs dins la zòna prevista per aquò far o seleccionatz un fichièr de faiçon classica e los fichièrs seràn descopats a tròces, chifrats e mandats al servidor. Recuperaretz dos ligams per fichièr : un ligam de telecargament e un ligam per suprimir lo fichièr quand o volètz."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Fasètz lisar de fichièrs dins la zòna prevista per aquò far o seleccionatz "
|
||||
"un fichièr de faiçon classica e los fichièrs seràn descopats a tròces, "
|
||||
"chifrats e mandats al servidor. Recuperaretz dos ligams per fichièr : un "
|
||||
"ligam de telecargament e un ligam per suprimir lo fichièr quand o volètz."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr "Lisatz vòstres fichièrs aquí"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Còs del corrièl"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Subjècte del corrièl"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "Corrièl"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Chiframent del tròç XX1 sus XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Error : lo fichièr existissiá mas es estat suprimit"
|
||||
msgstr "Error : lo fichièr existissiá mas es estat suprimit"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Error : lo fichièr es pas estat mandat completament"
|
||||
msgstr "Error : lo fichièr es pas estat mandat completament"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Error : impossible de trobar lo fichièr. Sètz segur-a de l’URL ?"
|
||||
msgstr "Error : impossible de trobar lo fichièr. Sètz segur-a de l’URL ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Expiracion :"
|
||||
|
||||
|
@ -184,7 +236,7 @@ msgstr "Expira lo"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Exportar las donadas localStorage"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Fichièr suprimit"
|
||||
|
||||
|
@ -192,29 +244,42 @@ msgstr "Fichièr suprimit"
|
|||
msgid "File name"
|
||||
msgstr "Nom del fichièr"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr "Fichièr suprimit al primièr telecargament"
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Recuperar lo fichièr"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Recuperatz lo còdi font sul <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">depaus oficial</a> o sus son <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">miralh Github</a>."
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Recuperatz lo còdi font sul <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">depaus oficial</a> o sus son <a href=\"https://github.com/ldidry/"
|
||||
"lufi\" class=\"classic\">miralh Github</a>."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Bonjorn,\\n\\nVaquí qualques fichièrs que desiri partejar amb tu :\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Vaquí qualques fichièrs"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Picatz sus Entrada puèi fasètz Ctrl+C per copiar totes los ligams per telecargar"
|
||||
msgstr ""
|
||||
"Quichatz Entrada puèi fasètz Ctrl+C per copiar totes los ligams per "
|
||||
"telecargar"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Picatz sus Entrada puèi fasètz Ctrl+C per copiar lo ligam per telecargar"
|
||||
msgstr ""
|
||||
"Quichatz Entrada puèi fasètz Ctrl+C per copiar lo ligam per telecargar"
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "How does it work?"
|
||||
|
@ -230,17 +295,22 @@ msgstr "Cossí senhalar un fichièr illegal ?"
|
|||
|
||||
#: themes/default/templates/delays.html.ep:7
|
||||
msgid "If you choose a delay, the file will be deleted after that delay."
|
||||
msgstr "S’avètz causit un relambi, lo fichièr serà suprimit aprèp aqueste relambi."
|
||||
msgstr ""
|
||||
"S’avètz causit un relambi, lo fichièr serà suprimit aprèp aqueste relambi."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Se mandatz lo corrièl d’aqueste servidor, los ligams seràn mandat al servidor, aquò pòt demesir vòstra proteccion de la confidencialitat."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Se mandatz lo corrièl d’aqueste servidor, los ligams seràn mandat al "
|
||||
"servidor, aquò pòt demesir vòstra proteccion de la confidencialitat."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importar las donadas localStorage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Important : mai d’informacions suls relambis"
|
||||
|
||||
|
@ -248,19 +318,26 @@ msgstr "Important : mai d’informacions suls relambis"
|
|||
msgid "Information about delays"
|
||||
msgstr "Informacion suls relambis"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Sembla que la clau dins vòstra URL siá incorrècta. Mercés de verificar vòstra URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Sembla que la clau dins vòstra URL siá incorrècta. Mercés de verificar "
|
||||
"vòstra URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript es desactivat. Lufi foncionarà pas."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr "Lenga"
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Identificant"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Desconnexion"
|
||||
|
||||
|
@ -272,24 +349,32 @@ msgstr "Lufi es un logicial liure d’albèrgament de fichièrs."
|
|||
msgid "Mail"
|
||||
msgstr "Corrièl"
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Mos fichièrs"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "Espaci disc insufisent sul servidor per aqueste fichièr (talha del fichièr : \"%1)."
|
||||
msgstr ""
|
||||
"Espaci disc insufisent sul servidor per aqueste fichièr (talha del fichièr :"
|
||||
" \"%1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Pas cap de relambi d’expiracion"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Sols los fichièrs mandats amb aqueste navigador web son listats aicí. Las informacions son gardadas en localStorage : se suprimissètz vòstras donadas localStorage, perdretz aquelas informacions."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Sols los fichièrs mandats amb aqueste navigador web son listats aicí. Las "
|
||||
"informacions son gardadas en localStorage : se suprimissètz vòstras donadas "
|
||||
"localStorage, perdretz aquelas informacions."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Senhal"
|
||||
|
||||
|
@ -299,12 +384,21 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Mercés de contactar l’administrator : %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Mercés d’esperar pendent la recuperacion de vòstre fichièr. Nos cal d’en primièr recuperar e deschifrar totes los fragaments abans que poscatz o telecargar."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Mercés d’esperar pendent la recuperacion de vòstre fichièr. Nos cal d’en "
|
||||
"primièr recuperar e deschifrar totes los tròces abans que poscatz o "
|
||||
"telecargar."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
msgstr "Mercés de verificar vòstres identificants : impossible de vos autentificar."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
"Mercés de verificar vòstres identificants o vòstres dreches d’accès a "
|
||||
"aqueste servici : autentificacion impossibla."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "Privacy"
|
||||
|
@ -314,116 +408,173 @@ msgstr "Confidencialitat"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Suprimir del localStorage los fichièrs expirats"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "Las linhas en roge indican que lo fichièr a expirat e es pas mai disponible."
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr "Senhalar un fichièr"
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"Las linhas en roge indican que lo fichièr a expirat e es pas mai disponible."
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Mandar totes los ligams per corrièl"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Mandar amb aqueste servidor"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Mandar amb vòstre pròpri logicial de corrièl"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr "Mandadís del fragment XX1 sus XX2. Pacientatz, la barra de progression pòt metre de temps abans d’avançar."
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Mandadís del tròç XX1 sus XX2. Pacientatz, la barra de progression pòt metre "
|
||||
"de temps abans d’avançar."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Partejatz vòstres fichièrs en tota confidencialitat sus %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Connexion"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr "O planhèm collèga, sètz pas autorizat a utilizar aqueste servici. Contactatz vòstre administrator sistèma se pensatz que i a un problèma."
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "O planhèm, la foncion per mandar de fichièr es desactivada pel moment. Mercés de tornar ensajar mai tard."
|
||||
msgstr ""
|
||||
"O planhèm, la foncion per mandar de fichièr es desactivada pel moment. "
|
||||
"Mercés de tornar ensajar mai tard."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "O planhèm, la foncion per mandar de fichièr es desactivada."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgstr "L’administrator pòt pas que veire lo nom del fichièr, sa talha e son mimetype (Quina mena de fichièr es : vidèo, tèxte, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"L’administrator pòt pas que veire lo nom del fichièr, sa talha e son "
|
||||
"mimetype (Quina mena de fichièr es : vidèo, tèxte, etc.)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
"Lo còr del messatge deu conténer almens una URL menant a un fichièr albergat "
|
||||
"a aquesta instància."
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "Las donadas son ben estadas importadas."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "Lo contengut del corrièl pòt pas èsser void."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "Lo sujècte del corrièl pòt pas èsser void."
|
||||
msgstr "Lo subjècte del corrièl pòt pas èsser void."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "Lo fichièr es ja estat suprimit"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "Los fichièrs mandats amb una instància Lufi son chifrats abans la mandadís al servidor : l’administrator del servidor pòt pas veire lo contengut dels fichièrs."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Los fichièrs mandats amb una instància Lufi son chifrats abans la mandadís "
|
||||
"al servidor : l’administrator del servidor pòt pas veire lo contengut dels "
|
||||
"fichièrs."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Las adreças de corrièl seguentas son pas validas : %1"
|
||||
msgstr "Las adreças de corrièl seguentas son pas validas : %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "Lo(s) ligam(s) es/son estat(s) copiat(s) dins vòstre quicha-papièrs"
|
||||
msgstr "Lo(s) ligam(s) es/son estat(s) copiat(s) al quicha-papièrs"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "Lo corrièl es estat mandat."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "L’autor original (e pel moment, lo sol) es <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. S’avètz enveja de lo sostenir, podètz o far via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> o via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"L’autor original (e pel moment, lo sol) es <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. S’avètz enveja de lo sostenir, podètz o far "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"o via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "Lo servidor es pas estat capable de retrobar l’enregistrament del fichièr que li cal ajustar vòstre tròç de fichièr. Mercés de contactar l’administrator."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"Lo servidor es pas estat capable de retrobar l’enregistrament del fichièr "
|
||||
"que li cal ajustar vòstre tròç de fichièr. Mercés de contactar "
|
||||
"l’administrator."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
"Aqueste fichièr es estat desactivat pels administrators. Contactatz-los per "
|
||||
"saber perque."
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "Aqueste servidor impausa de limitacions segon la talha dels fichièrs. Lo relambi d’expiracion de vòstre fichièr serà lo minimum entre çò qu’avètz causit e los limits seguents :"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"Aqueste servidor impausa de limitacions segon la talha dels fichièrs. Lo "
|
||||
"relambi d’expiracion de vòstre fichièr serà lo minimum entre çò qu’avètz "
|
||||
"causit e los limits seguents :"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Impossible de copiar lo(s) ligams(s) dins vòstre quicha-papièrs"
|
||||
msgstr "Impossible de copiar lo(s) ligams(s) al quicha-papièrs"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "Impossible de recuperar lo comptador per %1. Lo fichièr existís pas. Serà levat de vòstre localStorage."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Impossible de recuperar lo comptador per %1. Lo fichièr existís pas. Serà "
|
||||
"levat de vòstre localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Impossible de recuperar lo comptador per %1. Lo geton es invalid."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "Impossible de recuperar lo comptador per %1. Sètz pas connectat·ada."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Mandar de fichièrs"
|
||||
|
||||
|
@ -431,11 +582,11 @@ msgstr "Mandar de fichièrs"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Mandat lo"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Fichièrs mandats"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Error de comunicacion WebSocket"
|
||||
|
||||
|
@ -448,41 +599,78 @@ msgid "Who wrote this software?"
|
|||
msgstr "Qual escriguèt aqueste logicial ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Podètz veire la lista de vòstres fichièrs en clicant sul ligam « Mos fichièrs » amont a man drecha d’aquesta pagina."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Podètz veire la lista de vòstres fichièrs en clicant sul ligam « Mos "
|
||||
"fichièrs » amont a man drecha d’aquesta pagina."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr "Podètz pas ajustar d’URL que son pas ligadas a aquesta instància."
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "Avètz pas besonh de vos enregistrar per mandar de fichièrs mas notatz que, per de rasons legalas, vòstra adreça IP serà enregistrada quand mandatz un fichièr. Paniquetz pas, es normalament lo cas per totes los sites ont mandatz de fichièrs."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Avètz pas besonh de vos enregistrar per mandar de fichièrs mas notatz que, "
|
||||
"per de rasons legalas, vòstra adreça IP serà enregistrada quand mandatz un "
|
||||
"fichièr. Paniquetz pas, es normalament lo cas per totes los sites ont "
|
||||
"mandatz de fichièrs."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "Sembla qu’avètz pas la bona clau dins l’URL. Poiretz pas deschifrar lo fichièr. Telecargament anullat."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Sembla qu’avètz pas la bona clau dins l’URL. Poiretz pas deschifrar lo "
|
||||
"fichièr. Telecargament anullat."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
msgstr "Ensajatz de partir de la pagina. Lo telecargament serà anullat. Sètz segur-a ?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr ""
|
||||
"Ensajatz de partir de la pagina. Lo telecargament serà anullat. Sètz segur-"
|
||||
"a ?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
msgstr "Ensajatz de partir de la pagina. Lo mandadís serà anullat. Sètz segur-a ?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr ""
|
||||
"Ensajatz de partir de la pagina. Lo mandadís serà anullat. Sètz segur-a ?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Sètz ben estat desconnectat."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Vos cal donar d’adreças."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "Vòstre fichièr es tròp voluminós : %1 (la talha maximum autorizada es %2)"
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
"Vòstre navigador a pas pro d’entropia per generar una clau de chiframent "
|
||||
"fòrta. Mercés d’esperar (es de bon far de realizar de causas a l’ordenador "
|
||||
"d’aquel temps)."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
"Vòstre fichièr es tròp voluminós : %1 (la talha maximum autorizada es %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr "Lo senhal es pas valid. Mercés d’actualizar la pagina e ensajar tornamai."
|
||||
msgstr ""
|
||||
"Lo senhal es pas valid. Mercés d’actualizar la pagina e ensajar tornamai."
|
||||
|
||||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:20
|
||||
|
@ -494,7 +682,7 @@ msgstr "entre %1 e %2, lo fichièr serà gardat %3 jorn(s) ;"
|
|||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "entre %1 e %2, lo fichièr serà gardat per totjorn. ;"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "darrièr relambi per telecargar :"
|
||||
|
||||
|
@ -512,6 +700,6 @@ msgstr "per %1 e mai, lo fichièr serà gardat per totjorn."
|
|||
msgid "no time limit"
|
||||
msgstr "Pas cap de relambi d’expiracion"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "o"
|
||||
|
|
|
@ -3,61 +3,88 @@
|
|||
# This file is distributed under the same license as the Lufi package.
|
||||
# Luc Didry <luc@didry.org>, 2015.
|
||||
# Jéssica Da Cunha <dacunhajessica@hotmail.com>, 2017.
|
||||
#
|
||||
# Luc Didry <luc@framasoft.org>, 2018. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: 2017-03-01 14:00+0100\n"
|
||||
"PO-Revision-Date: 2017-03-01 14:00+0100\n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2018-10-28 01:57+0000\n"
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Poedit 1.8.5\n"
|
||||
"Last-Translator: Jéssica Da Cunha <dacunhajessica@hotmail.com>\n"
|
||||
"X-Generator: Zanata 4.6.2\n"
|
||||
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Language: pt\n"
|
||||
|
||||
#. ($delay)
|
||||
#. (max_delay)
|
||||
#: themes/default/templates/index.html.ep:40 themes/default/templates/index.html.ep:49 themes/default/templates/index.html.ep:50
|
||||
#: themes/default/templates/index.html.ep:47 themes/default/templates/index.html.ep:56 themes/default/templates/index.html.ep:57
|
||||
msgid "%1 days"
|
||||
msgstr "%1 dias"
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:26
|
||||
msgid "(max size: XXX)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 ano"
|
||||
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:49
|
||||
#: themes/default/templates/index.html.ep:4 themes/default/templates/index.html.ep:56
|
||||
msgid "24 hours"
|
||||
msgstr "24 horas"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:83
|
||||
#: themes/default/templates/partial/mail.js.ep:40
|
||||
msgid ":"
|
||||
msgstr " :"
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "A thank you with a photo of kitten on <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> is cool too ;-)"
|
||||
msgstr "Um obrigado com a foto de um gatinho no <a href=\"https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> ou <a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> é também porreiro ;-)"
|
||||
msgid ""
|
||||
"A thank you with a photo of kitten on <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> or "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> "
|
||||
"is cool too ;-)"
|
||||
msgstr ""
|
||||
"Um obrigado com a foto de um gatinho no <a href=\"https://framasphere.org/"
|
||||
"people/b13eb6b0beac0131e7e32a0000053625\" class=\"classic\">Diaspora*</a> ou "
|
||||
"<a href=\"https://framapiaf.org/@framasky\" class=\"classic\">Mastodon</a> é "
|
||||
"também porreiro ;-)"
|
||||
|
||||
#: themes/default/templates/render.html.ep:42
|
||||
msgid "Abort"
|
||||
msgstr "Interromper"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:65 themes/default/templates/layouts/default.html.ep:77
|
||||
#: themes/default/templates/layouts/default.html.ep:48 themes/default/templates/layouts/default.html.ep:76
|
||||
msgid "About"
|
||||
msgstr "Sobre"
|
||||
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
#: themes/default/templates/index.html.ep:88
|
||||
msgid "Add a password to file(s)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "As Lufi is a free software licensed under of the terms of the <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can install it on you own server. Have a look on the <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr "Como Lufi é um programa livre sob os termos da licença <a href=\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, pode instalar-lo no seu prórpio servidor. Para saber mais clique aqui <a href=\"https://framagit.org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> para ver o procedimento."
|
||||
#: themes/default/templates/mail.html.ep:16
|
||||
msgid ""
|
||||
"Adding URLs not related to this Lufi instance to the mail body or subject is "
|
||||
"prohibited."
|
||||
msgstr ""
|
||||
|
||||
#. (stash('f')
|
||||
#: themes/default/templates/render.html.ep:52
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid ""
|
||||
"As Lufi is a free software licensed under of the terms of the <a href="
|
||||
"\"https://gnu.org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, you can "
|
||||
"install it on you own server. Have a look on the <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> for the procedure."
|
||||
msgstr ""
|
||||
"Como Lufi é um programa livre sob os termos da licença <a href=\"https://gnu."
|
||||
"org/licenses/agpl.html\" class=\"classic\">AGPLv3</a>, pode instalar-lo no "
|
||||
"seu prórpio servidor. Para saber mais clique aqui <a href=\"https://framagit."
|
||||
"org/luc/lufi/wikis/home\" class=\"classic\">Wiki</a> para ver o procedimento."
|
||||
""
|
||||
|
||||
#. (stash('nbslices')
|
||||
#: themes/default/templates/partial/render.js.ep:9
|
||||
msgid "Asking for file part XX1 of %1"
|
||||
msgstr "Pedido de recuperação de um fragmento do ficheiro XX1 de %1"
|
||||
|
||||
|
@ -65,15 +92,19 @@ msgstr "Pedido de recuperação de um fragmento do ficheiro XX1 de %1"
|
|||
msgid "Back to homepage"
|
||||
msgstr "Voltar à página inicial"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:21
|
||||
#: lib/Lufi/Controller/Mail.pm:25
|
||||
msgid "Bad CSRF token!"
|
||||
msgstr "Símbolo errado CSRF !"
|
||||
|
||||
#: themes/default/templates/render.html.ep:48
|
||||
#: lib/Lufi/Controller/Auth.pm:22 lib/Lufi/Controller/Auth.pm:39
|
||||
msgid "Bad CSRF token."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:5
|
||||
msgid "Click here to refresh the page and restart the download."
|
||||
msgstr "Clique aqui para atualizar a página e começar o download."
|
||||
|
||||
#: themes/default/templates/index.html.ep:80
|
||||
#: themes/default/templates/index.html.ep:98
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Clique para abrir o navegador de ficheiros"
|
||||
|
||||
|
@ -81,35 +112,38 @@ msgstr "Clique para abrir o navegador de ficheiros"
|
|||
msgid "Close"
|
||||
msgstr "Fechar"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:22
|
||||
#: themes/default/templates/mail.html.ep:23
|
||||
msgid "Comma-separated email addresses"
|
||||
msgstr "Os e-mails devem ser separados por vírgulas"
|
||||
|
||||
#: themes/default/templates/index.html.ep:100
|
||||
#: themes/default/templates/partial/index.js.ep:14
|
||||
msgid "Copy all links to clipboard"
|
||||
msgstr "Copiar todos os links para a área de transferência"
|
||||
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
#: themes/default/templates/partial/index.js.ep:17
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copiar para a área de transferência"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:429
|
||||
#: lib/Lufi/Controller/Files.pm:460
|
||||
msgid "Could not delete the file. You are not authenticated."
|
||||
msgstr "Impossível apagar o ficheiro. Não está conectado."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:411
|
||||
#: lib/Lufi/Controller/Files.pm:442
|
||||
msgid "Could not find the file. Are you sure of the URL and the token?"
|
||||
msgstr "Impossível encontrar o ficheiro.Tem a certeza que o URL e os símbolos estão corretos?"
|
||||
msgstr ""
|
||||
"Impossível encontrar o ficheiro.Tem a certeza que o URL e os símbolos estão "
|
||||
"corretos?"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
#: lib/Lufi/Controller/Files.pm:353
|
||||
msgid "Could not find the file. Are you sure of the URL?"
|
||||
msgstr "Impossível encontar o ficheiro. Tem a certeza de que o URL está correto?"
|
||||
msgstr ""
|
||||
"Impossível encontar o ficheiro. Tem a certeza de que o URL está correto?"
|
||||
|
||||
#: themes/default/templates/files.html.ep:28
|
||||
msgid "Counter"
|
||||
msgstr "Contador"
|
||||
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:64
|
||||
#: themes/default/templates/files.html.ep:29 themes/default/templates/index.html.ep:81
|
||||
msgid "Delete at first download?"
|
||||
msgstr "Apagar após o primeiro download?"
|
||||
|
||||
|
@ -117,67 +151,77 @@ msgstr "Apagar após o primeiro download?"
|
|||
msgid "Delete selected files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/index.html.ep:104
|
||||
#: themes/default/templates/files.html.ep:32 themes/default/templates/partial/index.js.ep:18
|
||||
msgid "Deletion link"
|
||||
msgstr "Eliminar o link"
|
||||
|
||||
#: themes/default/templates/delays.html.ep:8
|
||||
msgid "Don't worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file."
|
||||
msgstr "Não se preocupe: se um utilizador começa a descarregar um ficheiro antes a sua expiração e que o descarregamento acaba após a sua expiração, o utilizador pode ainda assim recuperar o ficheiro."
|
||||
msgid ""
|
||||
"Don't worry: if a user begins to download the file before the expiration and "
|
||||
"the download ends after the expiration, he will be able to get the file."
|
||||
msgstr ""
|
||||
"Não se preocupe: se um utilizador começa a descarregar um ficheiro antes a "
|
||||
"sua expiração e que o descarregamento acaba após a sua expiração, o "
|
||||
"utilizador pode ainda assim recuperar o ficheiro."
|
||||
|
||||
#: themes/default/templates/index.html.ep:106 themes/default/templates/render.html.ep:28
|
||||
#: themes/default/templates/partial/index.js.ep:20 themes/default/templates/render.html.ep:28
|
||||
msgid "Download"
|
||||
msgstr "Download"
|
||||
|
||||
#: themes/default/templates/render.html.ep:47
|
||||
#: themes/default/templates/partial/render.js.ep:4
|
||||
msgid "Download aborted."
|
||||
msgstr "Download interrompido."
|
||||
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/index.html.ep:105
|
||||
#: themes/default/templates/files.html.ep:27 themes/default/templates/partial/index.js.ep:19
|
||||
msgid "Download link"
|
||||
msgstr "Link para o download"
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want."
|
||||
msgstr "Deslize os ficheiros na zona própria e esse efeito ou selecione um ficheiro de forma tradicional, e os ficheiros serão fragmentados, codificados e enviados ao servidor. Vai receber dois links por ficheiro: um é de download e o outro para poder apagar o ficheiro quando quiser."
|
||||
msgid ""
|
||||
"Drag and drop files in the appropriate area or use the traditional way to "
|
||||
"send files and the files will be chunked, encrypted and sent to the server. "
|
||||
"You will get two links per file: a download link, that you give to the "
|
||||
"people you want to share the file with and a deletion link, allowing you to "
|
||||
"delete the file whenever you want."
|
||||
msgstr ""
|
||||
"Deslize os ficheiros na zona própria e esse efeito ou selecione um ficheiro "
|
||||
"de forma tradicional, e os ficheiros serão fragmentados, codificados e "
|
||||
"enviados ao servidor. Vai receber dois links por ficheiro: um é de download "
|
||||
"e o outro para poder apagar o ficheiro quando quiser."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77
|
||||
#: themes/default/templates/index.html.ep:94
|
||||
msgid "Drop files here"
|
||||
msgstr ""
|
||||
|
||||
#:
|
||||
msgid "Drop files here (max. 4 Gb/file)"
|
||||
msgstr "Deslize os ficheiros aqui (max. 4 Gb/ficheiro)"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:38
|
||||
#: themes/default/templates/mail.html.ep:39
|
||||
msgid "Email body"
|
||||
msgstr "Conteúdo do e-mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:30
|
||||
#: themes/default/templates/mail.html.ep:31
|
||||
msgid "Email subject"
|
||||
msgstr "Assunto do e-mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:24 themes/default/templates/mail.html.ep:26
|
||||
#: themes/default/templates/mail.html.ep:25 themes/default/templates/mail.html.ep:27
|
||||
msgid "Emails"
|
||||
msgstr "E-mails"
|
||||
|
||||
#: themes/default/templates/index.html.ep:107
|
||||
#: themes/default/templates/partial/index.js.ep:21
|
||||
msgid "Encrypting part XX1 of XX2"
|
||||
msgstr "Codificação do fragmento XX1 de XX2"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:225
|
||||
#: lib/Lufi/Controller/Files.pm:242
|
||||
msgid "Error: the file existed but was deleted."
|
||||
msgstr "Erro: o ficheiro existia mas foi apagado."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:291
|
||||
#: lib/Lufi/Controller/Files.pm:322
|
||||
msgid "Error: the file has not been sent entirely."
|
||||
msgstr "Erro: o ficheiro não foi enviado na totalidade."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:301
|
||||
#: lib/Lufi/Controller/Files.pm:332
|
||||
msgid "Error: unable to find the file. Are you sure of your URL?"
|
||||
msgstr "Erro: impossível encontrar o ficheiro. Tem a certeza do URL?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:108
|
||||
#: themes/default/templates/partial/index.js.ep:22
|
||||
msgid "Expiration:"
|
||||
msgstr "Expiração:"
|
||||
|
||||
|
@ -189,7 +233,7 @@ msgstr "Expira no"
|
|||
msgid "Export localStorage data"
|
||||
msgstr "Exportar os dados localStorage"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:393
|
||||
#: lib/Lufi/Controller/Files.pm:424
|
||||
msgid "File deleted"
|
||||
msgstr "Ficheiro apagado"
|
||||
|
||||
|
@ -197,27 +241,39 @@ msgstr "Ficheiro apagado"
|
|||
msgid "File name"
|
||||
msgstr "Nome do ficheiro"
|
||||
|
||||
#: themes/default/templates/render.html.ep:51
|
||||
#: themes/default/templates/index.html.ep:71
|
||||
msgid "Files deleted at first download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/render.js.ep:8
|
||||
msgid "Get the file"
|
||||
msgstr "Recuperar o ficheiro"
|
||||
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Get the source code on <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">the official repository</a> or on its <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr "Recupere o código-fonte no <a href=\"https://framagit.org/luc/lufi\" class=\"classic\">o depósito oficial</a> ou então <a href=\"https://github.com/ldidry/lufi\" class=\"classic\">réplicas Github</a>."
|
||||
msgid ""
|
||||
"Get the source code on <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">the official repository</a> or on its <a href=\"https://github."
|
||||
"com/ldidry/lufi\" class=\"classic\">Github mirror</a>"
|
||||
msgstr ""
|
||||
"Recupere o código-fonte no <a href=\"https://framagit.org/luc/lufi\" class="
|
||||
"\"classic\">o depósito oficial</a> ou então <a href=\"https://github.com/"
|
||||
"ldidry/lufi\" class=\"classic\">réplicas Github</a>."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:78
|
||||
#: themes/default/templates/partial/mail.js.ep:35
|
||||
msgid "Hello,\\n\\nHere's some files I want to share with you:\\n"
|
||||
msgstr "Olá,\\n\\nAqui estão alguns ficheiros que gostaria de partilhar contigo:\\n"
|
||||
msgstr ""
|
||||
"Olá,\\n\\nAqui estão alguns ficheiros que gostaria de partilhar contigo:\\n"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:34
|
||||
#: themes/default/templates/mail.html.ep:35
|
||||
msgid "Here's some files"
|
||||
msgstr "Aqui estão alguns ficheiros"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110
|
||||
#: themes/default/templates/partial/index.js.ep:24
|
||||
msgid "Hit Enter, then Ctrl+C to copy all the download links"
|
||||
msgstr "Clique no Enter e depois Ctrl+C para copiar todos os links de download"
|
||||
msgstr ""
|
||||
"Clique no Enter e depois Ctrl+C para copiar todos os links de download"
|
||||
|
||||
#: themes/default/templates/index.html.ep:109
|
||||
#: themes/default/templates/partial/index.js.ep:23
|
||||
msgid "Hit Enter, then Ctrl+C to copy the download link"
|
||||
msgstr "Clique no Enter e depois Ctrl+C para copiar o link de download"
|
||||
|
||||
|
@ -225,10 +281,6 @@ msgstr "Clique no Enter e depois Ctrl+C para copiar o link de download"
|
|||
msgid "How does it work?"
|
||||
msgstr "Como funciona?"
|
||||
|
||||
#:
|
||||
msgid "How to install Lufi on my server?"
|
||||
msgstr "Como instalar Lufi no meu servidor?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "How to install the software on my server?"
|
||||
msgstr ""
|
||||
|
@ -242,14 +294,18 @@ msgid "If you choose a delay, the file will be deleted after that delay."
|
|||
msgstr "Se escolher um prazo, o ficheiro será apagado após esse prazo."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:15
|
||||
msgid "If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection."
|
||||
msgstr "Se enviar um e-mail a partir deste servidor, os links serão enviados ao servidor, o que poderá diminuir a proteção da confidencia."
|
||||
msgid ""
|
||||
"If you send the mail from this server, the links will be sent to the server, "
|
||||
"which may lower your privacy protection."
|
||||
msgstr ""
|
||||
"Se enviar um e-mail a partir deste servidor, os links serão enviados ao "
|
||||
"servidor, o que poderá diminuir a proteção da confidencia."
|
||||
|
||||
#: themes/default/templates/files.html.ep:14
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Importar os dados localStorage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
#: themes/default/templates/index.html.ep:44
|
||||
msgid "Important: more information on delays"
|
||||
msgstr "Importante: mais informações sobre os prazos"
|
||||
|
||||
|
@ -257,48 +313,63 @@ msgstr "Importante: mais informações sobre os prazos"
|
|||
msgid "Information about delays"
|
||||
msgstr "Informação sobre os prazos"
|
||||
|
||||
#: themes/default/templates/render.html.ep:49
|
||||
msgid "It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr "Parece que a chave do seu URL está incorreta.Por favor, verifique o seu URL."
|
||||
#: themes/default/templates/partial/render.js.ep:6
|
||||
msgid ""
|
||||
"It seems that the key in your URL is incorrect. Please, verify your URL."
|
||||
msgstr ""
|
||||
"Parece que a chave do seu URL está incorreta.Por favor, verifique o seu URL."
|
||||
|
||||
#: themes/default/templates/index.html.ep:12
|
||||
msgid "Javascript is disabled. You won't be able to use Lufi."
|
||||
msgstr "Javascript está desativado. Lufi não funcionará."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:40 themes/default/templates/layouts/default.html.ep:68
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:15
|
||||
msgid "Login"
|
||||
msgstr "Utilizador"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:67 themes/default/templates/layouts/default.html.ep:79
|
||||
#: themes/default/templates/layouts/default.html.ep:53 themes/default/templates/layouts/default.html.ep:78
|
||||
msgid "Logout"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lufi is a free (as in free speech) file hosting software."
|
||||
msgstr "Lufi é um programa de reserva gratuita (como na liberdade de expressão) de ficheiros."
|
||||
msgstr ""
|
||||
"Lufi é um programa de reserva gratuita (como na liberdade de expressão) de "
|
||||
"ficheiros."
|
||||
|
||||
#: themes/default/templates/files.html.ep:33
|
||||
msgid "Mail"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:61 themes/default/templates/layouts/default.html.ep:73
|
||||
#: themes/default/templates/files.html.ep:3 themes/default/templates/layouts/default.html.ep:34 themes/default/templates/layouts/default.html.ep:62
|
||||
msgid "My files"
|
||||
msgstr "Meus ficheiros"
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:69
|
||||
#: lib/Lufi/Controller/Files.pm:79
|
||||
msgid "No enough space available on the server for this file (size: %1)."
|
||||
msgstr "O servidor não tem espaço suficiente para este ficheiro (tamanho: %1)."
|
||||
msgstr ""
|
||||
"O servidor não tem espaço suficiente para este ficheiro (tamanho: %1)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:45 themes/default/templates/index.html.ep:112
|
||||
#: themes/default/templates/partial/files.js.ep:10 themes/default/templates/partial/index.js.ep:27
|
||||
msgid "No expiration delay"
|
||||
msgstr "Não tem prazo de expiração"
|
||||
|
||||
#: themes/default/templates/files.html.ep:8
|
||||
msgid "Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you'll lose this list."
|
||||
msgstr "Apenas os ficheiros enviados com este navegador web estão listados aqui. As informações são armazenadas no localStorage : se apagar os seus dados no LocalStorage, poedrá perder essa informação."
|
||||
msgid ""
|
||||
"Only the files sent with this browser will be listed here. This list is "
|
||||
"stored in localStorage: if you delete your localStorage data, you'll lose "
|
||||
"this list."
|
||||
msgstr ""
|
||||
"Apenas os ficheiros enviados com este navegador web estão listados aqui. As "
|
||||
"informações são armazenadas no localStorage : se apagar os seus dados no "
|
||||
"LocalStorage, poedrá perder essa informação."
|
||||
|
||||
#: themes/default/templates/index.html.ep:70 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
#: themes/default/templates/index.html.ep:87 themes/default/templates/login.html.ep:21 themes/default/templates/render.html.ep:26
|
||||
msgid "Password"
|
||||
msgstr "Palavra-passe"
|
||||
|
||||
|
@ -308,11 +379,18 @@ msgid "Please contact the administrator: %1"
|
|||
msgstr "Contacte o administrador: %1"
|
||||
|
||||
#: themes/default/templates/render.html.ep:33
|
||||
msgid "Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it."
|
||||
msgstr "Por favor aguarde durante a recuperação do seu ficheiro. Primeiro devemos recuperar e descodificar todos os fragmentos e depois poderá descarregar o ficheiro."
|
||||
msgid ""
|
||||
"Please wait while we are getting your file. We first need to download and "
|
||||
"decrypt all parts before you can get it."
|
||||
msgstr ""
|
||||
"Por favor aguarde durante a recuperação do seu ficheiro. Primeiro devemos "
|
||||
"recuperar e descodificar todos os fragmentos e depois poderá descarregar o "
|
||||
"ficheiro."
|
||||
|
||||
#: lib/Lufi.pm:191
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
#: lib/Lufi/Controller/Auth.pm:28
|
||||
msgid ""
|
||||
"Please, check your credentials or your right to access this service: unable "
|
||||
"to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
|
@ -323,116 +401,166 @@ msgstr "Privacidade"
|
|||
msgid "Purge expired files from localStorage"
|
||||
msgstr "Apagar do localStorage os ficheiros expirados"
|
||||
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid "Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr "As linhas a vermelho indicam que o ficheiro expirou e já não está disponível."
|
||||
#: themes/default/templates/layouts/default.html.ep:31 themes/default/templates/layouts/default.html.ep:59
|
||||
msgid "Report file"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:111
|
||||
#: themes/default/templates/files.html.ep:9
|
||||
msgid ""
|
||||
"Rows in red mean that the files have expired and are no longer available."
|
||||
msgstr ""
|
||||
"As linhas a vermelho indicam que o ficheiro expirou e já não está disponível."
|
||||
""
|
||||
|
||||
#: themes/default/templates/partial/index.js.ep:25
|
||||
msgid "Send all links by email"
|
||||
msgstr "Enviar todos os links por e-mail"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:45
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
msgid "Send with this server"
|
||||
msgstr "Enviar com este servidor"
|
||||
|
||||
#: themes/default/templates/mail.html.ep:46
|
||||
#: themes/default/templates/mail.html.ep:47
|
||||
msgid "Send with your own mail software"
|
||||
msgstr "Enviar com o seu e-mail pessoal"
|
||||
|
||||
#: themes/default/templates/index.html.ep:113
|
||||
msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||
msgstr "Envio do fragmento XX1 de XX2. Por favor aguarde, a barra de progressão pode levar algum tempo antes de avançar."
|
||||
#: themes/default/templates/partial/index.js.ep:28
|
||||
msgid ""
|
||||
"Sending part XX1 of XX2. Please, be patient, the progress bar can take a "
|
||||
"while to move."
|
||||
msgstr ""
|
||||
"Envio do fragmento XX1 de XX2. Por favor aguarde, a barra de progressão pode "
|
||||
"levar algum tempo antes de avançar."
|
||||
|
||||
#. (url_for('/')
|
||||
#: themes/default/templates/mail.html.ep:91
|
||||
#: themes/default/templates/partial/mail.js.ep:48
|
||||
msgid "Share your files in total privacy on %1"
|
||||
msgstr "Partilhe os seus ficheiros com toda a privacidade em %1"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:63 themes/default/templates/layouts/default.html.ep:75 themes/default/templates/login.html.ep:26 themes/default/templates/logout.html.ep:8
|
||||
#: themes/default/templates/layouts/default.html.ep:36 themes/default/templates/layouts/default.html.ep:64 themes/default/templates/login.html.ep:27 themes/default/templates/logout.html.ep:17
|
||||
msgid "Signin"
|
||||
msgstr "Conexão"
|
||||
|
||||
#: lib/Lufi.pm:194
|
||||
msgid "Sorry mate, you are not authorised to use that service. Contact your sysadmin if you think there's a glitch in the matrix."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:30
|
||||
#: themes/default/templates/index.html.ep:37
|
||||
msgid "Sorry, the uploading is currently disabled. Please try again later."
|
||||
msgstr "Desculpe, o envio do ficheiro está atualmente desativado. Tente mais tarde."
|
||||
msgstr ""
|
||||
"Desculpe, o envio do ficheiro está atualmente desativado. Tente mais tarde."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:43
|
||||
#: lib/Lufi/Controller/Files.pm:53
|
||||
msgid "Sorry, uploading is disabled."
|
||||
msgstr "Desculpe, o envio do ficheiro está desativado."
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "The administrator can only see the file's name, its size and its mimetype (what kind of file it is: video, text, etc.)."
|
||||
msgstr "O administrador pode apenas ver o nome do ficheiro, o seu tamanho e o tipo de mime (o tipo de ficheiro: texto, vídeo, etc.)."
|
||||
msgid ""
|
||||
"The administrator can only see the file's name, its size and its mimetype "
|
||||
"(what kind of file it is: video, text, etc.)."
|
||||
msgstr ""
|
||||
"O administrador pode apenas ver o nome do ficheiro, o seu tamanho e o tipo "
|
||||
"de mime (o tipo de ficheiro: texto, vídeo, etc.)."
|
||||
|
||||
#: themes/default/templates/files.html.ep:46
|
||||
#: lib/Lufi/Controller/Mail.pm:53
|
||||
msgid ""
|
||||
"The body of the mail must contain at least one URL pointing to a file hosted "
|
||||
"on this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/files.js.ep:11
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "Os dados foram importados com sucesso."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:43
|
||||
#: lib/Lufi/Controller/Mail.pm:73
|
||||
msgid "The email body can't be empty."
|
||||
msgstr "A mensagem do e-mail não pode estar vazia."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
#: lib/Lufi/Controller/Mail.pm:72
|
||||
msgid "The email subject can't be empty."
|
||||
msgstr "O assunto do e-mail não pode estar vazio."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:390
|
||||
#: lib/Lufi/Controller/Files.pm:421
|
||||
msgid "The file has already been deleted"
|
||||
msgstr "O ficheiro já foi apagado"
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file's content."
|
||||
msgstr "Os ficheiros enviados no Lufi são codificados antes de serem enviados ao servidor: o administrador do servidor não pode ver o conteúdo dos ficheiros."
|
||||
msgid ""
|
||||
"The files uploaded on a Lufi instance are encrypted before the upload to the "
|
||||
"server: the administrator of the server can not see the file's content."
|
||||
msgstr ""
|
||||
"Os ficheiros enviados no Lufi são codificados antes de serem enviados ao "
|
||||
"servidor: o administrador do servidor não pode ver o conteúdo dos ficheiros."
|
||||
|
||||
#. (join(', ', @bad)
|
||||
#: lib/Lufi/Controller/Mail.pm:38
|
||||
#: lib/Lufi/Controller/Mail.pm:68
|
||||
msgid "The following email addresses are not valid: %1"
|
||||
msgstr "Os e-mails seguintes não são válidos: %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101
|
||||
#: themes/default/templates/partial/index.js.ep:15
|
||||
msgid "The link(s) has been copied to your clipboard"
|
||||
msgstr "O(s) link(s) foi/foram copiados para a área de transferência"
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:66
|
||||
#: lib/Lufi/Controller/Mail.pm:97
|
||||
msgid "The mail has been sent."
|
||||
msgstr "O e-mail foi enviado."
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "The original (and only for now) author is <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. If you want to support him, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgstr "O autor original (e por agora, o único) é <a href=\"https://fiat-tux.fr\" class=\"classic\">Luc Didry</a>. Se o desejar apoiar pode fazer-lo via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> ou via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
msgid ""
|
||||
"The original (and only for now) author is <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. If you want to support him, you can do it "
|
||||
"via <a href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> "
|
||||
"or via <a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</"
|
||||
"a>."
|
||||
msgstr ""
|
||||
"O autor original (e por agora, o único) é <a href=\"https://fiat-tux.fr\" "
|
||||
"class=\"classic\">Luc Didry</a>. Se o desejar apoiar pode fazer-lo via <a "
|
||||
"href=\"https://www.tipeee.com/fiat-tux\" class=\"classic\">Tipeee</a> ou via "
|
||||
"<a href=\"https://liberapay.com/sky/\" class=\"classic\">Liberapay</a>."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:179
|
||||
msgid "The server was unable to find the file record to add your file part to. Please, contact the administrator."
|
||||
msgstr "O servidor foi incapaz de encontrar o registo do ficheiro no qual devia-se juntar o fragmento do seu ficheiro. Contacte o administrador."
|
||||
#: lib/Lufi/Controller/Files.pm:189
|
||||
msgid ""
|
||||
"The server was unable to find the file record to add your file part to. "
|
||||
"Please, contact the administrator."
|
||||
msgstr ""
|
||||
"O servidor foi incapaz de encontrar o registo do ficheiro no qual devia-se "
|
||||
"juntar o fragmento do seu ficheiro. Contacte o administrador."
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:248
|
||||
msgid ""
|
||||
"This file has been deactivated by the admins. Contact them to know why."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/delays.html.ep:10
|
||||
msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:"
|
||||
msgstr "O servidor exige limites segundo o tamanho dos ficheiros. O prazo de expiração dos seu ficheiro sera o minimo entre o que você escolheu e os limites seguintes:"
|
||||
msgid ""
|
||||
"This server sets limitations according to the file size. The expiration "
|
||||
"delay of your file will be the minimum between what you choose and the "
|
||||
"following limitations:"
|
||||
msgstr ""
|
||||
"O servidor exige limites segundo o tamanho dos ficheiros. O prazo de "
|
||||
"expiração dos seu ficheiro sera o minimo entre o que você escolheu e os "
|
||||
"limites seguintes:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:102
|
||||
#: themes/default/templates/partial/index.js.ep:16
|
||||
msgid "Unable to copy the link(s) to your clipboard"
|
||||
msgstr "Impossível copiar o(s) link(s) na sua área de transferência"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:361
|
||||
msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage."
|
||||
msgstr "Impossível recuperar o contador para %1. O ficheiro não existe. Isso vai apagar a sua localStorage."
|
||||
#: lib/Lufi/Controller/Files.pm:392
|
||||
msgid ""
|
||||
"Unable to get counter for %1. The file does not exists. It will be removed "
|
||||
"from your localStorage."
|
||||
msgstr ""
|
||||
"Impossível recuperar o contador para %1. O ficheiro não existe. Isso vai "
|
||||
"apagar a sua localStorage."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:351
|
||||
#: lib/Lufi/Controller/Files.pm:382
|
||||
msgid "Unable to get counter for %1. The token is invalid."
|
||||
msgstr "Impossível recuperar o contador para %1. O símbolo é inválido."
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lufi/Controller/Files.pm:371
|
||||
#: lib/Lufi/Controller/Files.pm:402
|
||||
msgid "Unable to get counter for %1. You are not authenticated."
|
||||
msgstr "Impossível recuperar o contador para %1. Não está conectado."
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:60 themes/default/templates/layouts/default.html.ep:72
|
||||
#: themes/default/templates/layouts/default.html.ep:33 themes/default/templates/layouts/default.html.ep:61
|
||||
msgid "Upload files"
|
||||
msgstr "Enviar os ficheiros"
|
||||
|
||||
|
@ -440,11 +568,11 @@ msgstr "Enviar os ficheiros"
|
|||
msgid "Uploaded at"
|
||||
msgstr "Enviar a"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85
|
||||
#: themes/default/templates/index.html.ep:103
|
||||
msgid "Uploaded files"
|
||||
msgstr "Ficheiros enviados"
|
||||
|
||||
#: themes/default/templates/index.html.ep:114
|
||||
#: themes/default/templates/partial/index.js.ep:29
|
||||
msgid "Websocket communication error"
|
||||
msgstr "Erro de comunicação com WebSocket"
|
||||
|
||||
|
@ -452,48 +580,73 @@ msgstr "Erro de comunicação com WebSocket"
|
|||
msgid "What is Lufi?"
|
||||
msgstr "O que é o Lufi?"
|
||||
|
||||
#:
|
||||
msgid "Who wrote Lufi?"
|
||||
msgstr "Quem escreveu Lufi?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "Who wrote this software?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "You can see the list of your files by clicking on the \"My files\" link at the top right of this page."
|
||||
msgstr "Pode ver a lista dos seus ficheiros clicando no link « Meus ficheiros » em cima da página à direita."
|
||||
msgid ""
|
||||
"You can see the list of your files by clicking on the \"My files\" link at "
|
||||
"the top right of this page."
|
||||
msgstr ""
|
||||
"Pode ver a lista dos seus ficheiros clicando no link « Meus ficheiros » em "
|
||||
"cima da página à direita."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:42
|
||||
msgid "You can't add URLs that are not related to this instance."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You don't need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don't panic, this is normally the case for all sites on which you send files."
|
||||
msgstr "Não precisa registar-se para enviar ficheiros mas saiba que, por razões legais, o seu endereço IP ficará registrado quando envia um ficheiro. Não entre em pânico, é algo comum a todos os sites onde envia ficheiros."
|
||||
msgid ""
|
||||
"You don't need to register yourself to upload files but be aware that, for "
|
||||
"legal reasons, your IP address will be stored when you send a file. Don't "
|
||||
"panic, this is normally the case for all sites on which you send files."
|
||||
msgstr ""
|
||||
"Não precisa registar-se para enviar ficheiros mas saiba que, por razões "
|
||||
"legais, o seu endereço IP ficará registrado quando envia um ficheiro. Não "
|
||||
"entre em pânico, é algo comum a todos os sites onde envia ficheiros."
|
||||
|
||||
#: themes/default/templates/render.html.ep:53
|
||||
msgid "You don't seem to have a key in your URL. You won't be able to decrypt the file. Download canceled."
|
||||
msgstr "Parece que não tem a chave no seu URL. Não poderá descodificar o ficheiro. Download anulado."
|
||||
#: themes/default/templates/partial/render.js.ep:10
|
||||
msgid ""
|
||||
"You don't seem to have a key in your URL. You won't be able to decrypt the "
|
||||
"file. Download canceled."
|
||||
msgstr ""
|
||||
"Parece que não tem a chave no seu URL. Não poderá descodificar o ficheiro. "
|
||||
"Download anulado."
|
||||
|
||||
#: themes/default/templates/render.html.ep:50
|
||||
msgid "You have attempted to leave this page. The download will be canceled. Are you sure?"
|
||||
#: themes/default/templates/partial/render.js.ep:7
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The download will be canceled. Are "
|
||||
"you sure?"
|
||||
msgstr "Está a tentar sair da página. O download será anulado. Tem a certeza?"
|
||||
|
||||
#: themes/default/templates/index.html.ep:99
|
||||
msgid "You have attempted to leave this page. The upload will be canceled. Are you sure?"
|
||||
#: themes/default/templates/partial/index.js.ep:13
|
||||
msgid ""
|
||||
"You have attempted to leave this page. The upload will be canceled. Are you "
|
||||
"sure?"
|
||||
msgstr "Está a tentar sair da página. O envio será anulado. Tem a certeza?"
|
||||
|
||||
#: themes/default/templates/logout.html.ep:5
|
||||
#: themes/default/templates/logout.html.ep:14
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr "Foi desconectado com sucesso."
|
||||
|
||||
#: lib/Lufi/Controller/Mail.pm:41
|
||||
#: lib/Lufi/Controller/Mail.pm:71
|
||||
msgid "You must give email addresses."
|
||||
msgstr "Deve escrever os e-mails."
|
||||
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:56
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr "O seu ficheiro é grande de mais: %1 (o tamanho máximo autorizado é de %2)"
|
||||
#: themes/default/templates/index.html.ep:29
|
||||
msgid ""
|
||||
"Your browser has not enough entropy to generate a strong encryption key. "
|
||||
"Please wait (it's better if you do things on your computer while waiting)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:273
|
||||
#. (format_bytes($json->{size})
|
||||
#: lib/Lufi/Controller/Files.pm:66
|
||||
msgid "Your file is too big: %1 (maximum size allowed: %2)"
|
||||
msgstr ""
|
||||
"O seu ficheiro é grande de mais: %1 (o tamanho máximo autorizado é de %2)"
|
||||
|
||||
#: lib/Lufi/Controller/Files.pm:304
|
||||
msgid "Your password is not valid. Please refresh the page to retry."
|
||||
msgstr ""
|
||||
|
||||
|
@ -507,7 +660,7 @@ msgstr "entre %1 e %2, o ficheiro será conservado %3 dia(s) ;"
|
|||
msgid "between %1 and %2, the file will be kept forever."
|
||||
msgstr "entre %1 e %2, o ficheiro será conservado por um tempo indeterminado."
|
||||
|
||||
#: themes/default/templates/mail.html.ep:85
|
||||
#: themes/default/templates/partial/mail.js.ep:42
|
||||
msgid "deadline: "
|
||||
msgstr "Data-limite: "
|
||||
|
||||
|
@ -519,12 +672,13 @@ msgstr "para %1 e mais, o ficheiro será conservado %2 dia(s)."
|
|||
#. (format_bytes($keys[$i])
|
||||
#: themes/default/templates/delays.html.ep:28
|
||||
msgid "for %1 and more, the file will be kept forever."
|
||||
msgstr "para %1 e mais, o ficheiro será conservado por um tempo indeterminado."
|
||||
msgstr ""
|
||||
"para %1 e mais, o ficheiro será conservado por um tempo indeterminado."
|
||||
|
||||
#: themes/default/templates/index.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "Não tem limite de expiração"
|
||||
|
||||
#: themes/default/templates/index.html.ep:78
|
||||
#: themes/default/templates/index.html.ep:96
|
||||
msgid "or"
|
||||
msgstr "ou"
|
||||
|
|
|
@ -102,3 +102,145 @@ a.classic:focus {
|
|||
.files-buttons a {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
#pb {
|
||||
width: 0;
|
||||
}
|
||||
.no_border {
|
||||
border: 0;
|
||||
}
|
||||
.like-label {
|
||||
color: #9e9e9e;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
.select-lang .select-wrapper span.caret {
|
||||
top: -10px;
|
||||
color: #FFF;
|
||||
}
|
||||
.select-lang .select-wrapper input.select-dropdown {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.select-lang-mobile .select-wrapper input.select-dropdown {
|
||||
color: #444;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.select-lang-mobile .select-wrapper span.caret {
|
||||
top: -10px;
|
||||
}
|
||||
.select-lang,
|
||||
.select-lang-mobile {
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
nav .btn-flat {
|
||||
color: #fff !important;
|
||||
text-transform: initial !important;
|
||||
}
|
||||
nav .btn-flat:focus {
|
||||
background-color: rgba(0,0,0,0.1) !important;
|
||||
}
|
||||
.white-background {
|
||||
background-color: #FFF;
|
||||
}
|
||||
.width-0 { width: 0%; }
|
||||
.width-1 { width: 1%; }
|
||||
.width-2 { width: 2%; }
|
||||
.width-3 { width: 3%; }
|
||||
.width-4 { width: 4%; }
|
||||
.width-5 { width: 5%; }
|
||||
.width-6 { width: 6%; }
|
||||
.width-7 { width: 7%; }
|
||||
.width-8 { width: 8%; }
|
||||
.width-9 { width: 9%; }
|
||||
.width-10 { width: 10%; }
|
||||
.width-11 { width: 11%; }
|
||||
.width-12 { width: 12%; }
|
||||
.width-13 { width: 13%; }
|
||||
.width-14 { width: 14%; }
|
||||
.width-15 { width: 15%; }
|
||||
.width-16 { width: 16%; }
|
||||
.width-17 { width: 17%; }
|
||||
.width-18 { width: 18%; }
|
||||
.width-19 { width: 19%; }
|
||||
.width-20 { width: 20%; }
|
||||
.width-21 { width: 21%; }
|
||||
.width-22 { width: 22%; }
|
||||
.width-23 { width: 23%; }
|
||||
.width-24 { width: 24%; }
|
||||
.width-25 { width: 25%; }
|
||||
.width-26 { width: 26%; }
|
||||
.width-27 { width: 27%; }
|
||||
.width-28 { width: 28%; }
|
||||
.width-29 { width: 29%; }
|
||||
.width-30 { width: 30%; }
|
||||
.width-31 { width: 31%; }
|
||||
.width-32 { width: 32%; }
|
||||
.width-33 { width: 33%; }
|
||||
.width-34 { width: 34%; }
|
||||
.width-35 { width: 35%; }
|
||||
.width-36 { width: 36%; }
|
||||
.width-37 { width: 37%; }
|
||||
.width-38 { width: 38%; }
|
||||
.width-39 { width: 39%; }
|
||||
.width-40 { width: 40%; }
|
||||
.width-41 { width: 41%; }
|
||||
.width-42 { width: 42%; }
|
||||
.width-43 { width: 43%; }
|
||||
.width-44 { width: 44%; }
|
||||
.width-45 { width: 45%; }
|
||||
.width-46 { width: 46%; }
|
||||
.width-47 { width: 47%; }
|
||||
.width-48 { width: 48%; }
|
||||
.width-49 { width: 49%; }
|
||||
.width-50 { width: 50%; }
|
||||
.width-51 { width: 51%; }
|
||||
.width-52 { width: 52%; }
|
||||
.width-53 { width: 53%; }
|
||||
.width-54 { width: 54%; }
|
||||
.width-55 { width: 55%; }
|
||||
.width-56 { width: 56%; }
|
||||
.width-57 { width: 57%; }
|
||||
.width-58 { width: 58%; }
|
||||
.width-59 { width: 59%; }
|
||||
.width-60 { width: 60%; }
|
||||
.width-61 { width: 61%; }
|
||||
.width-62 { width: 62%; }
|
||||
.width-63 { width: 63%; }
|
||||
.width-64 { width: 64%; }
|
||||
.width-65 { width: 65%; }
|
||||
.width-66 { width: 66%; }
|
||||
.width-67 { width: 67%; }
|
||||
.width-68 { width: 68%; }
|
||||
.width-69 { width: 69%; }
|
||||
.width-70 { width: 70%; }
|
||||
.width-71 { width: 71%; }
|
||||
.width-72 { width: 72%; }
|
||||
.width-73 { width: 73%; }
|
||||
.width-74 { width: 74%; }
|
||||
.width-75 { width: 75%; }
|
||||
.width-76 { width: 76%; }
|
||||
.width-77 { width: 77%; }
|
||||
.width-78 { width: 78%; }
|
||||
.width-79 { width: 79%; }
|
||||
.width-80 { width: 80%; }
|
||||
.width-81 { width: 81%; }
|
||||
.width-82 { width: 82%; }
|
||||
.width-83 { width: 83%; }
|
||||
.width-84 { width: 84%; }
|
||||
.width-85 { width: 85%; }
|
||||
.width-86 { width: 86%; }
|
||||
.width-87 { width: 87%; }
|
||||
.width-88 { width: 88%; }
|
||||
.width-89 { width: 89%; }
|
||||
.width-90 { width: 90%; }
|
||||
.width-91 { width: 91%; }
|
||||
.width-92 { width: 92%; }
|
||||
.width-93 { width: 93%; }
|
||||
.width-94 { width: 94%; }
|
||||
.width-95 { width: 95%; }
|
||||
.width-96 { width: 96%; }
|
||||
.width-97 { width: 97%; }
|
||||
.width-98 { width: 98%; }
|
||||
.width-99 { width: 99%; }
|
||||
.width-100 { width: 100%; }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* 2015 Jason Mulligan
|
||||
* @version 3.1.2
|
||||
* */
|
||||
"use strict";!function(a){var b=/b$/,c={bits:["B","kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","kB","MB","GB","TB","PB","EB","ZB","YB"]},d=function(a){var d=void 0===arguments[1]?{}:arguments[1],e=[],f=!1,g=0,h=void 0,i=void 0,j=void 0,k=void 0,l=void 0,m=void 0,n=void 0,o=void 0,p=void 0,q=void 0,r=void 0;if(isNaN(a))throw new Error("Invalid arguments");return j=d.bits===!0,p=d.unix===!0,i=void 0!==d.base?d.base:2,o=void 0!==d.round?d.round:p?1:2,q=void 0!==d.spacer?d.spacer:p?"":" ",r=void 0!==d.suffixes?d.suffixes:{},n=void 0!==d.output?d.output:"string",h=void 0!==d.exponent?d.exponent:-1,m=Number(a),l=0>m,k=i>2?1e3:1024,l&&(m=-m),0===m?(e[0]=0,e[1]=p?"":"B"):((-1===h||isNaN(h))&&(h=Math.floor(Math.log(m)/Math.log(k))),h>8&&(g=1e3*g*(h-8),h=8),g=2===i?m/Math.pow(2,10*h):m/Math.pow(1e3,h),j&&(g=8*g,g>k&&(g/=k,h++)),e[0]=Number(g.toFixed(h>0?o:0)),e[1]=c[j?"bits":"bytes"][h],!f&&p&&(j&&b.test(e[1])&&(e[1]=e[1].toLowerCase()),e[1]=e[1].charAt(0),"B"===e[1]?(e[0]=Math.floor(e[0]),e[1]=""):j||"k"!==e[1]||(e[1]="K"))),l&&(e[0]=-e[0]),e[1]=r[e[1]]||e[1],"array"===n?e:"exponent"===n?h:"object"===n?{value:e[0],suffix:e[1]}:e.join(q)};"undefined"!=typeof exports?module.exports=d:"function"==typeof define?define(function(){return d}):a.filesize=d}("undefined"!=typeof global?global:window);
|
||||
//# sourceMappingURL=filesize.min.js.map
|
||||
2018 Jason Mulligan <jason.mulligan@avoidwork.com>
|
||||
@version 3.6.1
|
||||
*/
|
||||
"use strict";!function(e){var i=/^(b|B)$/,t={iec:{bits:["b","Kib","Mib","Gib","Tib","Pib","Eib","Zib","Yib"],bytes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},jedec:{bits:["b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]}},o={iec:["","kibi","mebi","gibi","tebi","pebi","exbi","zebi","yobi"],jedec:["","kilo","mega","giga","tera","peta","exa","zetta","yotta"]};function b(e){var b,n,r,a,s,f,d,u,l,B,c,p,y,g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},m=[],v=0,x=void 0,h=void 0;if(isNaN(e))throw new Error("Invalid arguments");return n=!0===g.bits,l=!0===g.unix,b=g.base||2,u=void 0!==g.round?g.round:l?1:2,B=void 0!==g.separator&&g.separator||"",c=void 0!==g.spacer?g.spacer:l?"":" ",y=g.symbols||g.suffixes||{},p=2===b&&g.standard||"jedec",d=g.output||"string",a=!0===g.fullform,s=g.fullforms instanceof Array?g.fullforms:[],x=void 0!==g.exponent?g.exponent:-1,f=(h=Number(e))<0,r=b>2?1e3:1024,f&&(h=-h),(-1===x||isNaN(x))&&(x=Math.floor(Math.log(h)/Math.log(r)))<0&&(x=0),x>8&&(x=8),0===h?(m[0]=0,m[1]=l?"":t[p][n?"bits":"bytes"][x]):(v=h/(2===b?Math.pow(2,10*x):Math.pow(1e3,x)),n&&(v*=8)>=r&&x<8&&(v/=r,x++),m[0]=Number(v.toFixed(x>0?u:0)),m[1]=10===b&&1===x?n?"kb":"kB":t[p][n?"bits":"bytes"][x],l&&(m[1]="jedec"===p?m[1].charAt(0):x>0?m[1].replace(/B$/,""):m[1],i.test(m[1])&&(m[0]=Math.floor(m[0]),m[1]=""))),f&&(m[0]=-m[0]),m[1]=y[m[1]]||m[1],"array"===d?m:"exponent"===d?x:"object"===d?{value:m[0],suffix:m[1],symbol:m[1]}:(a&&(m[1]=s[x]?s[x]:o[p][x]+(n?"bit":"byte")+(1===m[0]?"":"s")),B.length>0&&(m[0]=m[0].toString().replace(".",B)),m.join(c))}b.partial=function(e){return function(i){return b(i,e)}},"undefined"!=typeof exports?module.exports=b:"function"==typeof define&&define.amd?define(function(){return b}):e.filesize=b}("undefined"!=typeof window?window:global);
|
||||
//# sourceMappingURL=filesize.min.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"sources":["filesize.js"],"names":["global","b","symbol","iec","bits","bytes","jedec","fullform","filesize","arg","base","ceil","full","fullforms","neg","output","round","unix","separator","spacer","standard","symbols","descriptor","arguments","length","undefined","result","val","e","num","isNaN","Error","suffixes","Array","exponent","Number","Math","floor","log","pow","toFixed","charAt","replace","test","value","suffix","toString","join","partial","opt","exports","module","define","amd","window"],"mappings":";;;;AAAA,cASA,SAAWA,GACV,IAAIC,EAAI,UACJC,GACHC,KACCC,MAAO,IAAK,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC7DC,OAAQ,IAAK,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAE/DC,OACCF,MAAO,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACtDC,OAAQ,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,QAGrDE,GACHJ,KAAM,GAAI,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAClEG,OAAQ,GAAI,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,QAAS,UAWrE,SAASE,EAASC,GACjB,IAKIC,EACAN,EACAO,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAlBAC,EAAaC,UAAUC,OAAS,QAAsBC,IAAjBF,UAAU,GAAmBA,UAAU,MAE5EG,KACAC,EAAM,EACNC,OAAI,EAOJC,OAAM,EASV,GAAIC,MAAMrB,GACT,MAAM,IAAIsB,MAAM,qBA4EjB,OAzEA3B,GAA2B,IAApBkB,EAAWlB,KAClBa,GAA2B,IAApBK,EAAWL,KAClBP,EAAOY,EAAWZ,MAAQ,EAC1BM,OAA6B,IAArBM,EAAWN,MAAmBM,EAAWN,MAAQC,EAAO,EAAI,EACpEC,OAAqC,IAAzBI,EAAWJ,WAAuBI,EAAWJ,WAAkB,GAC3EC,OAA+B,IAAtBG,EAAWH,OAAoBG,EAAWH,OAASF,EAAO,GAAK,IACxEI,EAAUC,EAAWD,SAAWC,EAAWU,aAC3CZ,EAAoB,IAATV,GAAaY,EAAWF,UAAsB,QACzDL,EAASO,EAAWP,QAAU,SAC9BH,GAA+B,IAAxBU,EAAWf,SAClBM,EAAYS,EAAWT,qBAAqBoB,MAAQX,EAAWT,aAC/De,OAA4B,IAAxBN,EAAWY,SAAsBZ,EAAWY,UAAY,EAE5DpB,GADAe,EAAMM,OAAO1B,IACD,EACZE,EAAOD,EAAO,EAAI,IAAO,KAGrBI,IACHe,GAAOA,KAIG,IAAPD,GAAYE,MAAMF,MACrBA,EAAIQ,KAAKC,MAAMD,KAAKE,IAAIT,GAAOO,KAAKE,IAAI3B,KAEhC,IACPiB,EAAI,GAKFA,EAAI,IACPA,EAAI,GAIO,IAARC,GACHH,EAAO,GAAK,EACZA,EAAO,GAAKT,EAAO,GAAKf,EAAOkB,GAAUhB,EAAO,OAAS,SAASwB,KAElED,EAAME,GAAgB,IAATnB,EAAa0B,KAAKG,IAAI,EAAO,GAAJX,GAAUQ,KAAKG,IAAI,IAAMX,IAE3DxB,IACHuB,GAAY,IAEDhB,GAAQiB,EAAI,IACtBD,GAAYhB,EACZiB,KAIFF,EAAO,GAAKS,OAAOR,EAAIa,QAAQZ,EAAI,EAAIZ,EAAQ,IAC/CU,EAAO,GAAc,KAAThB,GAAqB,IAANkB,EAAUxB,EAAO,KAAO,KAAOF,EAAOkB,GAAUhB,EAAO,OAAS,SAASwB,GAEhGX,IACHS,EAAO,GAAkB,UAAbN,EAAuBM,EAAO,GAAGe,OAAO,GAAKb,EAAI,EAAIF,EAAO,GAAGgB,QAAQ,KAAM,IAAMhB,EAAO,GAElGzB,EAAE0C,KAAKjB,EAAO,MACjBA,EAAO,GAAKU,KAAKC,MAAMX,EAAO,IAC9BA,EAAO,GAAK,MAMXZ,IACHY,EAAO,IAAMA,EAAO,IAIrBA,EAAO,GAAKL,EAAQK,EAAO,KAAOA,EAAO,GAG1B,UAAXX,EACIW,EAGO,aAAXX,EACIa,EAGO,WAAXb,GACM6B,MAAOlB,EAAO,GAAImB,OAAQnB,EAAO,GAAIxB,OAAQwB,EAAO,KAG1Dd,IACHc,EAAO,GAAKb,EAAUe,GAAKf,EAAUe,GAAKrB,EAASa,GAAUQ,IAAMxB,EAAO,MAAQ,SAAyB,IAAdsB,EAAO,GAAW,GAAK,MAGjHR,EAAUM,OAAS,IACtBE,EAAO,GAAKA,EAAO,GAAGoB,WAAWJ,QAAQ,IAAKxB,IAGxCQ,EAAOqB,KAAK5B,IAIpBX,EAASwC,QAAU,SAAUC,GAC5B,OAAO,SAAUxC,GAChB,OAAOD,EAASC,EAAKwC,KAKA,oBAAZC,QACVC,OAAOD,QAAU1C,EACW,mBAAX4C,QAAyBA,OAAOC,IACjDD,OAAO,WACN,OAAO5C,IAGRR,EAAOQ,SAAWA,EAjKpB,CAmKqB,oBAAX8C,OAAyBA,OAAStD","file":"filesize.min.js"}
|
|
@ -0,0 +1,29 @@
|
|||
function confirmExit() {
|
||||
console.log(i18n.confirmExit);
|
||||
return i18n.confirmExit;
|
||||
}
|
||||
|
||||
// Is the browser IE?
|
||||
var isIE = /*@cc_on!@*/false || !!document.documentMode;
|
||||
|
||||
// If the browser is IE, add readAsBinaryString function and store the data
|
||||
if (isIE == true){
|
||||
if (FileReader.prototype.readAsBinaryString === undefined) {
|
||||
FileReader.prototype.readAsBinaryString = function (fileData) {
|
||||
var binary = "";
|
||||
var pt = this;
|
||||
var reader = new FileReader();
|
||||
reader.onload = function (e) {
|
||||
var bytes = new Uint8Array(reader.result);
|
||||
var length = bytes.byteLength;
|
||||
for (var i = 0; i < length; i++) {
|
||||
binary += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
//pt.result - readonly so assign content to another property
|
||||
pt.content = binary;
|
||||
$(pt).trigger('onloadend');
|
||||
}
|
||||
reader.readAsArrayBuffer(fileData);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -14,3 +14,11 @@ function escapeHtml(string) {
|
|||
return entityMap[s];
|
||||
});
|
||||
}
|
||||
function changeLang() {
|
||||
window.location = langUrl+$(this).val();
|
||||
}
|
||||
$(document).ready(function(){
|
||||
$('select').material_select();
|
||||
$(".select-lang select").on('change', changeLang);
|
||||
$(".select-lang-mobile select").on('change', changeLang);
|
||||
});
|
||||
|
|
|
@ -173,8 +173,12 @@ $(document).ready(function(){
|
|||
window.ws.onclose = function() {};
|
||||
window.ws.close();
|
||||
$('#please-wait, #loading, #pbd, #abort').remove();
|
||||
$('#filesize').parent().append('<h4>'+i18n.aborted1+'</h4><a onClick="window.location.reload();" class="waves-effect waves-light btn">'+i18n.aborted2+'</a></p>');
|
||||
$('#filesize').parent().append('<h4>'+i18n.aborted1+'</h4><a id="reloadLocation" class="waves-effect waves-light btn">'+i18n.aborted2+'</a></p>');
|
||||
window.onbeforeunload = null;
|
||||
$('#reloadLocation').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
window.location.reload();
|
||||
})
|
||||
});
|
||||
$('#filesize').html(filesize($('#filesize').attr('data-filesize'), {base: 10}));
|
||||
window.a = new Array();
|
||||
|
|
|
@ -43,7 +43,8 @@ function itemExists(name) {
|
|||
}
|
||||
}
|
||||
|
||||
function purgeExpired() {
|
||||
function purgeExpired(event) {
|
||||
event.preventDefault();
|
||||
var files = JSON.parse(localStorage.getItem('files'));
|
||||
|
||||
files.forEach(function(element, index, array) {
|
||||
|
@ -67,7 +68,8 @@ function purgeExpired() {
|
|||
});
|
||||
}
|
||||
|
||||
function exportStorage() {
|
||||
function exportStorage(event) {
|
||||
event.preventDefault();
|
||||
var a = $('<a id="data-json">');
|
||||
a.hide();
|
||||
$('body').append(a);
|
||||
|
@ -91,7 +93,7 @@ function importStorage(f) {
|
|||
var hasImported = 0;
|
||||
for (i = 0; i < newFiles.length; i++) {
|
||||
var item = newFiles[i];
|
||||
if (!itemExists(item.short)) {
|
||||
if (validURL(item.url) && !itemExists(item.short)) {
|
||||
addItem(item);
|
||||
hasImported++;
|
||||
}
|
||||
|
@ -106,6 +108,19 @@ function importStorage(f) {
|
|||
reader.readAsArrayBuffer(f[0]);
|
||||
}
|
||||
|
||||
function validURL(str) {
|
||||
try {
|
||||
var url = new URL(str);
|
||||
if (url.host) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function delFile() {
|
||||
var dlink = $(this).attr('data-dlink');
|
||||
var short = $(this).attr('data-short');
|
||||
|
@ -122,6 +137,7 @@ function delFile() {
|
|||
} else {
|
||||
alert(data.msg);
|
||||
}
|
||||
evaluateMassDelete();
|
||||
},
|
||||
error: function() {
|
||||
},
|
||||
|
@ -140,14 +156,20 @@ function evaluateMassDelete() {
|
|||
}
|
||||
}
|
||||
|
||||
function massDelete() {
|
||||
function massDelete(event) {
|
||||
event.preventDefault();
|
||||
$('input[data-checked="data-checked"]').each(delFile);
|
||||
}
|
||||
|
||||
function populateFilesTable() {
|
||||
$('#myfiles').empty();
|
||||
|
||||
var files = JSON.parse(localStorage.getItem('files'));
|
||||
var files = localStorage.getItem('files');
|
||||
if (files === null) {
|
||||
files = new Array();
|
||||
} else {
|
||||
files = JSON.parse(files);
|
||||
}
|
||||
files.sort(function(a, b) {
|
||||
if (a.created_at < b.created_at) {
|
||||
return -1;
|
||||
|
@ -159,7 +181,7 @@ function populateFilesTable() {
|
|||
});
|
||||
files.forEach(function(element, index, array) {
|
||||
var del_view = (element.del_at_first_view) ? '<i class="small mdi-action-done"></i>' : '<i class="small mdi-navigation-close"></i>';
|
||||
var dlink = baseURL+'d/'+element.short+'/'+element.token;
|
||||
var dlink = actionURL+'d/'+element.short+'/'+element.token;
|
||||
var limit = (element.delay === 0) ? i18n.noExpiration : moment.unix(element.delay * 86400 + element.created_at).locale(window.navigator.language).format('LLLL');
|
||||
var created_at = moment.unix(element.created_at).locale(window.navigator.language).format('LLLL');
|
||||
|
||||
|
@ -189,7 +211,7 @@ function populateFilesTable() {
|
|||
'<a id="del-', element.short, '" data-short="', element.short, '" data-dlink="', dlink, '" href="#" class="classic"><i class="small mdi-action-delete"></i></a>',
|
||||
'</td>',
|
||||
'<td class="center-align">',
|
||||
'<a href="'+baseURL+'m?links=["'+element.short+'"]" class="classic"><i class="small mdi-communication-email"></i></a>',
|
||||
'<a href="'+actionURL+'m?links=["'+element.short+'"]" class="classic"><i class="small mdi-communication-email"></i></a>',
|
||||
'</td>'].join(''));
|
||||
$('#myfiles').append(tr);
|
||||
$('#del-'+element.short).on('click', delFile);
|
||||
|
@ -227,3 +249,8 @@ function populateFilesTable() {
|
|||
});
|
||||
});
|
||||
}
|
||||
|
||||
function clickImport(event) {
|
||||
event.preventDefault();
|
||||
$('#import').click();
|
||||
}
|
||||
|
|
|
@ -30,7 +30,8 @@ function copyToClipboard(txt) {
|
|||
}
|
||||
|
||||
// Copy all links to clipboard
|
||||
function copyAllToClipboard() {
|
||||
function copyAllToClipboard(event) {
|
||||
event.preventDefault();
|
||||
var text = new Array();
|
||||
var a = $('.link-input');
|
||||
var i;
|
||||
|
@ -49,9 +50,8 @@ function copyAllToClipboard() {
|
|||
var msg = successful ? i18n.copySuccess : i18n.copyFail;
|
||||
Materialize.toast(msg, 4000);
|
||||
} catch (err) {
|
||||
textArea.css('width', '');
|
||||
textArea.css('height', '');
|
||||
textArea.css('background', '#FFFFFF');
|
||||
textArea.removeClass('textarea-hidden');
|
||||
textArea.addClass('white-background');
|
||||
alert(i18n.hits);
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ function updateMailLink() {
|
|||
for (i = 0; i < a.length; i++) {
|
||||
l.push(a[i].id);
|
||||
}
|
||||
var u = baseURL+'m?links='+JSON.stringify(l);
|
||||
var u = actionURL+'m?links='+JSON.stringify(l);
|
||||
$('#mailto').attr('href', u);
|
||||
}
|
||||
|
||||
|
@ -137,6 +137,7 @@ function uploadFile(i, delay, del_at_first_view) {
|
|||
// Get the file and properties
|
||||
var file = window.fileList[i];
|
||||
var name = escapeHtml(file.name);
|
||||
var size = filesize(file.size);
|
||||
var parts = Math.ceil(file.size/window.sliceLength);
|
||||
if (parts === 0) {
|
||||
parts = 1;
|
||||
|
@ -148,20 +149,24 @@ function uploadFile(i, delay, del_at_first_view) {
|
|||
w.addClass('list-group-item');
|
||||
w.html(['<div class="card">',
|
||||
'<div>',
|
||||
'<a href="#" onclick="destroyBlock(this);">',
|
||||
'<a href="#" id="destroy-', window.fc, '">',
|
||||
'<i class="right mdi-navigation-close small"></i>',
|
||||
'</a>',
|
||||
'<div class="card-content">',
|
||||
'<span class="card-title" id="name-', window.fc, '">', name, '</span>',
|
||||
'<span class="card-title" id="name-', window.fc, '">', name, '</span> <span id="size-', window.fc ,'">(', size,')</span>',
|
||||
'<p id="parts-', window.fc, '"></p>',
|
||||
'</div>',
|
||||
'<div class="progress">',
|
||||
'<div id="progress-', window.fc, '" style="width: 0%;" data-key="', randomkey, '" data-name="', name, '" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" role="progressbar" class="determinate">',
|
||||
'<div id="progress-', window.fc, '" data-key="', randomkey, '" data-name="', name, '" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" role="progressbar" class="determinate width-0">',
|
||||
'<span class="sr-only">', name, '0%</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div>'].join(''));
|
||||
r.append(w);
|
||||
r.prepend(w);
|
||||
$('#destroy-'+window.fc).on('click', function(event) {
|
||||
event.preventDefault();
|
||||
destroyBlock(this)
|
||||
});
|
||||
|
||||
sliceAndUpload(randomkey, i, parts, 0, delay, del_at_first_view, null);
|
||||
}
|
||||
|
@ -190,7 +195,9 @@ function sliceAndUpload(randomkey, i, parts, j, delay, del_at_first_view, short)
|
|||
|
||||
// Prepare json
|
||||
var data = {
|
||||
// number of parts
|
||||
total: parts,
|
||||
// part X of total
|
||||
part: j,
|
||||
size: file.size,
|
||||
name: file.name,
|
||||
|
@ -198,6 +205,7 @@ function sliceAndUpload(randomkey, i, parts, j, delay, del_at_first_view, short)
|
|||
delay: delay,
|
||||
del_at_first_view: del_at_first_view,
|
||||
id: short,
|
||||
// number of the sent file in the queue
|
||||
i: i
|
||||
};
|
||||
if ($('#file_pwd').length === 1) {
|
||||
|
@ -266,33 +274,35 @@ function updateProgressBar(data) {
|
|||
|
||||
$('#parts-'+window.fc).remove();
|
||||
var n = $('#name-'+window.fc);
|
||||
var s = $('#size-'+window.fc);
|
||||
var d = $('<div>');
|
||||
var url = baseURL+'r/'+short+'#'+key;
|
||||
var del_url = baseURL+'d/'+short+'/'+data.token;
|
||||
var del_url = actionURL+'d/'+short+'/'+data.token;
|
||||
var links = encodeURIComponent('["'+short+'"]');
|
||||
var limit = (delay === 0) ? i18n.noLimit : i18n.expiration+' '+moment.unix(delay * 86400 + created_at).locale(window.navigator.language).format('LLLL');
|
||||
n.html(n.html()+' <a href="'+baseURL+'m?links='+links+'"><i class="mdi-communication-email"></i></a><br>'+limit);
|
||||
n.html(n.html()+' '+s.html()+' <a href="'+actionURL+'m?links='+links+'"><i class="mdi-communication-email"></i></a><br>'+limit);
|
||||
d.html(['<div class="card-action">',
|
||||
'<div class="input-field">',
|
||||
'<span class="prefix big-prefix">',
|
||||
'<a href="', url, '" target="_blank">',
|
||||
'<i class="mdi-file-file-download small" title="', i18n.dlText, '"></i>',
|
||||
'</a>',
|
||||
'<a href="#" onclick="copyToClipboard(\'', url, '\');" title="', i18n.cpText, '">',
|
||||
'<a href="#" id="copyurl-', window.fc, '" title="', i18n.cpText, '">',
|
||||
'<i class="mdi-content-content-copy small"></i>',
|
||||
'</a>',
|
||||
'</span>',
|
||||
'<input id="', short, '" class="form-control link-input" value="', url, '" readonly="" type="text" style="background-color: #FFF;">',
|
||||
'<input id="', short, '" class="form-control link-input white-background" value="', url, '" readonly="" type="text">',
|
||||
'<label class="active" for="', short, '">', i18n.dlText, '</label>',
|
||||
'</div>',
|
||||
'<div class="input-field">',
|
||||
'<a href="', del_url, '" target="_blank" class="prefix big-prefix">',
|
||||
'<i class="mdi-action-delete small" title="', i18n.delText, '"></i>',
|
||||
'</a>',
|
||||
'<input id="delete-', short, '" class="form-control" value="', del_url, '" readonly="" type="text" style="background-color: #FFF;">',
|
||||
'<input id="delete-', short, '" class="form-control white-background" value="', del_url, '" readonly="" type="text">',
|
||||
'<label class="active" for="delete-', short, '">', i18n.delText, '</label>',
|
||||
'</div>',
|
||||
'</div>'].join(''));
|
||||
s.remove();
|
||||
|
||||
var p2 = dp.parent();
|
||||
var p1 = p2.parent();
|
||||
|
@ -300,13 +310,18 @@ function updateProgressBar(data) {
|
|||
p2.remove();
|
||||
p1.append(d);
|
||||
|
||||
$('#copyurl-'+window.fc).on('click', function(e) {
|
||||
e.preventDefault();
|
||||
copyToClipboard(url);
|
||||
});
|
||||
$("input[type='text']").on("click", function () {
|
||||
$(this).select();
|
||||
});
|
||||
// Add copy all and mailto buttons
|
||||
var misc = $('#misc');
|
||||
if (misc.html() === '') {
|
||||
misc.html('<a href="#" onclick="copyAllToClipboard();" class="btn btn-info">'+i18n.copyAll+'</a> <a id="mailto" href="'+baseURL+'m?links='+links+'" class="btn btn-info">'+i18n.mailTo+'</a>');
|
||||
misc.html('<a href="#" id="copyall" class="btn btn-info">'+i18n.copyAll+'</a> <a id="mailto" href="'+actionURL+'m?links='+links+'" class="btn btn-info">'+i18n.mailTo+'</a>');
|
||||
$('#copyall').on('click', copyAllToClipboard);
|
||||
} else {
|
||||
updateMailLink();
|
||||
}
|
||||
|
@ -330,7 +345,9 @@ function updateProgressBar(data) {
|
|||
j++;
|
||||
// Update progress bar
|
||||
var percent = Math.round(100 * j/parts);
|
||||
dp.css('width', percent+'%');
|
||||
dp.removeClass();
|
||||
dp.addClass('determinate');
|
||||
dp.addClass('width-'+percent);
|
||||
dp.attr('aria-valuenow', percent);
|
||||
|
||||
// Encrypt and upload next slice
|
||||
|
@ -411,12 +428,37 @@ function spawnWebsocket(i, callback) {
|
|||
return ws;
|
||||
}
|
||||
|
||||
// When it's ready
|
||||
$(document).ready(function(){
|
||||
// Dropzone events binding
|
||||
// Dropzone events binding
|
||||
function bindDropZone() {
|
||||
var dropZone = document.getElementById('files');
|
||||
dropZone.addEventListener('dragover', handleDragOver, false);
|
||||
dropZone.addEventListener('drop', handleDrop, false);
|
||||
$('#file-browser-span').removeClass('disabled');
|
||||
$('#file-browser-span').addClass('cyan');
|
||||
$('#file-browser-button').attr('disabled', null);
|
||||
$('#file-browser-button').on('change', function(e) {
|
||||
handleFiles(this.files);
|
||||
});
|
||||
}
|
||||
|
||||
// When it's ready
|
||||
$(document).ready(function(){
|
||||
if (!sjcl.random.isReady(10)) {
|
||||
var loop = setInterval(function() {
|
||||
if (!sjcl.random.isReady(10)) {
|
||||
$('#not-enough-entropy').removeClass('hiddendiv');
|
||||
} else {
|
||||
$('#not-enough-entropy').addClass('hiddendiv');
|
||||
bindDropZone();
|
||||
clearInterval(loop);
|
||||
}
|
||||
}, 1000);
|
||||
} else {
|
||||
bindDropZone();
|
||||
}
|
||||
if (maxSize > 0) {
|
||||
$('#max-file-size').text(i18n.maxSize.replace('XXX', filesize(maxSize)));
|
||||
}
|
||||
$('label[for="first-view"]').on('click', function(){
|
||||
if ($('#first-view').attr('data-checked') && $('#first-view').attr('data-checked') === 'data-checked') {
|
||||
$('#first-view').attr('data-checked', null);
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
$(document).ready(function() {
|
||||
$(".button-collapse").sideNav();
|
||||
});
|
|
@ -1,58 +1,60 @@
|
|||
"use strict";function q(a){throw a;}var s=void 0,u=!1;var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}};
|
||||
"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl});
|
||||
sjcl.cipher.aes=function(a){this.l[0][0][0]||this.G();var b,c,d,e,g=this.l[0][4],f=this.l[1];b=a.length;var h=1;4!==b&&(6!==b&&8!==b)&&q(new sjcl.exception.invalid("invalid aes key size"));this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=g[c>>>24]<<24^g[c>>16&255]<<16^g[c>>8&255]<<8^g[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:f[0][g[c>>>24]]^f[1][g[c>>16&255]]^f[2][g[c>>8&255]]^f[3][g[c&
|
||||
"use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}};
|
||||
sjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,f=this.s[0][4],g=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid("invalid aes key size");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^g[3][f[c&
|
||||
255]]};
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return w(this,a,0)},decrypt:function(a){return w(this,a,1)},l:[[[],[],[],[],[]],[[],[],[],[],[]]],G:function(){var a=this.l[0],b=this.l[1],c=a[4],d=b[4],e,g,f,h=[],l=[],k,m,n,p;for(e=0;0x100>e;e++)l[(h[e]=e<<1^283*(e>>7))^e]=e;for(g=f=0;!c[g];g^=k||1,f=l[f]||1){n=f^f<<1^f<<2^f<<3^f<<4;n=n>>8^n&255^99;c[g]=n;d[n]=g;m=h[e=h[k=h[g]]];p=0x1010101*m^0x10001*e^0x101*k^0x1010100*g;m=0x101*h[n]^0x1010100*n;for(e=0;4>e;e++)a[e][g]=m=m<<24^m>>>8,b[e][n]=p=p<<24^p>>>8}for(e=
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return t(this,a,0)},decrypt:function(a){return t(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,f,g,h=[],k=[],l,n,m,p;for(e=0;0x100>e;e++)k[(h[e]=e<<1^283*(e>>7))^e]=e;for(f=g=0;!c[f];f^=l||1,g=k[g]||1)for(m=g^g<<1^g<<2^g<<3^g<<4,m=m>>8^m&255^99,c[f]=m,d[m]=f,n=h[e=h[l=h[f]]],p=0x1010101*n^0x10001*e^0x101*l^0x1010100*f,n=0x101*h[m]^0x1010100*m,e=0;4>e;e++)a[e][f]=n=n<<24^n>>>8,b[e][m]=p=p<<24^p>>>8;for(e=
|
||||
0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}};
|
||||
function w(a,b,c){4!==b.length&&q(new sjcl.exception.invalid("invalid aes block size"));var d=a.b[c],e=b[0]^d[0],g=b[c?3:1]^d[1],f=b[2]^d[2];b=b[c?1:3]^d[3];var h,l,k,m=d.length/4-2,n,p=4,t=[0,0,0,0];h=a.l[c];a=h[0];var r=h[1],v=h[2],y=h[3],z=h[4];for(n=0;n<m;n++)h=a[e>>>24]^r[g>>16&255]^v[f>>8&255]^y[b&255]^d[p],l=a[g>>>24]^r[f>>16&255]^v[b>>8&255]^y[e&255]^d[p+1],k=a[f>>>24]^r[b>>16&255]^v[e>>8&255]^y[g&255]^d[p+2],b=a[b>>>24]^r[e>>16&255]^v[g>>8&255]^y[f&255]^d[p+3],p+=4,e=h,g=l,f=k;for(n=0;4>
|
||||
n;n++)t[c?3&-n:n]=z[e>>>24]<<24^z[g>>16&255]<<16^z[f>>8&255]<<8^z[b&255]^d[p++],h=e,e=g,g=f,f=b,b=h;return t}
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.R(a.slice(b/32),32-(b&31)).slice(1);return c===s?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.R(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
|
||||
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b&=31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return u;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
|
||||
c},R:function(a,b,c,d){var e;e=0;for(d===s&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},g:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>24),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
|
||||
sjcl.codec.base32={p:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",O:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,g="",f=0,h=sjcl.codec.base32.p,l=0,k=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.O);for(c=0;g.length*d<k;)g+=h.charAt((l^a[c]>>>f)>>>e),f<d?(l=a[c]<<d-f,f+=e,c++):(l<<=d,f-=d);for(;g.length&7&&!b;)g+="=";return g},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
|
||||
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,g=[],f,h=0,l=sjcl.codec.base32.p,k=0,m,n="base32";b&&(l=sjcl.codec.base32.O,n="base32hex");for(f=0;f<a.length;f++){m=l.indexOf(a.charAt(f));if(0>m){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}q(new sjcl.exception.invalid("this isn't "+n+"!"))}h>e?(h-=e,g.push(k^m>>>h),k=m<<c-h):(h+=d,k^=m<<c-h)}h&56&&g.push(sjcl.bitArray.partial(h&56,k,1));return g}};
|
||||
function t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes block size");var d=a.b[c],e=b[0]^d[0],f=b[c?3:1]^d[1],g=b[2]^d[2];b=b[c?1:3]^d[3];var h,k,l,n=d.length/4-2,m,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],v=h[2],w=h[3],x=h[4];for(m=0;m<n;m++)h=a[e>>>24]^q[f>>16&255]^v[g>>8&255]^w[b&255]^d[p],k=a[f>>>24]^q[g>>16&255]^v[b>>8&255]^w[e&255]^d[p+1],l=a[g>>>24]^q[b>>16&255]^v[e>>8&255]^w[f&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^v[f>>8&255]^w[g&255]^d[p+3],p+=4,e=h,f=k,g=l;for(m=
|
||||
0;4>m;m++)r[c?3&-m:m]=x[e>>>24]<<24^x[f>>16&255]<<16^x[g>>8&255]<<8^x[b&255]^d[p++],h=e,e=f,f=g,g=b,b=h;return r}
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
|
||||
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
|
||||
c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>8>>>8>>>8),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
|
||||
sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f="",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+="=";return f},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
|
||||
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m="base32";b&&(k=sjcl.codec.base32.X,m="base32hex");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};
|
||||
sjcl.codec.base32hex={fromBits:function(a,b){return sjcl.codec.base32.fromBits(a,b,1)},toBits:function(a){return sjcl.codec.base32.toBits(a,1)}};
|
||||
sjcl.codec.base64={p:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,g=sjcl.codec.base64.p,f=0,h=sjcl.bitArray.bitLength(a);c&&(g=g.substr(0,62)+"-_");for(c=0;6*d.length<h;)d+=g.charAt((f^a[c]>>>e)>>>26),6>e?(f=a[c]<<6-e,e+=26,c++):(f<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,g=sjcl.codec.base64.p,f=0,h;b&&(g=g.substr(0,62)+"-_");for(d=0;d<a.length;d++)h=g.indexOf(a.charAt(d)),
|
||||
0>h&&q(new sjcl.exception.invalid("this isn't base64!")),26<e?(e-=26,c.push(f^h>>>e),f=h<<32-e):(e+=6,f^=h<<32-e);e&56&&c.push(sjcl.bitArray.partial(e&56,f,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.G();a?(this.s=a.s.slice(0),this.o=a.o.slice(0),this.i=a.i):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.s=this.P.slice(0);this.o=[];this.i=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.o=sjcl.bitArray.concat(this.o,a);b=this.i;a=this.i=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)x(this,c.splice(0,16));return this},finalize:function(){var a,b=this.o,c=this.s,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.i/
|
||||
4294967296));for(b.push(this.i|0);b.length;)x(this,b.splice(0,16));this.reset();return c},P:[],b:[],G:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}var b=0,c=2,d;a:for(;64>b;c++){for(d=2;d*d<=c;d++)if(0===c%d)continue a;8>b&&(this.P[b]=a(Math.pow(c,0.5)));this.b[b]=a(Math.pow(c,1/3));b++}}};
|
||||
function x(a,b){var c,d,e,g=b.slice(0),f=a.s,h=a.b,l=f[0],k=f[1],m=f[2],n=f[3],p=f[4],t=f[5],r=f[6],v=f[7];for(c=0;64>c;c++)16>c?d=g[c]:(d=g[c+1&15],e=g[c+14&15],d=g[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g[c&15]+g[c+9&15]|0),d=d+v+(p>>>6^p>>>11^p>>>25^p<<26^p<<21^p<<7)+(r^p&(t^r))+h[c],v=r,r=t,t=p,p=n+d|0,n=m,m=k,k=l,l=d+(k&m^n&(k^m))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+l|0;f[1]=f[1]+k|0;f[2]=f[2]+m|0;f[3]=f[3]+n|0;f[4]=f[4]+p|0;f[5]=f[5]+t|0;f[6]=
|
||||
f[6]+r|0;f[7]=f[7]+v|0}
|
||||
sjcl.mode.ccm={name:"ccm",t:[],listenProgress:function(a){sjcl.mode.ccm.t.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.t.indexOf(a);-1<a&&sjcl.mode.ccm.t.splice(a,1)},X:function(a){var b=sjcl.mode.ccm.t.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var g,f=b.slice(0),h=sjcl.bitArray,l=h.bitLength(c)/8,k=h.bitLength(f)/8;e=e||64;d=d||[];7>l&&q(new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"));for(g=2;4>g&&k>>>8*g;g++);g<15-l&&(g=15-l);c=h.clamp(c,8*(15-
|
||||
g));b=sjcl.mode.ccm.M(a,b,c,d,e,g);f=sjcl.mode.ccm.q(a,f,c,b,e,g);return h.concat(f.data,f.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var g=sjcl.bitArray,f=g.bitLength(c)/8,h=g.bitLength(b),l=g.clamp(b,h-e),k=g.bitSlice(b,h-e),h=(h-e)/8;7>f&&q(new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"));for(b=2;4>b&&h>>>8*b;b++);b<15-f&&(b=15-f);c=g.clamp(c,8*(15-b));l=sjcl.mode.ccm.q(a,l,c,k,e,b);a=sjcl.mode.ccm.M(a,l.data,c,d,e,b);g.equal(l.tag,a)||q(new sjcl.exception.corrupt("ccm: tag doesn't match"));
|
||||
return l.data},ea:function(a,b,c,d,e,g){var f=[],h=sjcl.bitArray,l=h.g;d=[h.partial(8,(b.length?64:0)|d-2<<2|g-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length){c=h.bitLength(b)/8;65279>=c?f=[h.partial(16,c)]:0xffffffff>=c&&(f=h.concat([h.partial(16,65534)],[c]));f=h.concat(f,b);for(b=0;b<f.length;b+=4)d=a.encrypt(l(d,f.slice(b,b+4).concat([0,0,0])))}return d},M:function(a,b,c,d,e,g){var f=sjcl.bitArray,h=f.g;e/=8;(e%2||4>e||16<e)&&q(new sjcl.exception.invalid("ccm: invalid tag length"));(0xffffffff<
|
||||
d.length||0xffffffff<b.length)&&q(new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"));c=sjcl.mode.ccm.ea(a,d,c,e,f.bitLength(b)/8,g);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return f.clamp(c,8*e)},q:function(a,b,c,d,e,g){var f,h=sjcl.bitArray;f=h.g;var l=b.length,k=h.bitLength(b),m=l/50,n=m;c=h.concat([h.partial(8,g-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(f(d,a.encrypt(c)),0,e);if(!l)return{tag:d,data:[]};for(f=0;f<l;f+=4)f>m&&(sjcl.mode.ccm.X(f/
|
||||
l),m+=n),c[3]++,e=a.encrypt(c),b[f]^=e[0],b[f+1]^=e[1],b[f+2]^=e[2],b[f+3]^=e[3];return{tag:d,data:h.clamp(b,k)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,g){128!==sjcl.bitArray.bitLength(c)&&q(new sjcl.exception.invalid("ocb iv must be 128 bits"));var f,h=sjcl.mode.ocb2.J,l=sjcl.bitArray,k=l.g,m=[0,0,0,0];c=h(a.encrypt(c));var n,p=[];d=d||[];e=e||64;for(f=0;f+4<b.length;f+=4)n=b.slice(f,f+4),m=k(m,n),p=p.concat(k(c,a.encrypt(k(c,n)))),c=h(c);n=b.slice(f);b=l.bitLength(n);f=a.encrypt(k(c,[0,0,0,b]));n=l.clamp(k(n.concat([0,0,0]),f),b);m=k(m,k(n.concat([0,0,0]),f));m=a.encrypt(k(m,k(c,h(c))));d.length&&
|
||||
(m=k(m,g?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(l.concat(n,l.clamp(m,e)))},decrypt:function(a,b,c,d,e,g){128!==sjcl.bitArray.bitLength(c)&&q(new sjcl.exception.invalid("ocb iv must be 128 bits"));e=e||64;var f=sjcl.mode.ocb2.J,h=sjcl.bitArray,l=h.g,k=[0,0,0,0],m=f(a.encrypt(c)),n,p,t=sjcl.bitArray.bitLength(b)-e,r=[];d=d||[];for(c=0;c+4<t/32;c+=4)n=l(m,a.decrypt(l(m,b.slice(c,c+4)))),k=l(k,n),r=r.concat(n),m=f(m);p=t-32*c;n=a.encrypt(l(m,[0,0,0,p]));n=l(n,h.clamp(b.slice(c),p).concat([0,0,0]));
|
||||
k=l(k,n);k=a.encrypt(l(k,l(m,f(m))));d.length&&(k=l(k,g?d:sjcl.mode.ocb2.pmac(a,d)));h.equal(h.clamp(k,e),h.bitSlice(b,t))||q(new sjcl.exception.corrupt("ocb: tag doesn't match"));return r.concat(h.clamp(n,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.J,e=sjcl.bitArray,g=e.g,f=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=g(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),f=g(f,a.encrypt(g(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=g(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));f=g(f,c);return a.encrypt(g(d(g(h,
|
||||
d(h))),f))},J:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}};
|
||||
sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var g=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.q(!0,a,g,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var g=b.slice(0),f=sjcl.bitArray,h=f.bitLength(g);e=e||128;d=d||[];e<=h?(b=f.bitSlice(g,h-e),g=f.bitSlice(g,0,h-e)):(b=g,g=[]);a=sjcl.mode.gcm.q(u,a,g,d,c,e);f.equal(a.tag,b)||q(new sjcl.exception.corrupt("gcm: tag doesn't match"));return a.data},ba:function(a,b){var c,d,e,g,f,h=sjcl.bitArray.g;e=[0,0,0,0];g=
|
||||
b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,g));f=0!==(g[3]&1);for(d=3;0<d;d--)g[d]=g[d]>>>1|(g[d-1]&1)<<31;g[0]>>>=1;f&&(g[0]^=-0x1f000000)}return e},h:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ba(b,a);return b},q:function(a,b,c,d,e,g){var f,h,l,k,m,n,p,t,r=sjcl.bitArray;n=c.length;p=r.bitLength(c);t=r.bitLength(d);h=r.bitLength(e);f=
|
||||
b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=r.concat(e,[1])):(e=sjcl.mode.gcm.h(f,[0,0,0,0],e),e=sjcl.mode.gcm.h(f,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.h(f,[0,0,0,0],d);m=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.h(f,h,c));for(k=0;k<n;k+=4)m[3]++,l=b.encrypt(m),c[k]^=l[0],c[k+1]^=l[1],c[k+2]^=l[2],c[k+3]^=l[3];c=r.clamp(c,p);a&&(d=sjcl.mode.gcm.h(f,h,c));a=[Math.floor(t/0x100000000),t&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.h(f,d,a);l=b.encrypt(e);
|
||||
d[0]^=l[0];d[1]^=l[1];d[2]^=l[2];d[3]^=l[3];return{tag:r.bitSlice(d,0,g),data:c}}};sjcl.misc.hmac=function(a,b){this.N=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.n=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.n[0].update(c[0]);this.n[1].update(c[1]);this.I=new b(this.n[0])};
|
||||
sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){this.S&&q(new sjcl.exception.invalid("encrypt on already updated hmac called!"));this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.I=new this.N(this.n[0]);this.S=u};sjcl.misc.hmac.prototype.update=function(a){this.S=!0;this.I.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.I.finalize(),a=(new this.N(this.n[1])).update(a).finalize();this.reset();return a};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;(0>d||0>c)&&q(sjcl.exception.invalid("invalid params to pbkdf2"));"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var g,f,h,l,k=[],m=sjcl.bitArray;for(l=1;32*k.length<(d||1);l++){e=g=a.encrypt(m.concat(b,[l]));for(f=1;f<c;f++){g=a.encrypt(g);for(h=0;h<g.length;h++)e[h]^=g[h]}k=k.concat(e)}d&&(k=m.clamp(k,d));return k};
|
||||
sjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.j=[0];this.H=0;this.u={};this.F=0;this.L={};this.Q=this.d=this.k=this.Z=0;this.b=[0,0,0,0,0,0,0,0];this.f=[0,0,0,0];this.C=s;this.D=a;this.r=u;this.B={progress:{},seeded:{}};this.m=this.Y=0;this.w=1;this.A=2;this.U=0x10000;this.K=[0,48,64,96,128,192,0x100,384,512,768,1024];this.V=3E4;this.T=80};
|
||||
sjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;d===this.m&&q(new sjcl.exception.notReady("generator isn't seeded"));if(d&this.A){d=!(d&this.w);e=[];var g=0,f;this.Q=e[0]=(new Date).valueOf()+this.V;for(f=0;16>f;f++)e.push(0x100000000*Math.random()|0);for(f=0;f<this.c.length&&!(e=e.concat(this.c[f].finalize()),g+=this.j[f],this.j[f]=0,!d&&this.H&1<<f);f++);this.H>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.j.push(0));this.d-=g;g>this.k&&(this.k=g);this.H++;
|
||||
this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.C=new sjcl.cipher.aes(this.b);for(d=0;4>d&&!(this.f[d]=this.f[d]+1|0,this.f[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.U&&A(this),e=B(this),c.push(e[0],e[1],e[2],e[3]);A(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){0===a&&"Setting paranoia=0 will ruin your security; use it only for testing"!==b&&q("Setting paranoia=0 will ruin your security; use it only for testing");this.D=a},addEntropy:function(a,b,c){c=c||"user";var d,e,g=(new Date).valueOf(),
|
||||
f=this.u[c],h=this.isReady(),l=0;d=this.L[c];d===s&&(d=this.L[c]=this.Z++);f===s&&(f=this.u[c]=0);this.u[c]=(this.u[c]+1)%this.c.length;switch(typeof a){case "number":b===s&&(b=1);this.c[f].update([d,this.F++,1,b,g,1,a|0]);break;case "object":c=Object.prototype.toString.call(a);if("[object Uint32Array]"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else{"[object Array]"!==c&&(l=1);for(c=0;c<a.length&&!l;c++)"number"!==typeof a[c]&&(l=1)}if(!l){if(b===s)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,
|
||||
e>>>=1;this.c[f].update([d,this.F++,2,b,g,a.length].concat(a))}break;case "string":b===s&&(b=a.length);this.c[f].update([d,this.F++,3,b,g,a.length]);this.c[f].update(a);break;default:l=1}l&&q(new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string"));this.j[f]+=b;this.d+=b;h===this.m&&(this.isReady()!==this.m&&C("seeded",Math.max(this.k,this.d)),C("progress",this.getProgress()))},isReady:function(a){a=this.K[a!==s?a:this.D];return this.k&&this.k>=a?this.j[0]>this.T&&
|
||||
(new Date).valueOf()>this.Q?this.A|this.w:this.w:this.d>=a?this.A|this.m:this.m},getProgress:function(a){a=this.K[a?a:this.D];return this.k>=a?1:this.d>a?1:this.d/a},startCollectors:function(){this.r||(this.a={loadTimeCollector:D(this,this.da),mouseCollector:D(this,this.fa),keyboardCollector:D(this,this.ca),accelerometerCollector:D(this,this.W),touchCollector:D(this,this.ha)},window.addEventListener?(window.addEventListener("load",this.a.loadTimeCollector,u),window.addEventListener("mousemove",this.a.mouseCollector,
|
||||
u),window.addEventListener("keypress",this.a.keyboardCollector,u),window.addEventListener("devicemotion",this.a.accelerometerCollector,u),window.addEventListener("touchmove",this.a.touchCollector,u)):document.attachEvent?(document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector)):q(new sjcl.exception.bug("can't attach event")),this.r=!0)},stopCollectors:function(){this.r&&(window.removeEventListener?
|
||||
(window.removeEventListener("load",this.a.loadTimeCollector,u),window.removeEventListener("mousemove",this.a.mouseCollector,u),window.removeEventListener("keypress",this.a.keyboardCollector,u),window.removeEventListener("devicemotion",this.a.accelerometerCollector,u),window.removeEventListener("touchmove",this.a.touchCollector,u)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove",this.a.mouseCollector),document.detachEvent("keypress",
|
||||
this.a.keyboardCollector)),this.r=u)},addEventListener:function(a,b){this.B[a][this.Y++]=b},removeEventListener:function(a,b){var c,d,e=this.B[a],g=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&g.push(d);for(c=0;c<g.length;c++)d=g[c],delete e[d]},ca:function(){E(1)},fa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&sjcl.random.addEntropy([b,c],2,"mouse");E(0)},ha:function(a){a=a.touches[0]||a.changedTouches[0];sjcl.random.addEntropy([a.pageX||
|
||||
a.clientX,a.pageY||a.clientY],1,"touch");E(0)},da:function(){E(2)},W:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;"number"===typeof b&&sjcl.random.addEntropy(b,1,"accelerometer")}a&&sjcl.random.addEntropy(a,2,"accelerometer");E(0)}};function C(a,b){var c,d=sjcl.random.B[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}
|
||||
function E(a){"undefined"!==typeof window&&window.performance&&"function"===typeof window.performance.now?sjcl.random.addEntropy(window.performance.now(),a,"loadtime"):sjcl.random.addEntropy((new Date).valueOf(),a,"loadtime")}function A(a){a.b=B(a).concat(B(a));a.C=new sjcl.cipher.aes(a.b)}function B(a){for(var b=0;4>b&&!(a.f[b]=a.f[b]+1|0,a.f[b]);b++);return a.C.encrypt(a.f)}function D(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6);
|
||||
a:try{var F,G,H,I;if(I="undefined"!==typeof module){var J;if(J=module.exports){var K;try{K=require("crypto")}catch(L){K=null}J=(G=K)&&G.randomBytes}I=J}if(I)F=G.randomBytes(128),F=new Uint32Array((new Uint8Array(F)).buffer),sjcl.random.addEntropy(F,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){H=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(H);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(H);
|
||||
else break a;sjcl.random.addEntropy(H,1024,"crypto['getRandomValues']")}}catch(M){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(M))}
|
||||
sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},aa:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,g=e.e({iv:sjcl.random.randomWords(4,0)},e.defaults),f;e.e(g,c);c=g.adata;"string"===typeof g.salt&&(g.salt=sjcl.codec.base64.toBits(g.salt));"string"===typeof g.iv&&(g.iv=sjcl.codec.base64.toBits(g.iv));(!sjcl.mode[g.mode]||!sjcl.cipher[g.cipher]||"string"===typeof a&&100>=g.iter||64!==g.ts&&96!==g.ts&&128!==g.ts||128!==g.ks&&192!==g.ks&&0x100!==g.ks||2>g.iv.length||
|
||||
4<g.iv.length)&&q(new sjcl.exception.invalid("json encrypt: invalid parameters"));"string"===typeof a?(f=sjcl.misc.cachedPbkdf2(a,g),a=f.key.slice(0,g.ks/32),g.salt=f.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(f=a.kem(),g.kemtag=f.tag,a=f.key.slice(0,g.ks/32));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));"string"===typeof c&&(g.adata=c=sjcl.codec.utf8String.toBits(c));f=new sjcl.cipher[g.cipher](a);e.e(d,g);d.key=a;g.ct="ccm"===g.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&
|
||||
b instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(f,b,g.iv,c,g.ts):sjcl.mode[g.mode].encrypt(f,b,g.iv,c,g.ts);return g},encrypt:function(a,b,c,d){var e=sjcl.json,g=e.aa.apply(e,arguments);return e.encode(g)},$:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.e(e.e(e.e({},e.defaults),b),c,!0);var g,f;g=b.adata;"string"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));"string"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||"string"===
|
||||
typeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)&&q(new sjcl.exception.invalid("json decrypt: invalid parameters"));"string"===typeof a?(f=sjcl.misc.cachedPbkdf2(a,b),a=f.key.slice(0,b.ks/32),b.salt=f.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));"string"===typeof g&&(g=sjcl.codec.utf8String.toBits(g));f=new sjcl.cipher[b.cipher](a);g="ccm"===
|
||||
b.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(f,b.ct,b.iv,b.tag,g,b.ts):sjcl.mode[b.mode].decrypt(f,b.ct,b.iv,g,b.ts);e.e(d,b);d.key=a;return 1===c.raw?g:sjcl.codec.utf8String.fromBits(g)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.$(a,e.decode(b),c,d)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b))switch(b.match(/^[a-z0-9]+$/i)||q(new sjcl.exception.invalid("json encode: invalid property name")),c+=d+'"'+b+
|
||||
'":',d=",",typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:q(new sjcl.exception.bug("json encode: unsupported type"))}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");a.match(/^\{.*\}$/)||q(new sjcl.exception.invalid("json decode: this isn't json!"));a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++)(d=a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))||
|
||||
q(new sjcl.exception.invalid("json decode: this isn't json!")),null!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]="true"===d[5]);return b},e:function(a,b,c){a===s&&(a={});if(b===s)return a;for(var d in b)b.hasOwnProperty(d)&&(c&&(a[d]!==s&&a[d]!==b[d])&&q(new sjcl.exception.invalid("required parameter overridden")),a[d]=b[d]);return a},ja:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&
|
||||
a[d]!==b[d]&&(c[d]=a[d]);return c},ia:function(a,b){var c={},d;for(d=0;d<b.length;d++)a[b[d]]!==s&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.ga={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.ga,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===s?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
sjcl.codec.base64={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,f=sjcl.codec.base64.B,g=0,h=sjcl.bitArray.bitLength(a);c&&(f=f.substr(0,62)+"-_");for(c=0;6*d.length<h;)d+=f.charAt((g^a[c]>>>e)>>>26),6>e?(g=a[c]<<6-e,e+=26,c++):(g<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,f=sjcl.codec.base64.B,g=0,h;b&&(f=f.substr(0,62)+"-_");for(d=0;d<a.length;d++){h=f.indexOf(a.charAt(d));
|
||||
if(0>h)throw new sjcl.exception.invalid("this isn't base64!");26<e?(e-=26,c.push(g^h>>>e),g=h<<32-e):(e+=6,g^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,g,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);if(0x1fffffffffffff<a)throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits");if("undefined"!==typeof Uint32Array){var d=new Uint32Array(c),e=0;for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,d.subarray(16*e,
|
||||
16*(e+1))),e+=1;c.splice(0,16*e)}else for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,c.splice(0,16));return this},finalize:function(){var a,b=this.A,c=this.F,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.l/0x100000000));for(b.push(this.l|0);b.length;)u(this,b.splice(0,16));this.reset();return c},Y:[],b:[],O:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}for(var b=0,c=2,d,e;64>b;c++){e=!0;for(d=2;d*d<=c;d++)if(0===c%d){e=
|
||||
!1;break}e&&(8>b&&(this.Y[b]=a(Math.pow(c,.5))),this.b[b]=a(Math.pow(c,1/3)),b++)}}};
|
||||
function u(a,b){var c,d,e,f=a.F,g=a.b,h=f[0],k=f[1],l=f[2],n=f[3],m=f[4],p=f[5],r=f[6],q=f[7];for(c=0;64>c;c++)16>c?d=b[c]:(d=b[c+1&15],e=b[c+14&15],d=b[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+b[c&15]+b[c+9&15]|0),d=d+q+(m>>>6^m>>>11^m>>>25^m<<26^m<<21^m<<7)+(r^m&(p^r))+g[c],q=r,r=p,p=m,m=n+d|0,n=l,l=k,k=h,h=d+(k&l^n&(k^l))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+h|0;f[1]=f[1]+k|0;f[2]=f[2]+l|0;f[3]=f[3]+n|0;f[4]=f[4]+m|0;f[5]=f[5]+p|0;f[6]=f[6]+r|0;f[7]=
|
||||
f[7]+q|0}
|
||||
sjcl.mode.ccm={name:"ccm",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1<a&&sjcl.mode.ccm.G.splice(a,1)},fa:function(a){var b=sjcl.mode.ccm.G.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,k=h.bitLength(c)/8,l=h.bitLength(g)/8;e=e||64;d=d||[];if(7>k)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;4>f&&l>>>8*f;f++);f<15-k&&(f=15-k);c=h.clamp(c,
|
||||
8*(15-f));b=sjcl.mode.ccm.V(a,b,c,d,e,f);g=sjcl.mode.ccm.C(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),k=f.clamp(b,h-e),l=f.bitSlice(b,h-e),h=(h-e)/8;if(7>g)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;4>b&&h>>>8*b;b++);b<15-g&&(b=15-g);c=f.clamp(c,8*(15-b));k=sjcl.mode.ccm.C(a,k,c,l,e,b);a=sjcl.mode.ccm.V(a,k.data,c,d,e,b);if(!f.equal(k.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");
|
||||
return k.data},na:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,k=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|f-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?g=[h.partial(16,c)]:0xffffffff>=c&&(g=h.concat([h.partial(16,65534)],[c])),g=h.concat(g,b),b=0;b<g.length;b+=4)d=a.encrypt(k(d,g.slice(b,b+4).concat([0,0,0])));return d},V:function(a,b,c,d,e,f){var g=sjcl.bitArray,h=g.i;e/=8;if(e%2||4>e||16<e)throw new sjcl.exception.invalid("ccm: invalid tag length");
|
||||
if(0xffffffff<d.length||0xffffffff<b.length)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");c=sjcl.mode.ccm.na(a,d,c,e,g.bitLength(b)/8,f);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return g.clamp(c,8*e)},C:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.i;var k=b.length,l=h.bitLength(b),n=k/50,m=n;c=h.concat([h.partial(8,f-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!k)return{tag:d,data:[]};for(g=0;g<k;g+=4)g>n&&(sjcl.mode.ccm.fa(g/
|
||||
k),n+=m),c[3]++,e=a.encrypt(c),b[g]^=e[0],b[g+1]^=e[1],b[g+2]^=e[2],b[g+3]^=e[3];return{tag:d,data:h.clamp(b,l)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.S,k=sjcl.bitArray,l=k.i,n=[0,0,0,0];c=h(a.encrypt(c));var m,p=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4)m=b.slice(g,g+4),n=l(n,m),p=p.concat(l(c,a.encrypt(l(c,m)))),c=h(c);m=b.slice(g);b=k.bitLength(m);g=a.encrypt(l(c,[0,0,0,b]));m=k.clamp(l(m.concat([0,0,0]),g),b);n=l(n,l(m.concat([0,0,0]),g));n=a.encrypt(l(n,l(c,h(c))));
|
||||
d.length&&(n=l(n,f?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(k.concat(m,k.clamp(n,e)))},decrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.S,h=sjcl.bitArray,k=h.i,l=[0,0,0,0],n=g(a.encrypt(c)),m,p,r=sjcl.bitArray.bitLength(b)-e,q=[];d=d||[];for(c=0;c+4<r/32;c+=4)m=k(n,a.decrypt(k(n,b.slice(c,c+4)))),l=k(l,m),q=q.concat(m),n=g(n);p=r-32*c;m=a.encrypt(k(n,[0,0,0,p]));m=k(m,h.clamp(b.slice(c),p).concat([0,
|
||||
0,0]));l=k(l,m);l=a.encrypt(k(l,k(n,g(n))));d.length&&(l=k(l,f?d:sjcl.mode.ocb2.pmac(a,d)));if(!h.equal(h.clamp(l,e),h.bitSlice(b,r)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return q.concat(h.clamp(m,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.S,e=sjcl.bitArray,f=e.i,g=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),g=f(g,a.encrypt(f(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=f(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));g=f(g,c);
|
||||
return a.encrypt(f(d(f(h,d(h))),g))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}};
|
||||
sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var f=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,f,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var f=b.slice(0),g=sjcl.bitArray,h=g.bitLength(f);e=e||128;d=d||[];e<=h?(b=g.bitSlice(f,h-e),f=g.bitSlice(f,0,h-e)):(b=f,f=[]);a=sjcl.mode.gcm.C(!1,a,f,d,c,e);if(!g.equal(a.tag,b))throw new sjcl.exception.corrupt("gcm: tag doesn't match");return a.data},ka:function(a,b){var c,d,e,f,g,h=sjcl.bitArray.i;e=[0,0,
|
||||
0,0];f=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,f));g=0!==(f[3]&1);for(d=3;0<d;d--)f[d]=f[d]>>>1|(f[d-1]&1)<<31;f[0]>>>=1;g&&(f[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ka(b,a);return b},C:function(a,b,c,d,e,f){var g,h,k,l,n,m,p,r,q=sjcl.bitArray;m=c.length;p=q.bitLength(c);r=q.bitLength(d);h=q.bitLength(e);
|
||||
g=b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=q.concat(e,[1])):(e=sjcl.mode.gcm.j(g,[0,0,0,0],e),e=sjcl.mode.gcm.j(g,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.j(g,[0,0,0,0],d);n=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.j(g,h,c));for(l=0;l<m;l+=4)n[3]++,k=b.encrypt(n),c[l]^=k[0],c[l+1]^=k[1],c[l+2]^=k[2],c[l+3]^=k[3];c=q.clamp(c,p);a&&(d=sjcl.mode.gcm.j(g,h,c));a=[Math.floor(r/0x100000000),r&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.j(g,d,a);k=b.encrypt(e);
|
||||
d[0]^=k[0];d[1]^=k[1];d[2]^=k[2];d[3]^=k[3];return{tag:q.bitSlice(d,0,f),data:c}}};sjcl.misc.hmac=function(a,b){this.W=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.w=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.w[0].update(c[0]);this.w[1].update(c[1]);this.R=new b(this.w[0])};
|
||||
sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){if(this.aa)throw new sjcl.exception.invalid("encrypt on already updated hmac called!");this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.R=new this.W(this.w[0]);this.aa=!1};sjcl.misc.hmac.prototype.update=function(a){this.aa=!0;this.R.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.R.finalize(),a=(new this.W(this.w[1])).update(a).finalize();this.reset();return a};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E4;if(0>d||0>c)throw new sjcl.exception.invalid("invalid params to pbkdf2");"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,k,l=[],n=sjcl.bitArray;for(k=1;32*l.length<(d||1);k++){e=f=a.encrypt(n.concat(b,[k]));for(g=1;g<c;g++)for(f=a.encrypt(f),h=0;h<f.length;h++)e[h]^=f[h];l=l.concat(e)}d&&(l=n.clamp(l,d));return l};
|
||||
sjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.m=[0];this.P=0;this.H={};this.N=0;this.U={};this.Z=this.f=this.o=this.ha=0;this.b=[0,0,0,0,0,0,0,0];this.h=[0,0,0,0];this.L=void 0;this.M=a;this.D=!1;this.K={progress:{},seeded:{}};this.u=this.ga=0;this.I=1;this.J=2;this.ca=0x10000;this.T=[0,48,64,96,128,192,0x100,384,512,768,1024];this.da=3E4;this.ba=80};
|
||||
sjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;if(d===this.u)throw new sjcl.exception.notReady("generator isn't seeded");if(d&this.J){d=!(d&this.I);e=[];var f=0,g;this.Z=e[0]=(new Date).valueOf()+this.da;for(g=0;16>g;g++)e.push(0x100000000*Math.random()|0);for(g=0;g<this.c.length&&(e=e.concat(this.c[g].finalize()),f+=this.m[g],this.m[g]=0,d||!(this.P&1<<g));g++);this.P>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.m.push(0));this.f-=f;f>this.o&&(this.o=
|
||||
f);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.ca&&y(this),e=z(this),c.push(e[0],e[1],e[2],e[3]);y(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){if(0===a&&"Setting paranoia=0 will ruin your security; use it only for testing"!==b)throw new sjcl.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing");this.M=a},addEntropy:function(a,
|
||||
b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.H[c],h=this.isReady(),k=0;d=this.U[c];void 0===d&&(d=this.U[c]=this.ha++);void 0===g&&(g=this.H[c]=0);this.H[c]=(this.H[c]+1)%this.c.length;switch(typeof a){case "number":void 0===b&&(b=1);this.c[g].update([d,this.N++,1,b,f,1,a|0]);break;case "object":c=Object.prototype.toString.call(a);if("[object Uint32Array]"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else for("[object Array]"!==c&&(k=1),c=0;c<a.length&&!k;c++)"number"!==typeof a[c]&&
|
||||
(k=1);if(!k){if(void 0===b)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,e=e>>>1;this.c[g].update([d,this.N++,2,b,f,a.length].concat(a))}break;case "string":void 0===b&&(b=a.length);this.c[g].update([d,this.N++,3,b,f,a.length]);this.c[g].update(a);break;default:k=1}if(k)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");this.m[g]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A("seeded",Math.max(this.o,this.f)),A("progress",this.getProgress()))},
|
||||
isReady:function(a){a=this.T[void 0!==a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener("load",
|
||||
this.a.loadTimeCollector,!1),window.addEventListener("mousemove",this.a.mouseCollector,!1),window.addEventListener("keypress",this.a.keyboardCollector,!1),window.addEventListener("devicemotion",this.a.accelerometerCollector,!1),window.addEventListener("touchmove",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector);else throw new sjcl.exception.bug("can't attach event");
|
||||
this.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener("load",this.a.loadTimeCollector,!1),window.removeEventListener("mousemove",this.a.mouseCollector,!1),window.removeEventListener("keypress",this.a.keyboardCollector,!1),window.removeEventListener("devicemotion",this.a.accelerometerCollector,!1),window.removeEventListener("touchmove",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove",
|
||||
this.a.mouseCollector),document.detachEvent("keypress",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],f=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&f.push(d);for(c=0;c<f.length;c++)d=f[c],delete e[d]},la:function(){C(this,1)},oa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&this.addEntropy([b,c],2,"mouse");C(this,0)},qa:function(a){a=
|
||||
a.touches[0]||a.changedTouches[0];this.addEntropy([a.pageX||a.clientX,a.pageY||a.clientY],1,"touch");C(this,0)},ma:function(){C(this,2)},ea:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;"number"===typeof b&&this.addEntropy(b,1,"accelerometer")}a&&this.addEntropy(a,2,"accelerometer");C(this,0)}};
|
||||
function A(a,b){var c,d=sjcl.random.K[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}function C(a,b){"undefined"!==typeof window&&window.performance&&"function"===typeof window.performance.now?a.addEntropy(window.performance.now(),b,"loadtime"):a.addEntropy((new Date).valueOf(),b,"loadtime")}function y(a){a.b=z(a).concat(z(a));a.L=new sjcl.cipher.aes(a.b)}function z(a){for(var b=0;4>b&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)}
|
||||
function B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6);
|
||||
a:try{var D,E,F,G;if(G="undefined"!==typeof module&&module.exports){var H;try{H=require("crypto")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F);
|
||||
else break a;sjcl.random.addEntropy(F,1024,"crypto['getRandomValues']")}}catch(a){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(a))}
|
||||
sjcl.json={defaults:{v:1,iter:1E4,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.g(f,c);c=f.adata;"string"===typeof f.salt&&(f.salt=sjcl.codec.base64.toBits(f.salt));"string"===typeof f.iv&&(f.iv=sjcl.codec.base64.toBits(f.iv));if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||"string"===typeof a&&100>=f.iter||64!==f.ts&&96!==f.ts&&128!==f.ts||128!==f.ks&&192!==f.ks&&0x100!==f.ks||2>f.iv.length||
|
||||
4<f.iv.length)throw new sjcl.exception.invalid("json encrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,f),a=g.key.slice(0,f.ks/32),f.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(g=a.kem(),f.kemtag=g.tag,a=g.key.slice(0,f.ks/32));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));"string"===typeof c&&(f.adata=c=sjcl.codec.utf8String.toBits(c));g=new sjcl.cipher[f.cipher](a);e.g(d,f);d.key=a;f.ct="ccm"===f.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&
|
||||
b instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(g,b,f.iv,c,f.ts):sjcl.mode[f.mode].encrypt(g,b,f.iv,c,f.ts);return f},encrypt:function(a,b,c,d){var e=sjcl.json,f=e.ja.apply(e,arguments);return e.encode(f)},ia:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.g(e.g(e.g({},e.defaults),b),c,!0);var f,g;f=b.adata;"string"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));"string"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||"string"===
|
||||
typeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)throw new sjcl.exception.invalid("json decrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,b),a=g.key.slice(0,b.ks/32),b.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));"string"===typeof f&&(f=sjcl.codec.utf8String.toBits(f));g=new sjcl.cipher[b.cipher](a);f="ccm"===
|
||||
b.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(g,b.ct,b.iv,b.tag,f,b.ts):sjcl.mode[b.mode].decrypt(g,b.ct,b.iv,f,b.ts);e.g(d,b);d.key=a;return 1===c.raw?f:sjcl.codec.utf8String.fromBits(f)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.ia(a,e.decode(b),c,d)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+'"'+
|
||||
b+'":';d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");
|
||||
null!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]="true"===d[5])}return b},g:function(a,b,c){void 0===a&&(a={});if(void 0===b)return a;for(var d in b)if(b.hasOwnProperty(d)){if(c&&void 0!==a[d]&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},sa:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&a[d]!==b[d]&&(c[d]=a[d]);return c},ra:function(a,
|
||||
b){var c={},d;for(d=0;d<b.length;d++)void 0!==a[b[d]]&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.pa={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.pa,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=void 0===b.salt?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl});
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<p><%= l('Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.') %></p>
|
||||
<p><%= l('You can see the list of your files by clicking on the "My files" link at the top right of this page.') %></p>
|
||||
<h3><%= l('How to report an illegal file?') %></h3>
|
||||
<p><%= l('Please contact the administrator: %1', config('contact')) %></p>
|
||||
<p><%== l('Please contact the administrator: %1', config('contact')) %></p>
|
||||
<h3><%= l('Who wrote this software?') %></h3>
|
||||
<p><%== l('The original (and only for now) author is <a href="https://fiat-tux.fr" class="classic">Luc Didry</a>. If you want to support him, you can do it via <a href="https://www.tipeee.com/fiat-tux" class="classic">Tipeee</a> or via <a href="https://liberapay.com/sky/" class="classic">Liberapay</a>.') %><br>
|
||||
<%== l('A thank you with a photo of kitten on <a href="https://framasphere.org/people/b13eb6b0beac0131e7e32a0000053625" class="classic">Diaspora*</a> or <a href="https://framapiaf.org/@framasky" class="classic">Mastodon</a> is cool too ;-)') %></p>
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
<%= l('Rows in red mean that the files have expired and are no longer available.') %>
|
||||
</p>
|
||||
<div class="files-buttons">
|
||||
<a href="#" onclick="exportStorage();" class="btn left-mg cyan"><%= l('Export localStorage data') %></a>
|
||||
<a href="#" onclick="purgeExpired();" class="btn left-mg cyan"><%= l('Purge expired files from localStorage') %></a>
|
||||
<a href="#" onclick="$('#import').click();" class="btn left-mg cyan"><%= l('Import localStorage data') %></a>
|
||||
<a href="#" id="exportStorage" class="btn left-mg cyan"><%= l('Export localStorage data') %></a>
|
||||
<a href="#" id="purgeExpired" class="btn left-mg cyan"><%= l('Purge expired files from localStorage') %></a>
|
||||
<a href="#" id="clickImport" class="btn left-mg cyan"><%= l('Import localStorage data') %></a>
|
||||
<span class="file-field input-field">
|
||||
<input type="file" id="import" onchange="importStorage(this.files)">
|
||||
</span>
|
||||
<a href="#" onclick="massDelete()" class="btn left-mg cyan disabled" id="mass-delete" disabled><%= l('Delete selected files') %></a>
|
||||
<a href="#" class="btn left-mg cyan disabled" id="mass-delete" disabled><%= l('Delete selected files') %></a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
@ -38,16 +38,6 @@
|
|||
</table>
|
||||
</div>
|
||||
|
||||
%= javascript begin
|
||||
var baseURL = '<%== url_for('/')->to_abs() %>';
|
||||
var counterURL = '<%== url_for('counter') %>';
|
||||
var i18n = {
|
||||
noExpiration: '<%= l('No expiration delay') %>',
|
||||
importProcessed: '<%= l('The data has been successfully imported.') %>',
|
||||
};
|
||||
$(document).ready(function() {
|
||||
populateFilesTable();
|
||||
});
|
||||
% end
|
||||
%= javascript '/partial/files.js.ep'
|
||||
%= javascript '/js/lufi-files.js'
|
||||
%= javascript '/js/moment-with-locales.min.js'
|
||||
|
|
|
@ -23,6 +23,13 @@
|
|||
</div>
|
||||
</div>
|
||||
% }
|
||||
<div class="col s12 hiddendiv" id="not-enough-entropy">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('Your browser has not enough entropy to generate a strong encryption key. Please wait (it\'s better if you do things on your computer while waiting).') %></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% if (stop_upload) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
|
@ -59,8 +66,18 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<p class="col s12 m6 text-left">
|
||||
<input type="checkbox" id="first-view" data-checked="">
|
||||
% if ($self->config('force_burn_after_reading')) {
|
||||
<p class="col s12 m6 text-left like-label">
|
||||
<%= l('Files deleted at first download') %>
|
||||
</p>
|
||||
% }
|
||||
<p class="col s12 m6 text-left<%= ' hiddendiv' if $self->config('force_burn_after_reading') %>">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="first-view"
|
||||
data-checked="<%= 'data-checked' if $self->config('force_burn_after_reading') %>"
|
||||
<%= 'disabled="disabled"' if $self->config('force_burn_after_reading') %>
|
||||
>
|
||||
<label for="first-view"><%= l('Delete at first download?') %></label>
|
||||
</p>
|
||||
</div>
|
||||
|
@ -75,10 +92,11 @@
|
|||
</form>
|
||||
<div id="files">
|
||||
<h2><%= l('Drop files here') %></h2>
|
||||
<p id="max-file-size"></p>
|
||||
<p><small><%= l('or') %></small></p>
|
||||
<label>
|
||||
<span class="btn cyan waves-effect waves-light"><%= l('Click to open the file browser') %></span>
|
||||
<input type="file" onchange="handleFiles(this.files)" multiple>
|
||||
<span id="file-browser-span" class="btn disabled waves-effect waves-light"><%= l('Click to open the file browser') %></span>
|
||||
<input type="file" id="file-browser-button" multiple disabled>
|
||||
</label>
|
||||
</div>
|
||||
<div id="results">
|
||||
|
@ -88,33 +106,9 @@
|
|||
</ul>
|
||||
</div>
|
||||
%= include 'delays'
|
||||
%= javascript begin
|
||||
$(document).ready(function(){
|
||||
$('.modal-trigger').leanModal();
|
||||
$('select').material_select();
|
||||
});
|
||||
var ws_url = '<%= url_for('upload')->to_abs() %>';
|
||||
var baseURL = '<%= url_for('/')->to_abs() %>';
|
||||
var i18n = {
|
||||
confirmExit: '<%= l('You have attempted to leave this page. The upload will be canceled. Are you sure?') %>',
|
||||
copyAll: '<%= l('Copy all links to clipboard') %>',
|
||||
copySuccess: '<%= l('The link(s) has been copied to your clipboard') %>',
|
||||
copyFail: '<%= l('Unable to copy the link(s) to your clipboard') %>',
|
||||
cpText: '<%= l('Copy to clipboard') %>',
|
||||
delText: '<%= l('Deletion link') %>',
|
||||
dlText: '<%= l('Download link') %>',
|
||||
download: '<%= l('Download') %>',
|
||||
encrypting: '<%= l('Encrypting part XX1 of XX2') %>',
|
||||
expiration: '<%= l('Expiration:') %>',
|
||||
hit: '<%= l('Hit Enter, then Ctrl+C to copy the download link') %>',
|
||||
hits: '<%= l('Hit Enter, then Ctrl+C to copy all the download links') %>',
|
||||
mailTo: '<%= l('Send all links by email') %>',
|
||||
noLimit: '<%= l('No expiration delay') %>',
|
||||
sending: '<%= l('Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.') %>',
|
||||
wsProblem: '<%= l('Websocket communication error') %>',
|
||||
};
|
||||
% end
|
||||
%= javascript '/partial/index.js'
|
||||
%= javascript '/js/sjcl.js'
|
||||
%= javascript '/js/moment-with-locales.min.js'
|
||||
%= javascript '/js/filesize.min.js'
|
||||
%= javascript '/js/lufi-up.js'
|
||||
% }
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my $lang = $self->languages;
|
||||
% $lang =~ s/-(.*)/_\U$1/;
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
@ -17,63 +19,62 @@
|
|||
<link rel="apple-touch-icon-precomposed" sizes="128x128" href="<%= url_for('/img/lufi128.png') %>">
|
||||
%= stylesheet '/css/materialize.min.css'
|
||||
%= stylesheet '/css/lufi.css'
|
||||
%= javascript begin
|
||||
function confirmExit() {
|
||||
console.log(i18n.confirmExit);
|
||||
return i18n.confirmExit;
|
||||
}
|
||||
|
||||
// Is the browser IE?
|
||||
var isIE = /*@cc_on!@*/false || !!document.documentMode;
|
||||
|
||||
// If the browser is IE, add readAsBinaryString function and store the data
|
||||
if (isIE == true){
|
||||
if (FileReader.prototype.readAsBinaryString === undefined) {
|
||||
FileReader.prototype.readAsBinaryString = function (fileData) {
|
||||
var binary = "";
|
||||
var pt = this;
|
||||
var reader = new FileReader();
|
||||
reader.onload = function (e) {
|
||||
var bytes = new Uint8Array(reader.result);
|
||||
var length = bytes.byteLength;
|
||||
for (var i = 0; i < length; i++) {
|
||||
binary += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
//pt.result - readonly so assign content to another property
|
||||
pt.content = binary;
|
||||
$(pt).trigger('onloadend');
|
||||
}
|
||||
reader.readAsArrayBuffer(fileData);
|
||||
}
|
||||
}
|
||||
}
|
||||
% end
|
||||
%= javascript '/js/ie-detection.js'
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="cyan">
|
||||
<div class="nav-wrapper container">
|
||||
<a href="<%= url_for('/') %>" class="brand-logo"> <img src="<%= url_for('/img/lufi-min.png') %>" alt="logo"> Lufi</a>
|
||||
<a href="#" data-activates="mobile-demo" class="button-collapse"><i class="mdi-navigation-menu"></i></a>
|
||||
<a href="#" data-activates="mobile" class="button-collapse"><i class="mdi-navigation-menu"></i></a>
|
||||
<ul id="nav-mobile" class="right hide-on-med-and-down">
|
||||
<li><a href="<%= $self->config('report') %>"><%= l('Report file') %></a></li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li<%== ' class="active"' if (current_route eq 'index') %>><a href="<%= url_for('/') %>"><%= l('Upload files') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'files') %>><a href="<%= url_for('/files') %>"><%= l('My files') %></a></li>
|
||||
% } else {
|
||||
<li><a href="<%= url_for('/login') %>"><%= l('Signin') %></a></li>
|
||||
% }
|
||||
<li>
|
||||
<div class="input-field select-lang">
|
||||
<label class="hiddendiv"><%= l('Language') %></label>
|
||||
<select>
|
||||
<option value="" disabled selected><%= l('Language') %></option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>"><%= iso639_native_name($i) %></option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li<%== ' class="active"' if (current_route eq 'about') %>><a href="<%= url_for('/about') %>"><%= l('About') %></a></li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li><a href="<%= url_for('/logout') %>"><%= l('Logout') %></a></li>
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button class="btn-flat" type="submit"><%= l('Logout') %></button>
|
||||
</form>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
||||
<ul id="mobile-demo" class="side-nav">
|
||||
<ul id="mobile" class="side-nav">
|
||||
<li><a href="<%= $self->config('report') %>"><%= l('Report file') %></a></li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li<%== ' class="active"' if (current_route eq 'index') %>><a href="<%= url_for('/') %>"><%= l('Upload files') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'files') %>><a href="<%= url_for('/files') %>"><%= l('My files') %></a></li>
|
||||
% } else {
|
||||
<li><a href="<%= url_for('/login') %>"><%= l('Signin') %></a></li>
|
||||
% }
|
||||
<li>
|
||||
<div class="input-field select-lang-mobile">
|
||||
<label class="hiddendiv"><%= l('Language') %></label>
|
||||
<select>
|
||||
<option value="" disabled selected><%= l('Language') %></option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>"><%= iso639_native_name($i) %></option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li<%== ' class="active"' if (current_route eq 'about') %>><a href="<%= url_for('/about') %>"><%= l('About') %></a></li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li><a href="<%= url_for('/logout') %>"><%= l('Logout') %></a></li>
|
||||
|
@ -82,18 +83,15 @@
|
|||
</div>
|
||||
</nav>
|
||||
<div class="container">
|
||||
%= javascript '/js/jquery-2.1.1.min.js'
|
||||
%= javascript '/js/jquery-2.2.4.min.js'
|
||||
%= javascript '/partial/layout.js'
|
||||
%= javascript '/js/lufi-common.js'
|
||||
<%= content %>
|
||||
</div>
|
||||
% if (defined(config('piwik_img'))) {
|
||||
<img src="<%== config('piwik_img') %>" style="border:0" alt="" />
|
||||
<img src="<%== config('piwik_img') %>" class="no_border" alt="" />
|
||||
% }
|
||||
%= javascript '/js/materialize.js'
|
||||
%= javascript begin
|
||||
$(document).ready(function() {
|
||||
$(".button-collapse").sideNav();
|
||||
});
|
||||
%end
|
||||
%= javascript '/js/sidenav.js'
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
<label for="password"><%= l('Password') %></label>
|
||||
</div>
|
||||
</div>
|
||||
%= csrf_field
|
||||
<div class="col s8 m8 offset-s2 offset-m2">
|
||||
<button class="btn waves-effect waves-light" type="submit" name="action">
|
||||
<%= l('Signin') %>
|
||||
|
|
|
@ -1,4 +1,13 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% if (defined stash('msg')) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg') %></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% } else {
|
||||
<div class="col s12">
|
||||
<div class="card blue-grey darken-1">
|
||||
<div class="card-content white-text">
|
||||
|
@ -9,3 +18,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg')%></strong>
|
||||
<strong><%== stash('msg')%></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -13,6 +13,7 @@
|
|||
<div class="card cyan">
|
||||
<div class="card-content white-text">
|
||||
<p><%= l('If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.') %></p>
|
||||
<p><%= l('Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.') %></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -46,63 +47,5 @@
|
|||
<a href="#" class="btn btn-primary" id="mailto"><%= l('Send with your own mail software') %></a>
|
||||
</form>
|
||||
<div>
|
||||
%= javascript begin
|
||||
function findItem(name) {
|
||||
var files = localStorage.getItem('files');
|
||||
if (files === null) {
|
||||
files = new Array();
|
||||
} else {
|
||||
files = JSON.parse(files);
|
||||
}
|
||||
var i;
|
||||
for (i = 0; i < files.length; i++) {
|
||||
if (files[i].short === name) {
|
||||
return files[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
function updateMailtoLink() {
|
||||
var btn = document.getElementById('mailto');
|
||||
var emails = document.getElementById('emails');
|
||||
var subject = document.getElementById('subject');
|
||||
var text = document.getElementById('body');
|
||||
|
||||
btn.href = 'mailto:'+encodeURIComponent(emails.value)+'?subject='+encodeURIComponent(subject.value)+'&body='+encodeURIComponent(text.value);
|
||||
}
|
||||
function populateBody() {
|
||||
var links = [
|
||||
% for my $link (@{$links}) {
|
||||
'<%= $link %>',
|
||||
% }
|
||||
];
|
||||
var text = "<%== l('Hello,\n\nHere\'s some files I want to share with you:\n') %>";
|
||||
links.forEach(function(name, index, array) {
|
||||
var item = findItem(name);
|
||||
if (item !== null && item !== undefined) {
|
||||
var limit = (item.delay === 0) ? null : moment.unix(item.delay * 86400 + item.created_at).locale(window.navigator.language).format('LLLL');
|
||||
text = text+'- '+item.name+'<%= l(':') %> '+item.url;
|
||||
if (limit !== null) {
|
||||
text = text+"\n (<%= l('deadline: ') %>"+limit+')';
|
||||
}
|
||||
text = text+"\n";
|
||||
}
|
||||
});
|
||||
|
||||
text = text+"\n--\n<%= l('Share your files in total privacy on %1', url_for('/')->to_abs) %>";
|
||||
tArea = document.getElementById('body').value = text;
|
||||
updateMailtoLink();
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
% unless (defined(stash('msg')) || defined(stash('values'))) {
|
||||
populateBody();
|
||||
% }
|
||||
|
||||
var emails = document.getElementById('emails');
|
||||
var subject = document.getElementById('subject');
|
||||
var text = document.getElementById('body');
|
||||
emails.addEventListener('change', updateMailtoLink);
|
||||
subject.addEventListener('change', updateMailtoLink);
|
||||
text.addEventListener('change', updateMailtoLink);
|
||||
});
|
||||
% end
|
||||
%= javascript url_for('/partial/mail.js')->query(populate => (!defined(stash('msg')) && !defined(stash('values'))), links => $links)
|
||||
%= javascript '/js/moment-with-locales.min.js'
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
% if (defined($self->config('fixed_domain')) && $self->config('fixed_domain')) {
|
||||
var baseURL = '<%= url_for('/')->host($self->config('fixed_domain'))->to_abs() %>';
|
||||
% } else {
|
||||
var baseURL = '<%= url_for('/')->to_abs() %>';
|
||||
% }
|
||||
var actionURL = '<%= url_for('/')->to_abs() %>';
|
||||
var counterURL = '<%== url_for('counter') %>';
|
||||
var i18n = {
|
||||
noExpiration: '<%= l('No expiration delay') %>',
|
||||
importProcessed: '<%= l('The data has been successfully imported.') %>',
|
||||
};
|
||||
$(document).ready(function() {
|
||||
populateFilesTable();
|
||||
$('#exportStorage').on('click', exportStorage);
|
||||
$('#purgeExpired').on('click', purgeExpired);
|
||||
$('#clickImport').on('click', clickImport);
|
||||
$('#mass-delete').on('click', massDelete);
|
||||
});
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
$(document).ready(function(){
|
||||
$('.modal-trigger').leanModal();
|
||||
});
|
||||
var ws_url = '<%= url_for('upload')->to_abs() %>';
|
||||
% if (defined($self->config('fixed_domain')) && $self->config('fixed_domain')) {
|
||||
var baseURL = '<%= url_for('/')->host($self->config('fixed_domain'))->to_abs() %>';
|
||||
% } else {
|
||||
var baseURL = '<%= url_for('/')->to_abs() %>';
|
||||
% }
|
||||
var actionURL = '<%= url_for('/')->to_abs() %>';
|
||||
var i18n = {
|
||||
confirmExit: '<%= l('You have attempted to leave this page. The upload will be canceled. Are you sure?') %>',
|
||||
copyAll: '<%= l('Copy all links to clipboard') %>',
|
||||
copySuccess: '<%= l('The link(s) has been copied to your clipboard') %>',
|
||||
copyFail: '<%= l('Unable to copy the link(s) to your clipboard') %>',
|
||||
cpText: '<%= l('Copy to clipboard') %>',
|
||||
delText: '<%= l('Deletion link') %>',
|
||||
dlText: '<%= l('Download link') %>',
|
||||
download: '<%= l('Download') %>',
|
||||
encrypting: '<%= l('Encrypting part XX1 of XX2') %>',
|
||||
expiration: '<%= l('Expiration:') %>',
|
||||
hit: '<%= l('Hit Enter, then Ctrl+C to copy the download link') %>',
|
||||
hits: '<%= l('Hit Enter, then Ctrl+C to copy all the download links') %>',
|
||||
mailTo: '<%= l('Send all links by email') %>',
|
||||
maxSize: '<%= l('(max size: XXX)') %>',
|
||||
noLimit: '<%= l('No expiration delay') %>',
|
||||
sending: '<%= l('Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move.') %>',
|
||||
wsProblem: '<%= l('Websocket communication error') %>',
|
||||
};
|
||||
var maxSize = <%= config('max_file_size') || 0 %>;
|
|
@ -0,0 +1,2 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
var langUrl = '<%= url_for('lang') %>';
|
|
@ -0,0 +1,63 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
function findItem(name) {
|
||||
var files = localStorage.getItem('files');
|
||||
if (files === null) {
|
||||
files = new Array();
|
||||
} else {
|
||||
files = JSON.parse(files);
|
||||
}
|
||||
var i;
|
||||
for (i = 0; i < files.length; i++) {
|
||||
if (files[i].short === name) {
|
||||
return files[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
function updateMailtoLink() {
|
||||
var btn = document.getElementById('mailto');
|
||||
var emails = document.getElementById('emails');
|
||||
var subject = document.getElementById('subject');
|
||||
var text = document.getElementById('body');
|
||||
|
||||
btn.href = 'mailto:'+encodeURIComponent(emails.value)+'?subject='+encodeURIComponent(subject.value)+'&body='+encodeURIComponent(text.value);
|
||||
}
|
||||
function populateBody() {
|
||||
var links = [
|
||||
% my $ref = ref(stash('links'));
|
||||
% if ($ref eq 'ARRAY') {
|
||||
% for my $link (@{stash('links')}) {
|
||||
'<%= $link %>',
|
||||
% }
|
||||
% } else {
|
||||
'<%= stash('links') %>',
|
||||
% }
|
||||
];
|
||||
var text = "<%== l('Hello,\n\nHere\'s some files I want to share with you:\n') %>";
|
||||
links.forEach(function(name, index, array) {
|
||||
var item = findItem(name);
|
||||
if (item !== null && item !== undefined) {
|
||||
var limit = (item.delay === 0) ? null : moment.unix(item.delay * 86400 + item.created_at).locale(window.navigator.language).format('LLLL');
|
||||
text = text+'- '+item.name+'<%= l(':') %> '+item.url;
|
||||
if (limit !== null) {
|
||||
text = text+"\n (<%= l('deadline: ') %>"+limit+')';
|
||||
}
|
||||
text = text+"\n";
|
||||
}
|
||||
});
|
||||
|
||||
text = text+"\n--\n<%= l('Share your files in total privacy on %1', url_for('/')->to_abs) %>";
|
||||
tArea = document.getElementById('body').value = text;
|
||||
updateMailtoLink();
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
% if (stash('populate')) {
|
||||
populateBody();
|
||||
% }
|
||||
|
||||
var emails = document.getElementById('emails');
|
||||
var subject = document.getElementById('subject');
|
||||
var text = document.getElementById('body');
|
||||
emails.addEventListener('change', updateMailtoLink);
|
||||
subject.addEventListener('change', updateMailtoLink);
|
||||
text.addEventListener('change', updateMailtoLink);
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
var ws_url = '<%= url_for('download')->to_abs().stash('file') %>';
|
||||
var i18n = {
|
||||
aborted1: '<%= l('Download aborted.') %>',
|
||||
aborted2: '<%= l('Click here to refresh the page and restart the download.') %>',
|
||||
badkey: '<%= l('It seems that the key in your URL is incorrect. Please, verify your URL.') %>',
|
||||
confirmExit: '<%= l('You have attempted to leave this page. The download will be canceled. Are you sure?') %>',
|
||||
download: '<%= l('Get the file') %>',
|
||||
loading: '<%= l('Asking for file part XX1 of %1', stash('nbslices')) %>',
|
||||
nokey: '<%= l('You don\'t seem to have a key in your URL. You won\'t be able to decrypt the file. Download canceled.') %>',
|
||||
}
|
|
@ -33,7 +33,7 @@
|
|||
<p id="please-wait"><%= l('Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.') %></p>
|
||||
<p id="loading"></p>
|
||||
<div class="progress" id="pbd">
|
||||
<div id="pb" class="determinate" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;">
|
||||
<div id="pb" class="determinate" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
|
||||
<span id="pbt" class="sr-only">0%</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -41,18 +41,7 @@
|
|||
<div class="file-abort col s12<%= (stash('file_pwd')) ? ' hide' : '' %>">
|
||||
<a id="abort" class="waves-effect waves-light btn"><%= l('Abort') %></a>
|
||||
</div>
|
||||
%= javascript begin
|
||||
var ws_url = '<%= url_for('download')->to_abs() %>';
|
||||
var i18n = {
|
||||
aborted1: '<%= l('Download aborted.') %>',
|
||||
aborted2: '<%= l('Click here to refresh the page and restart the download.') %>',
|
||||
badkey: '<%= l('It seems that the key in your URL is incorrect. Please, verify your URL.') %>',
|
||||
confirmExit: '<%= l('You have attempted to leave this page. The download will be canceled. Are you sure?') %>',
|
||||
download: '<%= l('Get the file') %>',
|
||||
loading: '<%= l('Asking for file part XX1 of %1', stash('f')->nbslices) %>',
|
||||
nokey: '<%= l('You don\'t seem to have a key in your URL. You won\'t be able to decrypt the file. Download canceled.') %>',
|
||||
}
|
||||
% end
|
||||
%= javascript '/partial/render.js?nbslices='.stash('f')->nbslices.'&file='.stash('f')->short
|
||||
%= javascript '/js/filesize.min.js'
|
||||
%= javascript '/js/sjcl.js'
|
||||
%= javascript '/js/lufi-down.js'
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
-- 1 up
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
short varchar(255) PRIMARY KEY,
|
||||
deleted boolean default false,
|
||||
mediatype varchar(255),
|
||||
filename varchar(255),
|
||||
filesize integer,
|
||||
counter integer default 0,
|
||||
delete_at_first_view boolean,
|
||||
delete_at_day integer,
|
||||
created_at integer,
|
||||
created_by varchar(255),
|
||||
last_access_at integer,
|
||||
mod_token varchar(255),
|
||||
nbslices integer,
|
||||
complete boolean default false,
|
||||
passwd varchar(255),
|
||||
abuse integer
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS slices (
|
||||
short varchar(255) NOT NULL REFERENCES files(short) ON DELETE CASCADE,
|
||||
j integer NOT NULL,
|
||||
path varchar(255) unique NOT NULL,
|
||||
constraint slice_short_j UNIQUE (short, j)
|
||||
);
|
||||
-- 1 down
|
||||
DROP TABLE slices;
|
||||
DROP TABLE files;
|
|
@ -0,0 +1,32 @@
|
|||
-- 1 up
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
short text PRIMARY KEY,
|
||||
deleted boolean default false,
|
||||
mediatype text,
|
||||
filename text,
|
||||
filesize integer,
|
||||
counter integer default 0,
|
||||
delete_at_first_view boolean,
|
||||
delete_at_day integer,
|
||||
created_at integer,
|
||||
created_by text,
|
||||
last_access_at integer,
|
||||
mod_token text,
|
||||
nbslices integer,
|
||||
complete boolean default false,
|
||||
passwd text
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS slices (
|
||||
short text NOT NULL REFERENCES files(short) ON DELETE CASCADE,
|
||||
j integer NOT NULL,
|
||||
path text unique NOT NULL,
|
||||
constraint slice_short_j UNIQUE (short, j)
|
||||
);
|
||||
-- 1 down
|
||||
DROP TABLE slices;
|
||||
DROP TABLE files;
|
||||
-- 2 up
|
||||
ALTER TABLE files ADD COLUMN abuse integer;
|
||||
-- 2 down
|
||||
ALTER TABLE files DROP COLUMN abuse;
|
|
@ -0,0 +1,54 @@
|
|||
-- 1 up
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
short TEXT PRIMARY KEY,
|
||||
deleted INTEGER,
|
||||
mediatype TEXT,
|
||||
filename TEXT,
|
||||
filesize INTEGER,
|
||||
counter INTEGER,
|
||||
delete_at_first_view INTEGER,
|
||||
delete_at_day INTEGER,
|
||||
created_at INTEGER,
|
||||
created_by TEXT,
|
||||
last_access_at INTEGER,
|
||||
mod_token TEXT,
|
||||
nbslices INTEGER,
|
||||
complete INTEGER,
|
||||
passwd TEXT
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS slices (
|
||||
short TEXT,
|
||||
j INTEGER,
|
||||
path TEXT,
|
||||
FOREIGN KEY (short) REFERENCES files(short)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS slices_idx ON slices(short);
|
||||
-- 1 down
|
||||
DROP INDEX slices_idx ON slices(short);
|
||||
DROP TABLE slices;
|
||||
DROP TABLE files;
|
||||
-- 2 up
|
||||
ALTER TABLE files ADD COLUMN abuse INTEGER;
|
||||
-- 2 down
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE files_backup (
|
||||
short TEXT PRIMARY KEY,
|
||||
deleted INTEGER,
|
||||
mediatype TEXT,
|
||||
filename TEXT,
|
||||
filesize INTEGER,
|
||||
counter INTEGER,
|
||||
delete_at_first_view INTEGER,
|
||||
delete_at_day INTEGER,
|
||||
created_at INTEGER,
|
||||
created_by TEXT,
|
||||
last_access_at INTEGER,
|
||||
mod_token TEXT,
|
||||
nbslices INTEGER,
|
||||
complete INTEGER,
|
||||
passwd TEXT
|
||||
);
|
||||
INSERT INTO files_backup SELECT short, deleted, mediatype, filename, filesize, counter, delete_at_first_view, delete_at_day, created_at, created_by, last_access_at, mod_token, nbslices, complete, passwd FROM files;
|
||||
DROP TABLE files;
|
||||
ALTER TABLE files_backup RENAME TO files;
|
||||
COMMIT;
|
|
@ -1,28 +0,0 @@
|
|||
-- 1 up
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
short text PRIMARY KEY,
|
||||
deleted boolean default false,
|
||||
mediatype text,
|
||||
filename text,
|
||||
filesize integer,
|
||||
counter integer default 0,
|
||||
delete_at_first_view boolean,
|
||||
delete_at_day integer,
|
||||
created_at integer,
|
||||
created_by text,
|
||||
last_access_at integer,
|
||||
mod_token text,
|
||||
nbslices integer,
|
||||
complete boolean default false,
|
||||
passwd text
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS slices (
|
||||
short text NOT NULL REFERENCES files(short) ON DELETE CASCADE,
|
||||
j integer NOT NULL,
|
||||
path text unique NOT NULL,
|
||||
constraint slice_short_j UNIQUE (short, j)
|
||||
);
|
||||
-- 1 down
|
||||
DROP TABLE slices;
|
||||
DROP TABLE files;
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<config xmlns="http://zanata.org/namespace/config/">
|
||||
<url>https://trad.framasoft.org/</url>
|
||||
<project>lufi</project>
|
||||
<project-type>gettext</project-type>
|
||||
<src-dir>themes/default/lib/Lufi/I18N/</src-dir>
|
||||
<trans-dir>themes/default/lib/Lufi/I18N/</trans-dir>
|
||||
</config>
|
Loading…
Reference in New Issue