Commit 339cdf39 authored by Luc Didry's avatar Luc Didry
Browse files

Use .po files for i18n + add spanish translation

parent f1c096fd
[main]
host = https://www.transifex.com
[lutim.enpo]
source_file = lib/Lutim/I18N/en.po
source_lang = en
type = PO
file_filter = lib/Lutim/I18N/<lang>.po
Revision history for Lutim
0.7 2015-08-02
- Use .po files for internationalization
- Add spanish translation (thx to Laura Arjona Reina)
0.6 2014-10-03
- Add OpenGraph tags in social page (ex-twitter page)
- Update README.md
......
EXTRACTFILES=utilities/locales_files.txt
EN=lib/Lutim/I18N/en.po
XGETTEXT=carton exec local/bin/xgettext.pl
CARTON=carton exec
LUTIM=script/lutim
locales:
$(XGETTEXT) -f $(EXTRACTFILES) -o $(EN)
tx push -s
dev:
$(CARTON) morbo $(LUTIM) --listen http://0.0.0.0:3000
......@@ -278,16 +278,11 @@ And restart Shutter if it was running.
Of course, this plugin is configured for the official instance of Lutim (<http://lut.im>), feel free to edit it for your own instance.
## Internationalization
Lutim comes with English and French languages. It will choose the language to display from the browser's settings.
Lutim comes with English, French and Spanish languages. It will choose the language to display from the browser's settings.
If you want to add more languages, for example German:
```shell
cd lib/Lutim/I18N
cp en.pm de.pm
vim de.pm
```
There is a [project on Transifex](https://www.transifex.com/projects/p/lutim/) if you want to help translating Lutim. There is also the `templates/manifest.webapp.ep` file which contains multiple languages sentences.
There's just a few sentences, so it will be quick to translate. Please consider to send me you language file in order to help the other users :smile:.
Thank you :smile:
## Others projects dependancies
Lutim is written in Perl with the [Mojolicious](http://mojolicio.us) framework, uses the [Twitter bootstrap](http://getbootstrap.com) framework to look not too ugly, [JQuery](http://jquery.com) and [JQuery File Uploader](https://github.com/danielm/uploader/) (slightly modified) to add some modernity, [Raphaël](http://raphaeljs.com/) and [morris.js](http://www.oesmith.co.uk/morris.js/) for stats graphs and [freezeframe.js](http://freezeframe.chrisantonellis.com/) (slightly modified) to be able to freeze animated gifs in twitter card.
......@@ -303,3 +298,4 @@ Licenses for the icons fonts are in `public/font/LICENSE.txt`.
* Jean-Christophe Bach (<https://github.com/jcb>)
* Florian Bigard, aka Chocobozzz (<https://github.com/Chocobozzz>)
* Sandro CAZZANIGA, aka Kharec (<http://sandrocazzaniga.fr>), [@Kharec](https://twitter.com/Kharec)
* Laura Arjona Reina (<https://wiki.debian.org/LauraArjona>), spanish translation
......@@ -53,7 +53,7 @@ sub startup {
unless ( -f $path && -r _ ) {
$c->app->log->error("Cannot read file [$path]. error [$!]");
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return 500;
}
......@@ -146,7 +146,7 @@ sub startup {
if (-f 'stop-upload' || -f 'stop-upload.manual') {
$c->stash(
stop_upload => $c->l('stop_upload', $config->{contact})
stop_upload => $c->l('Uploading is currently disabled, please try later or contact the administrator (%1).', $config->{contact})
);
return 1;
}
......
......@@ -70,7 +70,7 @@ sub modify {
my $image = $images[0];
my $msg;
if ($image->mod_token() ne $token || $token eq '') {
$msg = $c->l('invalid_token');
$msg = $c->l('The delete token is invalid.');
} else {
$c->app->log->info('[MODIFICATION] someone modify '.$image->filename.' with token method (path: '.$image->path.')');
......@@ -78,7 +78,7 @@ sub modify {
delete_at_day => ($c->param('delete-day') && $c->param('delete-day') <= $c->max_delay) ? $c->param('delete-day') : $c->max_delay,
delete_at_first_view => ($c->param('first-view')) ? 1 : 0,
);
$msg = $c->l('image_delay_modified');
$msg = $c->l('The image\'s delay has been successfully modified');
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
......@@ -112,7 +112,7 @@ sub modify {
$c->app->log->info('[UNSUCCESSFUL] someone tried to modify '.$short.' but it does\'nt exist.');
# Image never existed
my $msg = $c->l('image_mod_not_found', $short);
my $msg = $c->l('Unable to find the image %1.', $short);
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
......@@ -139,15 +139,15 @@ sub delete {
my $image = $images[0];
my $msg;
if ($image->mod_token() ne $token || $token eq '') {
$msg = $c->l('invalid_token');
$msg = $c->l('The delete token is invalid.');
} elsif ($image->enabled() == 0) {
$msg = $c->l('already_deleted', $image->filename);
$msg = $c->l('The image %1 has already been deleted.', $image->filename);
} else {
$c->app->log->info('[DELETION] someone made '.$image->filename.' removed with token method (path: '.$image->path.')');
$c->delete_image($image);
$c->flash(
success => $c->l('image_deleted', $image->filename)
success => $c->l('The image %1 has been successfully deleted', $image->filename)
);
return $c->redirect_to('/');
}
......@@ -191,7 +191,7 @@ sub add {
);
$c->app->{wait_for_it}->{$ip} = time;
} elsif ($tx->res->is_limit_exceeded) {
my $msg = $c->l('file_too_big', $tx->res->max_message_size);
my $msg = $c->l('The file exceed the size limit (%1)', $tx->res->max_message_size);
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
......@@ -208,7 +208,7 @@ sub add {
return $c->redirect_to('/');
}
} else {
my $msg = $c->l('download_error');
my $msg = $c->l('An error occured while downloading the image.');
$c->app->log->warn('[DOWNLOAD ERROR]'.$c->dumper($tx->error));
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
......@@ -227,7 +227,7 @@ sub add {
}
}
} else {
my $msg = $c->l('no_valid_url');
my $msg = $c->l('The URL is not valid.');
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
......@@ -258,7 +258,7 @@ sub add {
mkdir('files', 0700) unless (-d 'files');
if ($c->req->is_limit_exceeded) {
$msg = $c->l('file_too_big', $c->req->max_message_size);
$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') {
return $c->render(
json => {
......@@ -325,12 +325,12 @@ sub add {
$short .= '/'.$key if (defined($key));
} else {
# Houston, we have a problem
$msg = $c->l('no_more_short', $c->config->{contact});
$msg = $c->l('There is no more available URL. Retry or contact the administrator. %1', $c->config->{contact});
}
}
LutimModel->commit;
} else {
$msg = $c->l('no_valid_file', $upload->filename);
$msg = $c->l('The file %1 is not an image.', $upload->filename);
}
if (defined($c->param('format')) && $c->param('format') eq 'json') {
......@@ -409,7 +409,7 @@ sub short {
# Warn user
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
}
......@@ -455,7 +455,7 @@ sub short {
$c->delete_image($images[0]);
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
} else {
......@@ -499,7 +499,7 @@ sub short {
# Warn user
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
} else {
......
package Lutim::I18N;
use base 'Locale::Maketext';
use File::Basename qw/dirname/;
use Locale::Maketext::Lexicon {
_auto => 1,
_decode => 1,
_style => 'gettext',
'*' => [Gettext => dirname(__FILE__) . '/I18N/*.po']
};
1;
package Lutim::I18N::en;
use Mojo::Base 'Lutim::I18N';
my $inf_body = <<EOF;
<h4>What is Lutim?</h4>
<p>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.</p>
<p>The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed.</p>
<h4>How does it work?</h4>
<p>Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you three 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.</p>
<p>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.</p>
<h4>Is it really free (as in free beer)?</h4>
<p>Yes, it is! On the other side, if you want to support the developer, you can do it via <a href="https://flattr.com/submit/auto?user_id=_SKy_&amp;url=[_1]&amp;title=Lutim&amp;category=software">Flattr</a> or with <a href="bitcoin:1K3n4MXNRSMHk28oTfXEvDunWFthePvd8v?label=lutim">BitCoin</a>.</p>
<h4>Is it really anonymous?</h4>
<p>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!</p>
<p>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).</p>
<p>If the files are deleted if you ask it while posting it, their SHA512 footprint are retained.</p>
<h4>Who owns rights on images uploaded on Lutim?</h4>
<p>Only the uploader! (well, only if he's the only owner of the images' rights before the upload)</p>
<p>Unlike many image sharing services, you don't give rights on uploaded images.</p>
<h4>How to report an image?</h4>
<p>Please contact the administrator: [_2]</p>
<h4>How do you pronounce Lutim?</h4>
<p>Juste like you pronounce the French word <a href="https://fr.wikipedia.org/wiki/Lutin">lutin</a> (/ly.tɛ̃/).</p>
<h4>What about the software which provides the service?</h4>
<p>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>For more details, see the <a href="https://github.com/ldidry/lutim">Github</a> page of the project.</p>
<h4>Main developers</h4>
<ul>
<li>Luc Didry, aka Sky (<a href="http://www.fiat-tux.fr">http://www.fiat-tux.fr</a>), core developer, \@framasky on <a href="https://twitter.com/framasky">Twitter</a>, or on <a href="https://framasphere.org/public/framasky">Diaspora*</a></li>
<li>Dattaz (<a href="http://dattaz.fr">http://dattaz.fr</a>), webapp developer, <a href="https://twitter.com/dat_taz">\@dat_taz</a></li>
</ul>
<h4>Contributors</h4>
<ul>
<li>Jean-Bernard Marcon, aka Goofy (<a href="https://github.com/goofy-bz">https://github.com/goofy-bz</a>)</li>
<li>Jean-Christophe Bach (<a href="https://github.com/jcb">https://github.com/jcb</a>)</li>
<li>Florian Bigard, aka Chocobozzz (<a href="https://github.com/Chocobozzz">https://github.com/Chocobozzz</a>)</li>
<li>Sandro CAZZANIGA, aka Kharec (<a href="http://sandrocazzaniga.fr">http://sandrocazzaniga.fr</a>), <a href="https://twitter.com/Kharec">\@Kharec</a></li>
</ul>
EOF
our %Lexicon = (
'homepage' => 'Homepage',
'license' => 'License:',
'fork-me' => 'Fork me on Github !',
'share-twitter' => 'Share on Twitter',
'informations' => 'Informations',
'informations-body' => $inf_body,
'view-link' => 'View link',
'download-link' => 'Download link',
'share-link' => 'Link for share on social networks',
'tweet_it' => 'Tweet it!',
'share_it' => 'Share it!',
'delete-link' => 'Deletion link',
'some-bad' => 'Something bad happened',
'delete-first' => 'Delete at first view?',
'delete-day' => 'Delete after 24 hours?',
'upload_image' => 'Send an image',
'image-only' => 'Only images are allowed',
'go' => 'Let\'s go!',
'drag-n-drop' => 'Drag & drop images here',
'or' => '-or-',
'file-browser' => 'Click to open the file browser',
'image_not_found' => 'Unable to find the image: it has been deleted.',
'no_more_short' => 'There is no more available URL. Retry or contact the administrator. [_1]',
'no_valid_file' => 'The file [_1] is not an image.',
'file_too_big' => 'The file exceed the size limit ([_1])',
'no_time_limit' => 'No time limit',
'24_hours' => '24 hours',
'7_days' => '7 days',
'30_days' => '30 days',
'1_year' => 'One year',
'pushed-images' => ' sent images on this instance from beginning.',
'graph-data-once-a-day' => 'The graph\'s datas are not updated in real-time.',
'lutim-stats' => 'Lutim\'s statistics',
'back-to-index' => 'Back to homepage',
'stop_upload' => 'Uploading is currently disabled, please try later or contact the administrator ([_1]).',
'download_error' => 'An error occured while downloading the image.',
'no_valid_url' => 'The URL is not valid.',
'image_url' => 'Image URL',
'upload_image_url' => 'Upload an image with its URL',
'delay_0' => 'no time limit',
'delay_1' => '24 hours',
'delay_days' => '[_1] days',
'delay_365' => '1 year',
'max_delay' => 'Warning! The maximum time limit for an image is [_1] day(s), even if you choose "no time limit".',
'crypt_image' => 'Encrypt the image (Lutim does not keep the key).',
'always_encrypt' => 'The images are encrypted on the server (Lutim does not keep the key).',
'image_deleted' => 'The image [_1] has been successfully deleted',
'invalid_token' => 'The delete token is invalid.',
'already_deleted' => 'The image [_1] has already been deleted.',
'install_as_webapp' => 'Install webapp',
'image_delay_modified' => 'The image\'s delay has been successfully modified',
'image_mod_not_found' => 'Unable to find the image [_1].',
'modify_image_error' => 'Error while trying to modify the image.',
);
1;
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#. ($delay)
#. (config('max_delay')
#: templates/index.html.ep:134 templates/index.html.ep:143 templates/index.html.ep:144 templates/index.html.ep:255 templates/index.html.ep:264 templates/index.html.ep:265 templates/index.html.ep:36 templates/index.html.ep:45 templates/index.html.ep:46 templates/index.html.ep:88 templates/index.html.ep:97 templates/index.html.ep:98
msgid "%1 days"
msgstr ""
#. ($total)
#: templates/stats.html.ep:2
msgid "%1 sent images on this instance from beginning."
msgstr ""
#: templates/index.html.ep:164
msgid "-or-"
msgstr ""
#: templates/index.html.ep:5
msgid "1 year"
msgstr ""
#: templates/index.html.ep:143 templates/index.html.ep:264 templates/index.html.ep:4 templates/index.html.ep:45 templates/index.html.ep:97
msgid "24 hours"
msgstr ""
#: lib/Lutim/Controller.pm:211
msgid "An error occured while downloading the image."
msgstr ""
#: templates/about.html.ep:39 templates/stats.html.ep:13
msgid "Back to homepage"
msgstr ""
#: templates/index.html.ep:167 templates/index.html.ep:168
msgid "Click to open the file browser"
msgstr ""
#: templates/about.html.ep:30
msgid "Contributors"
msgstr ""
#: templates/index.html.ep:109 templates/index.html.ep:155 templates/index.html.ep:273 templates/index.html.ep:57
msgid "Delete at first view?"
msgstr ""
#: templates/index.html.ep:249 templates/index.html.ep:26
msgid "Deletion link"
msgstr ""
#: templates/index.html.ep:24 templates/index.html.ep:245
msgid "Download link"
msgstr ""
#: templates/index.html.ep:163
msgid "Drag & drop images here"
msgstr ""
#: 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 ""
#: templates/index.html.ep:112 templates/index.html.ep:158 templates/index.html.ep:60
msgid "Encrypt the image (Lutim does not keep the key)."
msgstr ""
#: templates/index.html.ep:230
msgid "Error while trying to modify the image."
msgstr ""
#: templates/stats.html.ep:9
msgid "Evolution of total files"
msgstr ""
#: templates/about.html.ep:24
msgid "For more details, see the <a href=\"https://git.framasoft.org/luc/lutim\">homepage of the project</a>."
msgstr ""
#: templates/layouts/default.html.ep:50
msgid "Fork me!"
msgstr ""
#: templates/layouts/default.html.ep:45
msgid "Homepage"
msgstr ""
#: templates/about.html.ep:20
msgid "How do you pronounce Lutim?"
msgstr ""
#: templates/about.html.ep:6
msgid "How does it work?"
msgstr ""
#: templates/about.html.ep:18
msgid "How to report an image?"
msgstr ""
#: templates/about.html.ep:14
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
msgstr ""
#: templates/index.html.ep:122 templates/index.html.ep:177
msgid "Image URL"
msgstr ""
#: templates/layouts/default.html.ep:49
msgid "Informations"
msgstr ""
#: templates/layouts/default.html.ep:54
msgid "Install webapp"
msgstr ""
#: templates/about.html.ep:11
msgid "Is it really anonymous?"
msgstr ""
#: templates/about.html.ep:9
msgid "Is it really free (as in free beer)?"
msgstr ""
#: 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 ""
#: templates/index.html.ep:125 templates/index.html.ep:180 templates/index.html.ep:275 templates/index.html.ep:63
msgid "Let's go!"
msgstr ""
#: templates/layouts/default.html.ep:48
msgid "License:"
msgstr ""
#: templates/index.html.ep:247 templates/index.html.ep:25
msgid "Link for share on social networks"
msgstr ""
#: 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 ""
#: templates/about.html.ep:25
msgid "Main developers"
msgstr ""
#: templates/index.html.ep:124 templates/index.html.ep:172
msgid "Only images are allowed"
msgstr ""
#: 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 ""
#: templates/about.html.ep:19
msgid "Please contact the administrator: %1"
msgstr ""
#: templates/index.html.ep:117
msgid "Send an image"
msgstr ""
#: templates/index.html.ep:212
msgid "Share it!"
msgstr ""
#: templates/layouts/default.html.ep:51
msgid "Share on Twitter"
msgstr ""
#: templates/index.html.ep:278 templates/index.html.ep:77
msgid "Something bad happened"
msgstr ""
#: 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 ""
#: 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.pm:230
msgid "The URL is not valid."
msgstr ""
#: lib/Lutim/Controller.pm:142 lib/Lutim/Controller.pm:73
msgid "The delete token is invalid."
msgstr ""
#. ($upload->filename)
#: lib/Lutim/Controller.pm:333
msgid "The file %1 is not an image."
msgstr ""
#. ($max_file_size)
#. ($tx->res->max_message_size)
#. ($c->req->max_message_size)
#: lib/Lutim/Controller.pm:194 lib/Lutim/Controller.pm:261 templates/index.html.ep:308
msgid "The file exceed the size limit (%1)"
msgstr ""
#: templates/stats.html.ep:11
msgid "The graph's datas are not updated in real-time."
msgstr ""
#. ($image->filename)
#: lib/Lutim/Controller.pm:144
msgid "The image %1 has already been deleted."
msgstr ""
#. ($image->filename)
#: lib/Lutim/Controller.pm:150
msgid "The image %1 has been successfully deleted"
msgstr ""
#: lib/Lutim/Controller.pm:81
msgid "The image's delay has been successfully modified"
msgstr ""
#: templates/index.html.ep:9
msgid "The images are encrypted on the server (Lutim does not keep the key)."
msgstr ""
#: 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 ""
#. ($c->config->{contact})
#: lib/Lutim/Controller.pm:328
msgid "There is no more available URL. Retry or contact the administrator. %1"
msgstr ""
#: templates/index.html.ep:20 templates/index.html.ep:210
msgid "Tweet it!"
msgstr ""
#. ($short)
#: lib/Lutim/Controller.pm:115
msgid "Unable to find the image %1."
msgstr ""
#: lib/Lutim.pm:56 lib/Lutim/Controller.pm:412 lib/Lutim/Controller.pm:458 lib/Lutim/Controller.pm:502
msgid "Unable to find the image: it has been deleted."
msgstr ""
#: templates/about.html.ep:17
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
msgstr ""
#: templates/index.html.ep:121 templates/index.html.ep:175
msgid "Upload an image with its URL"
msgstr ""
#: templates/stats.html.ep:6
msgid "Uploaded files by days"
msgstr ""
#. ($config->{contact})
#: lib/Lutim.pm:149
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
msgstr ""
#: templates/index.html.ep:23 templates/index.html.ep:243
msgid "View link"
msgstr ""
#: templates/about.html.ep:22
msgid "What about the software which provides the service?"
msgstr ""
#: templates/about.html.ep:3
msgid "What is Lutim?"
msgstr ""
#: templates/about.html.ep:15
msgid "Who owns rights on images uploaded on Lutim?"
msgstr ""
#: 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 ""
#. (url_for('index')
#: 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://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
msgstr ""
#: 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 ""
#: templates/about.html.ep:27
msgid "and on"
msgstr ""
#: templates/about.html.ep:27
msgid "core developer"
msgstr ""
#: templates/index.html.ep:3
msgid "no time limit"
msgstr ""
#: templates/about.html.ep:27
msgid "on"
msgstr ""