mirror of
https://framagit.org/fiat-tux/hat-softwares/lutim.git
synced 2026-03-28 17:42:54 +01:00
Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95c5620178 | ||
|
|
117d619056 | ||
|
|
717b0562c2 | ||
|
|
64492955ff | ||
|
|
54b461617e | ||
|
|
46fcc036e6 | ||
|
|
e14cdd2ca1 | ||
|
|
bd72394835 | ||
|
|
476dcfc4ff | ||
|
|
98326f53b2 | ||
|
|
202c529983 | ||
|
|
e0fc6cfe9f | ||
|
|
3c8d69f746 | ||
|
|
ddbf43d11a | ||
|
|
c72ba813c2 | ||
|
|
9f5bb58eb5 | ||
|
|
f42ab6c532 | ||
|
|
a09c2af956 | ||
|
|
b5c6acaa70 | ||
|
|
037afeaade | ||
|
|
9364601ee9 | ||
|
|
3e73d58325 | ||
|
|
1e93cf9cc5 | ||
|
|
81e3a00f14 | ||
|
|
ac76032745 | ||
|
|
c62bf20a92 | ||
|
|
b862249c0c | ||
|
|
aaa0ae4858 | ||
|
|
8d20b3d934 | ||
|
|
9563e3a701 | ||
|
|
8f5b1df337 | ||
|
|
e77943b1cc | ||
|
|
0617683c63 | ||
|
|
81701b6f60 | ||
|
|
82f57fc72d | ||
|
|
4de01f5f8b | ||
|
|
7e15ca9174 | ||
|
|
5c0504d5d4 | ||
|
|
0080e26333 | ||
|
|
f5867f4fd6 | ||
|
|
03f63e4ec6 | ||
|
|
2a466f0140 | ||
|
|
613ba30752 | ||
|
|
125a7103a0 | ||
|
|
9477e1add1 | ||
|
|
03dbeecac0 | ||
|
|
a76b240ed8 | ||
|
|
5d6f715396 | ||
|
|
5bf1a9d717 | ||
|
|
fff56a89bb | ||
|
|
2cb07f8565 | ||
|
|
ebf9f66e47 | ||
|
|
ed70fbac2e | ||
|
|
af11a1e7ec | ||
|
|
438ce5050e |
@@ -1,6 +1,6 @@
|
||||
image: hatsoftwares/lutim-test-ci:latest
|
||||
stages:
|
||||
- publish_changelog
|
||||
- create_release
|
||||
- pouet_it
|
||||
- podcheck
|
||||
- carton
|
||||
@@ -63,8 +63,8 @@ variables:
|
||||
##
|
||||
#
|
||||
include:
|
||||
- 'https://framagit.org/fiat-tux/gitlabci-snippets/raw/4e4e03322e95e9b0124c714456ebf1bdc02ad43f/publish_changelog.gitlab-ci.yml'
|
||||
- 'https://framagit.org/fiat-tux/gitlabci-snippets/raw/4e4e03322e95e9b0124c714456ebf1bdc02ad43f/pouet-it-from-ci.gitlab-ci.yml'
|
||||
- 'https://framagit.org/fiat-tux/gitlabci-snippets/-/raw/2aac6c1f3dd725d9aed57549da67a92759f9f9ec/create-release-from-ci.gitlab-ci.yml'
|
||||
- 'https://framagit.org/fiat-tux/gitlabci-snippets/-/raw/41345a919d3c927991782f5fd17e0c7b338a3f3a/pouet-it-from-ci.gitlab-ci.yml'
|
||||
|
||||
### Podcheck
|
||||
##
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
|
||||
25
CHANGELOG
25
CHANGELOG
@@ -1,6 +1,29 @@
|
||||
Revision history for Lutim
|
||||
|
||||
0.15.0 ????-??-??
|
||||
0.19.0 ????-??-??
|
||||
|
||||
0.18.0 2025-10-13
|
||||
- 🌐 — Update translations
|
||||
- 📦 — Update alpine version by @ploc
|
||||
- 🔧 — Ability to configure MOJO_TMPDIR via environment by @s7b4
|
||||
|
||||
0.17.0 2023-12-30
|
||||
- 🐛 — AVIF format support (#139)
|
||||
- ✨ — Allow to configure the directory where to store the images (#125)
|
||||
- ✨ — Ask for confirmation before deleting image on index page (#92)
|
||||
- ✨ — Mass delete button in "My images" page (#47)
|
||||
- ♿ — Improve accessibility on index page
|
||||
|
||||
0.16.0 2023-12-29
|
||||
- ⬆️ Update jQuery
|
||||
- 💥 BREAKING CHANGE: no more twitter cards
|
||||
- 🎨 — Use template literals in js
|
||||
- 🐛 — Gallery, zip and random URLs are now updated when closing image dialog box
|
||||
— ➖ — Replace moment.js with Date().toLocaleDateString(…)
|
||||
- 🩹 — Replace old URL of the project
|
||||
|
||||
0.15.0 2023-12-19
|
||||
- ✨ — Add --nuke option to image command
|
||||
|
||||
0.14.0 2023-12-18
|
||||
- ⬆️ Update dependencies
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Contributing
|
||||
|
||||
See how to contribute on the [wiki](https://framagit.org/luc/lutim/wikis/contribute).
|
||||
See how to contribute on the [wiki](https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/contribute).
|
||||
|
||||
14
Dockerfile
14
Dockerfile
@@ -1,13 +1,13 @@
|
||||
FROM alpine:3.15
|
||||
FROM alpine:3.22
|
||||
|
||||
ARG BUILD_DATE
|
||||
ARG VCS_REF
|
||||
ARG VERSION
|
||||
LABEL org.label-schema.build-date=$BUILD_DATE \
|
||||
org.label-schema.name="Lets Upload That Image" \
|
||||
org.label-schema.url="https://lut.im/" \
|
||||
org.label-schema.url="https://lutim.fiat-tux.fr/" \
|
||||
org.label-schema.vcs-ref=$VCS_REF \
|
||||
org.label-schema.vcs-url="https://git.framasoft.org/luc/lutim" \
|
||||
org.label-schema.vcs-url="https://framagit.org/fiat-tux/hat-softwares/lutim" \
|
||||
org.label-schema.vendor="Luc Didry" \
|
||||
org.label-schema.version=$VERSION \
|
||||
org.label-schema.schema-version="1.0"
|
||||
@@ -20,7 +20,7 @@ RUN chmod -R g+rwX /home/lutim
|
||||
|
||||
WORKDIR /home/lutim
|
||||
RUN apk --no-cache add perl~=5 \
|
||||
libpq~=14 \
|
||||
libpq~=17 \
|
||||
perl-crypt-rijndael~=1 \
|
||||
perl-io-socket-ssl~=2 \
|
||||
perl-net-ssleay~=1 \
|
||||
@@ -33,8 +33,8 @@ RUN apk --no-cache add perl~=5 \
|
||||
&& apk --no-cache add --virtual .build-deps build-base~=0.5 \
|
||||
perl-utils~=5 \
|
||||
perl-dev~=5 \
|
||||
postgresql14-dev~=14 \
|
||||
vim~=8 \
|
||||
postgresql17-dev~=17 \
|
||||
vim~=9 \
|
||||
wget~=1 \
|
||||
zlib-dev~=1 \
|
||||
&& cpan notest Carton Config::FromHash \
|
||||
@@ -45,4 +45,4 @@ RUN apk --no-cache add perl~=5 \
|
||||
USER lutim
|
||||
EXPOSE 8080
|
||||
|
||||
ENTRYPOINT ["/bin/sh", "/home/lutim/docker/entrypoint.sh"]
|
||||
ENTRYPOINT ["/bin/sh", "/home/lutim/docker/entrypoint.sh"]
|
||||
|
||||
1
Makefile
1
Makefile
@@ -13,7 +13,6 @@ minify:
|
||||
@cd ./themes/default/public/css/ && cat bootstrap.min.css fontello.css hennypenny.css lutim.css toastify.css | csso > common.min.css
|
||||
@cd ./themes/default/public/css/ && cat animation.css uploader.css markdown.css | csso > not_stats.min.css
|
||||
@cd ./themes/default/public/css/ && cat photoswipe.css default-skin/default-skin.css | csso > gallery.min.css
|
||||
@cd ./themes/default/public/css/ && cat twitter.css | csso > twitter.min.css
|
||||
|
||||
locales:
|
||||
$(XGETTEXT) $(EXTRACTDIR) -o $(POT) 2>/dev/null
|
||||
|
||||
15
README.md
15
README.md
@@ -4,27 +4,24 @@
|
||||
It means Let's Upload That Image.
|
||||
|
||||
## What does it do?
|
||||
It stores images and allows you to see them, download them or share them on social networks. From version 0.5, the gif images can be displayed as animated gifs in Twitter, but you need an HTTPS server (Twitter requires that. Lutim detects if you have a HTTPS server and displays a static image twitter card if you don't);
|
||||
It stores images and allows you to see them, download them or share them on social networks.
|
||||
|
||||
Images are indefinitely stored unless you request that they will be deleted at first view or after 24 hours / one week / one month / one year.
|
||||
|
||||
## License
|
||||
Lutim is licensed under the terms of the AGPL. See the LICENSE file.
|
||||
|
||||
## Official instance
|
||||
You can see it working at https://lut.im.
|
||||
|
||||
## Logo
|
||||
Lutim's logo is an adaptation of [Lutin](http://commons.wikimedia.org/wiki/File:Lutin_by_godo.jpg) by [Godo](http://godoillustrateur.wordpress.com/), licensed under the terms of the CC-BY-SA 3.0 license.
|
||||
|
||||

|
||||

|
||||
|
||||
## Wiki
|
||||
|
||||
The official wiki contains all you need to know about Lutim (installation, API, etc.). Go to <https://framagit.org/luc/lutim/wikis/home> or clone it:
|
||||
The official wiki contains all you need to know about Lutim (installation, API, etc.). Go to <https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/home> or clone it:
|
||||
|
||||
```
|
||||
git clone https://framagit.org/luc/lutim.wiki.git
|
||||
git clone https://framagit.org/fiat-tux/hat-softwares/lutim.wiki.git
|
||||
```
|
||||
|
||||
## Encryption
|
||||
@@ -43,9 +40,9 @@ See [AUTHORS.md](AUTHORS.md) file.
|
||||
|
||||
## Contribute!
|
||||
|
||||
Please consider contributing, either by [reporting issues](https://framagit.org/luc/lutim/issues) or by helping the [internationalization](https://weblate.framasoft.org/projects/lutim/). And of course, code contribution are welcome!
|
||||
Please consider contributing, either by [reporting issues](https://framagit.org/fiat-tux/hat-softwares/lutim/issues) or by helping the [internationalization](https://weblate.framasoft.org/projects/lutim/). And of course, code contribution are welcome!
|
||||
|
||||
The details on how to contribute are on the [wiki](https://framagit.org/luc/lutim/wikis/contribute).
|
||||
The details on how to contribute are on the [wiki](https://framagit.org/fiat-tux/hat-softwares/lutim/wikis/contribute).
|
||||
|
||||
## Make a donation
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ BEGIN {
|
||||
}
|
||||
}
|
||||
|
||||
$ENV{MOJO_TMPDIR} = 'tmp';
|
||||
$ENV{MOJO_TMPDIR} = 'tmp' unless (defined $ENV{MOJO_TMPDIR});
|
||||
mkdir($ENV{MOJO_TMPDIR}, 0700) unless (-d $ENV{MOJO_TMPDIR});
|
||||
# This method will run once at server start
|
||||
sub startup {
|
||||
@@ -109,6 +109,10 @@ sub startup {
|
||||
$self->plugin('Lutim::Plugin::Helpers');
|
||||
$self->plugin('Lutim::Plugin::Lang');
|
||||
|
||||
# Create directory if needed
|
||||
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'));
|
||||
|
||||
# Minion
|
||||
if ($config->{minion}->{enabled}) {
|
||||
$self->config->{minion}->{dbtype} = 'sqlite' unless defined $config->{minion}->{dbtype};
|
||||
|
||||
@@ -198,11 +198,11 @@ var disabled_donut = {
|
||||
};
|
||||
EOF
|
||||
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/stats.json.ep')->spurt(encode_json($stats));
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/data.html.ep')->spurt($dom);
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/raw.html.ep')->spurt(encode('UTF-8', $dom2));
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/stats.json.ep')->spew(encode_json($stats));
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/data.html.ep')->spew($dom);
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/raw.html.ep')->spew(encode('UTF-8', $dom2));
|
||||
mkdir 'themes/'.$config->{theme}.'/templates/partial/' unless -d 'themes/'.$config->{theme}.'/templates/partial/';
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/partial/raw.js.ep')->spurt(encode('UTF-8', $js));
|
||||
Mojo::File->new('themes/'.$config->{theme}.'/templates/partial/raw.js.ep')->spew(encode('UTF-8', $js));
|
||||
}
|
||||
|
||||
=encoding utf8
|
||||
|
||||
@@ -46,7 +46,8 @@ sub run {
|
||||
'r|remove=s{1,}' => \my @remove,
|
||||
'y|yes' => \my $yes,
|
||||
'q|quiet' => \my $quiet,
|
||||
's|search=s' => \my $ip
|
||||
's|search=s' => \my $ip,
|
||||
'n|nuke=s' => \my $nuke,
|
||||
;
|
||||
|
||||
if (scalar @info) {
|
||||
@@ -85,9 +86,43 @@ sub run {
|
||||
push @shorts, $e->short;
|
||||
print_infos($e, $csv);
|
||||
});
|
||||
say sprintf('%d matching URLs', $u->size);
|
||||
say sprintf('%d matching images', $u->size);
|
||||
say sprintf("If you want to delete those images, please do:\n carton exec script/lutim image --remove %s", join(' ', @shorts)) if @shorts;
|
||||
}
|
||||
if ($nuke) {
|
||||
my $i = get_short($c, $nuke);
|
||||
if ($i && $i->created_by) {
|
||||
my $u = Lutim::DB::Image->new(app => $c->app)->search_exact_created_by($i->created_by);
|
||||
my @shorts;
|
||||
say sprintf('%d images created by the same IP address (%s) than image %s', $u->size, $i->created_by, $nuke);
|
||||
my $confirm = ($yes) ? 'yes' : undef;
|
||||
unless (defined $confirm) {
|
||||
printf('Are you sure you want to remove those %d images? [N/y] ', $u->size);
|
||||
$confirm = <STDIN>;
|
||||
chomp $confirm;
|
||||
}
|
||||
if ($confirm =~ m/^y(es)?$/i) {
|
||||
$u->each(sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = get_short($c, $e->short);
|
||||
if ($i) {
|
||||
print_infos($i, $csv);
|
||||
if ($i->enabled) {
|
||||
delete_short($c, $i, 1);
|
||||
} else {
|
||||
say sprintf('The image %s is already disabled', $e->short);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
say 'Answer was not "y" or "yes". Aborting deletion.';
|
||||
}
|
||||
} elsif (! $i->created_by) {
|
||||
say sprintf('Image %s does not contain its creator’s IP address.', $nuke);
|
||||
} else {
|
||||
say sprintf('Sorry, can’t find image %s', $nuke);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub get_short {
|
||||
@@ -168,7 +203,7 @@ sub delete_short {
|
||||
|
||||
my $confirm = ($y) ? 'yes' : undef;
|
||||
unless (defined $confirm) {
|
||||
printf('Are you sure you want to remove this image (%s) ? [N/y] ', $i->short);
|
||||
printf('Are you sure you want to remove this image (%s)? [N/y] ', $i->short);
|
||||
$confirm = <STDIN>;
|
||||
chomp $confirm;
|
||||
}
|
||||
@@ -191,6 +226,7 @@ Lutim::Command::image - Manage URL in Lutim's database
|
||||
carton exec script/lutim image --info <short> <short> [--csv] Print infos about the space-separated images (--csv creates a CSV output)
|
||||
carton exec script/lutim image --remove <short> <short> [--yes] [--quiet] Delete the space-separated images (--yes disables confirmation, --quiet disables informations printing)
|
||||
carton exec script/lutim image --search <ip> Print infos about the images uploaded by this IP (database LIKE, may include images uploaded by other IPs)
|
||||
carton exec script/lutim image --nuke <short> Delete the image and all images sent by the same IP address and print infos about the deleted images
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package Lutim::Controller::Image;
|
||||
use Mojo::Asset::Memory;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Mojo::File qw(path);
|
||||
use Mojo::Util qw(url_escape url_unescape b64_encode encode);
|
||||
use Mojo::JSON qw(true false);
|
||||
use Lutim::DB::Image;
|
||||
@@ -312,8 +313,8 @@ sub add {
|
||||
sleep($c->config->{anti_flood_delay});
|
||||
}
|
||||
my $ua = Mojo::UserAgent->new;
|
||||
my $tx = $ua->get($file_url => {DNT => 1});
|
||||
if (my $res = $tx->success) {
|
||||
my $res = $ua->get($file_url => {DNT => 1})->result;
|
||||
if ($res->is_success) {
|
||||
$file_url = url_unescape $file_url;
|
||||
$file_url =~ m#^.*/([^/?]*)\??.*$#;
|
||||
my $filename = $1;
|
||||
@@ -324,8 +325,8 @@ sub add {
|
||||
filename => $filename
|
||||
);
|
||||
$c->app->{wait_for_it}->{$ip} = time;
|
||||
} elsif ($tx->res->is_limit_exceeded) {
|
||||
my $msg = $c->l('The file exceed the size limit (%1)', $tx->res->max_message_size);
|
||||
} elsif ($res->is_limit_exceeded) {
|
||||
my $msg = $c->l('The file exceed the size limit (%1)', $res->max_message_size);
|
||||
if (defined($c->param('format')) && $c->param('format') eq 'json') {
|
||||
return $c->render(
|
||||
json => {
|
||||
@@ -343,7 +344,7 @@ sub add {
|
||||
}
|
||||
} else {
|
||||
my $msg = $c->l('An error occured while downloading the image.');
|
||||
$c->app->log->warn('[DOWNLOAD ERROR]'.$c->dumper($tx->error));
|
||||
$c->app->log->warn('[DOWNLOAD ERROR]'.$c->dumper($res->message));
|
||||
if (defined($c->param('format')) && $c->param('format') eq 'json') {
|
||||
return $c->render(
|
||||
json => {
|
||||
@@ -390,9 +391,6 @@ sub add {
|
||||
my ($msg, $short, $real_short, $token, $thumb, $limit, $created);
|
||||
# Check file type
|
||||
if (index($mediatype, 'image/') >= 0) {
|
||||
# Create directory if needed
|
||||
mkdir('files', 0700) unless (-d 'files');
|
||||
|
||||
if ($c->req->is_limit_exceeded) {
|
||||
$msg = $c->l('The file exceed the size limit (%1)', $c->req->max_message_size);
|
||||
if (defined($c->param('format')) && $c->param('format') eq 'json') {
|
||||
@@ -413,10 +411,12 @@ sub add {
|
||||
# Save file and create record
|
||||
my $filename = unidecode($upload->filename);
|
||||
my $ext = ($filename =~ m/([^.]+)$/)[0];
|
||||
my $path = 'files/'.$record->short.'.'.$ext;
|
||||
my $path = path($c->config('upload_dir'), $record->short.'.'.$ext)->to_string;
|
||||
|
||||
my ($width, $height);
|
||||
if ($im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?)
|
||||
if ($im_loaded && $mediatype ne 'image/svg+xml' # ImageMagick doesn't work with SVG, xcf or avif files
|
||||
&& $mediatype !~ m#image/(x-)?xcf#
|
||||
&& $mediatype ne 'image/avif') {
|
||||
my $im = Image::Magick->new;
|
||||
$im->BlobToImage($upload->slurp);
|
||||
|
||||
@@ -484,7 +484,9 @@ sub add {
|
||||
}
|
||||
|
||||
unless (defined($keep_exif) && $keep_exif) {
|
||||
if ($mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') {
|
||||
# Exiftool can’t process SVG or xcf files
|
||||
if ($mediatype ne 'image/svg+xml'
|
||||
&& $mediatype !~ m#image/(x-)?xcf#) {
|
||||
# Remove the EXIF tags
|
||||
my $data = new IO::Scalar \$upload->slurp();
|
||||
my $et = Image::ExifTool->new;
|
||||
@@ -642,7 +644,7 @@ sub short {
|
||||
if ($image->mediatype eq 'image/gif') {
|
||||
if (defined($image->width) && defined($image->height)) {
|
||||
($width, $height) = ($image->width, $image->height);
|
||||
} elsif ($im_loaded) {
|
||||
} elsif ($im_loaded && $image->mediatype !~ m/xcf|avif/) {
|
||||
my $upload = $c->decrypt($key, $image->path, $image->iv);
|
||||
my $im = Image::Magick->new;
|
||||
$im->BlobToImage($upload->slurp);
|
||||
@@ -655,11 +657,11 @@ sub short {
|
||||
}
|
||||
}
|
||||
return $c->render(
|
||||
template => 'twitter',
|
||||
template => 'share',
|
||||
layout => undef,
|
||||
short => $short,
|
||||
filename => $image->filename,
|
||||
mimetype => ($c->req->url->to_abs()->scheme eq 'https') ? $image->mediatype : '',
|
||||
mimetype => $image->mediatype,
|
||||
width => $width,
|
||||
height => $height
|
||||
);
|
||||
|
||||
@@ -345,6 +345,20 @@ sub to_hash {
|
||||
|
||||
=back
|
||||
|
||||
=head2 search_exact_created_by
|
||||
|
||||
=over 1
|
||||
|
||||
=item B<Usage> : C<$c-E<gt>search_exact_created_by($ip)>
|
||||
|
||||
=item B<Arguments> : an IP address
|
||||
|
||||
=item B<Purpose> : get enabled images that have been uploaded by this IP address
|
||||
|
||||
=item B<Returns> : a Mojo::Collection object containing the matching images as Lutim::DB::Image objects
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
||||
|
||||
@@ -213,6 +213,27 @@ sub search_created_by {
|
||||
return c(@images);
|
||||
}
|
||||
|
||||
sub search_exact_created_by {
|
||||
my $c = shift;
|
||||
my $ip = shift;
|
||||
|
||||
my @images;
|
||||
|
||||
my $records = $c->app->pg->db->select('lutim', undef, { enabled => 1, created_by => $ip })->hashes;
|
||||
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lutim::DB::Image->new(app => $c->app);
|
||||
$i->_slurp($e);
|
||||
|
||||
push @images, $i;
|
||||
}
|
||||
);
|
||||
|
||||
return c(@images);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
@@ -214,6 +214,27 @@ sub search_created_by {
|
||||
return c(@images);
|
||||
}
|
||||
|
||||
sub search_exact_created_by {
|
||||
my $c = shift;
|
||||
my $ip = shift;
|
||||
|
||||
my @images;
|
||||
|
||||
my $records = $c->app->sqlite->db->select('lutim', undef, { enabled => 1, created_by => $ip })->hashes;
|
||||
|
||||
$records->each(
|
||||
sub {
|
||||
my ($e, $num) = @_;
|
||||
my $i = Lutim::DB::Image->new(app => $c->app);
|
||||
$i->_slurp($e);
|
||||
|
||||
push @images, $i;
|
||||
}
|
||||
);
|
||||
|
||||
return c(@images);
|
||||
}
|
||||
|
||||
sub _slurp {
|
||||
my $c = shift;
|
||||
my $r = shift;
|
||||
|
||||
@@ -23,6 +23,7 @@ our $default_config = {
|
||||
watermark_enforce => 'none',
|
||||
theme => 'default',
|
||||
disable_api => 0,
|
||||
upload_dir => 'files',
|
||||
dbtype => 'sqlite',
|
||||
db_path => 'lutim.db',
|
||||
max_files_in_zip => 15,
|
||||
|
||||
@@ -144,7 +144,7 @@ sub _render_file {
|
||||
my $asset = Mojo::Asset::Memory->new;
|
||||
$asset->add_chunk($cache->{asset});
|
||||
|
||||
if (defined $thumb && $im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?)
|
||||
if (defined $thumb && $im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/avif') { # ImageMagick don't work in Debian with svg (for now?)
|
||||
my $im = Image::Magick->new;
|
||||
$im->BlobToImage($asset->slurp);
|
||||
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, no default
|
||||
#tweet_card_via => '@foo',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -139,6 +134,15 @@
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored.
|
||||
# You can define it relative to lutim directory or set an absolute path.
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you move the images in an other directory (if you keep the old directory
|
||||
# where it was, you have nothing to do).
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -244,7 +248,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -159,6 +189,29 @@
|
||||
# }
|
||||
#},
|
||||
|
||||
# set `ldap` if you want that only authenticated users can shorten URLs
|
||||
# please note that everybody can still use shortend URLs
|
||||
# optional, no default
|
||||
#ldap => {
|
||||
# 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.)
|
||||
#},
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# create the file with `htpasswd -c lutim.passwd user`, update it with `htpasswd lutim.passwd user2`
|
||||
# make sure that lutim can read the file!
|
||||
# optional, no default
|
||||
#htpasswd => 'lutim.passwd',
|
||||
|
||||
# if you've set ldap or htpasswd above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# disable counters of images
|
||||
# set to 1 to disable counters
|
||||
# optional, counters are enabled by default
|
||||
@@ -194,7 +247,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +258,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +268,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +277,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -159,6 +189,29 @@
|
||||
# }
|
||||
},
|
||||
|
||||
# set `ldap` if you want that only authenticated users can shorten URLs
|
||||
# please note that everybody can still use shortend URLs
|
||||
# optional, no default
|
||||
#ldap => {
|
||||
# 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.)
|
||||
#},
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# create the file with `htpasswd -c lutim.passwd user`, update it with `htpasswd lutim.passwd user2`
|
||||
# make sure that lutim can read the file!
|
||||
# optional, no default
|
||||
#htpasswd => 'lutim.passwd',
|
||||
|
||||
# if you've set ldap or htpasswd above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# disable counters of images
|
||||
# set to 1 to disable counters
|
||||
# optional, counters are enabled by default
|
||||
@@ -194,7 +247,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +258,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +268,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +277,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -194,7 +224,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +235,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +245,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +254,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -159,6 +189,29 @@
|
||||
# }
|
||||
#},
|
||||
|
||||
# set `ldap` if you want that only authenticated users can shorten URLs
|
||||
# please note that everybody can still use shortend URLs
|
||||
# optional, no default
|
||||
#ldap => {
|
||||
# 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.)
|
||||
#},
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# create the file with `htpasswd -c lutim.passwd user`, update it with `htpasswd lutim.passwd user2`
|
||||
# make sure that lutim can read the file!
|
||||
# optional, no default
|
||||
#htpasswd => 'lutim.passwd',
|
||||
|
||||
# if you've set ldap or htpasswd above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# disable counters of images
|
||||
# set to 1 to disable counters
|
||||
# optional, counters are enabled by default
|
||||
@@ -194,7 +247,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +258,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +268,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +277,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -159,6 +189,29 @@
|
||||
# }
|
||||
},
|
||||
|
||||
# set `ldap` if you want that only authenticated users can shorten URLs
|
||||
# please note that everybody can still use shortend URLs
|
||||
# optional, no default
|
||||
#ldap => {
|
||||
# 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.)
|
||||
#},
|
||||
|
||||
# set `htpasswd` if you want to use an htpasswd file instead of ldap
|
||||
# create the file with `htpasswd -c lutim.passwd user`, update it with `htpasswd lutim.passwd user2`
|
||||
# make sure that lutim can read the file!
|
||||
# optional, no default
|
||||
#htpasswd => 'lutim.passwd',
|
||||
|
||||
# if you've set ldap or htpasswd above, the session will last `session_duration` seconds before
|
||||
# the user needs to reauthenticate
|
||||
# optional, default is 3600
|
||||
#session_duration => 3600,
|
||||
|
||||
# disable counters of images
|
||||
# set to 1 to disable counters
|
||||
# optional, counters are enabled by default
|
||||
@@ -194,7 +247,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +258,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +268,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +277,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -49,11 +49,6 @@
|
||||
# optional, default is 5
|
||||
#anti_flood_delay => 5,
|
||||
|
||||
# twitter account which will appear on twitter cards
|
||||
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
|
||||
# optional, default is @framasky
|
||||
#tweet_card_via => '@framasky',
|
||||
|
||||
# max image size, in octets
|
||||
# you can write it 10*1024*1024
|
||||
# optional, default is 10485760
|
||||
@@ -102,6 +97,29 @@
|
||||
# optional, default is 0
|
||||
#always_encrypt => 0,
|
||||
|
||||
# you can allow to use a watermark on the uploaded images (or enforce its use)
|
||||
# define a path to the watermark image (provide an image with alpha channel)
|
||||
# you can define the path relative to lutim directory or set an absolute path
|
||||
# to disable the usage of a watermark, leave it blank or commented
|
||||
# optional, no default
|
||||
#watermark_path => '',
|
||||
|
||||
# the watermark can be a tiling one or a single one
|
||||
# when using a small one, you can choose where to place it
|
||||
# valid values are 'Center', 'North', 'NorthEast', 'East', 'SouthEast', 'South', 'SouthWest', 'West' and 'NorthWest' (case insensitive)
|
||||
# optional, default is 'SouthEast'
|
||||
#watermark_placement => 'SouthEast',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be used by default
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_default => 'none',
|
||||
|
||||
# choose which watermark (tiling, single or none) should be enforced (users will always have a watermark and won’t be able to disable it)
|
||||
# valid values are 'tiling', 'single' or 'none' (case insensitive)
|
||||
# optional, default is 'none'
|
||||
#watermark_enforce => 'none',
|
||||
|
||||
# length of the image's delete token
|
||||
# optional, default is 24
|
||||
#token_length => 24,
|
||||
@@ -112,6 +130,18 @@
|
||||
# optional, defaut is /
|
||||
#prefix => '/',
|
||||
|
||||
# if set to 1, Lutim will try to prevent its use without using the web interface
|
||||
# optional, default is 0
|
||||
#disable_api => 0,
|
||||
|
||||
# Define a path to the upload directory, where the uploaded images will be stored
|
||||
# You can define it relative to lutim directory or set an absolute path
|
||||
# The path is stored in database for each uploaded file, so you’ll need to do some
|
||||
# SQL commands if you change the upload_dir after getting images uploaded.
|
||||
# Remember that it has to be in a directory writable by Lutim user
|
||||
# optional, default is 'files'
|
||||
#upload_dir => 'files',
|
||||
|
||||
# choose what database you want to use
|
||||
# valid choices are sqlite and postgresql (all lowercase)
|
||||
# optional, default is sqlite
|
||||
@@ -194,7 +224,7 @@
|
||||
# array of memcached servers to cache URL in order to accelerate responses to often-viewed URL.
|
||||
# If set to [], the use of memcached is disabled.
|
||||
# If you use memcached, the internal cache (see cache_max_size option above) will not be used.
|
||||
# Please see https://framagit.org/luc/lutim/wikis/memcached to know how to configure your memcached
|
||||
# Please see https://framagit.org/fiat-tux/hat-softwares/lutim/-/wikis/memcached to know how to configure your memcached
|
||||
# servers.
|
||||
# exemple of valid value: ['127.0.0.1:11211']
|
||||
# optional, default is []
|
||||
@@ -205,7 +235,7 @@
|
||||
# optional, default is 0
|
||||
#quiet_logs => 0,
|
||||
|
||||
# Content-Security-Policy header that will be sent by Lstu
|
||||
# Content-Security-Policy header that will be sent by Lutim
|
||||
# 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.
|
||||
@@ -215,7 +245,7 @@
|
||||
# the default value is good for `default` theme
|
||||
#csp => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'",
|
||||
|
||||
# X-Frame-Options header that will be sent by Lstu
|
||||
# X-Frame-Options header that will be sent by Lutim
|
||||
# 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
|
||||
@@ -224,18 +254,22 @@
|
||||
# optional, default is 'DENY'
|
||||
#x_frame_options => 'DENY',
|
||||
|
||||
# X-Content-Type-Options that will be sent by Lstu
|
||||
# X-Content-Type-Options that will be sent by Lutim
|
||||
# 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 Lstu
|
||||
# X-XSS-Protection that will be sent by Lutim
|
||||
# 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',
|
||||
|
||||
# if set, the uploaded images will use this domain
|
||||
# optional
|
||||
#fixed_domain => 'example.org',
|
||||
|
||||
##########################
|
||||
# Lutim cron jobs settings
|
||||
##########################
|
||||
|
||||
@@ -265,12 +265,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "هل هو مجاني (كما في عبارة مشروب مجاني) ؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"يُنطق مِثل الكلمة الفرنسية <a href=\"https://fr.wikipedia.org/wiki/"
|
||||
"Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "يُنطق مِثل الكلمة الفرنسية <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
|
||||
@@ -264,12 +264,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Is es wirklich kostenlos?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Genauso wie das französische Wort <a href=\"https://fr.wikipedia.org/wiki/"
|
||||
"Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Genauso wie das französische Wort <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
|
||||
@@ -18,7 +18,7 @@ msgstr ""
|
||||
#. (30)
|
||||
#. ($delay)
|
||||
#. (config('max_delay')
|
||||
#: lib/Lutim/Command/cron/stats.pm:156 lib/Lutim/Command/cron/stats.pm:157 lib/Lutim/Command/cron/stats.pm:170 lib/Lutim/Command/cron/stats.pm:171 lib/Lutim/Command/cron/stats.pm:187 lib/Lutim/Command/cron/stats.pm:188 themes/default/templates/myfiles.html.ep:24 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:34 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/for_my_delay.html.ep:14 themes/default/templates/partial/for_my_delay.html.ep:4 themes/default/templates/partial/lutim.js.ep:140 themes/default/templates/partial/lutim.js.ep:149 themes/default/templates/partial/lutim.js.ep:150 themes/default/templates/partial/raw.js.ep:23 themes/default/templates/partial/raw.js.ep:24 themes/default/templates/partial/raw.js.ep:6 themes/default/templates/partial/raw.js.ep:7 themes/default/templates/raw.html.ep:8 themes/default/templates/raw.html.ep:9
|
||||
#: lib/Lutim/Command/cron/stats.pm:156 lib/Lutim/Command/cron/stats.pm:157 lib/Lutim/Command/cron/stats.pm:170 lib/Lutim/Command/cron/stats.pm:171 lib/Lutim/Command/cron/stats.pm:187 lib/Lutim/Command/cron/stats.pm:188 themes/default/templates/myfiles.html.ep:24 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:34 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/for_my_delay.html.ep:14 themes/default/templates/partial/for_my_delay.html.ep:4 themes/default/templates/partial/lutim.js.ep:129 themes/default/templates/partial/lutim.js.ep:138 themes/default/templates/partial/lutim.js.ep:139
|
||||
msgid "%1 days"
|
||||
msgstr "%1 days"
|
||||
|
||||
@@ -27,31 +27,31 @@ msgstr "%1 days"
|
||||
msgid "%1 sent images on this instance from beginning."
|
||||
msgstr "%1 sent images on this instance from beginning."
|
||||
|
||||
#: themes/default/templates/index.html.ep:228
|
||||
#: themes/default/templates/index.html.ep:227
|
||||
msgid "-or-"
|
||||
msgstr "-or-"
|
||||
|
||||
#: lib/Lutim.pm:342 lib/Lutim/Command/cron/stats.pm:158 lib/Lutim/Command/cron/stats.pm:172 lib/Lutim/Command/cron/stats.pm:189 themes/default/templates/index.html.ep:5 themes/default/templates/myfiles.html.ep:5 themes/default/templates/partial/raw.js.ep:25 themes/default/templates/partial/raw.js.ep:8 themes/default/templates/raw.html.ep:10
|
||||
#: lib/Lutim.pm:346 lib/Lutim/Command/cron/stats.pm:158 lib/Lutim/Command/cron/stats.pm:172 lib/Lutim/Command/cron/stats.pm:189 themes/default/templates/index.html.ep:5 themes/default/templates/myfiles.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr "1 year"
|
||||
|
||||
#: lib/Lutim.pm:341 lib/Lutim/Command/cron/stats.pm:155 lib/Lutim/Command/cron/stats.pm:169 lib/Lutim/Command/cron/stats.pm:186 themes/default/templates/index.html.ep:4 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:4 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/lutim.js.ep:149 themes/default/templates/partial/raw.js.ep:22 themes/default/templates/partial/raw.js.ep:5 themes/default/templates/raw.html.ep:7
|
||||
#: lib/Lutim.pm:345 lib/Lutim/Command/cron/stats.pm:155 lib/Lutim/Command/cron/stats.pm:169 lib/Lutim/Command/cron/stats.pm:186 themes/default/templates/index.html.ep:4 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:4 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/lutim.js.ep:138
|
||||
msgid "24 hours"
|
||||
msgstr "24 hours"
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:210
|
||||
#: themes/default/templates/partial/myfiles.js.ep:245
|
||||
msgid ": Error while trying to get the counter."
|
||||
msgstr ": Error while trying to get the counter."
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:63
|
||||
#: themes/default/templates/partial/navbar.html.ep:65
|
||||
msgid "About"
|
||||
msgstr "About"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:151 themes/default/templates/raw.html.ep:3
|
||||
#: lib/Lutim/Command/cron/stats.pm:151
|
||||
msgid "Active images"
|
||||
msgstr "Active images"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:329
|
||||
#: lib/Lutim/Controller/Image.pm:346
|
||||
msgid "An error occured while downloading the image."
|
||||
msgstr "An error occured while downloading the image."
|
||||
|
||||
@@ -59,11 +59,15 @@ msgstr "An error occured while downloading the image."
|
||||
msgid "Archives download"
|
||||
msgstr "Archives download"
|
||||
|
||||
#: themes/default/templates/about.html.ep:44 themes/default/templates/myfiles.html.ep:129 themes/default/templates/stats.html.ep:25
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Are you sure you want to delete the image ${short}?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:44 themes/default/templates/myfiles.html.ep:130 themes/default/templates/stats.html.ep:25
|
||||
msgid "Back to homepage"
|
||||
msgstr "Back to homepage"
|
||||
|
||||
#: themes/default/templates/index.html.ep:231 themes/default/templates/index.html.ep:232
|
||||
#: themes/default/templates/index.html.ep:230 themes/default/templates/index.html.ep:231
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "Click to open the file browser"
|
||||
|
||||
@@ -83,15 +87,15 @@ msgstr "Contributors"
|
||||
msgid "Copied to clipboard"
|
||||
msgstr "Copied to clipboard"
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:215 themes/default/templates/partial/lutim.js.ep:278 themes/default/templates/partial/lutim.js.ep:364
|
||||
#: themes/default/templates/partial/lutim.js.ep:206 themes/default/templates/partial/lutim.js.ep:267 themes/default/templates/partial/lutim.js.ep:354
|
||||
msgid "Copy all view links to clipboard"
|
||||
msgstr "Copy all view links to clipboard"
|
||||
|
||||
#: themes/default/templates/index.html.ep:105 themes/default/templates/index.html.ep:16 themes/default/templates/index.html.ep:32 themes/default/templates/index.html.ep:48 themes/default/templates/index.html.ep:81 themes/default/templates/index.html.ep:89 themes/default/templates/index.html.ep:97 themes/default/templates/myfiles.html.ep:66 themes/default/templates/myfiles.html.ep:82 themes/default/templates/myfiles.html.ep:98 themes/default/templates/partial/common.js.ep:186 themes/default/templates/partial/lutim.js.ep:106 themes/default/templates/partial/lutim.js.ep:121 themes/default/templates/partial/lutim.js.ep:80 themes/default/templates/partial/lutim.js.ep:92 themes/default/templates/partial/myfiles.js.ep:172
|
||||
#: themes/default/templates/index.html.ep:104 themes/default/templates/index.html.ep:16 themes/default/templates/index.html.ep:32 themes/default/templates/index.html.ep:48 themes/default/templates/index.html.ep:80 themes/default/templates/index.html.ep:88 themes/default/templates/index.html.ep:96 themes/default/templates/myfiles.html.ep:66 themes/default/templates/myfiles.html.ep:82 themes/default/templates/myfiles.html.ep:98 themes/default/templates/partial/common.js.ep:209 themes/default/templates/partial/lutim.js.ep:110 themes/default/templates/partial/lutim.js.ep:70 themes/default/templates/partial/lutim.js.ep:82 themes/default/templates/partial/lutim.js.ep:96 themes/default/templates/partial/myfiles.js.ep:183
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Copy to clipboard"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:117
|
||||
#: themes/default/templates/myfiles.html.ep:118
|
||||
msgid "Counter"
|
||||
msgstr "Counter"
|
||||
|
||||
@@ -103,19 +107,23 @@ msgstr "Delay repartition chart for disabled images"
|
||||
msgid "Delay repartition chart for enabled images"
|
||||
msgstr "Delay repartition chart for enabled images"
|
||||
|
||||
#: themes/default/templates/index.html.ep:127 themes/default/templates/index.html.ep:159 themes/default/templates/index.html.ep:203 themes/default/templates/myfiles.html.ep:118 themes/default/templates/myfiles.html.ep:45 themes/default/templates/partial/lutim.js.ep:161
|
||||
#: themes/default/templates/index.html.ep:126 themes/default/templates/index.html.ep:158 themes/default/templates/index.html.ep:202 themes/default/templates/myfiles.html.ep:119 themes/default/templates/myfiles.html.ep:45 themes/default/templates/partial/lutim.js.ep:150
|
||||
msgid "Delete at first view?"
|
||||
msgstr "Delete at first view?"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:152 themes/default/templates/raw.html.ep:4
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr "Delete selected images"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:152
|
||||
msgid "Deleted images"
|
||||
msgstr "Deleted images"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:153 themes/default/templates/raw.html.ep:5
|
||||
#: lib/Lutim/Command/cron/stats.pm:153
|
||||
msgid "Deleted images in 30 days"
|
||||
msgstr "Deleted images in 30 days"
|
||||
|
||||
#: themes/default/templates/index.html.ep:110 themes/default/templates/myfiles.html.ep:121 themes/default/templates/partial/common.js.ep:178 themes/default/templates/partial/common.js.ep:181
|
||||
#: themes/default/templates/index.html.ep:109 themes/default/templates/myfiles.html.ep:122 themes/default/templates/partial/common.js.ep:195 themes/default/templates/partial/common.js.ep:200
|
||||
msgid "Deletion link"
|
||||
msgstr "Deletion link"
|
||||
|
||||
@@ -123,7 +131,7 @@ msgstr "Deletion link"
|
||||
msgid "Download all images"
|
||||
msgstr "Download all images"
|
||||
|
||||
#: themes/default/templates/index.html.ep:93 themes/default/templates/index.html.ep:95 themes/default/templates/partial/lutim.js.ep:102 themes/default/templates/partial/lutim.js.ep:98
|
||||
#: themes/default/templates/index.html.ep:92 themes/default/templates/index.html.ep:94 themes/default/templates/partial/lutim.js.ep:88 themes/default/templates/partial/lutim.js.ep:92
|
||||
msgid "Download link"
|
||||
msgstr "Download link"
|
||||
|
||||
@@ -131,7 +139,7 @@ msgstr "Download link"
|
||||
msgid "Download zip link"
|
||||
msgstr "Download zip link"
|
||||
|
||||
#: themes/default/templates/index.html.ep:227
|
||||
#: themes/default/templates/index.html.ep:226
|
||||
msgid "Drag & drop images here"
|
||||
msgstr "Drag & drop images here"
|
||||
|
||||
@@ -139,11 +147,11 @@ msgstr "Drag & drop images here"
|
||||
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
|
||||
msgstr "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
|
||||
|
||||
#: themes/default/templates/index.html.ep:162 themes/default/templates/index.html.ep:206
|
||||
#: themes/default/templates/index.html.ep:161 themes/default/templates/index.html.ep:205
|
||||
msgid "Encrypt the image (Lutim does not keep the key)."
|
||||
msgstr "Encrypt the image (Lutim does not keep the key)."
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:45 themes/default/templates/partial/myfiles.js.ep:128
|
||||
#: themes/default/templates/partial/lutim.js.ep:38 themes/default/templates/partial/myfiles.js.ep:129
|
||||
msgid "Error while trying to modify the image."
|
||||
msgstr "Error while trying to modify the image."
|
||||
|
||||
@@ -151,7 +159,7 @@ msgstr "Error while trying to modify the image."
|
||||
msgid "Evolution of total files"
|
||||
msgstr "Evolution of total files"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:120
|
||||
#: themes/default/templates/myfiles.html.ep:121
|
||||
msgid "Expires at"
|
||||
msgstr "Expires at"
|
||||
|
||||
@@ -159,7 +167,7 @@ msgstr "Expires at"
|
||||
msgid "Export localStorage data"
|
||||
msgstr "Export localStorage data"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:115
|
||||
#: themes/default/templates/myfiles.html.ep:116
|
||||
msgid "File name"
|
||||
msgstr "File name"
|
||||
|
||||
@@ -167,7 +175,7 @@ msgstr "File name"
|
||||
msgid "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-softwares/lutim\">homepage of the project</a>."
|
||||
msgstr "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-softwares/lutim\">homepage of the project</a>."
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:66
|
||||
#: themes/default/templates/partial/navbar.html.ep:68
|
||||
msgid "Fork me!"
|
||||
msgstr "Fork me!"
|
||||
|
||||
@@ -179,7 +187,7 @@ msgstr "Gallery link"
|
||||
msgid "Hit Ctrl+C, then Enter to copy the short link"
|
||||
msgstr "Hit Ctrl+C, then Enter to copy the short link"
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:47
|
||||
#: themes/default/templates/layouts/default.html.ep:46
|
||||
msgid "Homepage"
|
||||
msgstr "Homepage"
|
||||
|
||||
@@ -199,19 +207,19 @@ msgstr "How to report an image?"
|
||||
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
|
||||
msgstr "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
|
||||
|
||||
#: themes/default/templates/index.html.ep:188 themes/default/templates/index.html.ep:241
|
||||
#: themes/default/templates/index.html.ep:187 themes/default/templates/index.html.ep:240
|
||||
msgid "Image URL"
|
||||
msgstr "Image URL"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:150 themes/default/templates/raw.html.ep:2
|
||||
#: lib/Lutim/Command/cron/stats.pm:150
|
||||
msgid "Image delay"
|
||||
msgstr "Image delay"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:157
|
||||
#: themes/default/templates/partial/common.js.ep:172
|
||||
msgid "Image deleted"
|
||||
msgstr "Image deleted"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:799
|
||||
#: lib/Lutim/Controller/Image.pm:815
|
||||
msgid "Image not found."
|
||||
msgstr "Image not found."
|
||||
|
||||
@@ -219,7 +227,7 @@ msgstr "Image not found."
|
||||
msgid "Import localStorage data"
|
||||
msgstr "Import localStorage data"
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:55
|
||||
#: themes/default/templates/partial/navbar.html.ep:57
|
||||
msgid "Informations"
|
||||
msgstr "Informations"
|
||||
|
||||
@@ -239,27 +247,23 @@ msgstr "Is it really anonymous?"
|
||||
msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Is it really free (as in free beer)?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:165 themes/default/templates/index.html.ep:209
|
||||
#: themes/default/templates/index.html.ep:164 themes/default/templates/index.html.ep:208
|
||||
msgid "Keep EXIF tags"
|
||||
msgstr "Keep EXIF tags"
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:43
|
||||
#: themes/default/templates/partial/navbar.html.ep:43 themes/default/templates/partial/navbar.html.ep:44
|
||||
msgid "Language"
|
||||
msgstr "Language"
|
||||
|
||||
#: themes/default/templates/index.html.ep:130 themes/default/templates/index.html.ep:191 themes/default/templates/index.html.ep:244 themes/default/templates/partial/lutim.js.ep:165
|
||||
#: themes/default/templates/index.html.ep:129 themes/default/templates/index.html.ep:190 themes/default/templates/index.html.ep:243 themes/default/templates/partial/lutim.js.ep:157
|
||||
msgid "Let's go!"
|
||||
msgstr "Let's go!"
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:60
|
||||
#: themes/default/templates/partial/navbar.html.ep:62
|
||||
msgid "License:"
|
||||
msgstr "License:"
|
||||
|
||||
#: themes/default/templates/index.html.ep:101 themes/default/templates/index.html.ep:103 themes/default/templates/partial/lutim.js.ep:112 themes/default/templates/partial/lutim.js.ep:116
|
||||
#: themes/default/templates/index.html.ep:100 themes/default/templates/index.html.ep:102 themes/default/templates/partial/lutim.js.ep:102 themes/default/templates/partial/lutim.js.ep:106
|
||||
msgid "Link for share on social networks"
|
||||
msgstr "Link for share on social networks"
|
||||
|
||||
@@ -283,11 +287,11 @@ msgstr "Lutim is a free (as in free beer) and anonymous image hosting service. I
|
||||
msgid "Main developers"
|
||||
msgstr "Main developers"
|
||||
|
||||
#: themes/default/templates/index.html.ep:85 themes/default/templates/index.html.ep:87 themes/default/templates/partial/lutim.js.ep:86 themes/default/templates/partial/lutim.js.ep:89
|
||||
#: themes/default/templates/index.html.ep:84 themes/default/templates/index.html.ep:86 themes/default/templates/partial/lutim.js.ep:76 themes/default/templates/partial/lutim.js.ep:79
|
||||
msgid "Markdown syntax"
|
||||
msgstr "Markdown syntax"
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:179
|
||||
#: themes/default/templates/partial/myfiles.js.ep:200
|
||||
msgid "Modify expiration delay"
|
||||
msgstr "Modify expiration delay"
|
||||
|
||||
@@ -299,15 +303,15 @@ msgstr "My images"
|
||||
msgid "Next (arrow right)"
|
||||
msgstr "Next (arrow right)"
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:120 themes/default/templates/partial/myfiles.js.ep:162
|
||||
#: themes/default/templates/partial/myfiles.js.ep:121 themes/default/templates/partial/myfiles.js.ep:163
|
||||
msgid "No limit"
|
||||
msgstr "No limit"
|
||||
|
||||
#: themes/default/templates/index.html.ep:177 themes/default/templates/index.html.ep:221
|
||||
#: themes/default/templates/index.html.ep:176 themes/default/templates/index.html.ep:220
|
||||
msgid "No watermark"
|
||||
msgstr "No watermark"
|
||||
|
||||
#: themes/default/templates/index.html.ep:190 themes/default/templates/index.html.ep:236
|
||||
#: themes/default/templates/index.html.ep:189 themes/default/templates/index.html.ep:235
|
||||
msgid "Only images are allowed"
|
||||
msgstr "Only images are allowed"
|
||||
|
||||
@@ -352,7 +356,7 @@ msgstr "Raw stats"
|
||||
msgid "Save changes"
|
||||
msgstr "Save changes"
|
||||
|
||||
#: themes/default/templates/index.html.ep:183
|
||||
#: themes/default/templates/index.html.ep:182
|
||||
msgid "Send an image"
|
||||
msgstr "Send an image"
|
||||
|
||||
@@ -360,19 +364,23 @@ msgstr "Send an image"
|
||||
msgid "Signin"
|
||||
msgstr "Signin"
|
||||
|
||||
#: themes/default/templates/index.html.ep:174 themes/default/templates/index.html.ep:218
|
||||
#: themes/default/templates/index.html.ep:173 themes/default/templates/index.html.ep:217
|
||||
msgid "Single watermark"
|
||||
msgstr "Single watermark"
|
||||
|
||||
#: themes/default/templates/index.html.ep:145 themes/default/templates/partial/gallery.js.ep:211 themes/default/templates/partial/lutim.js.ep:176
|
||||
#: themes/default/templates/index.html.ep:144 themes/default/templates/partial/gallery.js.ep:210 themes/default/templates/partial/lutim.js.ep:166
|
||||
msgid "Something bad happened"
|
||||
msgstr "Something bad happened"
|
||||
|
||||
#. ($c->config('contact')
|
||||
#: lib/Lutim/Controller/Image.pm:806
|
||||
#: lib/Lutim/Controller/Image.pm:822
|
||||
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
|
||||
msgstr "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "Sorry, the API is disabled"
|
||||
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
|
||||
msgstr "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
|
||||
@@ -381,7 +389,7 @@ msgstr "The IP address of the image's sender is retained for a delay which depen
|
||||
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
|
||||
msgstr "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:348
|
||||
#: lib/Lutim/Controller/Image.pm:365
|
||||
msgid "The URL is not valid."
|
||||
msgstr "The URL is not valid."
|
||||
|
||||
@@ -393,19 +401,19 @@ msgstr "The automatic download process will open a tab in your browser for each
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr "The data has been successfully imported."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:160 lib/Lutim/Controller/Image.pm:228
|
||||
#: lib/Lutim/Controller/Image.pm:161 lib/Lutim/Controller/Image.pm:229
|
||||
msgid "The delete token is invalid."
|
||||
msgstr "The delete token is invalid."
|
||||
|
||||
#. ($upload->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:531
|
||||
#: lib/Lutim/Controller/Image.pm:547
|
||||
msgid "The file %1 is not an image."
|
||||
msgstr "The file %1 is not an image."
|
||||
|
||||
#. ($tx->res->max_message_size)
|
||||
#. ($res->max_message_size)
|
||||
#. ($c->req->max_message_size)
|
||||
#. (config('max_file_size')
|
||||
#: lib/Lutim/Controller/Image.pm:312 lib/Lutim/Controller/Image.pm:381 themes/default/templates/partial/lutim.js.ep:249
|
||||
#: lib/Lutim/Controller/Image.pm:329 lib/Lutim/Controller/Image.pm:395 themes/default/templates/partial/lutim.js.ep:239
|
||||
msgid "The file exceed the size limit (%1)"
|
||||
msgstr "The file exceed the size limit (%1)"
|
||||
|
||||
@@ -414,12 +422,12 @@ msgid "The graph's datas are not updated in real-time."
|
||||
msgstr "The graph's datas are not updated in real-time."
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:230
|
||||
#: lib/Lutim/Controller/Image.pm:231
|
||||
msgid "The image %1 has already been deleted."
|
||||
msgstr "The image %1 has already been deleted."
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:239 lib/Lutim/Controller/Image.pm:244
|
||||
#: lib/Lutim/Controller/Image.pm:240 lib/Lutim/Controller/Image.pm:245
|
||||
msgid "The image %1 has been successfully deleted"
|
||||
msgstr "The image %1 has been successfully deleted"
|
||||
|
||||
@@ -431,20 +439,25 @@ msgstr "The images are encrypted on the server (Lutim does not keep the key)."
|
||||
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
|
||||
msgstr "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:168
|
||||
#: lib/Lutim/Controller/Image.pm:169
|
||||
msgid "The image’s delay has been successfully modified"
|
||||
msgstr "The image’s delay has been successfully modified"
|
||||
|
||||
#: themes/default/templates/partial/gallery.js.ep:277
|
||||
#. ('https://fr.wikipedia.org/wiki/Lutin')
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/partial/gallery.js.ep:271
|
||||
msgid "There is XXXX image(s) in the gallery"
|
||||
msgstr "There is XXXX image(s) in the gallery"
|
||||
|
||||
#. ($c->config->{contact})
|
||||
#: lib/Lutim/Controller/Image.pm:528
|
||||
#: lib/Lutim/Controller/Image.pm:544
|
||||
msgid "There is no more available URL. Retry or contact the administrator. %1"
|
||||
msgstr "There is no more available URL. Retry or contact the administrator. %1"
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:215
|
||||
#: themes/default/templates/index.html.ep:170 themes/default/templates/index.html.ep:214
|
||||
msgid "Tiling watermark"
|
||||
msgstr "Tiling watermark"
|
||||
|
||||
@@ -456,11 +469,11 @@ msgstr "Toggle fullscreen"
|
||||
msgid "Toggle navigation"
|
||||
msgstr "Toggle navigation"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:159 themes/default/templates/raw.html.ep:11
|
||||
#: lib/Lutim/Command/cron/stats.pm:159
|
||||
msgid "Total"
|
||||
msgstr "Total"
|
||||
|
||||
#: themes/default/templates/index.html.ep:72 themes/default/templates/partial/lutim.js.ep:17
|
||||
#:
|
||||
msgid "Tweet it!"
|
||||
msgstr "Tweet it!"
|
||||
|
||||
@@ -469,15 +482,15 @@ msgid "Unable to copy to clipboard"
|
||||
msgstr "Unable to copy to clipboard"
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lutim/Controller/Image.pm:108 lib/Lutim/Controller/Image.pm:202 lib/Lutim/Controller/Image.pm:273
|
||||
#: lib/Lutim/Controller/Image.pm:109 lib/Lutim/Controller/Image.pm:203 lib/Lutim/Controller/Image.pm:274
|
||||
msgid "Unable to find the image %1."
|
||||
msgstr "Unable to find the image %1."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:617 lib/Lutim/Controller/Image.pm:662 lib/Lutim/Controller/Image.pm:703 lib/Lutim/Controller/Image.pm:746 lib/Lutim/Controller/Image.pm:758 lib/Lutim/Controller/Image.pm:769 lib/Lutim/Controller/Image.pm:796 lib/Lutim/Plugin/Helpers.pm:89
|
||||
#: lib/Lutim/Controller/Image.pm:633 lib/Lutim/Controller/Image.pm:678 lib/Lutim/Controller/Image.pm:719 lib/Lutim/Controller/Image.pm:762 lib/Lutim/Controller/Image.pm:774 lib/Lutim/Controller/Image.pm:785 lib/Lutim/Controller/Image.pm:812 lib/Lutim/Plugin/Helpers.pm:90
|
||||
msgid "Unable to find the image: it has been deleted."
|
||||
msgstr "Unable to find the image: it has been deleted."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:145
|
||||
#: lib/Lutim/Controller/Image.pm:146
|
||||
msgid "Unable to get counter"
|
||||
msgstr "Unable to get counter"
|
||||
|
||||
@@ -485,11 +498,11 @@ msgstr "Unable to get counter"
|
||||
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
|
||||
msgstr "Unlike many image sharing services, you don't give us rights on uploaded images."
|
||||
|
||||
#: themes/default/templates/index.html.ep:187 themes/default/templates/index.html.ep:239
|
||||
#: themes/default/templates/index.html.ep:186 themes/default/templates/index.html.ep:238
|
||||
msgid "Upload an image with its URL"
|
||||
msgstr "Upload an image with its URL"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:119
|
||||
#: themes/default/templates/myfiles.html.ep:120
|
||||
msgid "Uploaded at"
|
||||
msgstr "Uploaded at"
|
||||
|
||||
@@ -498,11 +511,11 @@ msgid "Uploaded files by days"
|
||||
msgstr "Uploaded files by days"
|
||||
|
||||
#. ($c->app->config('contact')
|
||||
#: lib/Lutim/Plugin/Helpers.pm:222
|
||||
#: lib/Lutim/Plugin/Helpers.pm:223
|
||||
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
|
||||
msgstr "Uploading is currently disabled, please try later or contact the administrator (%1)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:77 themes/default/templates/index.html.ep:79 themes/default/templates/myfiles.html.ep:116 themes/default/templates/partial/lutim.js.ep:72 themes/default/templates/partial/lutim.js.ep:76
|
||||
#: themes/default/templates/index.html.ep:76 themes/default/templates/index.html.ep:78 themes/default/templates/myfiles.html.ep:117 themes/default/templates/partial/lutim.js.ep:62 themes/default/templates/partial/lutim.js.ep:66
|
||||
msgid "View link"
|
||||
msgstr "View link"
|
||||
|
||||
@@ -558,7 +571,7 @@ msgstr "arabic translation"
|
||||
msgid "core developer"
|
||||
msgstr "core developer"
|
||||
|
||||
#: lib/Lutim.pm:340 lib/Lutim/Command/cron/stats.pm:154 lib/Lutim/Command/cron/stats.pm:168 lib/Lutim/Command/cron/stats.pm:185 themes/default/templates/index.html.ep:3 themes/default/templates/myfiles.html.ep:3 themes/default/templates/partial/raw.js.ep:21 themes/default/templates/partial/raw.js.ep:4 themes/default/templates/raw.html.ep:6
|
||||
#: lib/Lutim.pm:344 lib/Lutim/Command/cron/stats.pm:154 lib/Lutim/Command/cron/stats.pm:168 lib/Lutim/Command/cron/stats.pm:185 themes/default/templates/index.html.ep:3 themes/default/templates/myfiles.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr "no time limit"
|
||||
|
||||
|
||||
@@ -179,14 +179,6 @@ msgstr "Exportar datos de almacenamiento local"
|
||||
msgid "File name"
|
||||
msgstr "Nombre de archivo"
|
||||
|
||||
#: themes/default/templates/about.html.ep:24
|
||||
msgid ""
|
||||
"For more details, see the <a href=\"https://framagit.org/luc/"
|
||||
"lutim\">homepage of the project</a>."
|
||||
msgstr ""
|
||||
"Para más detalles, vea la <a href=\"https://framagit.org/luc/lutim\">página "
|
||||
"del proyecto</a>."
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:80
|
||||
msgid "Fork me!"
|
||||
msgstr "¡Clóname!"
|
||||
@@ -264,12 +256,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "¿Es realmente gratis?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Tal y como se pronuncia la palabra francesa <a href=\"https://fr.wikipedia."
|
||||
"org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Tal y como se pronuncia la palabra francesa <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
|
||||
600
themes/default/lib/Lutim/I18N/fa.po
Normal file
600
themes/default/lib/Lutim/I18N/fa.po
Normal file
@@ -0,0 +1,600 @@
|
||||
# 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.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2024-06-04 21:20+0000\n"
|
||||
"Last-Translator: Goudarz Jafari <goudarz.jafari@gmail.com>\n"
|
||||
"Language-Team: Persian <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/fa/>\n"
|
||||
"Language: fa\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.5.5\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
#. ($delay)
|
||||
#. (config('max_delay')
|
||||
#: lib/Lutim/Command/cron/stats.pm:156 lib/Lutim/Command/cron/stats.pm:157 lib/Lutim/Command/cron/stats.pm:170 lib/Lutim/Command/cron/stats.pm:171 lib/Lutim/Command/cron/stats.pm:187 lib/Lutim/Command/cron/stats.pm:188 themes/default/templates/myfiles.html.ep:24 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:34 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/for_my_delay.html.ep:14 themes/default/templates/partial/for_my_delay.html.ep:4 themes/default/templates/partial/lutim.js.ep:129 themes/default/templates/partial/lutim.js.ep:138 themes/default/templates/partial/lutim.js.ep:139 themes/default/templates/partial/raw.js.ep:23 themes/default/templates/partial/raw.js.ep:24 themes/default/templates/partial/raw.js.ep:6 themes/default/templates/partial/raw.js.ep:7 themes/default/templates/raw.html.ep:8 themes/default/templates/raw.html.ep:9
|
||||
msgid "%1 days"
|
||||
msgstr "%1 روز"
|
||||
|
||||
#. ($total)
|
||||
#: themes/default/templates/stats.html.ep:2
|
||||
msgid "%1 sent images on this instance from beginning."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:227
|
||||
msgid "-or-"
|
||||
msgstr "-یا-"
|
||||
|
||||
#: lib/Lutim.pm:346 lib/Lutim/Command/cron/stats.pm:158 lib/Lutim/Command/cron/stats.pm:172 lib/Lutim/Command/cron/stats.pm:189 themes/default/templates/index.html.ep:5 themes/default/templates/myfiles.html.ep:5 themes/default/templates/partial/raw.js.ep:25 themes/default/templates/partial/raw.js.ep:8 themes/default/templates/raw.html.ep:10
|
||||
msgid "1 year"
|
||||
msgstr "۱ سال"
|
||||
|
||||
#: lib/Lutim.pm:345 lib/Lutim/Command/cron/stats.pm:155 lib/Lutim/Command/cron/stats.pm:169 lib/Lutim/Command/cron/stats.pm:186 themes/default/templates/index.html.ep:4 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:4 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/lutim.js.ep:138 themes/default/templates/partial/raw.js.ep:22 themes/default/templates/partial/raw.js.ep:5 themes/default/templates/raw.html.ep:7
|
||||
msgid "24 hours"
|
||||
msgstr "۲۴ ساعت"
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:245
|
||||
msgid ": Error while trying to get the counter."
|
||||
msgstr ": در تلاش برای بدست آوردن شمارنده خطای رخ داد."
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:63
|
||||
msgid "About"
|
||||
msgstr "درباره ما"
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:151 themes/default/templates/raw.html.ep:3
|
||||
msgid "Active images"
|
||||
msgstr "تصاویر فعال"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:346
|
||||
msgid "An error occured while downloading the image."
|
||||
msgstr "هنگام بارگیری تصویر خطایی رخ داد."
|
||||
|
||||
#: themes/default/templates/zip.html.ep:2
|
||||
msgid "Archives download"
|
||||
msgstr "بارگیری بایگانی"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "آیا مطمئن هستید که تصویر ${short} را میخواهید، حذف کنید؟"
|
||||
|
||||
#: themes/default/templates/about.html.ep:44 themes/default/templates/myfiles.html.ep:130 themes/default/templates/stats.html.ep:25
|
||||
msgid "Back to homepage"
|
||||
msgstr "بازگشت به صفحه اصلی"
|
||||
|
||||
#: themes/default/templates/index.html.ep:230 themes/default/templates/index.html.ep:231
|
||||
msgid "Click to open the file browser"
|
||||
msgstr "برای باز شدن مرور پرونده، کلیک کنید"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:51
|
||||
msgid "Close"
|
||||
msgstr "بستن"
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:29
|
||||
msgid "Close (Esc)"
|
||||
msgstr "بستن (Esc)"
|
||||
|
||||
#: themes/default/templates/about.html.ep:30
|
||||
msgid "Contributors"
|
||||
msgstr "مشارکت کنندگان"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:113 themes/default/templates/partial/common.js.ep:93
|
||||
msgid "Copied to clipboard"
|
||||
msgstr "در کلیپبورد رونوشت شد"
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:206 themes/default/templates/partial/lutim.js.ep:267 themes/default/templates/partial/lutim.js.ep:354
|
||||
msgid "Copy all view links to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:104 themes/default/templates/index.html.ep:16 themes/default/templates/index.html.ep:32 themes/default/templates/index.html.ep:48 themes/default/templates/index.html.ep:80 themes/default/templates/index.html.ep:88 themes/default/templates/index.html.ep:96 themes/default/templates/myfiles.html.ep:66 themes/default/templates/myfiles.html.ep:82 themes/default/templates/myfiles.html.ep:98 themes/default/templates/partial/common.js.ep:209 themes/default/templates/partial/lutim.js.ep:110 themes/default/templates/partial/lutim.js.ep:70 themes/default/templates/partial/lutim.js.ep:82 themes/default/templates/partial/lutim.js.ep:96 themes/default/templates/partial/myfiles.js.ep:183
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:118
|
||||
msgid "Counter"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:18
|
||||
msgid "Delay repartition chart for disabled images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:15
|
||||
msgid "Delay repartition chart for enabled images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:126 themes/default/templates/index.html.ep:158 themes/default/templates/index.html.ep:202 themes/default/templates/myfiles.html.ep:119 themes/default/templates/myfiles.html.ep:45 themes/default/templates/partial/lutim.js.ep:150
|
||||
msgid "Delete at first view?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:152 themes/default/templates/raw.html.ep:4
|
||||
msgid "Deleted images"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:153 themes/default/templates/raw.html.ep:5
|
||||
msgid "Deleted images in 30 days"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:109 themes/default/templates/myfiles.html.ep:122 themes/default/templates/partial/common.js.ep:195 themes/default/templates/partial/common.js.ep:200
|
||||
msgid "Deletion link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:10
|
||||
msgid "Download all images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:92 themes/default/templates/index.html.ep:94 themes/default/templates/partial/lutim.js.ep:88 themes/default/templates/partial/lutim.js.ep:92
|
||||
msgid "Download link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:26 themes/default/templates/index.html.ep:28 themes/default/templates/myfiles.html.ep:76 themes/default/templates/myfiles.html.ep:78
|
||||
msgid "Download zip link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:226
|
||||
msgid "Drag & drop images here"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:7
|
||||
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:161 themes/default/templates/index.html.ep:205
|
||||
msgid "Encrypt the image (Lutim does not keep the key)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:38 themes/default/templates/partial/myfiles.js.ep:129
|
||||
msgid "Error while trying to modify the image."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:10
|
||||
msgid "Evolution of total files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:121
|
||||
msgid "Expires at"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:106
|
||||
msgid "Export localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:116
|
||||
msgid "File name"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:24
|
||||
msgid "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-softwares/lutim\">homepage of the project</a>."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:66
|
||||
msgid "Fork me!"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:10 themes/default/templates/index.html.ep:12 themes/default/templates/myfiles.html.ep:60 themes/default/templates/myfiles.html.ep:62
|
||||
msgid "Gallery link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:116 themes/default/templates/partial/common.js.ep:134
|
||||
msgid "Hit Ctrl+C, then Enter to copy the short link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:44
|
||||
msgid "Homepage"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:20
|
||||
msgid "How do you pronounce Lutim?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:6
|
||||
msgid "How does it work?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:18
|
||||
msgid "How to report an image?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:14
|
||||
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:187 themes/default/templates/index.html.ep:240
|
||||
msgid "Image URL"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:150 themes/default/templates/raw.html.ep:2
|
||||
msgid "Image delay"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:172
|
||||
msgid "Image deleted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:815
|
||||
msgid "Image not found."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:107
|
||||
msgid "Import localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:55
|
||||
msgid "Informations"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:25
|
||||
msgid "Install webapp"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:21
|
||||
msgid "Instance's statistics"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:11
|
||||
msgid "Is it really anonymous?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:9
|
||||
msgid "Is it really free (as in free beer)?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:164 themes/default/templates/index.html.ep:208
|
||||
msgid "Keep EXIF tags"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:43
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:129 themes/default/templates/index.html.ep:190 themes/default/templates/index.html.ep:243 themes/default/templates/partial/lutim.js.ep:157
|
||||
msgid "Let's go!"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:60
|
||||
msgid "License:"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:100 themes/default/templates/index.html.ep:102 themes/default/templates/partial/lutim.js.ep:102 themes/default/templates/partial/lutim.js.ep:106
|
||||
msgid "Link for share on social networks"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:8
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:33
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/zip.html.ep:7
|
||||
msgid "Lutim can't zip so many images at once, so it splitted your demand in multiple URLs."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:4
|
||||
msgid "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:25
|
||||
msgid "Main developers"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:84 themes/default/templates/index.html.ep:86 themes/default/templates/partial/lutim.js.ep:76 themes/default/templates/partial/lutim.js.ep:79
|
||||
msgid "Markdown syntax"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:200
|
||||
msgid "Modify expiration delay"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:7 themes/default/templates/partial/navbar.html.ep:18
|
||||
msgid "My images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:45
|
||||
msgid "Next (arrow right)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:121 themes/default/templates/partial/myfiles.js.ep:163
|
||||
msgid "No limit"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:176 themes/default/templates/index.html.ep:220
|
||||
msgid "No watermark"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:189 themes/default/templates/index.html.ep:235
|
||||
msgid "Only images are allowed"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:11
|
||||
msgid "Only the images sent with this browser will be listed here. The details are stored in localStorage: if you delete your localStorage data, you'll loose these details."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
msgid "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:12
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/zip.html.ep:12
|
||||
msgid "Please click on each URL to download the different zip files."
|
||||
msgstr ""
|
||||
|
||||
#. (config('contact')
|
||||
#: themes/default/templates/about.html.ep:19
|
||||
msgid "Please contact the administrator: %1"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Authent.pm:36
|
||||
msgid "Please, check your credentials: unable to authenticate."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:43
|
||||
msgid "Previous (arrow left)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:42 themes/default/templates/index.html.ep:44 themes/default/templates/myfiles.html.ep:92 themes/default/templates/myfiles.html.ep:94
|
||||
msgid "Random image link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:22
|
||||
msgid "Raw stats"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:52
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:182
|
||||
msgid "Send an image"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/login.html.ep:16 themes/default/templates/logout.html.ep:5 themes/default/templates/partial/navbar.html.ep:37
|
||||
msgid "Signin"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:173 themes/default/templates/index.html.ep:217
|
||||
msgid "Single watermark"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:144 themes/default/templates/partial/gallery.js.ep:210 themes/default/templates/partial/lutim.js.ep:166
|
||||
msgid "Something bad happened"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->config('contact')
|
||||
#: lib/Lutim/Controller/Image.pm:822
|
||||
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:23
|
||||
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:365
|
||||
msgid "The URL is not valid."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/zip.html.ep:16
|
||||
msgid "The automatic download process will open a tab in your browser for each link. You need to allow popups for Lutim."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:32
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:161 lib/Lutim/Controller/Image.pm:229
|
||||
msgid "The delete token is invalid."
|
||||
msgstr ""
|
||||
|
||||
#. ($upload->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:547
|
||||
msgid "The file %1 is not an image."
|
||||
msgstr ""
|
||||
|
||||
#. ($tx->res->max_message_size)
|
||||
#. ($c->req->max_message_size)
|
||||
#. (config('max_file_size')
|
||||
#: lib/Lutim/Controller/Image.pm:329 lib/Lutim/Controller/Image.pm:395 themes/default/templates/partial/lutim.js.ep:239
|
||||
msgid "The file exceed the size limit (%1)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:12
|
||||
msgid "The graph's datas are not updated in real-time."
|
||||
msgstr ""
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:231
|
||||
msgid "The image %1 has already been deleted."
|
||||
msgstr ""
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:240 lib/Lutim/Controller/Image.pm:245
|
||||
msgid "The image %1 has been successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:57
|
||||
msgid "The images are encrypted on the server (Lutim does not keep the key)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:169
|
||||
msgid "The image’s delay has been successfully modified"
|
||||
msgstr ""
|
||||
|
||||
#. ('https://fr.wikipedia.org/wiki/Lutin')
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/gallery.js.ep:271
|
||||
msgid "There is XXXX image(s) in the gallery"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->config->{contact})
|
||||
#: lib/Lutim/Controller/Image.pm:544
|
||||
msgid "There is no more available URL. Retry or contact the administrator. %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:170 themes/default/templates/index.html.ep:214
|
||||
msgid "Tiling watermark"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:30
|
||||
msgid "Toggle fullscreen"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:8
|
||||
msgid "Toggle navigation"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:159 themes/default/templates/raw.html.ep:11
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:110 themes/default/templates/partial/common.js.ep:90
|
||||
msgid "Unable to copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lutim/Controller/Image.pm:109 lib/Lutim/Controller/Image.pm:203 lib/Lutim/Controller/Image.pm:274
|
||||
msgid "Unable to find the image %1."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:633 lib/Lutim/Controller/Image.pm:678 lib/Lutim/Controller/Image.pm:719 lib/Lutim/Controller/Image.pm:762 lib/Lutim/Controller/Image.pm:774 lib/Lutim/Controller/Image.pm:785 lib/Lutim/Controller/Image.pm:812 lib/Lutim/Plugin/Helpers.pm:90
|
||||
msgid "Unable to find the image: it has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:146
|
||||
msgid "Unable to get counter"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:17
|
||||
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:186 themes/default/templates/index.html.ep:238
|
||||
msgid "Upload an image with its URL"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:120
|
||||
msgid "Uploaded at"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/stats.html.ep:6
|
||||
msgid "Uploaded files by days"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->app->config('contact')
|
||||
#: lib/Lutim/Plugin/Helpers.pm:223
|
||||
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:76 themes/default/templates/index.html.ep:78 themes/default/templates/myfiles.html.ep:117 themes/default/templates/partial/lutim.js.ep:62 themes/default/templates/partial/lutim.js.ep:66
|
||||
msgid "View link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:22
|
||||
msgid "What about the software which provides the service?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:3
|
||||
msgid "What is Lutim?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:15
|
||||
msgid "Who owns rights on images uploaded on Lutim?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:12
|
||||
msgid "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:10
|
||||
msgid "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://www.tipeee.com/fiat-tux\">Tipeee</a> or via <a href=\"https://liberapay.com/sky/\">Liberapay</a>."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/zip.html.ep:6
|
||||
msgid "You asked to download a zip archive for too much files."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:8
|
||||
msgid "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Authent.pm:27
|
||||
msgid "You have been successfully logged in."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Authent.pm:66 themes/default/templates/logout.html.ep:3
|
||||
msgid "You have been successfully logged out."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/gallery.html.ep:31
|
||||
msgid "Zoom in/out"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:27
|
||||
msgid "and on"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:40
|
||||
msgid "arabic translation"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:27
|
||||
msgid "core developer"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim.pm:344 lib/Lutim/Command/cron/stats.pm:154 lib/Lutim/Command/cron/stats.pm:168 lib/Lutim/Command/cron/stats.pm:185 themes/default/templates/index.html.ep:3 themes/default/templates/myfiles.html.ep:3 themes/default/templates/partial/raw.js.ep:21 themes/default/templates/partial/raw.js.ep:4 themes/default/templates/raw.html.ep:6
|
||||
msgid "no time limit"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:38
|
||||
msgid "occitan translation"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:27
|
||||
msgid "on"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:39
|
||||
msgid "paste image to upload ability"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:41
|
||||
msgid "russian translation"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:36
|
||||
msgid "spanish translation"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:28
|
||||
msgid "webapp developer"
|
||||
msgstr ""
|
||||
@@ -11,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2020-04-04 10:08+0000\n"
|
||||
"Last-Translator: spf <spf@framasoft.org>\n"
|
||||
"PO-Revision-Date: 2025-10-13 07:13+0000\n"
|
||||
"Last-Translator: Luc Didry <luc@framasoft.org>\n"
|
||||
"Language-Team: French <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/fr/>\n"
|
||||
"Language: fr\n"
|
||||
@@ -20,7 +20,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 3.11.2\n"
|
||||
"X-Generator: Weblate 5.13.3\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -265,12 +265,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "C’est vraiment gratuit ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Comme on prononce <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> "
|
||||
"(/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Comme on prononce <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -713,3 +709,15 @@ msgid "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-sof
|
||||
msgstr ""
|
||||
"Pour plus de détails, consultez la <a href=\"https://framagit.org/fiat-tux/"
|
||||
"hat-softwares/lutim\">page du projet</a>."
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Êtes-vous sûr·e de vouloir supprimer l’image ${short} ?"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "Navré, l'API est désactivée"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr "Supprimer les images sélectionnées"
|
||||
|
||||
@@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2020-03-09 16:23+0000\n"
|
||||
"PO-Revision-Date: 2025-10-13 07:13+0000\n"
|
||||
"Last-Translator: Luc Didry <luc@framasoft.org>\n"
|
||||
"Language-Team: French (France) <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/fr_FR/>\n"
|
||||
@@ -20,7 +20,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 3.11.2\n"
|
||||
"X-Generator: Weblate 5.13.3\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -265,12 +265,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "C’est vraiment gratuit ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Comme on prononce <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> "
|
||||
"(/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Comme on prononce <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -352,7 +348,7 @@ msgid ""
|
||||
"these details."
|
||||
msgstr ""
|
||||
"Seules les images envoyées avec ce navigateur seront listées ici. Les "
|
||||
"détails sont stockées en localStorage : si vous supprimez vos données "
|
||||
"détails sont stockés en localStorage : si vous supprimez vos données "
|
||||
"localStorage, vous perdrez ces détails."
|
||||
|
||||
#: themes/default/templates/about.html.ep:16
|
||||
@@ -713,3 +709,15 @@ msgid "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-sof
|
||||
msgstr ""
|
||||
"Pour plus de détails, consultez la <a href=\"https://framagit.org/fiat-tux/"
|
||||
"hat-softwares/lutim\">page du projet</a>."
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Êtes-vous sûr·e de vouloir supprimer l’image ${short} ?"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "Navré, l'API est désactivée"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr "Supprimer les images sélectionnées"
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2022-07-24 18:36+0000\n"
|
||||
"PO-Revision-Date: 2024-06-06 16:59+0000\n"
|
||||
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
|
||||
"Language-Team: Croatian <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/hr/>\n"
|
||||
@@ -15,9 +15,9 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.13.1\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.5.5\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -253,10 +253,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Je li se stvarno može besplatno koristiti?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Isto kao izgovaranje francuske riječi <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Isto kao izgovaranje francuske riječi <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:165 themes/default/templates/index.html.ep:209
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -411,8 +409,8 @@ msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_softw
|
||||
msgstr ""
|
||||
"Softver Lutim je <a href=\"http://en.wikipedia.org/wiki/Free_software\""
|
||||
">slobodan softver</a> koji omogućuje preuzmanje i instaliranje softvera na "
|
||||
"vlastiti poslužitelj. Pogledaj <a href=\"https://www.gnu.org/licenses/agpl-3."
|
||||
"0.html\">AGPL</a> za prikaz mogućnosti."
|
||||
"vlastiti server. Pogledaj <a href=\"https://www.gnu.org/licenses/agpl-3.0."
|
||||
"html\">AGPL</a> za prikaz mogućnosti."
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:348
|
||||
msgid "The URL is not valid."
|
||||
@@ -460,7 +458,7 @@ msgstr "Slika %1 je uspješno izbrisana"
|
||||
|
||||
#: themes/default/templates/index.html.ep:57
|
||||
msgid "The images are encrypted on the server (Lutim does not keep the key)."
|
||||
msgstr "Slike su šifrirane na poslužitelju (Lutim ne čuva ključ)."
|
||||
msgstr "Slike su šifrirane na serveru (Lutim ne čuva ključ)."
|
||||
|
||||
#: themes/default/templates/about.html.ep:5
|
||||
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
|
||||
@@ -635,3 +633,11 @@ msgstr "prijevod na španjolski"
|
||||
#: themes/default/templates/about.html.ep:28
|
||||
msgid "webapp developer"
|
||||
msgstr "programer web-aplikacije"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "Nažalost je API deaktiviran"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Stvarno želiš izbrisati sliku ${short}?"
|
||||
|
||||
@@ -3,8 +3,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2020-04-10 17:08+0000\n"
|
||||
"Last-Translator: Balázs Meskó <mesko.balazs@fsf.hu>\n"
|
||||
"PO-Revision-Date: 2025-10-13 07:13+0000\n"
|
||||
"Last-Translator: Ghost of Sparta <makesocialfoss32@keemail.me>\n"
|
||||
"Language-Team: Hungarian <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/hu/>\n"
|
||||
"Language: hu\n"
|
||||
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 3.11.2\n"
|
||||
"X-Generator: Weblate 5.13.3\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -256,12 +256,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Tényleg ingyenes?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Pont úgy, ahogy a francia <a href=\"https://fr.wikipedia.org/wiki/"
|
||||
"Lutin\">lutin</a> szót (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Pont úgy, ahogy a francia <a href=\"%1\">lutin</a> szót (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -698,3 +694,16 @@ msgstr "Egy vízjel"
|
||||
#: themes/default/templates/index.html.ep:177 themes/default/templates/index.html.ep:221
|
||||
msgid "No watermark"
|
||||
msgstr "Nincs vízjel"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "Sajnáljuk, az API le van tiltva"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Biztosan törölni szeretné a(z) ${short} képet?"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
#, fuzzy
|
||||
msgid "Delete selected images"
|
||||
msgstr "."
|
||||
|
||||
@@ -4,8 +4,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2020-06-09 19:24+0000\n"
|
||||
"Last-Translator: roberto marcolin <nilogadda@gmail.com>\n"
|
||||
"PO-Revision-Date: 2024-12-11 17:28+0000\n"
|
||||
"Last-Translator: Giuseppe De Ninno <peppedeninno@gmail.com>\n"
|
||||
"Language-Team: Italian <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/it/>\n"
|
||||
"Language: it\n"
|
||||
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 3.11.2\n"
|
||||
"X-Generator: Weblate 5.8.4\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -258,12 +258,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "È veramente gratuita (come in birra gratis)?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Come si pronuncia la parola francese <a href=\"https://fr.wikipedia.org/wiki/"
|
||||
"Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Come si pronuncia la parola francese <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -703,3 +699,7 @@ msgstr "Filigrana semplice"
|
||||
#: themes/default/templates/index.html.ep:177 themes/default/templates/index.html.ep:221
|
||||
msgid "No watermark"
|
||||
msgstr "Nessuna filigrana"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Sei sicuro di voler cancellare l'immagine ${short}?"
|
||||
|
||||
@@ -19,7 +19,7 @@ msgstr ""
|
||||
#. (30)
|
||||
#. ($delay)
|
||||
#. (config('max_delay')
|
||||
#: lib/Lutim/Command/cron/stats.pm:156 lib/Lutim/Command/cron/stats.pm:157 lib/Lutim/Command/cron/stats.pm:170 lib/Lutim/Command/cron/stats.pm:171 lib/Lutim/Command/cron/stats.pm:187 lib/Lutim/Command/cron/stats.pm:188 themes/default/templates/myfiles.html.ep:24 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:34 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/for_my_delay.html.ep:14 themes/default/templates/partial/for_my_delay.html.ep:4 themes/default/templates/partial/lutim.js.ep:140 themes/default/templates/partial/lutim.js.ep:149 themes/default/templates/partial/lutim.js.ep:150 themes/default/templates/partial/raw.js.ep:23 themes/default/templates/partial/raw.js.ep:24 themes/default/templates/partial/raw.js.ep:6 themes/default/templates/partial/raw.js.ep:7 themes/default/templates/raw.html.ep:8 themes/default/templates/raw.html.ep:9
|
||||
#: lib/Lutim/Command/cron/stats.pm:156 lib/Lutim/Command/cron/stats.pm:157 lib/Lutim/Command/cron/stats.pm:170 lib/Lutim/Command/cron/stats.pm:171 lib/Lutim/Command/cron/stats.pm:187 lib/Lutim/Command/cron/stats.pm:188 themes/default/templates/myfiles.html.ep:24 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:34 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/for_my_delay.html.ep:14 themes/default/templates/partial/for_my_delay.html.ep:4 themes/default/templates/partial/lutim.js.ep:129 themes/default/templates/partial/lutim.js.ep:138 themes/default/templates/partial/lutim.js.ep:139
|
||||
msgid "%1 days"
|
||||
msgstr ""
|
||||
|
||||
@@ -28,31 +28,31 @@ msgstr ""
|
||||
msgid "%1 sent images on this instance from beginning."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:228
|
||||
#: themes/default/templates/index.html.ep:227
|
||||
msgid "-or-"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim.pm:342 lib/Lutim/Command/cron/stats.pm:158 lib/Lutim/Command/cron/stats.pm:172 lib/Lutim/Command/cron/stats.pm:189 themes/default/templates/index.html.ep:5 themes/default/templates/myfiles.html.ep:5 themes/default/templates/partial/raw.js.ep:25 themes/default/templates/partial/raw.js.ep:8 themes/default/templates/raw.html.ep:10
|
||||
#: lib/Lutim.pm:346 lib/Lutim/Command/cron/stats.pm:158 lib/Lutim/Command/cron/stats.pm:172 lib/Lutim/Command/cron/stats.pm:189 themes/default/templates/index.html.ep:5 themes/default/templates/myfiles.html.ep:5
|
||||
msgid "1 year"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim.pm:341 lib/Lutim/Command/cron/stats.pm:155 lib/Lutim/Command/cron/stats.pm:169 lib/Lutim/Command/cron/stats.pm:186 themes/default/templates/index.html.ep:4 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:4 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/lutim.js.ep:149 themes/default/templates/partial/raw.js.ep:22 themes/default/templates/partial/raw.js.ep:5 themes/default/templates/raw.html.ep:7
|
||||
#: lib/Lutim.pm:345 lib/Lutim/Command/cron/stats.pm:155 lib/Lutim/Command/cron/stats.pm:169 lib/Lutim/Command/cron/stats.pm:186 themes/default/templates/index.html.ep:4 themes/default/templates/myfiles.html.ep:33 themes/default/templates/myfiles.html.ep:4 themes/default/templates/partial/for_my_delay.html.ep:13 themes/default/templates/partial/lutim.js.ep:138
|
||||
msgid "24 hours"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:210
|
||||
#: themes/default/templates/partial/myfiles.js.ep:245
|
||||
msgid ": Error while trying to get the counter."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:63
|
||||
#: themes/default/templates/partial/navbar.html.ep:65
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:151 themes/default/templates/raw.html.ep:3
|
||||
#: lib/Lutim/Command/cron/stats.pm:151
|
||||
msgid "Active images"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:329
|
||||
#: lib/Lutim/Controller/Image.pm:346
|
||||
msgid "An error occured while downloading the image."
|
||||
msgstr ""
|
||||
|
||||
@@ -60,11 +60,15 @@ msgstr ""
|
||||
msgid "Archives download"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:44 themes/default/templates/myfiles.html.ep:129 themes/default/templates/stats.html.ep:25
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:44 themes/default/templates/myfiles.html.ep:130 themes/default/templates/stats.html.ep:25
|
||||
msgid "Back to homepage"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:231 themes/default/templates/index.html.ep:232
|
||||
#: themes/default/templates/index.html.ep:230 themes/default/templates/index.html.ep:231
|
||||
msgid "Click to open the file browser"
|
||||
msgstr ""
|
||||
|
||||
@@ -84,15 +88,15 @@ msgstr ""
|
||||
msgid "Copied to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:215 themes/default/templates/partial/lutim.js.ep:278 themes/default/templates/partial/lutim.js.ep:364
|
||||
#: themes/default/templates/partial/lutim.js.ep:206 themes/default/templates/partial/lutim.js.ep:267 themes/default/templates/partial/lutim.js.ep:354
|
||||
msgid "Copy all view links to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:105 themes/default/templates/index.html.ep:16 themes/default/templates/index.html.ep:32 themes/default/templates/index.html.ep:48 themes/default/templates/index.html.ep:81 themes/default/templates/index.html.ep:89 themes/default/templates/index.html.ep:97 themes/default/templates/myfiles.html.ep:66 themes/default/templates/myfiles.html.ep:82 themes/default/templates/myfiles.html.ep:98 themes/default/templates/partial/common.js.ep:186 themes/default/templates/partial/lutim.js.ep:106 themes/default/templates/partial/lutim.js.ep:121 themes/default/templates/partial/lutim.js.ep:80 themes/default/templates/partial/lutim.js.ep:92 themes/default/templates/partial/myfiles.js.ep:172
|
||||
#: themes/default/templates/index.html.ep:104 themes/default/templates/index.html.ep:16 themes/default/templates/index.html.ep:32 themes/default/templates/index.html.ep:48 themes/default/templates/index.html.ep:80 themes/default/templates/index.html.ep:88 themes/default/templates/index.html.ep:96 themes/default/templates/myfiles.html.ep:66 themes/default/templates/myfiles.html.ep:82 themes/default/templates/myfiles.html.ep:98 themes/default/templates/partial/common.js.ep:209 themes/default/templates/partial/lutim.js.ep:110 themes/default/templates/partial/lutim.js.ep:70 themes/default/templates/partial/lutim.js.ep:82 themes/default/templates/partial/lutim.js.ep:96 themes/default/templates/partial/myfiles.js.ep:183
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:117
|
||||
#: themes/default/templates/myfiles.html.ep:118
|
||||
msgid "Counter"
|
||||
msgstr ""
|
||||
|
||||
@@ -104,19 +108,23 @@ msgstr ""
|
||||
msgid "Delay repartition chart for enabled images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:127 themes/default/templates/index.html.ep:159 themes/default/templates/index.html.ep:203 themes/default/templates/myfiles.html.ep:118 themes/default/templates/myfiles.html.ep:45 themes/default/templates/partial/lutim.js.ep:161
|
||||
#: themes/default/templates/index.html.ep:126 themes/default/templates/index.html.ep:158 themes/default/templates/index.html.ep:202 themes/default/templates/myfiles.html.ep:119 themes/default/templates/myfiles.html.ep:45 themes/default/templates/partial/lutim.js.ep:150
|
||||
msgid "Delete at first view?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:152 themes/default/templates/raw.html.ep:4
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:152
|
||||
msgid "Deleted images"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:153 themes/default/templates/raw.html.ep:5
|
||||
#: lib/Lutim/Command/cron/stats.pm:153
|
||||
msgid "Deleted images in 30 days"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:110 themes/default/templates/myfiles.html.ep:121 themes/default/templates/partial/common.js.ep:178 themes/default/templates/partial/common.js.ep:181
|
||||
#: themes/default/templates/index.html.ep:109 themes/default/templates/myfiles.html.ep:122 themes/default/templates/partial/common.js.ep:195 themes/default/templates/partial/common.js.ep:200
|
||||
msgid "Deletion link"
|
||||
msgstr ""
|
||||
|
||||
@@ -124,7 +132,7 @@ msgstr ""
|
||||
msgid "Download all images"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:93 themes/default/templates/index.html.ep:95 themes/default/templates/partial/lutim.js.ep:102 themes/default/templates/partial/lutim.js.ep:98
|
||||
#: themes/default/templates/index.html.ep:92 themes/default/templates/index.html.ep:94 themes/default/templates/partial/lutim.js.ep:88 themes/default/templates/partial/lutim.js.ep:92
|
||||
msgid "Download link"
|
||||
msgstr ""
|
||||
|
||||
@@ -132,7 +140,7 @@ msgstr ""
|
||||
msgid "Download zip link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:227
|
||||
#: themes/default/templates/index.html.ep:226
|
||||
msgid "Drag & drop images here"
|
||||
msgstr ""
|
||||
|
||||
@@ -140,11 +148,11 @@ msgstr ""
|
||||
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:162 themes/default/templates/index.html.ep:206
|
||||
#: themes/default/templates/index.html.ep:161 themes/default/templates/index.html.ep:205
|
||||
msgid "Encrypt the image (Lutim does not keep the key)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/lutim.js.ep:45 themes/default/templates/partial/myfiles.js.ep:128
|
||||
#: themes/default/templates/partial/lutim.js.ep:38 themes/default/templates/partial/myfiles.js.ep:129
|
||||
msgid "Error while trying to modify the image."
|
||||
msgstr ""
|
||||
|
||||
@@ -152,7 +160,7 @@ msgstr ""
|
||||
msgid "Evolution of total files"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:120
|
||||
#: themes/default/templates/myfiles.html.ep:121
|
||||
msgid "Expires at"
|
||||
msgstr ""
|
||||
|
||||
@@ -160,7 +168,7 @@ msgstr ""
|
||||
msgid "Export localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:115
|
||||
#: themes/default/templates/myfiles.html.ep:116
|
||||
msgid "File name"
|
||||
msgstr ""
|
||||
|
||||
@@ -168,7 +176,7 @@ msgstr ""
|
||||
msgid "For more details, see the <a href=\"https://framagit.org/fiat-tux/hat-softwares/lutim\">homepage of the project</a>."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:66
|
||||
#: themes/default/templates/partial/navbar.html.ep:68
|
||||
msgid "Fork me!"
|
||||
msgstr ""
|
||||
|
||||
@@ -180,7 +188,7 @@ msgstr ""
|
||||
msgid "Hit Ctrl+C, then Enter to copy the short link"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/layouts/default.html.ep:47
|
||||
#: themes/default/templates/layouts/default.html.ep:46
|
||||
msgid "Homepage"
|
||||
msgstr ""
|
||||
|
||||
@@ -200,19 +208,19 @@ msgstr ""
|
||||
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:188 themes/default/templates/index.html.ep:241
|
||||
#: themes/default/templates/index.html.ep:187 themes/default/templates/index.html.ep:240
|
||||
msgid "Image URL"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:150 themes/default/templates/raw.html.ep:2
|
||||
#: lib/Lutim/Command/cron/stats.pm:150
|
||||
msgid "Image delay"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:157
|
||||
#: themes/default/templates/partial/common.js.ep:172
|
||||
msgid "Image deleted"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:799
|
||||
#: lib/Lutim/Controller/Image.pm:815
|
||||
msgid "Image not found."
|
||||
msgstr ""
|
||||
|
||||
@@ -220,7 +228,7 @@ msgstr ""
|
||||
msgid "Import localStorage data"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:55
|
||||
#: themes/default/templates/partial/navbar.html.ep:57
|
||||
msgid "Informations"
|
||||
msgstr ""
|
||||
|
||||
@@ -240,27 +248,23 @@ msgstr ""
|
||||
msgid "Is it really free (as in free beer)?"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:165 themes/default/templates/index.html.ep:209
|
||||
#: themes/default/templates/index.html.ep:164 themes/default/templates/index.html.ep:208
|
||||
msgid "Keep EXIF tags"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:43
|
||||
#: themes/default/templates/partial/navbar.html.ep:43 themes/default/templates/partial/navbar.html.ep:44
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:130 themes/default/templates/index.html.ep:191 themes/default/templates/index.html.ep:244 themes/default/templates/partial/lutim.js.ep:165
|
||||
#: themes/default/templates/index.html.ep:129 themes/default/templates/index.html.ep:190 themes/default/templates/index.html.ep:243 themes/default/templates/partial/lutim.js.ep:157
|
||||
msgid "Let's go!"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:60
|
||||
#: themes/default/templates/partial/navbar.html.ep:62
|
||||
msgid "License:"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:101 themes/default/templates/index.html.ep:103 themes/default/templates/partial/lutim.js.ep:112 themes/default/templates/partial/lutim.js.ep:116
|
||||
#: themes/default/templates/index.html.ep:100 themes/default/templates/index.html.ep:102 themes/default/templates/partial/lutim.js.ep:102 themes/default/templates/partial/lutim.js.ep:106
|
||||
msgid "Link for share on social networks"
|
||||
msgstr ""
|
||||
|
||||
@@ -284,11 +288,11 @@ msgstr ""
|
||||
msgid "Main developers"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:85 themes/default/templates/index.html.ep:87 themes/default/templates/partial/lutim.js.ep:86 themes/default/templates/partial/lutim.js.ep:89
|
||||
#: themes/default/templates/index.html.ep:84 themes/default/templates/index.html.ep:86 themes/default/templates/partial/lutim.js.ep:76 themes/default/templates/partial/lutim.js.ep:79
|
||||
msgid "Markdown syntax"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:179
|
||||
#: themes/default/templates/partial/myfiles.js.ep:200
|
||||
msgid "Modify expiration delay"
|
||||
msgstr ""
|
||||
|
||||
@@ -300,15 +304,15 @@ msgstr ""
|
||||
msgid "Next (arrow right)"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/myfiles.js.ep:120 themes/default/templates/partial/myfiles.js.ep:162
|
||||
#: themes/default/templates/partial/myfiles.js.ep:121 themes/default/templates/partial/myfiles.js.ep:163
|
||||
msgid "No limit"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:177 themes/default/templates/index.html.ep:221
|
||||
#: themes/default/templates/index.html.ep:176 themes/default/templates/index.html.ep:220
|
||||
msgid "No watermark"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:190 themes/default/templates/index.html.ep:236
|
||||
#: themes/default/templates/index.html.ep:189 themes/default/templates/index.html.ep:235
|
||||
msgid "Only images are allowed"
|
||||
msgstr ""
|
||||
|
||||
@@ -353,7 +357,7 @@ msgstr ""
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:183
|
||||
#: themes/default/templates/index.html.ep:182
|
||||
msgid "Send an image"
|
||||
msgstr ""
|
||||
|
||||
@@ -361,19 +365,23 @@ msgstr ""
|
||||
msgid "Signin"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:174 themes/default/templates/index.html.ep:218
|
||||
#: themes/default/templates/index.html.ep:173 themes/default/templates/index.html.ep:217
|
||||
msgid "Single watermark"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:145 themes/default/templates/partial/gallery.js.ep:211 themes/default/templates/partial/lutim.js.ep:176
|
||||
#: themes/default/templates/index.html.ep:144 themes/default/templates/partial/gallery.js.ep:210 themes/default/templates/partial/lutim.js.ep:166
|
||||
msgid "Something bad happened"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->config('contact')
|
||||
#: lib/Lutim/Controller/Image.pm:806
|
||||
#: lib/Lutim/Controller/Image.pm:822
|
||||
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/about.html.ep:13
|
||||
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
|
||||
msgstr ""
|
||||
@@ -382,7 +390,7 @@ msgstr ""
|
||||
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:348
|
||||
#: lib/Lutim/Controller/Image.pm:365
|
||||
msgid "The URL is not valid."
|
||||
msgstr ""
|
||||
|
||||
@@ -394,19 +402,19 @@ msgstr ""
|
||||
msgid "The data has been successfully imported."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:160 lib/Lutim/Controller/Image.pm:228
|
||||
#: lib/Lutim/Controller/Image.pm:161 lib/Lutim/Controller/Image.pm:229
|
||||
msgid "The delete token is invalid."
|
||||
msgstr ""
|
||||
|
||||
#. ($upload->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:531
|
||||
#: lib/Lutim/Controller/Image.pm:547
|
||||
msgid "The file %1 is not an image."
|
||||
msgstr ""
|
||||
|
||||
#. ($tx->res->max_message_size)
|
||||
#. ($res->max_message_size)
|
||||
#. ($c->req->max_message_size)
|
||||
#. (config('max_file_size')
|
||||
#: lib/Lutim/Controller/Image.pm:312 lib/Lutim/Controller/Image.pm:381 themes/default/templates/partial/lutim.js.ep:249
|
||||
#: lib/Lutim/Controller/Image.pm:329 lib/Lutim/Controller/Image.pm:395 themes/default/templates/partial/lutim.js.ep:239
|
||||
msgid "The file exceed the size limit (%1)"
|
||||
msgstr ""
|
||||
|
||||
@@ -415,12 +423,12 @@ msgid "The graph's datas are not updated in real-time."
|
||||
msgstr ""
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:230
|
||||
#: lib/Lutim/Controller/Image.pm:231
|
||||
msgid "The image %1 has already been deleted."
|
||||
msgstr ""
|
||||
|
||||
#. ($image->filename)
|
||||
#: lib/Lutim/Controller/Image.pm:239 lib/Lutim/Controller/Image.pm:244
|
||||
#: lib/Lutim/Controller/Image.pm:240 lib/Lutim/Controller/Image.pm:245
|
||||
msgid "The image %1 has been successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
@@ -432,20 +440,25 @@ msgstr ""
|
||||
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:168
|
||||
#: lib/Lutim/Controller/Image.pm:169
|
||||
msgid "The image’s delay has been successfully modified"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/gallery.js.ep:277
|
||||
#. ('https://fr.wikipedia.org/wiki/Lutin')
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/gallery.js.ep:271
|
||||
msgid "There is XXXX image(s) in the gallery"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->config->{contact})
|
||||
#: lib/Lutim/Controller/Image.pm:528
|
||||
#: lib/Lutim/Controller/Image.pm:544
|
||||
msgid "There is no more available URL. Retry or contact the administrator. %1"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:215
|
||||
#: themes/default/templates/index.html.ep:170 themes/default/templates/index.html.ep:214
|
||||
msgid "Tiling watermark"
|
||||
msgstr ""
|
||||
|
||||
@@ -457,28 +470,24 @@ msgstr ""
|
||||
msgid "Toggle navigation"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Command/cron/stats.pm:159 themes/default/templates/raw.html.ep:11
|
||||
#: lib/Lutim/Command/cron/stats.pm:159
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:72 themes/default/templates/partial/lutim.js.ep:17
|
||||
msgid "Tweet it!"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:110 themes/default/templates/partial/common.js.ep:90
|
||||
msgid "Unable to copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#. ($short)
|
||||
#: lib/Lutim/Controller/Image.pm:108 lib/Lutim/Controller/Image.pm:202 lib/Lutim/Controller/Image.pm:273
|
||||
#: lib/Lutim/Controller/Image.pm:109 lib/Lutim/Controller/Image.pm:203 lib/Lutim/Controller/Image.pm:274
|
||||
msgid "Unable to find the image %1."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:617 lib/Lutim/Controller/Image.pm:662 lib/Lutim/Controller/Image.pm:703 lib/Lutim/Controller/Image.pm:746 lib/Lutim/Controller/Image.pm:758 lib/Lutim/Controller/Image.pm:769 lib/Lutim/Controller/Image.pm:796 lib/Lutim/Plugin/Helpers.pm:89
|
||||
#: lib/Lutim/Controller/Image.pm:633 lib/Lutim/Controller/Image.pm:678 lib/Lutim/Controller/Image.pm:719 lib/Lutim/Controller/Image.pm:762 lib/Lutim/Controller/Image.pm:774 lib/Lutim/Controller/Image.pm:785 lib/Lutim/Controller/Image.pm:812 lib/Lutim/Plugin/Helpers.pm:90
|
||||
msgid "Unable to find the image: it has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:145
|
||||
#: lib/Lutim/Controller/Image.pm:146
|
||||
msgid "Unable to get counter"
|
||||
msgstr ""
|
||||
|
||||
@@ -486,11 +495,11 @@ msgstr ""
|
||||
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:187 themes/default/templates/index.html.ep:239
|
||||
#: themes/default/templates/index.html.ep:186 themes/default/templates/index.html.ep:238
|
||||
msgid "Upload an image with its URL"
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:119
|
||||
#: themes/default/templates/myfiles.html.ep:120
|
||||
msgid "Uploaded at"
|
||||
msgstr ""
|
||||
|
||||
@@ -499,11 +508,11 @@ msgid "Uploaded files by days"
|
||||
msgstr ""
|
||||
|
||||
#. ($c->app->config('contact')
|
||||
#: lib/Lutim/Plugin/Helpers.pm:222
|
||||
#: lib/Lutim/Plugin/Helpers.pm:223
|
||||
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
|
||||
msgstr ""
|
||||
|
||||
#: themes/default/templates/index.html.ep:77 themes/default/templates/index.html.ep:79 themes/default/templates/myfiles.html.ep:116 themes/default/templates/partial/lutim.js.ep:72 themes/default/templates/partial/lutim.js.ep:76
|
||||
#: themes/default/templates/index.html.ep:76 themes/default/templates/index.html.ep:78 themes/default/templates/myfiles.html.ep:117 themes/default/templates/partial/lutim.js.ep:62 themes/default/templates/partial/lutim.js.ep:66
|
||||
msgid "View link"
|
||||
msgstr ""
|
||||
|
||||
@@ -559,7 +568,7 @@ msgstr ""
|
||||
msgid "core developer"
|
||||
msgstr ""
|
||||
|
||||
#: lib/Lutim.pm:340 lib/Lutim/Command/cron/stats.pm:154 lib/Lutim/Command/cron/stats.pm:168 lib/Lutim/Command/cron/stats.pm:185 themes/default/templates/index.html.ep:3 themes/default/templates/myfiles.html.ep:3 themes/default/templates/partial/raw.js.ep:21 themes/default/templates/partial/raw.js.ep:4 themes/default/templates/raw.html.ep:6
|
||||
#: lib/Lutim.pm:344 lib/Lutim/Command/cron/stats.pm:154 lib/Lutim/Command/cron/stats.pm:168 lib/Lutim/Command/cron/stats.pm:185 themes/default/templates/index.html.ep:3 themes/default/templates/myfiles.html.ep:3
|
||||
msgid "no time limit"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"PO-Revision-Date: 2020-03-09 16:30+0000\n"
|
||||
"PO-Revision-Date: 2024-12-21 21:15+0000\n"
|
||||
"Last-Translator: Quentin PAGÈS <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Occitan <https://weblate.framasoft.org/projects/lutim/"
|
||||
"default-theme/oc/>\n"
|
||||
@@ -18,7 +18,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 3.11.2\n"
|
||||
"X-Generator: Weblate 5.9.1\n"
|
||||
|
||||
#. (7)
|
||||
#. (30)
|
||||
@@ -263,13 +263,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Es vertadièrament gratuit ?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Òm pronóncia coma en occitan lengadocian, LU-TI-N, amb una M finala que sona "
|
||||
"N, o coma la paraula francesa <a href=\"https://fr.wikipedia.org/wiki/"
|
||||
"Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Òm pronóncia coma en occitan lengadocian, LU-TI-N, amb una M finala que sona N, o coma la paraula francesa <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
@@ -706,3 +701,15 @@ msgstr "Filigrana simpla"
|
||||
#: themes/default/templates/index.html.ep:177 themes/default/templates/index.html.ep:221
|
||||
msgid "No watermark"
|
||||
msgstr "Cap de filigrana"
|
||||
|
||||
#: lib/Lutim/Controller/Image.pm:294
|
||||
msgid "Sorry, the API is disabled"
|
||||
msgstr "O planhèm, l'API es desactivada"
|
||||
|
||||
#: themes/default/templates/partial/common.js.ep:145
|
||||
msgid "Are you sure you want to delete the image ${short}?"
|
||||
msgstr "Volètz vertadièrament suprimir aqueste imatge${short} ?"
|
||||
|
||||
#: themes/default/templates/myfiles.html.ep:109
|
||||
msgid "Delete selected images"
|
||||
msgstr " "
|
||||
|
||||
@@ -258,12 +258,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Это действительно бесплатно (as in free beer)?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid ""
|
||||
"Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/"
|
||||
"wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Как французское слово <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</"
|
||||
"a> (/ly.tɛ̃/)."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Как французское слово <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
|
||||
#: themes/default/templates/index.html.ep:171 themes/default/templates/index.html.ep:202
|
||||
msgid "Keep EXIF tags"
|
||||
|
||||
@@ -171,12 +171,6 @@ msgstr "Exportera localStorage-data"
|
||||
msgid "File name"
|
||||
msgstr "Filnamn"
|
||||
|
||||
#: themes/default/templates/about.html.ep:24
|
||||
msgid "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
|
||||
msgstr ""
|
||||
"Se <a href=\"https://framagit.org/luc/lutim\">projektets hemsida</a> för mer "
|
||||
"information."
|
||||
|
||||
#: themes/default/templates/partial/navbar.html.ep:66
|
||||
msgid "Fork me!"
|
||||
msgstr "Grena mig!"
|
||||
@@ -250,10 +244,8 @@ msgid "Is it really free (as in free beer)?"
|
||||
msgstr "Är det verkligen gratis?"
|
||||
|
||||
#: themes/default/templates/about.html.ep:21
|
||||
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr ""
|
||||
"Precis som du uttalar ordet <a href=\"https://fr.wikipedia.org/wiki/Lutin\""
|
||||
">lutin</a> på franska ([ly.tɛ̃])."
|
||||
msgid "The way you pronounce the French word <a href=\"%1\">lutin</a> (/ly.tɛ̃/)."
|
||||
msgstr "Precis som du uttalar ordet <a href=\"%1\">lutin</a> på franska ([ly.tɛ̃])."
|
||||
|
||||
#: themes/default/templates/index.html.ep:165 themes/default/templates/index.html.ep:196
|
||||
msgid "Keep EXIF tags"
|
||||
|
||||
2
themes/default/public/css/common.min.css
vendored
2
themes/default/public/css/common.min.css
vendored
File diff suppressed because one or more lines are too long
2
themes/default/public/css/gallery.min.css
vendored
2
themes/default/public/css/gallery.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -134,3 +134,21 @@ h1.ellips {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/*
|
||||
* a11y
|
||||
*/
|
||||
.navbar-default .navbar-brand,
|
||||
.navbar-default .navbar-nav > li > a,
|
||||
.navbar-default .navbar-text {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav > li > a:focus
|
||||
.navbar-default .navbar-nav > li > a:hover {
|
||||
color: #111;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #3c74c8;
|
||||
}
|
||||
|
||||
2
themes/default/public/css/not_stats.min.css
vendored
2
themes/default/public/css/not_stats.min.css
vendored
@@ -1 +1 @@
|
||||
@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.animate-spin{-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;display:inline-block}.uploader{border:2px dotted #a5a5c7;width:100%;color:#92aab0;text-align:center;vertical-align:middle;padding:30px 0;margin-bottom:10px;font-size:200%;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.uploader div.or{font-size:50%;font-weight:700;color:silver;padding:10px}@media (max-width:768px){.uploader div.browser label{max-width:95%}}@media (min-width:768px){.uploader div.browser label{width:300px}}.uploader div.browser label{background-color:#5a7bc2;color:#fff;padding:6px 0;font-size:40%;font-weight:700;cursor:pointer;border-radius:2px;position:relative;overflow:hidden;display:block;margin:20px auto 0;box-shadow:2px 2px 2px #888}.uploader div.browser span{cursor:pointer}.uploader div.browser input{position:absolute;top:0;right:0;margin:0;border:solid transparent;border-width:0 0 100px 200px;opacity:0;filter:alpha(opacity= 0);-o-transform:translate(250px,-50px) scale(1);-moz-transform:translate(-300px,0) scale(4);direction:ltr;cursor:pointer}.uploader div.browser label:hover{background-color:#427fed}@font-face{font-family:'markdown';src:url(../../font/markdown.eot?-6fnbp5);src:url(../../font/markdown.eot?#iefix-6fnbp5) format('embedded-opentype'),url(../../font/markdown.woff?-6fnbp5) format('woff'),url(../../font/markdown.ttf?-6fnbp5) format('truetype'),url(../../font/markdown.svg?-6fnbp5#markdown) format('svg');font-weight:400;font-style:normal}[class*=" markdown-"],[class^=markdown-]{font-family:'markdown';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.markdown-mark:before{content:"\e600"}.markdown-mark-solid:before{content:"\e601"}
|
||||
@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.animate-spin{-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;display:inline-block}.uploader{border:2px dotted #a5a5c7;width:100%;color:#777;text-align:center;vertical-align:middle;padding:30px 0;margin-bottom:10px;font-size:200%;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.uploader div.or{font-size:50%;font-weight:700;color:#677;padding:10px}@media (max-width:768px){.uploader div.browser label{max-width:95%}}@media (min-width:768px){.uploader div.browser label{width:300px}}.uploader div.browser label{background-color:#416bc4;color:#fff;padding:6px 0;font-size:40%;font-weight:700;cursor:pointer;border-radius:2px;position:relative;overflow:hidden;display:block;margin:20px auto 0;box-shadow:2px 2px 2px #888}.uploader div.browser span{cursor:pointer}.uploader div.browser input{position:absolute;top:0;right:0;margin:0;border:solid transparent;border-width:0 0 100px 200px;opacity:0;filter:alpha(opacity= 0);-o-transform:translate(250px,-50px) scale(1);-moz-transform:translate(-300px,0) scale(4);direction:ltr;cursor:pointer}.uploader div.browser label:hover{background-color:#427fed}@font-face{font-family:"markdown";src:url(../../font/markdown.eot?-6fnbp5);src:url(../../font/markdown.eot?#iefix-6fnbp5)format("embedded-opentype"),url(../../font/markdown.woff?-6fnbp5)format("woff"),url(../../font/markdown.ttf?-6fnbp5)format("truetype"),url(../../font/markdown.svg?-6fnbp5#markdown)format("svg");font-weight:400;font-style:normal}[class*=" markdown-"],[class^=markdown-]{font-family:"markdown";speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.markdown-mark:before{content:""}.markdown-mark-solid:before{content:""}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
/* vim:set sw=4 ts=4 sts=4 ft=css expandtab: */
|
||||
html {
|
||||
max-height:100%;
|
||||
}
|
||||
.height-97 {
|
||||
height: 97%;
|
||||
}
|
||||
.freezeframe {
|
||||
max-width: 100%;
|
||||
max-height:100%;
|
||||
}
|
||||
1
themes/default/public/css/twitter.min.css
vendored
1
themes/default/public/css/twitter.min.css
vendored
@@ -1 +0,0 @@
|
||||
html{max-height:100%}.height-97{height:97%}.freezeframe{max-width:100%;max-height:100%}
|
||||
@@ -2,7 +2,7 @@
|
||||
{
|
||||
border: 2px dotted #A5A5C7;
|
||||
width: 100%;
|
||||
color: #92AAB0;
|
||||
color: #777;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 30px 0px;
|
||||
@@ -22,7 +22,7 @@
|
||||
.uploader div.or {
|
||||
font-size: 50%;
|
||||
font-weight: bold;
|
||||
color: #C0C0C0;
|
||||
color: #677;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
}
|
||||
|
||||
.uploader div.browser label {
|
||||
background-color: #5a7bc2;
|
||||
background-color: #416bc4;
|
||||
padding: 5px 15px;
|
||||
color: white;
|
||||
padding: 6px 0px;
|
||||
|
||||
1
themes/default/public/js/jquery-3.2.1.min.js
vendored
1
themes/default/public/js/jquery-3.2.1.min.js
vendored
@@ -1 +0,0 @@
|
||||
jquery-3.5.1.min.js
|
||||
@@ -1 +0,0 @@
|
||||
jquery-3.5.1.min.map
|
||||
2
themes/default/public/js/jquery-3.5.1.min.js
vendored
2
themes/default/public/js/jquery-3.5.1.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
themes/default/public/js/jquery-3.7.1.min.js
vendored
Normal file
2
themes/default/public/js/jquery-3.7.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
themes/default/public/js/jquery-3.7.1.min.map
Normal file
1
themes/default/public/js/jquery-3.7.1.min.map
Normal file
File diff suppressed because one or more lines are too long
@@ -110,6 +110,7 @@ $('document').ready(function() {
|
||||
$('#import').on('change', function() { importStorage(this.files); })
|
||||
$('#mod-delay').on('click', modifyDelay);
|
||||
$('#check-all').on('click', checkAll)
|
||||
$('#mass-delete').on('click', massDelete);
|
||||
}
|
||||
$('.copy-to-clipboard-link').on('click', clickOnCopyLink);
|
||||
$('.copy-all-to-clipboard-link').on('click', copyAllToClipboard);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +0,0 @@
|
||||
freezeframe_options = {
|
||||
trigger_event: "click",
|
||||
animation_play_duration: 60000
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
<h4><%= l('How to report an image?') %></h4>
|
||||
<p><%= l('Please contact the administrator: %1', config('contact')) %></p>
|
||||
<h4><%= l('How do you pronounce Lutim?') %></h4>
|
||||
<p><%== l('Juste like you pronounce the French word <a href="https://fr.wikipedia.org/wiki/Lutin">lutin</a> (/ly.tɛ̃/).') %></p>
|
||||
<p><%== l('The way you pronounce the French word <a href="%1">lutin</a> (/ly.tɛ̃/).', 'https://fr.wikipedia.org/wiki/Lutin') %></p>
|
||||
<h4><%= l('What about the software which provides the service?') %></h4>
|
||||
<p><%== l('The Lutim software is a <a href="http://en.wikipedia.org/wiki/Free_software">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL</a> to see what you can do.') %></p>
|
||||
<p><%== l('For more details, see the <a href="https://framagit.org/fiat-tux/hat-softwares/lutim">homepage of the project</a>.') %></p>
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
% # Display image informations
|
||||
<h4>
|
||||
<a href="<%= $url.'.'.stash('ext') %>" target="_blank"><%= stash('filename') %></a>
|
||||
<a title="<%= l('Tweet it!') %>" target="_blank" href="https://twitter.com/share?url=<%= $url %>?t"><span class="icon icon-twitter"></span></a>
|
||||
</h4>
|
||||
% my $delete_url = url_for('delete', {short => stash('real_short'), token => stash('token')})->to_abs();
|
||||
<form class="form">
|
||||
@@ -181,7 +180,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lutim-file"><%= l('Send an image') %></label>
|
||||
<input type="file" name="file" id="lutim-file" accept="image/*">
|
||||
<input type="file" name="file" id="lutim-file" accept="image/*,image/avif">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lutim-file-url"><%= l('Upload an image with its URL') %></label>
|
||||
@@ -229,7 +228,7 @@
|
||||
<div class="browser">
|
||||
<label>
|
||||
<span><%= l('Click to open the file browser') %></span>
|
||||
<input type="file" name="files[]" multiple="multiple" title='<%= l('Click to open the file browser') %>' accept="image/*">
|
||||
<input type="file" name="files[]" multiple="multiple" title='<%= l('Click to open the file browser') %>' accept="image/*,image/avif">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% use Mojo::Util qw(url_escape);
|
||||
% my $twitter_url = 'https://twitter.com/share';
|
||||
% my $url = url_for('/')->to_abs();
|
||||
% $twitter_url .= '?url='.url_escape("$url")
|
||||
% .'&text=Check out this %23Lutim instance! ';
|
||||
% my $lang = $self->languages;
|
||||
% $lang =~ s/-(.*)/_\U$1/;
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html lang="<%= $lang %>">
|
||||
<head>
|
||||
<title>Lutim</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
@@ -32,7 +31,7 @@
|
||||
% }
|
||||
</head>
|
||||
<body>
|
||||
%= include 'partial/navbar', twitter_url => $twitter_url
|
||||
%= include 'partial/navbar'
|
||||
<div class="container">
|
||||
<div>
|
||||
% if (defined(config('hosted_by'))) {
|
||||
@@ -62,7 +61,7 @@
|
||||
% if (defined(config('piwik_img'))) {
|
||||
<img src="<%== config('piwik_img') %>" class="border-zero" alt="">
|
||||
% }
|
||||
%= javascript '/js/jquery-3.2.1.min.js'
|
||||
%= javascript '/js/jquery-3.7.1.min.js'
|
||||
%= javascript '/partial/manifest.js'
|
||||
%= javascript '/js/toastify.js'
|
||||
%= javascript '/js/bootstrap.min.js'
|
||||
@@ -89,7 +88,6 @@
|
||||
%= javascript '/partial/lutim.js'
|
||||
% }
|
||||
% if (current_route 'myfiles') {
|
||||
%= javascript '/js/moment-with-locales.min.js'
|
||||
%= javascript '/partial/myfiles.js'
|
||||
% }
|
||||
</body>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Lutim",
|
||||
"description": "Let's Upload That Image!\n\nThis is a simple image sharing app which use <%= url_for('/')->to_abs %> for storing the images. Once you have uploaded an image, you'll be provided differents links:\n a view link, which points directly to the image\n a download link, which force the download of the image\n a twitter link, which you can share on twitter : the image will natively appeared in twitter\n a delete link, which allows you to delete the image anytime you want\n\nThe image is stored on <%= url_for('/')->to_abs %> for a delay which you can define.\n\nThe particularity of Lutim is that the image is encrypted and its usage is as most anonymous as possible. See the information page (<%= url_for('about')->to_abs %>) for more details.\nLicense: AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html)",
|
||||
"description": "Let's Upload That Image!\n\nThis is a simple image sharing app which use <%= url_for('/')->to_abs %> for storing the images. Once you have uploaded an image, you'll be provided differents links:\n a view link, which points directly to the image\n a download link, which force the download of the image\n a social link, which you can share on social networks\n a delete link, which allows you to delete the image anytime you want\n\nThe image is stored on <%= url_for('/')->to_abs %> for a delay which you can define.\n\nThe particularity of Lutim is that the image is encrypted and its usage is as most anonymous as possible. See the information page (<%= url_for('about')->to_abs %>) for more details.\nLicense: AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html)",
|
||||
"launch_path": "<%= url_for('/') %>",
|
||||
"icons": {
|
||||
"32": "<%= url_for('/img/lutim32.png') %>",
|
||||
@@ -11,13 +11,13 @@
|
||||
"256": "<%= url_for('/img/lutim256.png') %>"
|
||||
},
|
||||
"developer": {
|
||||
"name": "Lutim team !",
|
||||
"url": "https://framagit.org/luc/lutim"
|
||||
"name": "Lutim team!",
|
||||
"url": "https://framagit.org/fiat-tux/hat-softwares/lutim"
|
||||
},
|
||||
"default_locale": "en",
|
||||
"locales": {
|
||||
"fr": {
|
||||
"description": "Envoyons cette image !\n\nCeci est une application de partage simple d'images qui utilise <%= url_for('/')->to_abs %> pour enregistrer les images. Une fois que vous avez envoyé une image, vous obtiendrez différents liens :\n un lien de visualisation, qui pointe directement sur l'image\n un lien de téléchargement, qui force le téléchargement de l'image\n un lien twitter, que vous pouvez partager sur twitter : l'image apparaîtra nativement dans twitter\n un lien de suppression, qui vous permet de supprimer l'image quand vous le souhaitez\n\nL'image est conservée sur <%= url_for('/')->to_abs %> pour un délai que vous pouvez définir.\n\nLa particularité de Lutim est que l'image est chiffrée et que son usage est aussi anonyme que possible. Voir la page d'information (<%= url_for('about')->to_abs %>) pour plus de détails.\nLicence : AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html)"
|
||||
"description": "Envoyons cette image !\n\nCeci est une application de partage simple d'images qui utilise <%= url_for('/')->to_abs %> pour enregistrer les images. Une fois que vous avez envoyé une image, vous obtiendrez différents liens :\n un lien de visualisation, qui pointe directement sur l'image\n un lien de téléchargement, qui force le téléchargement de l'image\n un lien de partage, que vous pouvez partager sur les réseaux sociaux\n un lien de suppression, qui vous permet de supprimer l'image quand vous le souhaitez\n\nL'image est conservée sur <%= url_for('/')->to_abs %> pour un délai que vous pouvez définir.\n\nLa particularité de Lutim est que l'image est chiffrée et que son usage est aussi anonyme que possible. Voir la page d'information (<%= url_for('about')->to_abs %>) pour plus de détails.\nLicence : AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html)"
|
||||
}
|
||||
},
|
||||
"activities": {
|
||||
|
||||
@@ -106,6 +106,7 @@
|
||||
<a href="#" id="json-export" class="btn btn-info"><%= l('Export localStorage data') %></a>
|
||||
<a href="#" id="json-import" class="btn btn-info"><%= l('Import localStorage data') %></a>
|
||||
<input type="file" class="hidden" id="import">
|
||||
<a href="#" id="mass-delete" class="btn btn-info" disabled><%= l('Delete selected images') %></a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
|
||||
@@ -9,14 +9,14 @@ function addToShortHash(short) {
|
||||
window.short_hash[short] = 1;
|
||||
if (Object.keys(window.short_hash).length > 0) {
|
||||
$('#gallery-url').removeClass('hidden');
|
||||
$('#gallery-url-input').val(window.gallery_url+Object.keys(window.short_hash).join(','));
|
||||
$('#gallery-url-link').attr('href', window.gallery_url+Object.keys(window.short_hash).join(','));
|
||||
$('#gallery-url-input').val(`${window.gallery_url}${Object.keys(window.short_hash).join(',')}`);
|
||||
$('#gallery-url-link').attr('href', `${window.gallery_url}${Object.keys(window.short_hash).join(',')}`);
|
||||
}
|
||||
}
|
||||
function rmFromShortHash(short) {
|
||||
delete window.short_hash[short];
|
||||
$('#gallery-url-input').val(window.gallery_url+Object.keys(window.short_hash).join(','));
|
||||
$('#gallery-url-link').attr('href', window.gallery_url+Object.keys(window.short_hash).join(','));
|
||||
$('#gallery-url-input').val(`${window.gallery_url}${Object.keys(window.short_hash).join(',')}`);
|
||||
$('#gallery-url-link').attr('href', `${window.gallery_url}${Object.keys(window.short_hash).join(',')}`);
|
||||
if (Object.keys(window.short_hash).length === 0) {
|
||||
$('#gallery-url').addClass('hidden');
|
||||
}
|
||||
@@ -25,14 +25,14 @@ function addToZipHash(short) {
|
||||
window.zip_hash[short] = 1;
|
||||
if (Object.keys(window.zip_hash).length > 0) {
|
||||
$('#zip-url').removeClass('hidden');
|
||||
$('#zip-url-input').val(window.zip_url+Object.keys(window.zip_hash).join('&i='));
|
||||
$('#zip-url-link').attr('href', window.zip_url+Object.keys(window.zip_hash).join('&i='));
|
||||
$('#zip-url-input').val(`${window.zip_url}${Object.keys(window.zip_hash).join('&i=')}`);
|
||||
$('#zip-url-link').attr('href', `${window.zip_url}${Object.keys(window.zip_hash).join('&i=')}`);
|
||||
}
|
||||
}
|
||||
function rmFromZipHash(short) {
|
||||
delete window.zip_hash[short];
|
||||
$('#zip-url-input').val(window.zip_url+Object.keys(window.zip_hash).join('&i='));
|
||||
$('#zip-url-link').attr('href', window.zip_url+Object.keys(window.zip_hash).join('&i='));
|
||||
$('#zip-url-input').val(`${window.zip_url}${Object.keys(window.zip_hash).join('&i=')}`);
|
||||
$('#zip-url-link').attr('href', `${window.zip_url}${Object.keys(window.zip_hash).join('&i=')}`);
|
||||
if (Object.keys(window.zip_hash).length === 0) {
|
||||
$('#zip-url').addClass('hidden');
|
||||
}
|
||||
@@ -41,14 +41,14 @@ function addToRandomHash(short) {
|
||||
window.random_hash[short] = 1;
|
||||
if (Object.keys(window.random_hash).length > 0) {
|
||||
$('#random-url').removeClass('hidden');
|
||||
$('#random-url-input').val(window.random_url+Object.keys(window.random_hash).join('&i='));
|
||||
$('#random-url-link').attr('href', window.random_url+Object.keys(window.random_hash).join('&i='));
|
||||
$('#random-url-input').val(`${window.random_url}${Object.keys(window.random_hash).join('&i=')}`);
|
||||
$('#random-url-link').attr('href', `${window.random_url}${Object.keys(window.random_hash).join('&i=')}`);
|
||||
}
|
||||
}
|
||||
function rmFromRandomHash(short) {
|
||||
delete window.random_hash[short];
|
||||
$('#random-url-input').val(window.random_url+Object.keys(window.random_hash).join('&i='));
|
||||
$('#random-url-link').attr('href', window.random_url+Object.keys(window.random_hash).join('&i='));
|
||||
$('#random-url-input').val(`${window.random_url}${Object.keys(window.random_hash).join('&i=')}`);
|
||||
$('#random-url-link').attr('href', `${window.random_url}${Object.keys(window.random_hash).join('&i=')}`);
|
||||
if (Object.keys(window.random_hash).length === 0) {
|
||||
$('#random-url').addClass('hidden');
|
||||
}
|
||||
@@ -85,10 +85,10 @@ function copyLink(e) {
|
||||
e.preventDefault();
|
||||
var successful = copyText($(this).prop('href'));
|
||||
var msg = successful ? 'successful' : 'unsuccessful';
|
||||
console.debug('Copying text command was ' + msg);
|
||||
console.debug(`Copying text command was ${msg}`);
|
||||
if (!successful) {
|
||||
badToast('<%= l('Unable to copy to clipboard') %>');
|
||||
throw new Error('Copying text command was ' + msg);
|
||||
throw new Error(`Copying text command was ${msg}`);
|
||||
} else {
|
||||
goodToast('<%= l('Copied to clipboard') %>');
|
||||
}
|
||||
@@ -105,10 +105,10 @@ function copyToClipboard(el) {
|
||||
try {
|
||||
var successful = copyInput(el);
|
||||
var msg = successful ? 'successful' : 'unsuccessful';
|
||||
console.debug('Copying text command was ' + msg);
|
||||
console.debug(`Copying text command was ${msg}`);
|
||||
if (!successful) {
|
||||
badToast('<%= l('Unable to copy to clipboard') %>');
|
||||
throw new Error('Copying text command was ' + msg);
|
||||
throw new Error(`Copying text command was ${msg}`);
|
||||
} else {
|
||||
goodToast('<%= l('Copied to clipboard') %>');
|
||||
}
|
||||
@@ -126,9 +126,9 @@ function copyAllToClipboard(e) {
|
||||
try {
|
||||
var successful = copyText(text.join("\n"));
|
||||
var msg = successful ? 'successful' : 'unsuccessful';
|
||||
console.debug('Copying text command was ' + msg);
|
||||
console.debug(`Copying text command was ${msg}`);
|
||||
if (!successful) {
|
||||
throw new Error('Copying text command was ' + msg);
|
||||
throw new Error(`Copying text command was ${msg}`);
|
||||
}
|
||||
} catch (err) {
|
||||
prompt('<%= l('Hit Ctrl+C, then Enter to copy the short link') %>', text.join(" "));
|
||||
@@ -139,19 +139,34 @@ function clickOnCopyLink(e) {
|
||||
e.preventDefault();
|
||||
copyToClipboard($(this));
|
||||
}
|
||||
function delImageConfirm(e) {
|
||||
e.preventDefault();
|
||||
var short = $(this).attr('data-short');
|
||||
if (confirm(`<%= l('Are you sure you want to delete the image ${short}?') %>`)) {
|
||||
var token = $(this).attr('data-token');
|
||||
var ext = $(this).attr('data-ext');
|
||||
delImageRequest(short, token);
|
||||
rmFromShortHash(`${short}.${ext}`);
|
||||
rmFromZipHash(short);
|
||||
rmFromRandomHash(short);
|
||||
}
|
||||
}
|
||||
function delImage(e) {
|
||||
e.preventDefault();
|
||||
var short = $(this).attr('data-short');
|
||||
var token = $(this).attr('data-token');
|
||||
delImageRequest(short, token);
|
||||
}
|
||||
function delImageRequest(short, token) {
|
||||
$.ajax({
|
||||
url: '<%= url_for('/') %>d/'+short+'/'+token,
|
||||
url: `<%= url_for('/') %>d/${short}/${token}`,
|
||||
method: 'GET',
|
||||
data: {
|
||||
_format: 'json'
|
||||
},
|
||||
success: function(data) {
|
||||
if (data.success) {
|
||||
$('#alert-'+short).remove();
|
||||
$(`#alert-${short}`).remove();
|
||||
evaluateCopyAll();
|
||||
delItem(short);
|
||||
goodToast('<%= l('Image deleted') %>');
|
||||
@@ -162,36 +177,43 @@ function delImage(e) {
|
||||
error: function() {
|
||||
},
|
||||
complete: function() {
|
||||
if (typeof evaluateMassDelete === "function") {
|
||||
evaluateMassDelete();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function link(url, dl, token, modify, only_url) {
|
||||
function link(url, dl, token, modify, only_url, ext) {
|
||||
if (token !== undefined) {
|
||||
if (modify !== undefined && modify === true) {
|
||||
return '<%== url_for('/m/')->to_abs() %>'+url+'/'+token;
|
||||
return `<%== url_for('/m/')->to_abs() %>${url}/${token}`;
|
||||
}
|
||||
var link = '<%== url_for('/')->to_abs() %>d/'+url+'/'+token;
|
||||
var link = `<%== url_for('/')->to_abs() %>d/${url}/${token}`;
|
||||
if (only_url !== undefined && only_url === true) {
|
||||
return link;
|
||||
}
|
||||
return [
|
||||
'<label class="sr-only" for="link-del-', url, '"><%= l('Deletion link') %></label>',
|
||||
'<div class="input-group input-group-sm">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a class="btn btn-default text-danger" href="#" title="<%= l('Deletion link') %>" id="del-', url, '" data-short="', url, '" data-token="', token, '">',
|
||||
'<span class="icon icon-trash"></span> ',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="link-del-', url, '" value="', link, '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join('');
|
||||
return `<label class="sr-only" for="link-del-${url}"><%= l('Deletion link') %></label>
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="#"
|
||||
class="btn btn-default text-danger"
|
||||
title="<%= l('Deletion link') %>"
|
||||
id="del-${url}"
|
||||
data-short="${url}"
|
||||
data-ext="${ext}"
|
||||
data-token="${token}">
|
||||
<span class="icon icon-trash"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="link-del-${url}" value="${link}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>`;
|
||||
} else if (dl !== '') {
|
||||
url = url+'?'+dl;
|
||||
url = `${url}?${dl}`;
|
||||
}
|
||||
return '<%== prefix() %>'+url;
|
||||
return `<%== prefix() %>${url}`;
|
||||
}
|
||||
|
||||
function badToast(msg) {
|
||||
@@ -216,3 +238,14 @@ function goodToast(msg) {
|
||||
positionLeft: false
|
||||
}).showToast();
|
||||
}
|
||||
|
||||
function formatDate(unixTimestamp) {
|
||||
return new Date(unixTimestamp * 1000).toLocaleString(window.navigator.language, {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
weekday: 'long',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
})
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ var initPhotoSwipeFromDOM = function(gallerySelector) {
|
||||
var galleryElements = document.querySelectorAll( gallerySelector );
|
||||
|
||||
for(var i = 0, l = galleryElements.length; i < l; i++) {
|
||||
galleryElements[i].setAttribute('data-pswp-uid', i+1);
|
||||
galleryElements[i].setAttribute('data-pswp-uid', i + 1);
|
||||
galleryElements[i].onclick = onThumbnailsClick;
|
||||
}
|
||||
|
||||
@@ -205,25 +205,19 @@ var initPhotoSwipeFromDOM = function(gallerySelector) {
|
||||
};
|
||||
|
||||
function addAlert(e) {
|
||||
$('#infos-msg').append([
|
||||
'<div class="alert alert-danger">',
|
||||
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>',
|
||||
'<strong><%= l('Something bad happened') %></strong><br>',
|
||||
cleanName(e, false),
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('#infos-msg').append(`<div class="alert alert-danger">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||
<strong><%= l('Something bad happened') %></strong><br>
|
||||
${cleanName(e, false)}
|
||||
</div>`);
|
||||
}
|
||||
|
||||
function appendToGallery(url, width, height) {
|
||||
$('.gallery').append(
|
||||
[
|
||||
'<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">',
|
||||
' <a href="', url, '" itemprop="contentUrl" data-size="', width, 'x', height, '">',
|
||||
' <img src="', url, '?width=275" itemprop="thumbnail" alt="" class="img-responsive"/>',
|
||||
' </a>',
|
||||
'</figure>'
|
||||
].join('')
|
||||
);
|
||||
$('.gallery').append(`<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<a href="${url}" itemprop="contentUrl" data-size="${width}x${height}">
|
||||
<img src="${url}?width=275" itemprop="thumbnail" alt="" class="img-responsive"/>
|
||||
</a>
|
||||
</figure>`);
|
||||
}
|
||||
|
||||
function nextOrInitGallery(keys) {
|
||||
@@ -238,21 +232,21 @@ function addElement(keys) {
|
||||
element = keys.shift();
|
||||
if (!element.match('xcf')) {
|
||||
$.ajax({
|
||||
url: '<%= url_for('about_img') %>'+element,
|
||||
url: `<%= url_for('about_img') %>${element}`,
|
||||
method: 'GET',
|
||||
dataType: 'json',
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
if (data.success) {
|
||||
if (data.data.width && data.data.height) {
|
||||
appendToGallery(absUrl+element, data.data.width, data.data.height);
|
||||
appendToGallery(`${absUrl}${element}`, data.data.width, data.data.height);
|
||||
nextOrInitGallery(keys);
|
||||
} else {
|
||||
var img = new Image();
|
||||
img.onload = function(){
|
||||
appendToGallery(absUrl+element, img.width, img.height);
|
||||
appendToGallery(`${absUrl}${element}`, img.width, img.height);
|
||||
nextOrInitGallery(keys);
|
||||
}
|
||||
img.src = absUrl+element;
|
||||
img.src = `${absUrl}${element}`;
|
||||
}
|
||||
} else {
|
||||
addAlert(data.msg);
|
||||
@@ -269,14 +263,14 @@ function addElement(keys) {
|
||||
$(document).ready(function() {
|
||||
var key = window.location.hash.substring(1); // Get key
|
||||
// First, strip everything after the equal sign (=) which signals end of base64 string.
|
||||
i = key.indexOf('='); if (i>-1) { key = key.substring(0,i+1); }
|
||||
i = key.indexOf('='); if (i>-1) { key = key.substring(0, i + 1); }
|
||||
// If the equal sign was not present, some parameters may remain:
|
||||
i = key.indexOf('&'); if (i>-1) { key = key.substring(0,i); }
|
||||
i = key.indexOf('&'); if (i>-1) { key = key.substring(0, i); }
|
||||
|
||||
var keys = key.split(',');
|
||||
$('#img-nb').append('<p><%= l('There is XXXX image(s) in the gallery') %></p>'.replace('XXXX', keys.length));
|
||||
|
||||
$('#download-all').attr('href', $('#download-all').attr('href')+keys.join('&i='));
|
||||
$('#download-all').attr('href', $('#download-all').attr('href') + keys.join('&i='));
|
||||
|
||||
addElement(keys);
|
||||
});
|
||||
|
||||
@@ -12,13 +12,6 @@ function cleanName(name, empty) {
|
||||
return name.replace(/</g, '<').replace(/>/g, '>');
|
||||
}
|
||||
}
|
||||
function tw_url(url) {
|
||||
return btn = [
|
||||
'<a title="<%= l('Tweet it!') %>" target="_blank" href="https://twitter.com/share?url=<%== url_for('/')->to_abs() %>', url, '?t" class="btn btn-default">',
|
||||
'<span class="icon icon-twitter"></span>',
|
||||
'</a>'
|
||||
].join('');
|
||||
}
|
||||
function modifyImage(e) {
|
||||
e.preventDefault();
|
||||
var url = $(this).data('modlink');
|
||||
@@ -26,13 +19,13 @@ function modifyImage(e) {
|
||||
modify(url, short);
|
||||
}
|
||||
function modify(url, short) {
|
||||
var limit = $('#day-'+short).val();
|
||||
var del_at_view = ($('#first-view-'+short).prop('checked')) ? 1 : 0;
|
||||
var limit = $(`#day-${short}`).val();
|
||||
var del_at_view = ($(`#first-view-${short}`).prop('checked')) ? 1 : 0;
|
||||
$.ajax({
|
||||
url : url,
|
||||
type : 'POST',
|
||||
data : {
|
||||
'image_url' : '<%== url_for('/')->to_abs() %>'+short,
|
||||
'image_url' : `<%== url_for('/')->to_abs() %>${short}`,
|
||||
'format' : 'json',
|
||||
'delete-day' : limit,
|
||||
'first-view' : del_at_view
|
||||
@@ -50,135 +43,131 @@ function modify(url, short) {
|
||||
function buildMessage(success, msg) {
|
||||
if(success) {
|
||||
var s_url = link([msg.short, '.', msg.ext].join(''), '');
|
||||
var thumb = (msg.thumb !== null) ? [
|
||||
'<div class="col-sm-1">',
|
||||
'<a href="', s_url, '" target="_blank">',
|
||||
'<img class="thumbnail img-responsive" alt="', cleanName(msg.filename, true), ' thumbnail" src="', msg.thumb, '">',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join('') : ''
|
||||
return [
|
||||
'<div class="alert alert-success" id="alert-', msg.real_short, '">',
|
||||
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>',
|
||||
'<div class="row">', thumb,
|
||||
'<div class="col-sm-11">',
|
||||
'<h4>',
|
||||
'<a href="', s_url, '" target="_blank">',
|
||||
msg.filename,
|
||||
'</a>',
|
||||
'</h4>',
|
||||
'<form class="form">',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="view', msg.real_short, '"><%= l('View link') %></label>',
|
||||
'<div class="input-group input-group-sm col-sm-6">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', s_url, '" target="_blank" class="btn btn-default">',
|
||||
'<span class="icon icon-eye" title=" <%= l('View link') %>"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control view-link-input" id="view', msg.real_short, '" value="', s_url, '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="markdown', msg.real_short, '"><%= l('Markdown syntax') %></label>',
|
||||
'<div class="input-group input-group-sm col-sm-6">',
|
||||
'<div class="input-group-addon adjust-addon">',
|
||||
'<span class="markdown-mark-solid" title="<%= l('Markdown syntax') %>"></span>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="markdown', msg.real_short, '" value=", ')" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="download', msg.real_short, '"><%= l('Download link') %></label>',
|
||||
'<div class="input-group input-group-sm col-sm-6">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', link(msg.short, 'dl'), '" class="btn btn-default">',
|
||||
'<span class="icon icon-download" title="<%= l('Download link') %>"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="download', msg.real_short, '" value="', link(msg.short, 'dl'), '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="share', msg.real_short, '"><%= l('Link for share on social networks') %></label>',
|
||||
'<div class="input-group input-group-sm col-sm-6">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', link(msg.short, 't'), '" target="_blank" class="btn btn-default">',
|
||||
'<span class="icon icon-share" title="<%= l('Link for share on social networks') %>"></span>',
|
||||
'</a>',
|
||||
tw_url(msg.short),
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="share', msg.real_short, '" value="', link(msg.short, 't'), '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<div class="input-group col-sm-6 col-xs-12">',
|
||||
'<span class="form-control-static">', link(msg.real_short, '', msg.token), '</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</form>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="row">',
|
||||
'<form class="form col-sm-11 col-sm-offset-1" role="form" method="POST" action="', link(msg.real_short, '', msg.token, true), '">',
|
||||
'<div class="form-group form-inline">',
|
||||
'<select id="day-', msg.real_short, '" name="delete-day" class="form-control">',
|
||||
var thumb = (msg.thumb !== null) ? `<div class="col-sm-1">
|
||||
<a href="${s_url}" target="_blank">
|
||||
<img class="thumbnail img-responsive" alt="${cleanName(msg.filename, true)} thumbnail" src="${msg.thumb}">
|
||||
</a>
|
||||
</div>` : '';
|
||||
return `<div class="alert alert-success" id="alert-${msg.real_short}">
|
||||
<button id="close-${msg.real_short}" type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||
<div class="row">${thumb}
|
||||
<div class="col-sm-11">
|
||||
<h4>
|
||||
<a href="${s_url}" target="_blank">
|
||||
${msg.filename}
|
||||
</a>
|
||||
</h4>
|
||||
<form class="form">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="view${msg.real_short}"><%= l('View link') %></label>
|
||||
<div class="input-group input-group-sm col-sm-6">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${s_url}" target="_blank" class="btn btn-default">
|
||||
<span class="icon icon-eye" title=" <%= l('View link') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control view-link-input" id="view${msg.real_short}" value="${s_url}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="markdown${msg.real_short}"><%= l('Markdown syntax') %></label>
|
||||
<div class="input-group input-group-sm col-sm-6">
|
||||
<div class="input-group-addon adjust-addon">
|
||||
<span class="markdown-mark-solid" title="<%= l('Markdown syntax') %>"></span>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="markdown${msg.real_short}" value="})" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="download${msg.real_short}"><%= l('Download link') %></label>
|
||||
<div class="input-group input-group-sm col-sm-6">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${link(msg.short, 'dl')}" class="btn btn-default">
|
||||
<span class="icon icon-download" title="<%= l('Download link') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="download${msg.real_short}" value="${link(msg.short, 'dl')}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="share${msg.real_short}"><%= l('Link for share on social networks') %></label>
|
||||
<div class="input-group input-group-sm col-sm-6">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${link(msg.short, 't')}" target="_blank" class="btn btn-default">
|
||||
<span class="icon icon-share" title="<%= l('Link for share on social networks') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="share${msg.real_short}" value="${link(msg.short, 't')}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group col-sm-6 col-xs-12">
|
||||
<span class="form-control-static">${link(msg.real_short, '', msg.token, false, false, msg.ext)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<form class="form col-sm-11 col-sm-offset-1" role="form" method="POST" action="${link(msg.real_short, '', msg.token, true)}">
|
||||
<div class="form-group form-inline">
|
||||
<select id="day-${msg.real_short}" name="delete-day" class="form-control">
|
||||
% my @delays = split(',', $self->config('proposed_delays'));
|
||||
% for my $delay (@delays) {
|
||||
% my $text = (defined($d->{'delay_'.$delay})) ? $d->{'delay_'.$delay} : l('%1 days', $delay);
|
||||
% if (config('max_delay')) {
|
||||
% if ($delay) {
|
||||
% if ($delay < config('max_delay')) {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% } elsif ($delay == config('max_delay')) {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% last;
|
||||
% } else {
|
||||
% my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);
|
||||
'<option value="<%= config('max_delay') %>" <%== is_selected(config('max_delay')) %>><%= l('%1 days', config('max_delay')) %></option>',
|
||||
<option value="<%= config('max_delay') %>" <%== is_selected(config('max_delay')) %>><%= l('%1 days', config('max_delay')) %></option>
|
||||
% last;
|
||||
% }
|
||||
% }
|
||||
% } else {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% }
|
||||
% }
|
||||
'</select> ',
|
||||
'<div class="checkbox">',
|
||||
'<label>',
|
||||
'<input id="first-view-', msg.real_short, '" type="checkbox" name="first-view"> <%= l('Delete at first view?') %>',
|
||||
'</label>',
|
||||
'</div> ',
|
||||
'<a href="#" class="btn btn-sm btn-default btn-primary modify-image" data-modlink="', link(msg.real_short, '', msg.token, true),'" data-modshort="', msg.real_short,'">',
|
||||
'<%= l('Let\'s go!') %>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</form>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join('');
|
||||
</select>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input id="first-view-${msg.real_short}" type="checkbox" name="first-view"> <%= l('Delete at first view?') %>
|
||||
</label>
|
||||
</div>
|
||||
<a href="#"
|
||||
class="btn btn-sm btn-default btn-primary modify-image"
|
||||
data-modlink="${link(msg.real_short, '', msg.token, true)}"
|
||||
data-modshort="${msg.real_short}">
|
||||
<%= l('Let\'s go!') %>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>`
|
||||
} else {
|
||||
return [
|
||||
'<div class="alert alert-danger">',
|
||||
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>',
|
||||
'<strong><%= l('Something bad happened') %></strong><br>',
|
||||
cleanName(msg.filename, false),
|
||||
'<br>',
|
||||
cleanName(msg.msg, false),
|
||||
'</div>'
|
||||
].join('');
|
||||
return `<div class="alert alert-danger">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||
<strong><%= l('Something bad happened') %></strong><br>
|
||||
${cleanName(msg.filename, false)}
|
||||
<br>
|
||||
${cleanName(msg.msg, false)}
|
||||
</div>`;
|
||||
}
|
||||
}
|
||||
function bindddz(firstview, deleteday) {
|
||||
@@ -188,51 +177,52 @@ function bindddz(firstview, deleteday) {
|
||||
allowedTypes: 'image/*',
|
||||
maxFileSize: <%= config('max_file_size') %>,
|
||||
onNewFile: function(id, file){
|
||||
$('.messages').append([
|
||||
'<div id="', id, '-div">',
|
||||
cleanName(file.name), '<br>',
|
||||
'<div class="progress">',
|
||||
'<div id="', id, '"class="progress-bar progress-striped active width-zero" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">',
|
||||
'<span id="', id, '-text" class="pull-left pdg-left-10"> 0%</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('.messages').append(`<div id="${id}-div">
|
||||
${cleanName(file.name)}<br>
|
||||
<div class="progress">
|
||||
<div id="${id}"
|
||||
class="progress-bar progress-striped active width-zero"
|
||||
role="progressbar"
|
||||
aria-valuenow="0"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100">
|
||||
<span id="${id}-text" class="pull-left pdg-left-10"> 0%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>`);
|
||||
},
|
||||
onUploadProgress: function(id, percent){
|
||||
var percentStr = ' '+percent+'%';
|
||||
$('#'+id).prop('aria-valuenow', percent);
|
||||
$('#'+id).css('width', percent+'%');
|
||||
$('#'+id+'-text').html(percentStr);
|
||||
var percentStr = ` ${percent}%`;
|
||||
$(`#${id}`).prop('aria-valuenow', percent);
|
||||
$(`#${id}`).css('width', `${percent}%`);
|
||||
$(`#${id}-text`).html(percentStr);
|
||||
},
|
||||
onUploadSuccess: function(id, data){
|
||||
data.msg.filename = cleanName(data.msg.filename);
|
||||
$('#'+id+'-div').remove();
|
||||
$(`#${id}-div`).remove();
|
||||
if ($('#copy-all').length === 0 && data.success) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('.messages').prepend(`<div class="col-xs-12 col-sm-11 col-sm-offset-1">
|
||||
<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">
|
||||
<%= l('Copy all view links to clipboard') %>
|
||||
</a>
|
||||
</div>`);
|
||||
}
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
$('#del-'+data.msg.real_short).on('click', function(e) {
|
||||
$(`#close-${data.msg.real_short}`).on('click', function(e) {
|
||||
e.preventDefault();
|
||||
rmFromShortHash(data.msg.short+'.'+data.msg.ext)
|
||||
rmFromShortHash(`${data.msg.short}.${data.msg.ext}`);
|
||||
rmFromZipHash(data.msg.short);
|
||||
rmFromRandomHash(data.msg.short);
|
||||
});
|
||||
$('#del-'+data.msg.real_short).on('click', delImage);
|
||||
$(`#del-${data.msg.real_short}`).on('click', delImageConfirm);
|
||||
if (data.success) {
|
||||
addToShortHash(data.msg.short+'.'+data.msg.ext);
|
||||
addToShortHash(`${data.msg.short}.${data.msg.ext}`);
|
||||
addToZipHash(data.msg.short);
|
||||
addToRandomHash(data.msg.short);
|
||||
$('.close').unbind('click', evaluateCopyAll);
|
||||
$('.close').on('click', evaluateCopyAll);
|
||||
$('input[type=\'text\']').unbind("click", selectInput);
|
||||
$('input[type=\'text\']').on("click", selectInput);
|
||||
$('input[type="text"]').unbind("click", selectInput);
|
||||
$('input[type="text"]').on("click", selectInput);
|
||||
$('.copy-all-to-clipboard-link').unbind('click', copyAllToClipboard);
|
||||
$('.copy-all-to-clipboard-link').on('click', copyAllToClipboard);
|
||||
$('.modify-image').unbind('click', modifyImage);
|
||||
@@ -272,19 +262,17 @@ function upload_url(e) {
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
if (data.success) {
|
||||
if ($('#copy-all').length === 0) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('.messages').prepend(`<div class="col-xs-12 col-sm-11 col-sm-offset-1">
|
||||
<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">
|
||||
<%= l('Copy all view links to clipboard') %>
|
||||
</a>
|
||||
</div>`);
|
||||
}
|
||||
$('#lutim-file-url').val('');
|
||||
addToShortHash(data.msg.short+'.'+data.msg.ext);
|
||||
addToShortHash(`${data.msg.short}.${data.msg.ext}`);
|
||||
addToZipHash(data.msg.short);
|
||||
addToRandomHash(data.msg.short);
|
||||
$('#del-'+data.msg.real_short).on('click', delImage);
|
||||
$(`#del-${data.msg.real_short}`).on('click', delImage);
|
||||
$('.close').unbind('click', evaluateCopyAll);
|
||||
$('.close').on('click', evaluateCopyAll);
|
||||
addItem(data.msg);
|
||||
@@ -316,15 +304,18 @@ function fileUpload(file) {
|
||||
fd.append('crypt', ($('#crypt').prop('checked')) ? 1 : 0);
|
||||
fd.append('delete-day', ($('#delete-day').val()));
|
||||
|
||||
$('.messages').append([
|
||||
'<div id="1-div">', cleanName(file.name), '<br>',
|
||||
'<div class="progress">',
|
||||
'<div id="1" class="progress-bar progress-striped active width-zero" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">',
|
||||
'<span id="1-text" class="pull-left pdg-left-10"> 0%</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('.messages').append(`<div id="1-div">${cleanName(file.name)}<br>
|
||||
<div class="progress">
|
||||
<div id="1"
|
||||
class="progress-bar progress-striped active width-zero"
|
||||
role="progressbar"
|
||||
aria-valuenow="0"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100">
|
||||
<span id="1-text" class="pull-left pdg-left-10"> 0%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>`);
|
||||
// Ajax Submit
|
||||
$.ajax({
|
||||
url: '<%== url_for('/') %>',
|
||||
@@ -346,9 +337,9 @@ function fileUpload(file) {
|
||||
percent = Math.ceil(position / total * 100);
|
||||
}
|
||||
|
||||
var percentStr = ' '+percent+'%';
|
||||
var percentStr = ` ${percent}%`;
|
||||
$('#1').prop('aria-valuenow', percent);
|
||||
$('#1').css('width', percent+'%');
|
||||
$('#1').css('width', `${percent}%`);
|
||||
$('#1-text').html(percentStr);
|
||||
}, false);
|
||||
}
|
||||
@@ -358,13 +349,11 @@ function fileUpload(file) {
|
||||
success: function (data, message, xhr){
|
||||
$('#1-div').remove();
|
||||
if ($('#copy-all').length === 0 && data.success) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
$('.messages').prepend(`<div class="col-xs-12 col-sm-11 col-sm-offset-1">
|
||||
<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">
|
||||
<%= l('Copy all view links to clipboard') %>
|
||||
</a>
|
||||
</div>`);
|
||||
}
|
||||
data.msg.filename = cleanName(data.msg.filename);
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
|
||||
@@ -54,10 +54,11 @@ function itemExists(name) {
|
||||
}
|
||||
function onCheck(e) {
|
||||
e.preventDefault();
|
||||
evaluateMassDelete();
|
||||
var short = $(this).data('short');
|
||||
var ext = $(this).data('ext');
|
||||
if ($(this).is(':checked')) {
|
||||
addToShortHash(short+'.'+ext);
|
||||
addToShortHash(`${short}.${ext}`);
|
||||
addToZipHash(short);
|
||||
addToRandomHash(short);
|
||||
if (!$('#check-all').is(':checked') && isAllChecked()) {
|
||||
@@ -67,7 +68,7 @@ function onCheck(e) {
|
||||
if ($('#check-all').is(':checked')) {
|
||||
$('#check-all').prop('checked', false);
|
||||
}
|
||||
rmFromShortHash(short+'.'+ext);
|
||||
rmFromShortHash(`${short}.${ext}`);
|
||||
rmFromZipHash(short);
|
||||
rmFromRandomHash(short);
|
||||
}
|
||||
@@ -117,11 +118,11 @@ function modifyDelay() {
|
||||
},
|
||||
success: function(data) {
|
||||
updateItem(short, parseInt(limit), del_at_view);
|
||||
var newLimit = (parseInt(limit, 10) === 0) ? '<%= l('No limit') %>' : moment.unix(limit * 86400 + created_at).locale(window.navigator.language).format('LLLL');
|
||||
$('#limit-'+short).html(newLimit);
|
||||
$('#del_at_view-'+short).html(delView(del_at_view));
|
||||
$('#edit-'+short).data('moddelay', limit);
|
||||
$('#edit-'+short).data('modfirstview', del_at_view);
|
||||
var newLimit = (parseInt(limit, 10) === 0) ? '<%= l('No limit') %>' : formatDate(limit * 86400 + created_at);
|
||||
$(`#limit-${short}`).html(newLimit);
|
||||
$(`#del_at_view-${short}`).html(delView(del_at_view));
|
||||
$(`#edit-${short}`).data('moddelay', limit);
|
||||
$(`#edit-${short}`).data('modfirstview', del_at_view);
|
||||
goodToast(data.msg);
|
||||
},
|
||||
error: function() {
|
||||
@@ -157,35 +158,69 @@ function populateFilesTable() {
|
||||
$('#myfiles').empty();
|
||||
files.forEach(function(element, index, array) {
|
||||
var real_short = element.real_short;
|
||||
var vlink = link(element.short+'.'+element.ext, '');
|
||||
var vlink = link(`${element.short}.${element.ext}`, '');
|
||||
var dlink = link(real_short, 'dl', element.token, false, true);
|
||||
var limit = (element.limit === 0) ? '<%= l('No limit') %>' : moment.unix(element.limit * 86400 + element.created_at).locale(window.navigator.language).format('LLLL');
|
||||
var created_at = moment.unix(element.created_at).locale(window.navigator.language).format('LLLL');
|
||||
var limit = (element.limit === 0) ? '<%= l('No limit') %>' : formatDate(element.limit * 86400 + element.created_at);
|
||||
var created_at = formatDate(element.created_at);
|
||||
|
||||
var name = element.filename.replace(/</g, '<').replace(/>/g, '>');
|
||||
var tr = [
|
||||
'<tr id="alert-',real_short,'">',
|
||||
'<td><span class="checkbox"><label><input type="checkbox" class="ckbx" data-short="', element.short, '" data-ext="', element.ext, '"><label></span></td>',
|
||||
'<td class="ellips"><span title="', name,'">', name, '</span></td>',
|
||||
'<td class="text-center">',
|
||||
'<a href="',vlink,'" target="_blank"><i class="icon icon-eye"></i></a>',
|
||||
' <a href="',vlink,'" class="copy-to-clipboard" title="<%= l('Copy to clipboard') %>"><i class="icon icon-clipboard"></i></a>',
|
||||
'</td>',
|
||||
'<td id="count-',real_short,'" class="text-center"></td>',
|
||||
'<td id="del_at_view-', real_short, '" class="text-center">', delView(element.del_at_view), '</td>',
|
||||
'<td>', created_at, '</td>',
|
||||
'<td>',
|
||||
'<span id="limit-', element.real_short, '">', limit, '</span>',
|
||||
' <a href="#" id="edit-', element.real_short, '" data-modlink="', link(element.real_short, '', element.token, true), '" data-modshort="', element.real_short, '" data-modfirstview="', element.del_at_view, '" data-moddelay="', element.limit, '" data-modcreated_at="', element.created_at, '" data-modname="', name, '" title="<%= l('Modify expiration delay') %>">',
|
||||
'<i class="icon icon-edit"></i>',
|
||||
'</a>',
|
||||
'</td>',
|
||||
'<td class="text-center"><a id="del-',real_short,'" data-short="',real_short,'" data-token="',element.token,'" href="#" class="remove-link"><i class="icon icon-trash"></i></a></td>',
|
||||
'</tr>'
|
||||
].join('');
|
||||
var tr = `<tr id="alert-${real_short}">',
|
||||
<td>
|
||||
<span class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox"
|
||||
class="ckbx"
|
||||
data-short="${element.short}"
|
||||
data-ext="${element.ext}">
|
||||
</label>
|
||||
</span>
|
||||
</td>
|
||||
<td class="ellips"><span title="${name}">${name}</span></td>
|
||||
<td class="text-center">
|
||||
<a href="${vlink}" target="_blank"><i class="icon icon-eye"></i></a>
|
||||
<a href="${vlink}"
|
||||
class="copy-to-clipboard"
|
||||
title="<%= l('Copy to clipboard') %>">
|
||||
<i class="icon icon-clipboard"></i>
|
||||
</a>
|
||||
</td>
|
||||
<td id="count-${real_short}" class="text-center"></td>
|
||||
<td id="del_at_view-${real_short}" class="text-center">${delView(element.del_at_view)}</td>
|
||||
<td>${created_at}</td>
|
||||
<td>
|
||||
<span id="limit-${element.real_short}">${limit}</span>
|
||||
<a href="#"
|
||||
id="edit-${element.real_short}"
|
||||
data-modlink="${link(element.real_short, '', element.token, true)}"
|
||||
data-modshort="${element.real_short}"
|
||||
data-modfirstview="${element.del_at_view}"
|
||||
data-moddelay="${element.limit}"
|
||||
data-modcreated_at="${element.created_at}"
|
||||
data-modname="${name}"
|
||||
title="<%= l('Modify expiration delay') %>">
|
||||
<i class="icon icon-edit"></i>
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<a id="del-${real_short}"
|
||||
data-short="${real_short}"
|
||||
data-token="${element.token}"
|
||||
href="#"
|
||||
class="remove-link">
|
||||
<i class="icon icon-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>`;
|
||||
$('#myfiles').append(tr);
|
||||
$('#del-'+real_short).on('click', delImage);
|
||||
$('#edit-'+real_short).on('click', editImage);
|
||||
$(`#del-${real_short}`).on('click', delImage);
|
||||
$(`#del-${real_short}`).on('click', function(e) {
|
||||
e.preventDefault();
|
||||
rmFromShortHash(`${element.short}.${element.ext}`);
|
||||
rmFromZipHash(element.short);
|
||||
rmFromRandomHash(element.short);
|
||||
});
|
||||
|
||||
$(`#edit-${real_short}`).on('click', editImage);
|
||||
|
||||
$.ajax({
|
||||
url : '<%== url_for('counter') %>',
|
||||
@@ -197,20 +232,40 @@ function populateFilesTable() {
|
||||
success: function(data) {
|
||||
if (data.success) {
|
||||
if (data.enabled) {
|
||||
$('#count-'+real_short).text(data.counter);
|
||||
$(`#count-${real_short}`).text(data.counter);
|
||||
} else {
|
||||
delItem(real_short);
|
||||
$('#alert-'+real_short).remove();
|
||||
$(`#alert-${real_short}`).remove();
|
||||
}
|
||||
} else {
|
||||
badToast(element.filename+' '+data.msg);
|
||||
badToast(`${element.filename} ${data.msg}`);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
badToast(element.filename+'<%= l(': Error while trying to get the counter.') %>');
|
||||
badToast(`${element.filename}<%= l(': Error while trying to get the counter.') %>`);
|
||||
}
|
||||
});
|
||||
});
|
||||
$('input.ckbx[type="checkbox"]').on('change', onCheck);
|
||||
$('.copy-to-clipboard').on('click', copyLink);
|
||||
}
|
||||
|
||||
function evaluateMassDelete() {
|
||||
if ($('input.ckbx:checked').length > 0) {
|
||||
$('#mass-delete').removeAttr('disabled');
|
||||
$('#mass-delete').removeClass('disabled');
|
||||
} else {
|
||||
$('#mass-delete').attr('disabled');
|
||||
$('#mass-delete').addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function massDelete(event) {
|
||||
event.preventDefault();
|
||||
$('input.ckbx:checked').each(delIm);
|
||||
}
|
||||
|
||||
function delIm() {
|
||||
var short = $(this).attr('data-short');
|
||||
$(`#del-${short}`).click();
|
||||
}
|
||||
|
||||
@@ -39,12 +39,14 @@
|
||||
% }
|
||||
% }
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
|
||||
<span class="icon-language" aria-hidden="true" title="<%= l('Language') %>"></span><span class="caret"></span>
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="icon-language" aria-hidden="true" title="<%= l('Language') %>"></i>
|
||||
<span class="sr-only"><%= l('Language') %></span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<li<%== ($i eq $lang) ? ' class="active"' : '' %>>
|
||||
<li<%== ($i eq $lang) ? ' class="active"' : '' %> role="menuitem">
|
||||
<a href="<%= url_for('lang', l => $i) %>" class="set-lang"><%= iso639_native_name($i) %></a>
|
||||
</li>
|
||||
% }
|
||||
@@ -63,7 +65,7 @@
|
||||
<%= link_to url_for('about') => begin %><%= l('About') %><% end %>
|
||||
</li>
|
||||
<li>
|
||||
<%= link_to 'https://framagit.org/luc/lutim' => begin %><%= l('Fork me!') %><% end %>
|
||||
<%= link_to 'https://framagit.org/fiat-tux/hat-softwares/lutim' => begin %><%= l('Fork me!') %><% end %>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
23
themes/default/templates/share.html.ep
Normal file
23
themes/default/templates/share.html.ep
Normal file
@@ -0,0 +1,23 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my $abs = url_for('/'.$short)->to_abs();
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Lutim</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" type="image/png" href="<%= url_for('/img/favicon.png')->to_abs() %>">
|
||||
<meta property="og:title" content="Lutim" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="<%= $abs %>?t" />
|
||||
<meta property="og:description" content="Image shared with Lutim" />
|
||||
<meta property="og:image" content="<%= $abs %>" />
|
||||
<meta property="og:image:url" content="<%= $abs %>" />
|
||||
<meta property="og:image:type" content="<%= $mimetype %>" />
|
||||
</head>
|
||||
<body>
|
||||
<img src="<%= $abs %>" alt="">
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my $g = ($mimetype eq 'image/gif') ? 1 : 0;
|
||||
% my $abs = url_for('/'.$short)->to_abs();
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Lutim</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" type="image/png" href="<%= url_for('/img/favicon.png')->to_abs() %>">
|
||||
%= stylesheet '/css/twitter.min.css'
|
||||
<meta property="og:title" content="Lutim" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="<%= $abs %>?t" />
|
||||
<meta property="og:image" content="<%= $abs %>" />
|
||||
<meta property="og:image:url" content="<%= $abs %>" />
|
||||
<meta property="og:image:type" content="<%= $mimetype %>" />
|
||||
% if (config('tweet_card_via')) {
|
||||
<meta name="twitter:site" content="<%= config('tweet_card_via') %>">
|
||||
% }
|
||||
<meta name="twitter:image:src" content="<%= $abs %>">
|
||||
% if ($g) {
|
||||
<meta name="twitter:card" content="player">
|
||||
<meta name="twitter:image" content="<%= $abs %>">
|
||||
<meta name="twitter:player" content="<%= $abs %>?t">
|
||||
<meta name="twitter:title" content="<%= $filename %>">
|
||||
<meta name="twitter:player:width" content="<%= $width %>">
|
||||
<meta name="twitter:player:height" content="<%= $height %>">
|
||||
%= javascript '/js/jquery-3.2.1.min.js'
|
||||
%= javascript '/js/freezeframe.min.js'
|
||||
%= javascript '/js/twitter.js'
|
||||
% } else {
|
||||
<meta name="twitter:card" content="photo">
|
||||
% }
|
||||
</head>
|
||||
<body<%== ($g) ? '' : ' class="height-97"' %>>
|
||||
<img class="freezeframe" src="<%= $abs %><%= '.gif' if ($g) %>" alt="<%= $filename %>">
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
% # Display image informations
|
||||
<h4>
|
||||
<a href="<%= $url.'.'.stash('ext') %>" target="_blank"><%= stash('filename') %></a>
|
||||
<a title="<%= l('Tweet it!') %>" target="_blank" href="https://twitter.com/share?url=<%= $url %>?t"><span class="icon icon-twitter"></span></a>
|
||||
</h4>
|
||||
% my $delete_url = url_for('delete', {short => stash('real_short'), token => stash('token')})->to_abs();
|
||||
<form class="form">
|
||||
@@ -182,7 +181,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lutim-file"><%= l('Send an image') %></label>
|
||||
<input type="file" name="file" id="lutim-file" accept="image/*">
|
||||
<input type="file" name="file" id="lutim-file" accept="image/*,image/avif">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lutim-file-url"><%= l('Upload an image with its URL') %></label>
|
||||
@@ -232,7 +231,7 @@
|
||||
<div class="browser">
|
||||
<label class="btn">
|
||||
<span><%= l('Click to open the file browser') %></span>
|
||||
<input type="file" name="files[]" multiple="multiple" title='<%= l('Click to open the file browser') %>' accept="image/*">
|
||||
<input type="file" name="files[]" multiple="multiple" title='<%= l('Click to open the file browser') %>' accept="image/*,image/avif">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% use Mojo::Util qw(url_escape);
|
||||
% my $twitter_url = 'https://twitter.com/share';
|
||||
% my $url = url_for('/')->to_abs();
|
||||
% $twitter_url .= '?url='.url_escape("$url")
|
||||
% .'&text=Check out this %23Lutim instance! ';
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
@@ -33,7 +30,7 @@
|
||||
%= stylesheet '/css/korrigan.css'
|
||||
</head>
|
||||
<body class="<%== current_route %>">
|
||||
%= include 'partial/navbar', twitter_url => $twitter_url
|
||||
%= include 'partial/navbar'
|
||||
<div class="container">
|
||||
<div class="upload-info"><!-- Warning: ends in index.html.ep -->
|
||||
<div>
|
||||
@@ -64,7 +61,7 @@
|
||||
% if (defined(config('piwik_img'))) {
|
||||
<img src="<%== config('piwik_img') %>" class="border-zero" alt="">
|
||||
% }
|
||||
%= javascript '/js/jquery-3.2.1.min.js'
|
||||
%= javascript '/js/jquery-3.7.1.min.js'
|
||||
%= javascript '/partial/manifest.js'
|
||||
%= javascript '/js/toastify.js'
|
||||
%= javascript '/js/bootstrap.min.js'
|
||||
@@ -81,6 +78,7 @@
|
||||
% }
|
||||
% if (current_route 'index') {
|
||||
%= javascript '/partial/lutim.js'
|
||||
%= javascript '/partial/korrigan.js'
|
||||
% }
|
||||
% if (current_route 'gallery') {
|
||||
%= javascript '/js/photoswipe.min.js'
|
||||
@@ -89,9 +87,9 @@
|
||||
%= javascript '/js/FileSaver.min.js'
|
||||
%= javascript '/partial/gallery.js'
|
||||
%= javascript '/partial/lutim.js'
|
||||
%= javascript '/partial/korrigan.js'
|
||||
% }
|
||||
% if (current_route 'myfiles') {
|
||||
%= javascript '/js/moment-with-locales.min.js'
|
||||
%= javascript '/partial/myfiles.js'
|
||||
% }
|
||||
</body>
|
||||
|
||||
141
themes/korrigan/templates/partial/korrigan.js.ep
Normal file
141
themes/korrigan/templates/partial/korrigan.js.ep
Normal file
@@ -0,0 +1,141 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:
|
||||
function buildMessage(success, msg) {
|
||||
if(success) {
|
||||
var s_url = link([msg.short, '.', msg.ext].join(''), '');
|
||||
var thumb = (msg.thumb !== null) ? `<div class="preview">
|
||||
<a href="${s_url}" target="_blank">
|
||||
<img class="thumbnail img-responsive" alt="${cleanName(msg.filename, true)} thumbnail" src="${msg.thumb}">
|
||||
</a>
|
||||
</div>` : '';
|
||||
return `<div class="alert alert-success" id="alert-${msg.real_short}">
|
||||
<button id="close-${msg.real_short}" type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||
<div>${thumb}
|
||||
<div>
|
||||
<h4>
|
||||
<a href="${s_url}" target="_blank">
|
||||
${msg.filename}
|
||||
</a>
|
||||
</h4>
|
||||
<form class="form">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="view${msg.real_short}"><%= l('View link') %></label>
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${s_url}" target="_blank" class="btn btn-default">
|
||||
<span class="icon icon-eye" title=" <%= l('View link') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control view-link-input" id="view${msg.real_short}" value="${s_url}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="markdown${msg.real_short}"><%= l('Markdown syntax') %></label>
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-addon adjust-addon">
|
||||
<span class="markdown-mark-solid" title="<%= l('Markdown syntax') %>"></span>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="markdown${msg.real_short}" value="})" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="download${msg.real_short}"><%= l('Download link') %></label>
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${link(msg.short, 'dl')}" class="btn btn-default">
|
||||
<span class="icon icon-download" title="<%= l('Download link') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="download${msg.real_short}" value="${link(msg.short, 'dl')}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="share${msg.real_short}"><%= l('Link for share on social networks') %></label>
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-btn adjust-addon">
|
||||
<a href="${link(msg.short, 't')}" target="_blank" class="btn btn-default">
|
||||
<span class="icon icon-share" title="<%= l('Link for share on social networks') %>"></span>
|
||||
</a>
|
||||
</div>
|
||||
<input type="text" class="form-control" id="share${msg.real_short}" value="${link(msg.short, 't')}" readonly>
|
||||
<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">
|
||||
<span class="icon icon-clipboard"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="form-control-static">${link(msg.real_short, '', msg.token, false, false, msg.ext)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<form class="form col-sm-11 col-sm-offset-1" role="form" method="POST" action="${link(msg.real_short, '', msg.token, true)}">
|
||||
<div class="form-group form-inline">
|
||||
<select id="day-${msg.real_short}" name="delete-day" class="form-control">
|
||||
% my @delays = split(',', $self->config('proposed_delays'));
|
||||
% for my $delay (@delays) {
|
||||
% my $text = (defined($d->{'delay_'.$delay})) ? $d->{'delay_'.$delay} : l('%1 days', $delay);
|
||||
% if (config('max_delay')) {
|
||||
% if ($delay) {
|
||||
% if ($delay < config('max_delay')) {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% } elsif ($delay == config('max_delay')) {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% last;
|
||||
% } else {
|
||||
% my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);
|
||||
<option value="<%= config('max_delay') %>" <%== is_selected(config('max_delay')) %>><%= l('%1 days', config('max_delay')) %></option>
|
||||
% last;
|
||||
% }
|
||||
% }
|
||||
% } else {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% }
|
||||
% }
|
||||
</select>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input id="first-view-${msg.real_short}" type="checkbox" name="first-view"> <%= l('Delete at first view?') %>
|
||||
</label>
|
||||
</div>
|
||||
<a href="#"
|
||||
class="btn btn-sm btn-default btn-primary modify-image"
|
||||
data-modlink="${link(msg.real_short, '', msg.token, true)}"
|
||||
data-modshort="${msg.real_short}">
|
||||
<%= l('Let\'s go!') %>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>`
|
||||
} else {
|
||||
return `<div class="alert alert-danger">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||
<strong><%= l('Something bad happened') %></strong><br>
|
||||
${cleanName(msg.filename, false)}
|
||||
<br>
|
||||
${cleanName(msg.msg, false)}
|
||||
</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
// Overwrite the function to edit the gallery selector: `.container .gallery` instead of `.gallery` as the page name is added
|
||||
// to the body's classnames in this theme.
|
||||
function appendToGallery(url, width, height) {
|
||||
$('.container .gallery').append(`<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<a href="${url}" itemprop="contentUrl" data-size="${width}x${height}">
|
||||
<img src="${url}?width=275" itemprop="thumbnail" alt="" class="img-responsive"/>
|
||||
</a>
|
||||
</figure>`);
|
||||
}
|
||||
@@ -1,494 +0,0 @@
|
||||
% # vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:
|
||||
function selectInput() {
|
||||
$(this).select();
|
||||
}
|
||||
function cleanName(name, empty) {
|
||||
if (typeof(name) === 'undefined') {
|
||||
return name;
|
||||
}
|
||||
if (empty !== undefined && empty !== null && empty) {
|
||||
return name.replace(/&(l|g)t;/g, '').replace(/"/g, '\'');
|
||||
} else {
|
||||
return name.replace(/</g, '<').replace(/>/g, '>');
|
||||
}
|
||||
}
|
||||
function tw_url(url) {
|
||||
return btn = [
|
||||
'<a title="<%= l('Tweet it!') %>" target="_blank" href="https://twitter.com/share?url=<%== url_for('/')->to_abs() %>', url, '?t" class="btn btn-default">',
|
||||
'<span class="icon icon-twitter"></span>',
|
||||
'</a>'
|
||||
].join('');
|
||||
}
|
||||
function modifyImage(e) {
|
||||
e.preventDefault();
|
||||
var url = $(this).data('modlink');
|
||||
var short = $(this).data('modshort');
|
||||
modify(url, short);
|
||||
}
|
||||
function modify(url, short) {
|
||||
var limit = $('#day-'+short).val();
|
||||
var del_at_view = ($('#first-view-'+short).prop('checked')) ? 1 : 0;
|
||||
$.ajax({
|
||||
url : url,
|
||||
type : 'POST',
|
||||
data : {
|
||||
'image_url' : '<%== url_for('/')->to_abs() %>'+short,
|
||||
'format' : 'json',
|
||||
'delete-day' : limit,
|
||||
'first-view' : del_at_view
|
||||
},
|
||||
success: function(data) {
|
||||
updateItem(short, limit, del_at_view);
|
||||
goodToast(data.msg);
|
||||
},
|
||||
error: function() {
|
||||
badToast('<%= l('Error while trying to modify the image.') %>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function buildMessage(success, msg) {
|
||||
if(success) {
|
||||
var s_url = link([msg.short, '.', msg.ext].join(''), '');
|
||||
var thumb = (msg.thumb !== null) ? [
|
||||
'<div class="preview">',
|
||||
'<a href="', s_url, '" target="_blank">',
|
||||
'<img class="thumbnail img-responsive" alt="', cleanName(msg.filename, true), ' thumbnail" src="', msg.thumb, '">',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join('') : ''
|
||||
return [
|
||||
'<div class="alert alert-success" id="alert-', msg.real_short, '">',
|
||||
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>',
|
||||
'<div>', thumb,
|
||||
'<div>',
|
||||
'<h4>',
|
||||
'<a href="', s_url, '" target="_blank">',
|
||||
msg.filename,
|
||||
'</a>',
|
||||
'</h4>',
|
||||
'<form class="form">',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="view', msg.real_short, '"><%= l('View link') %></label>',
|
||||
'<div class="input-group input-group-sm">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', s_url, '" target="_blank" class="btn btn-default">',
|
||||
'<span class="icon icon-eye" title=" <%= l('View link') %>"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control view-link-input" id="view', msg.real_short, '" value="', s_url, '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="markdown', msg.real_short, '"><%= l('Markdown syntax') %></label>',
|
||||
'<div class="input-group input-group-sm">',
|
||||
'<div class="input-group-addon adjust-addon">',
|
||||
'<span class="markdown-mark-solid" title="<%= l('Markdown syntax') %>"></span>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="markdown', msg.real_short, '" value=", ')" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="download', msg.real_short, '"><%= l('Download link') %></label>',
|
||||
'<div class="input-group input-group-sm">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', link(msg.short, 'dl'), '" class="btn btn-default">',
|
||||
'<span class="icon icon-download" title="<%= l('Download link') %>"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="download', msg.real_short, '" value="', link(msg.short, 'dl'), '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<label class="sr-only" for="share', msg.real_short, '"><%= l('Link for share on social networks') %></label>',
|
||||
'<div class="input-group input-group-sm">',
|
||||
'<div class="input-group-btn adjust-addon">',
|
||||
'<a href="', link(msg.short, 't'), '" target="_blank" class="btn btn-default">',
|
||||
'<span class="icon icon-share" title="<%= l('Link for share on social networks') %>"></span>',
|
||||
'</a>',
|
||||
tw_url(msg.short),
|
||||
'</div>',
|
||||
'<input type="text" class="form-control" id="share', msg.real_short, '" value="', link(msg.short, 't'), '" readonly>',
|
||||
'<a href="#" class="input-group-addon copy-to-clipboard-link" title="<%= l('Copy to clipboard') %>">',
|
||||
'<span class="icon icon-clipboard"></span>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="form-group">',
|
||||
'<div class="input-group">',
|
||||
'<span class="form-control-static">', link(msg.real_short, '', msg.token), '</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</form>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<div class="row">',
|
||||
'<form class="form col-sm-11 col-sm-offset-1" role="form" method="POST" action="', link(msg.real_short, '', msg.token, true), '">',
|
||||
'<div class="form-group form-inline">',
|
||||
'<select id="day-', msg.real_short, '" name="delete-day" class="form-control">',
|
||||
% my @delays = split(',', $self->config('proposed_delays'));
|
||||
% for my $delay (@delays) {
|
||||
% my $text = (defined($d->{'delay_'.$delay})) ? $d->{'delay_'.$delay} : l('%1 days', $delay);
|
||||
% if (config('max_delay')) {
|
||||
% if ($delay) {
|
||||
% if ($delay < config('max_delay')) {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
% } elsif ($delay == config('max_delay')) {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
% last;
|
||||
% } else {
|
||||
% my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);
|
||||
'<option value="<%= config('max_delay') %>" <%== is_selected(config('max_delay')) %>><%= l('%1 days', config('max_delay')) %></option>',
|
||||
% last;
|
||||
% }
|
||||
% }
|
||||
% } else {
|
||||
'<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>',
|
||||
% }
|
||||
% }
|
||||
'</select> ',
|
||||
'<div class="checkbox">',
|
||||
'<label>',
|
||||
'<input id="first-view-', msg.real_short, '" type="checkbox" name="first-view"> <%= l('Delete at first view?') %>',
|
||||
'</label>',
|
||||
'</div> ',
|
||||
'<a href="#" class="btn btn-sm btn-default btn-primary modify-image" data-modlink="', link(msg.real_short, '', msg.token, true),'" data-modshort="', msg.real_short,'">',
|
||||
'<%= l('Let\'s go!') %>',
|
||||
'</a>',
|
||||
'</div>',
|
||||
'</form>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join('');
|
||||
} else {
|
||||
return [
|
||||
'<div class="alert alert-danger">',
|
||||
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>',
|
||||
'<strong><%= l('Something bad happened') %></strong><br>',
|
||||
cleanName(msg.filename, false),
|
||||
'<br>',
|
||||
cleanName(msg.msg, false),
|
||||
'</div>'
|
||||
].join('');
|
||||
}
|
||||
}
|
||||
function bindddz(firstview, deleteday) {
|
||||
$('#drag-and-drop-zone').dmUploader({
|
||||
url: '<%== url_for('/') %>',
|
||||
dataType: 'json',
|
||||
allowedTypes: 'image/*',
|
||||
maxFileSize: <%= config('max_file_size') %>,
|
||||
onNewFile: function(id, file){
|
||||
$('.messages').append([
|
||||
'<div id="', id, '-div">',
|
||||
cleanName(file.name), '<br>',
|
||||
'<div class="progress">',
|
||||
'<div id="', id, '"class="progress-bar progress-striped active width-zero" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">',
|
||||
'<span id="', id, '-text" class="pull-left pdg-left-10"> 0%</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
},
|
||||
onUploadProgress: function(id, percent){
|
||||
var percentStr = ' '+percent+'%';
|
||||
$('#'+id).prop('aria-valuenow', percent);
|
||||
$('#'+id).css('width', percent+'%');
|
||||
$('#'+id+'-text').html(percentStr);
|
||||
},
|
||||
onUploadSuccess: function(id, data){
|
||||
data.msg.filename = cleanName(data.msg.filename);
|
||||
$('#'+id+'-div').remove();
|
||||
if ($('#copy-all').length === 0 && data.success) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
}
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
$('#del-'+data.msg.real_short).on('click', function(e) {
|
||||
e.preventDefault();
|
||||
rmFromShortHash(data.msg.short+'.'+data.msg.ext)
|
||||
rmFromZipHash(data.msg.short);
|
||||
rmFromRandomHash(data.msg.short);
|
||||
});
|
||||
$('#del-'+data.msg.real_short).on('click', delImage);
|
||||
if (data.success) {
|
||||
addToShortHash(data.msg.short+'.'+data.msg.ext);
|
||||
addToZipHash(data.msg.short);
|
||||
addToRandomHash(data.msg.short);
|
||||
$('.close').unbind('click', evaluateCopyAll);
|
||||
$('.close').on('click', evaluateCopyAll);
|
||||
$('input[type=\'text\']').unbind("click", selectInput);
|
||||
$('input[type=\'text\']').on("click", selectInput);
|
||||
$('.copy-all-to-clipboard-link').unbind('click', copyAllToClipboard);
|
||||
$('.copy-all-to-clipboard-link').on('click', copyAllToClipboard);
|
||||
$('.modify-image').unbind('click', modifyImage);
|
||||
$('.modify-image').on('click', modifyImage);
|
||||
$('.copy-to-clipboard-link').unbind('click', clickOnCopyLink);
|
||||
$('.copy-to-clipboard-link').on('click', clickOnCopyLink);
|
||||
addItem(data.msg);
|
||||
}
|
||||
},
|
||||
onUploadError: function(id, message){
|
||||
$('.messages').append(buildMessage(false, ''));
|
||||
},
|
||||
onFileSizeError: function(file){
|
||||
$('.messages').append(buildMessage(false, { filename: file.name, msg: '<%= l('The file exceed the size limit (%1)', config('max_file_size')) %>'}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function upload_url(e) {
|
||||
e.preventDefault();
|
||||
var val = $('#lutim-file-url').val();
|
||||
if (val !== undefined && val !== '') {
|
||||
$('#lutim-file-url').prop('disabled', 'disabled');
|
||||
$('.hidden-spin').css('display', 'block');
|
||||
$.ajax({
|
||||
url : '<%== url_for('/') %>',
|
||||
type : 'POST',
|
||||
data : {
|
||||
'lutim-file-url' : val,
|
||||
'format' : 'json',
|
||||
'first-view' : ($('#first-view').prop('checked')) ? 1 : 0,
|
||||
'crypt' : ($('#crypt').prop('checked')) ? 1 : 0,
|
||||
'delete-day' : $('#delete-day').val()
|
||||
},
|
||||
success: function(data) {
|
||||
data.msg.filename = cleanName(data.msg.filename);
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
if (data.success) {
|
||||
if ($('#copy-all').length === 0) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
}
|
||||
$('#lutim-file-url').val('');
|
||||
addToShortHash(data.msg.short+'.'+data.msg.ext);
|
||||
addToZipHash(data.msg.short);
|
||||
addToRandomHash(data.msg.short);
|
||||
$('#del-'+data.msg.real_short).on('click', delImage);
|
||||
$('.close').unbind('click', evaluateCopyAll);
|
||||
$('.close').on('click', evaluateCopyAll);
|
||||
addItem(data.msg);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
$('.messages').append(buildMessage(false, ''));
|
||||
},
|
||||
complete: function() {
|
||||
$('#lutim-file-url').prop('disabled', '');
|
||||
$('.hidden-spin').css('display', 'none');
|
||||
$('.copy-all-to-clipboard-link').unbind('click', copyAllToClipboard);
|
||||
$('.copy-all-to-clipboard-link').on('click', copyAllToClipboard);
|
||||
$('.modify-image').unbind('click', modifyImage);
|
||||
$('.modify-image').on('click', modifyImage);
|
||||
$('.copy-to-clipboard-link').unbind('click', clickOnCopyLink);
|
||||
$('.copy-to-clipboard-link').on('click', clickOnCopyLink);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function fileUpload(file) {
|
||||
var fd = new FormData();
|
||||
fd.append('file', file);
|
||||
|
||||
fd.append('format', 'json');
|
||||
fd.append('first-view', ($('#first-view').prop('checked')) ? 1 : 0);
|
||||
fd.append('crypt', ($('#crypt').prop('checked')) ? 1 : 0);
|
||||
fd.append('delete-day', ($('#delete-day').val()));
|
||||
|
||||
$('.messages').append([
|
||||
'<div id="1-div">', cleanName(file.name), '<br>',
|
||||
'<div class="progress">',
|
||||
'<div id="1" class="progress-bar progress-striped active width-zero" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">',
|
||||
'<span id="1-text" class="pull-left pdg-left-10"> 0%</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
// Ajax Submit
|
||||
$.ajax({
|
||||
url: '<%== url_for('/') %>',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: fd,
|
||||
cache: false,
|
||||
contentType: false,
|
||||
processData: false,
|
||||
forceSync: false,
|
||||
xhr: function(){
|
||||
var xhrobj = $.ajaxSettings.xhr();
|
||||
if(xhrobj.upload){
|
||||
xhrobj.upload.addEventListener('progress', function(event) {
|
||||
var percent = 0;
|
||||
var position = event.loaded || event.position;
|
||||
var total = event.total || e.totalSize;
|
||||
if(event.lengthComputable){
|
||||
percent = Math.ceil(position / total * 100);
|
||||
}
|
||||
|
||||
var percentStr = ' '+percent+'%';
|
||||
$('#1').prop('aria-valuenow', percent);
|
||||
$('#1').css('width', percent+'%');
|
||||
$('#1-text').html(percentStr);
|
||||
}, false);
|
||||
}
|
||||
|
||||
return xhrobj;
|
||||
},
|
||||
success: function (data, message, xhr){
|
||||
$('#1-div').remove();
|
||||
if ($('#copy-all').length === 0 && data.success) {
|
||||
$('.messages').prepend([
|
||||
'<div class="col-xs-12 col-sm-11 col-sm-offset-1">',
|
||||
'<a id="copy-all" href="#" class="btn btn-info copy-all-to-clipboard-link">',
|
||||
'<%= l('Copy all view links to clipboard') %>',
|
||||
'</a>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
}
|
||||
data.msg.filename = cleanName(data.msg.filename);
|
||||
$('.messages').append(buildMessage(data.success, data.msg));
|
||||
if (data.success) {
|
||||
$('.close').unbind('click', evaluateCopyAll);
|
||||
$('.close').on('click', evaluateCopyAll);
|
||||
addItem(data.msg);
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, errMsg){
|
||||
$('.messages').append(buildMessage(false, ''));
|
||||
},
|
||||
complete: function () {
|
||||
$('.copy-all-to-clipboard-link').unbind('click', copyAllToClipboard);
|
||||
$('.copy-all-to-clipboard-link').on('click', copyAllToClipboard);
|
||||
$('.modify-image').unbind('click', modifyImage);
|
||||
$('.modify-image').on('click', modifyImage);
|
||||
$('.copy-to-clipboard-link').unbind('click', clickOnCopyLink);
|
||||
$('.copy-to-clipboard-link').on('click', clickOnCopyLink);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initPaste() {
|
||||
/*
|
||||
actually FF and Chrome doesn't handle paste events the same way...
|
||||
for ff we need to create a editable div and register an event to it.
|
||||
When user paste, the image is "really" pasted in the div. Then, we need to iterate throught
|
||||
the div childs to get images. Previsouly FF didn't have the paste event so it was esay to figure on wich browser we were.
|
||||
But firefox now have a paste event so I test it...
|
||||
|
||||
on Chrome the file object is directlyt in the clipboard.
|
||||
*/
|
||||
var b = 'FF';
|
||||
try {
|
||||
//FF
|
||||
var cbe = new ClipboardEvent('hop');
|
||||
} catch(hop) {
|
||||
//under webkkit Clipboard doesn't have arguments...
|
||||
b = 'WK'
|
||||
}
|
||||
if (b === 'FF') {
|
||||
var pasteDiv = document.createElement('div');
|
||||
pasteDiv.addEventListener('paste', onPasteFF);
|
||||
pasteDiv.setAttribute('class', 'pasteZone');
|
||||
pasteDiv.setAttribute('contenteditable', true);
|
||||
|
||||
document.getElementsByTagName('body')[0].appendChild(pasteDiv);
|
||||
pasteDiv.focus();
|
||||
|
||||
document.addEventListener('click', function(event) {
|
||||
var t = $(event.target);
|
||||
|
||||
switch (t[0].nodeName.toUpperCase()) {
|
||||
case 'A':
|
||||
case 'BUTTON':
|
||||
case 'INPUT':
|
||||
case 'SELECT':
|
||||
case 'SPAN':
|
||||
case 'LABEL':
|
||||
break;
|
||||
default:
|
||||
if (t[0].parentNode.nodeName.toUpperCase() !== 'SELECT') {
|
||||
pasteDiv.focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
document.addEventListener('paste', onPaste);
|
||||
}
|
||||
}
|
||||
|
||||
function waitforpastedata(elem, savedcontent) {
|
||||
if (elem.childNodes && elem.childNodes.length > 0) {
|
||||
processpaste(elem, savedcontent);
|
||||
} else {
|
||||
var that = {
|
||||
e: elem,
|
||||
s: savedcontent
|
||||
};
|
||||
that.callself = function () {
|
||||
waitforpastedata(that.e, that.s);
|
||||
}
|
||||
setTimeout(that.callself, 20);
|
||||
}
|
||||
}
|
||||
|
||||
function processpaste(elem, savedcontent) {
|
||||
var pasteZone = document.getElementsByClassName('pasteZone')[0];
|
||||
var f = new Image();
|
||||
|
||||
f.onload = function(){
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.width = f.width;
|
||||
canvas.height = f.height;
|
||||
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.drawImage(f, 0, 0, canvas.width, canvas.height);
|
||||
|
||||
canvas.toBlob(function(blob) {
|
||||
var url = window.URL.createObjectURL(blob);
|
||||
fileUpload(blob);
|
||||
});
|
||||
}
|
||||
|
||||
f.src = pasteZone.childNodes[0].src;
|
||||
|
||||
pasteZone.innerHTML = '';
|
||||
}
|
||||
|
||||
function onPasteFF(e) {
|
||||
var pasteZone = document.getElementsByClassName('pasteZone')[0];
|
||||
waitforpastedata(pasteZone, 'savedcontent');
|
||||
}
|
||||
|
||||
function onPaste(e) {
|
||||
var items = e.clipboardData.items;
|
||||
for(var i = 0; i < items.length; i++) {
|
||||
var item = items[i];
|
||||
if (/image/.test(item.type)) {
|
||||
var file = item.getAsFile();
|
||||
fileUpload(file);
|
||||
} else {
|
||||
//not image..
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,7 @@ $d->dir( $ENV{'SHUTTER_INTL'} );
|
||||
|
||||
my %upload_plugin_info = (
|
||||
'module' => "Lutim",
|
||||
'url' => "https://lut.im/",
|
||||
'url' => "https://lutim.fiat-tux.fr/",
|
||||
'registration' => "-",
|
||||
'name' => "Lutim",
|
||||
'description' => "Upload screenshots to Lutim",
|
||||
@@ -102,7 +102,7 @@ sub upload {
|
||||
#upload the file
|
||||
eval{
|
||||
|
||||
my $url = 'https://lut.im/';
|
||||
my $url = 'https://lutim.fiat-tux.fr/';
|
||||
my $request = HTTP::Request::Common::POST(
|
||||
$url,
|
||||
Content_Type => 'multipart/form-data',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[Unit]
|
||||
Description=Image hosting and sharing service job queue
|
||||
Documentation=https://framagit.org/luc/lutim
|
||||
Documentation=https://framagit.org/fiat-tux/hat-softwares/lutim
|
||||
After=lutim.service
|
||||
|
||||
[Service]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[Unit]
|
||||
Description=Image hosting and sharing service
|
||||
Documentation=https://framagit.org/luc/lutim
|
||||
Documentation=https://framagit.org/fiat-tux/hat-softwares/lutim
|
||||
Requires=network.target
|
||||
After=network.target
|
||||
#Requires=postgresql.service
|
||||
|
||||
Reference in New Issue
Block a user