diff options
123 files changed, 3165 insertions, 1119 deletions
diff --git a/app/DoctrineMigrations/Version20160812120952.php b/app/DoctrineMigrations/Version20160812120952.php index 9adfdc8b..a8d3bcf2 100644 --- a/app/DoctrineMigrations/Version20160812120952.php +++ b/app/DoctrineMigrations/Version20160812120952.php | |||
@@ -29,7 +29,11 @@ class Version20160812120952 extends AbstractMigration implements ContainerAwareI | |||
29 | */ | 29 | */ |
30 | public function up(Schema $schema) | 30 | public function up(Schema $schema) |
31 | { | 31 | { |
32 | $this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD name longtext COLLATE \'utf8_unicode_ci\' DEFAULT NULL'); | 32 | if ($this->connection->getDatabasePlatform()->getName() == 'sqlite') { |
33 | $this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD name longtext DEFAULT NULL'); | ||
34 | } else { | ||
35 | $this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD name longtext COLLATE \'utf8_unicode_ci\' DEFAULT NULL'); | ||
36 | } | ||
33 | } | 37 | } |
34 | 38 | ||
35 | /** | 39 | /** |
diff --git a/app/Resources/static/themes/material/css/main.css b/app/Resources/static/themes/material/css/main.css index 67be1d22..00d7a869 100755 --- a/app/Resources/static/themes/material/css/main.css +++ b/app/Resources/static/themes/material/css/main.css | |||
@@ -348,7 +348,6 @@ main ul.row { | |||
348 | .card .card-content .card-title { | 348 | .card .card-content .card-title { |
349 | line-height: 32px; | 349 | line-height: 32px; |
350 | max-height: 64px; | 350 | max-height: 64px; |
351 | display: block; | ||
352 | } | 351 | } |
353 | 352 | ||
354 | .card .card-content i.right, | 353 | .card .card-content i.right, |
@@ -409,12 +408,12 @@ main ul.row { | |||
409 | } | 408 | } |
410 | 409 | ||
411 | .card .card-action a { | 410 | .card .card-action a { |
412 | color: #fff; | 411 | color: #fff !important; |
413 | margin: 0; | 412 | margin: 0; |
414 | } | 413 | } |
415 | 414 | ||
416 | .card .card-action a:hover { | 415 | .card .card-action a:hover { |
417 | color: #fff; | 416 | color: #fff !important; |
418 | } | 417 | } |
419 | 418 | ||
420 | .settings .div_tabs { | 419 | .settings .div_tabs { |
diff --git a/app/config/config.yml b/app/config/config.yml index a4584a1b..fbebfee7 100644 --- a/app/config/config.yml +++ b/app/config/config.yml | |||
@@ -55,7 +55,7 @@ wallabag_user: | |||
55 | registration_enabled: "%fosuser_registration%" | 55 | registration_enabled: "%fosuser_registration%" |
56 | 56 | ||
57 | wallabag_import: | 57 | wallabag_import: |
58 | allow_mimetypes: ['application/octet-stream', 'application/json', 'text/plain'] | 58 | allow_mimetypes: ['application/octet-stream', 'application/json', 'text/plain', 'text/csv'] |
59 | resource_dir: "%kernel.root_dir%/../web/uploads/import" | 59 | resource_dir: "%kernel.root_dir%/../web/uploads/import" |
60 | 60 | ||
61 | # Twig Configuration | 61 | # Twig Configuration |
@@ -64,6 +64,7 @@ twig: | |||
64 | strict_variables: "%kernel.debug%" | 64 | strict_variables: "%kernel.debug%" |
65 | form_themes: | 65 | form_themes: |
66 | - "LexikFormFilterBundle:Form:form_div_layout.html.twig" | 66 | - "LexikFormFilterBundle:Form:form_div_layout.html.twig" |
67 | exception_controller: wallabag_core.exception_controller:showAction | ||
67 | 68 | ||
68 | # Doctrine Configuration | 69 | # Doctrine Configuration |
69 | doctrine: | 70 | doctrine: |
@@ -236,6 +237,11 @@ old_sound_rabbit_mq: | |||
236 | exchange_options: | 237 | exchange_options: |
237 | name: 'wallabag.import.readability' | 238 | name: 'wallabag.import.readability' |
238 | type: topic | 239 | type: topic |
240 | import_instapaper: | ||
241 | connection: default | ||
242 | exchange_options: | ||
243 | name: 'wallabag.import.instapaper' | ||
244 | type: topic | ||
239 | import_wallabag_v1: | 245 | import_wallabag_v1: |
240 | connection: default | 246 | connection: default |
241 | exchange_options: | 247 | exchange_options: |
@@ -273,6 +279,14 @@ old_sound_rabbit_mq: | |||
273 | queue_options: | 279 | queue_options: |
274 | name: 'wallabag.import.readability' | 280 | name: 'wallabag.import.readability' |
275 | callback: wallabag_import.consumer.amqp.readability | 281 | callback: wallabag_import.consumer.amqp.readability |
282 | import_instapaper: | ||
283 | connection: default | ||
284 | exchange_options: | ||
285 | name: 'wallabag.import.instapaper' | ||
286 | type: topic | ||
287 | queue_options: | ||
288 | name: 'wallabag.import.instapaper' | ||
289 | callback: wallabag_import.consumer.amqp.instapaper | ||
276 | import_wallabag_v1: | 290 | import_wallabag_v1: |
277 | connection: default | 291 | connection: default |
278 | exchange_options: | 292 | exchange_options: |
diff --git a/app/config/routing.yml b/app/config/routing.yml index 40cc7165..2be74d7f 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml | |||
@@ -7,6 +7,11 @@ wallabag_import: | |||
7 | type: annotation | 7 | type: annotation |
8 | prefix: /import | 8 | prefix: /import |
9 | 9 | ||
10 | wallabag_user: | ||
11 | resource: "@WallabagUserBundle/Controller/" | ||
12 | type: annotation | ||
13 | prefix: /users | ||
14 | |||
10 | wallabag_api: | 15 | wallabag_api: |
11 | resource: "@WallabagApiBundle/Resources/config/routing.yml" | 16 | resource: "@WallabagApiBundle/Resources/config/routing.yml" |
12 | prefix: / | 17 | prefix: / |
diff --git a/app/config/security.yml b/app/config/security.yml index 1f30e58b..efb00a53 100644 --- a/app/config/security.yml +++ b/app/config/security.yml | |||
@@ -63,4 +63,5 @@ security: | |||
63 | - { path: ^/share, roles: IS_AUTHENTICATED_ANONYMOUSLY } | 63 | - { path: ^/share, roles: IS_AUTHENTICATED_ANONYMOUSLY } |
64 | - { path: ^/settings, roles: ROLE_SUPER_ADMIN } | 64 | - { path: ^/settings, roles: ROLE_SUPER_ADMIN } |
65 | - { path: ^/annotations, roles: ROLE_USER } | 65 | - { path: ^/annotations, roles: ROLE_USER } |
66 | - { path: ^/users, roles: ROLE_SUPER_ADMIN } | ||
66 | - { path: ^/, roles: ROLE_USER } | 67 | - { path: ^/, roles: ROLE_USER } |
diff --git a/app/config/services.yml b/app/config/services.yml index 76bbce27..a57ef0f3 100644 --- a/app/config/services.yml +++ b/app/config/services.yml | |||
@@ -21,6 +21,7 @@ services: | |||
21 | - "@wallabag_core.tag_repository" | 21 | - "@wallabag_core.tag_repository" |
22 | - "@security.token_storage" | 22 | - "@security.token_storage" |
23 | - "%wallabag_core.cache_lifetime%" | 23 | - "%wallabag_core.cache_lifetime%" |
24 | - "@translator" | ||
24 | tags: | 25 | tags: |
25 | - { name: twig.extension } | 26 | - { name: twig.extension } |
26 | 27 | ||
diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 29d27c3a..1fb1f298 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile | |||
@@ -4,9 +4,10 @@ FROM php:fpm | |||
4 | ARG timezone='Europe/Paris' | 4 | ARG timezone='Europe/Paris' |
5 | 5 | ||
6 | RUN apt-get update && apt-get install -y \ | 6 | RUN apt-get update && apt-get install -y \ |
7 | libmcrypt-dev libicu-dev libpq-dev libxml2-dev \ | 7 | libmcrypt-dev libicu-dev libpq-dev libxml2-dev libpng12-dev libjpeg-dev \ |
8 | && /usr/local/bin/docker-php-ext-configure gd --with-jpeg-dir=/usr/include \ | ||
8 | && docker-php-ext-install \ | 9 | && docker-php-ext-install \ |
9 | iconv mcrypt mbstring intl pdo pdo_mysql pdo_pgsql | 10 | iconv mcrypt mbstring intl pdo pdo_mysql pdo_pgsql gd |
10 | 11 | ||
11 | RUN echo "date.timezone="$timezone > /usr/local/etc/php/conf.d/date_timezone.ini | 12 | RUN echo "date.timezone="$timezone > /usr/local/etc/php/conf.d/date_timezone.ini |
12 | 13 | ||
diff --git a/docs/de/conf.py b/docs/de/conf.py index 8f2d130d..cc9dcdf8 100644 --- a/docs/de/conf.py +++ b/docs/de/conf.py | |||
@@ -12,7 +12,7 @@ source_suffix = '.rst' | |||
12 | master_doc = 'index' | 12 | master_doc = 'index' |
13 | project = u'wallabag-fr' | 13 | project = u'wallabag-fr' |
14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' | 14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' |
15 | version = '2.0.0' | 15 | version = '2.1.0' |
16 | release = version | 16 | release = version |
17 | exclude_patterns = ['_build'] | 17 | exclude_patterns = ['_build'] |
18 | pygments_style = 'sphinx' | 18 | pygments_style = 'sphinx' |
diff --git a/docs/de/developer/docker.rst b/docs/de/developer/docker.rst index c63194aa..9948fe8c 100644 --- a/docs/de/developer/docker.rst +++ b/docs/de/developer/docker.rst | |||
@@ -44,7 +44,7 @@ wallabag laufen lassen | |||
44 | Eigenschaften mit den kommentierten zu ersetzen (mit Werten | 44 | Eigenschaften mit den kommentierten zu ersetzen (mit Werten |
45 | mit ``env.`` Präfix) | 45 | mit ``env.`` Präfix) |
46 | #. ``composer install`` die Projektabhängigkeiten | 46 | #. ``composer install`` die Projektabhängigkeiten |
47 | #. ``php app/console wallabag:install``, um das Schema zu erstellen | 47 | #. ``php bin/console wallabag:install``, um das Schema zu erstellen |
48 | #. ``docker-compose up`` um die Container laufen zu lassen | 48 | #. ``docker-compose up`` um die Container laufen zu lassen |
49 | #. Schließlich öffne http://localhost:8080/, um dein frisch | 49 | #. Schließlich öffne http://localhost:8080/, um dein frisch |
50 | installiertes wallabag zu finden. | 50 | installiertes wallabag zu finden. |
diff --git a/docs/de/developer/rabbitmq.rst b/docs/de/developer/rabbitmq.rst new file mode 100644 index 00000000..bea02ff4 --- /dev/null +++ b/docs/de/developer/rabbitmq.rst | |||
@@ -0,0 +1,77 @@ | |||
1 | Installiere RabbitMQ für asynchrone Aufgaben | ||
2 | ============================================ | ||
3 | |||
4 | Um asynchrone Aufgaben zu starten (nützlich z.B. für große Imports), können wir RabbitMQ nutzen. | ||
5 | |||
6 | Voraussetzungen | ||
7 | --------------- | ||
8 | |||
9 | Du musst RabbitMQ auf deinem Server installiert haben. | ||
10 | |||
11 | Installation | ||
12 | ~~~~~~~~~~~~ | ||
13 | |||
14 | .. code:: bash | ||
15 | |||
16 | wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc | ||
17 | apt-key add rabbitmq-signing-key-public.asc | ||
18 | apt-get update | ||
19 | apt-get install rabbitmq-server | ||
20 | |||
21 | Konfiguration und Starten | ||
22 | ~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
23 | |||
24 | .. code:: bash | ||
25 | |||
26 | rabbitmq-plugins enable rabbitmq_management # (useful to have a web interface, available at http://localhost:15672/ (guest/guest) | ||
27 | rabbitmq-server -detached | ||
28 | |||
29 | RabbitMQ stoppen | ||
30 | ~~~~~~~~~~~~~~~ | ||
31 | |||
32 | .. code:: bash | ||
33 | |||
34 | rabbitmqctl stop | ||
35 | |||
36 | |||
37 | Konfigure RabbitMQ in wallabag | ||
38 | ------------------------------ | ||
39 | |||
40 | Bearbeite die Datei ``parameters.yml``, um die RabbitMQ Konfiguration einzurichten. Die Standardkonfiguration sollte ok sein: | ||
41 | |||
42 | .. code:: yaml | ||
43 | |||
44 | rabbitmq_host: localhost | ||
45 | rabbitmq_port: 5672 | ||
46 | rabbitmq_user: guest | ||
47 | rabbitmq_password: guest | ||
48 | |||
49 | |||
50 | Starte den RabbitMQ Consumer | ||
51 | ---------------------------- | ||
52 | |||
53 | Abhängig von welchem Service du importieren möchtest, solltest du einen Cron Job aktivieren (oder mehrere, wenn du viele unterstützen willst): | ||
54 | |||
55 | .. code:: bash | ||
56 | |||
57 | # for Pocket import | ||
58 | bin/console rabbitmq:consumer import_pocket -w | ||
59 | |||
60 | # for Readability import | ||
61 | bin/console rabbitmq:consumer import_readability -w | ||
62 | |||
63 | # for Instapaper import | ||
64 | bin/console rabbitmq:consumer import_instapaper -w | ||
65 | |||
66 | # for wallabag v1 import | ||
67 | bin/console rabbitmq:consumer import_wallabag_v1 -w | ||
68 | |||
69 | # for wallabag v2 import | ||
70 | bin/console rabbitmq:consumer import_wallabag_v2 -w | ||
71 | |||
72 | # for Firefox import | ||
73 | bin/console rabbitmq:consumer import_firefox -w | ||
74 | |||
75 | # for Chrome import | ||
76 | bin/console rabbitmq:consumer import_chrome -w | ||
77 | |||
diff --git a/docs/de/developer/redis.rst b/docs/de/developer/redis.rst new file mode 100644 index 00000000..d613ce6c --- /dev/null +++ b/docs/de/developer/redis.rst | |||
@@ -0,0 +1,71 @@ | |||
1 | Installiere Redis für asynchrone Aufgaben | ||
2 | ========================================= | ||
3 | |||
4 | Um asynchrone Aufgaben zu starten (nützlich z.B. für große Imports), können wir Redis nutzen. | ||
5 | |||
6 | Voraussetzungen | ||
7 | --------------- | ||
8 | |||
9 | Du musst Redis auf deinem Server installiert haben. | ||
10 | |||
11 | Installation | ||
12 | ~~~~~~~~~~~~ | ||
13 | |||
14 | .. code:: bash | ||
15 | |||
16 | apt-get install redis-server | ||
17 | |||
18 | Starten | ||
19 | ~~~~~~ | ||
20 | |||
21 | Der Redis Service läuft eventuell schon direkt nach der Installation. Falls nicht kannst du ihn wie folgt starten: | ||
22 | |||
23 | .. code:: bash | ||
24 | |||
25 | redis-server | ||
26 | |||
27 | |||
28 | Konfigure Redis in wallabag | ||
29 | --------------------------- | ||
30 | |||
31 | Bearbeite die Datei ``parameters.yml``, um die RabbitMQ Konfiguration einzurichten. Die Standardkonfiguration sollte ok sein: | ||
32 | |||
33 | .. code:: yaml | ||
34 | |||
35 | redis_host: localhost | ||
36 | redis_port: 6379 | ||
37 | |||
38 | |||
39 | Starte den Redis Consumer | ||
40 | ------------------------- | ||
41 | |||
42 | Abhängig von welchem Service du importieren möchtest, solltest du einen Cron Job aktivieren (oder mehrere, wenn du viele unterstützen willst): | ||
43 | |||
44 | .. code:: bash | ||
45 | |||
46 | # for Pocket import | ||
47 | bin/console wallabag:import:redis-worker pocket -vv >> /path/to/wallabag/var/logs/redis-pocket.log | ||
48 | |||
49 | # for Readability import | ||
50 | bin/console wallabag:import:redis-worker readability -vv >> /path/to/wallabag/var/logs/redis-readability.log | ||
51 | |||
52 | # for Instapaper import | ||
53 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-instapaper.log | ||
54 | |||
55 | # for wallabag v1 import | ||
56 | bin/console wallabag:import:redis-worker wallabag_v1 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v1.log | ||
57 | |||
58 | # for wallabag v2 import | ||
59 | bin/console wallabag:import:redis-worker wallabag_v2 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v2.log | ||
60 | |||
61 | # for Firefox import | ||
62 | bin/console wallabag:import:redis-worker firefox -vv >> /path/to/wallabag/var/logs/redis-firefox.log | ||
63 | |||
64 | # for Chrome import | ||
65 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-chrome.log | ||
66 | |||
67 | Wenn du den Import nur für ein paar Nachrichten und nicht für alle starten willst, kannst du die Nummer (im folgenden Beispiel 12) angeben. Der Redis Worker wird dann nach der 12. Nachricht stoppen: | ||
68 | |||
69 | .. code:: bash | ||
70 | |||
71 | bin/console wallabag:import:redis-worker pocket -vv --maxIterations=12 | ||
diff --git a/docs/de/index.rst b/docs/de/index.rst index d8cd8f39..b3cd33b0 100644 --- a/docs/de/index.rst +++ b/docs/de/index.rst | |||
@@ -30,7 +30,8 @@ Die Dokumentation ist in anderen Sprachen verfügbar : | |||
30 | 30 | ||
31 | user/faq | 31 | user/faq |
32 | user/installation | 32 | user/installation |
33 | user/upgrade | 33 | user/upgrade-2.0.x-2.1.y |
34 | user/upgrade-2.0.x-2.0.y | ||
34 | user/migration | 35 | user/migration |
35 | user/import | 36 | user/import |
36 | user/create_account | 37 | user/create_account |
@@ -55,3 +56,5 @@ Die Dokumentation ist in anderen Sprachen verfügbar : | |||
55 | developer/documentation | 56 | developer/documentation |
56 | developer/translate | 57 | developer/translate |
57 | developer/maintenance | 58 | developer/maintenance |
59 | developer/redis | ||
60 | developer/rabbitmq | ||
diff --git a/docs/de/user/upgrade.rst b/docs/de/user/upgrade-2.0.x-2.0.y.rst index 953c84ff..adf288bd 100644 --- a/docs/de/user/upgrade.rst +++ b/docs/de/user/upgrade-2.0.x-2.0.y.rst | |||
@@ -1,17 +1,18 @@ | |||
1 | Wallabag updaten | 1 | Wallabag updaten 2.0.x -> 2.1.x |
2 | ================ | 2 | =============================== |
3 | 3 | ||
4 | Update auf einem dedizierten Webserver | 4 | Update auf einem dedizierten Webserver |
5 | -------------------------------------- | 5 | -------------------------------------- |
6 | 6 | ||
7 | Das neueste Release ist auf https://www.wallabag.org/pages/download-wallabag.html veröffentlicht. Um deine wallabag Installation auf die neueste Version upzudaten, führe die folgenden Kommandos in deinem wallabag Ordner aus (ersetze ``2.1.0`` mit der neuesten Releasenummer): | 7 | Das neueste Release ist auf https://www.wallabag.org/pages/download-wallabag.html veröffentlicht. Um deine wallabag Installation auf die neueste Version upzudaten, führe die folgenden Kommandos in deinem wallabag Ordner aus (ersetze ``2.0.8`` mit der neuesten Releasenummer): |
8 | 8 | ||
9 | :: | 9 | :: |
10 | 10 | ||
11 | git fetch origin | 11 | git fetch origin |
12 | git fetch --tags | 12 | git fetch --tags |
13 | git checkout 2.1.0 | 13 | git checkout 2.0.8 |
14 | ./install.sh | 14 | SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist |
15 | php bin/console cache:clear --env=prod | ||
15 | 16 | ||
16 | Update auf einem Shared Webhosting | 17 | Update auf einem Shared Webhosting |
17 | ---------------------------------- | 18 | ---------------------------------- |
diff --git a/docs/de/user/upgrade-2.0.x-2.1.y.rst b/docs/de/user/upgrade-2.0.x-2.1.y.rst new file mode 100644 index 00000000..85229d30 --- /dev/null +++ b/docs/de/user/upgrade-2.0.x-2.1.y.rst | |||
@@ -0,0 +1,64 @@ | |||
1 | Wallabag updaten | ||
2 | ================ | ||
3 | |||
4 | .. warning:: | ||
5 | Wenn du den Import von Pocket durch das Hinzufügen des Consumer Key in den internen Einstellungen konfiguriert hast, fertige bitte ein Backup deines Keys an, bevor du auf das neue Release migrierst: Du wirst den Key nach dem Update in der Konfiguration erneut eintragen müssen. | ||
6 | |||
7 | Update auf einem dedizierten Webserver | ||
8 | -------------------------------------- | ||
9 | |||
10 | Das neueste Release ist auf https://www.wallabag.org/pages/download-wallabag.html veröffentlicht. Um deine wallabag-Installation auf die neueste Version zu aktualisieren, führe die folgenden Kommandos in deinem wallabag-Ordner aus (ersetze ``2.1.0`` mit der neuesten Releasenummer): | ||
11 | |||
12 | :: | ||
13 | |||
14 | git fetch origin | ||
15 | git fetch --tags | ||
16 | git checkout 2.1.0 | ||
17 | ASSETS=build ./install.sh | ||
18 | php bin/console doctrine:migrations:migrate --env=prod | ||
19 | php bin/console cache:clear --env=prod | ||
20 | |||
21 | Update auf einem Shared Webhosting | ||
22 | ---------------------------------- | ||
23 | |||
24 | Sichere deine ``app/config/parameters.yml`` Datei. | ||
25 | |||
26 | Lade das neueste Release von wallabag herunter: | ||
27 | |||
28 | .. code-block:: bash | ||
29 | |||
30 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package | ||
31 | |||
32 | (md5 hash: ``4f84c725d1d6e3345eae0a406115e5ff``) | ||
33 | |||
34 | Entpacke das Archiv in deinen wallabag-Ordner und ersetze ``app/config/parameters.yml`` mit deiner Datei. | ||
35 | |||
36 | Bitte beachte, dass wir in dieser Version neue Parameter hinzugefügt haben. Du musst die Datei ``app/config/parameters.yml`` bearbeiten und die folgenden Zeilen hinzufügen (ersetze die Werte mit deiner Konfiguration): | ||
37 | |||
38 | .. code-block:: bash | ||
39 | |||
40 | # RabbitMQ processing | ||
41 | rabbitmq_host: localhost | ||
42 | rabbitmq_port: 5672 | ||
43 | rabbitmq_user: guest | ||
44 | rabbitmq_password: guest | ||
45 | |||
46 | # Redis processing | ||
47 | redis_host: localhost | ||
48 | redis_port: 6379 | ||
49 | |||
50 | Wenn du SQLite nutzt, musst auch das ``data/`` Verzeichnis in die neue Installation kopieren. | ||
51 | |||
52 | Leere den ``var/cache`` Ordner. | ||
53 | |||
54 | Du musst einige SQL-Abfragen ausführen, um die Datenbank zu aktualisieren. Wir nehmen in diesem Fall an, dass das Tabellenpräfix ``wallabag_`` ist und eine MySQL-Datenbank genutzt wird: | ||
55 | |||
56 | .. code-block:: sql | ||
57 | |||
58 | ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL; | ||
59 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry'); | ||
60 | ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL; | ||
61 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import'); | ||
62 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import'); | ||
63 | ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL; | ||
64 | DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key'; | ||
diff --git a/docs/en/conf.py b/docs/en/conf.py index 86e33704..717b35f1 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py | |||
@@ -12,7 +12,7 @@ source_suffix = '.rst' | |||
12 | master_doc = 'index' | 12 | master_doc = 'index' |
13 | project = u'wallabag' | 13 | project = u'wallabag' |
14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' | 14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' |
15 | version = '2.0.0' | 15 | version = '2.1.0' |
16 | release = version | 16 | release = version |
17 | exclude_patterns = ['_build'] | 17 | exclude_patterns = ['_build'] |
18 | pygments_style = 'sphinx' | 18 | pygments_style = 'sphinx' |
diff --git a/docs/en/developer/docker.rst b/docs/en/developer/docker.rst index 8816cbcf..5e4f2ce6 100644 --- a/docs/en/developer/docker.rst +++ b/docs/en/developer/docker.rst | |||
@@ -40,7 +40,7 @@ Run wallabag | |||
40 | #. Edit ``app/config/parameters.yml`` to replace ``database_*`` | 40 | #. Edit ``app/config/parameters.yml`` to replace ``database_*`` |
41 | properties with commented ones (with values prefixed by ``env.``) | 41 | properties with commented ones (with values prefixed by ``env.``) |
42 | #. ``composer install`` the project dependencies | 42 | #. ``composer install`` the project dependencies |
43 | #. ``php app/console wallabag:install`` to create the schema | 43 | #. ``php bin/console wallabag:install`` to create the schema |
44 | #. ``docker-compose up`` to run the containers | 44 | #. ``docker-compose up`` to run the containers |
45 | #. Finally, browse to http://localhost:8080/ to find your freshly | 45 | #. Finally, browse to http://localhost:8080/ to find your freshly |
46 | installed wallabag. | 46 | installed wallabag. |
diff --git a/docs/en/developer/rabbitmq.rst b/docs/en/developer/rabbitmq.rst index 8cee45fb..63b85106 100644 --- a/docs/en/developer/rabbitmq.rst +++ b/docs/en/developer/rabbitmq.rst | |||
@@ -57,11 +57,20 @@ Depending on which service you want to import from you need to enable one (or ma | |||
57 | # for Pocket import | 57 | # for Pocket import |
58 | bin/console rabbitmq:consumer import_pocket -w | 58 | bin/console rabbitmq:consumer import_pocket -w |
59 | 59 | ||
60 | # for Readbility import | 60 | # for Readability import |
61 | bin/console rabbitmq:consumer import_readability -w | 61 | bin/console rabbitmq:consumer import_readability -w |
62 | 62 | ||
63 | # for Instapaper import | ||
64 | bin/console rabbitmq:consumer import_instapaper -w | ||
65 | |||
63 | # for wallabag v1 import | 66 | # for wallabag v1 import |
64 | bin/console rabbitmq:consumer import_wallabag_v1 -w | 67 | bin/console rabbitmq:consumer import_wallabag_v1 -w |
65 | 68 | ||
66 | # for wallabag v2 import | 69 | # for wallabag v2 import |
67 | bin/console rabbitmq:consumer import_wallabag_v2 -w | 70 | bin/console rabbitmq:consumer import_wallabag_v2 -w |
71 | |||
72 | # for Firefox import | ||
73 | bin/console rabbitmq:consumer import_firefox -w | ||
74 | |||
75 | # for Chrome import | ||
76 | bin/console rabbitmq:consumer import_chrome -w | ||
diff --git a/docs/en/developer/redis.rst b/docs/en/developer/redis.rst index 5748e260..820a52e9 100644 --- a/docs/en/developer/redis.rst +++ b/docs/en/developer/redis.rst | |||
@@ -1,5 +1,5 @@ | |||
1 | Install Redis for asynchronous tasks | 1 | Install Redis for asynchronous tasks |
2 | ======================================= | 2 | ==================================== |
3 | 3 | ||
4 | In order to launch asynchronous tasks (useful for huge imports for example), we can use Redis. | 4 | In order to launch asynchronous tasks (useful for huge imports for example), we can use Redis. |
5 | 5 | ||
@@ -37,7 +37,7 @@ Edit your ``parameters.yml`` file to edit Redis configuration. The default one s | |||
37 | 37 | ||
38 | 38 | ||
39 | Launch Redis consumer | 39 | Launch Redis consumer |
40 | ------------------------ | 40 | --------------------- |
41 | 41 | ||
42 | Depending on which service you want to import from you need to enable one (or many if you want to support many) cron job: | 42 | Depending on which service you want to import from you need to enable one (or many if you want to support many) cron job: |
43 | 43 | ||
@@ -46,15 +46,24 @@ Depending on which service you want to import from you need to enable one (or ma | |||
46 | # for Pocket import | 46 | # for Pocket import |
47 | bin/console wallabag:import:redis-worker pocket -vv >> /path/to/wallabag/var/logs/redis-pocket.log | 47 | bin/console wallabag:import:redis-worker pocket -vv >> /path/to/wallabag/var/logs/redis-pocket.log |
48 | 48 | ||
49 | # for Readbility import | 49 | # for Readability import |
50 | bin/console wallabag:import:redis-worker readability -vv >> /path/to/wallabag/var/logs/redis-readability.log | 50 | bin/console wallabag:import:redis-worker readability -vv >> /path/to/wallabag/var/logs/redis-readability.log |
51 | 51 | ||
52 | # for Instapaper import | ||
53 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-instapaper.log | ||
54 | |||
52 | # for wallabag v1 import | 55 | # for wallabag v1 import |
53 | bin/console wallabag:import:redis-worker wallabag_v1 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v1.log | 56 | bin/console wallabag:import:redis-worker wallabag_v1 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v1.log |
54 | 57 | ||
55 | # for wallabag v2 import | 58 | # for wallabag v2 import |
56 | bin/console wallabag:import:redis-worker wallabag_v2 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v2.log | 59 | bin/console wallabag:import:redis-worker wallabag_v2 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v2.log |
57 | 60 | ||
61 | # for Firefox import | ||
62 | bin/console wallabag:import:redis-worker firefox -vv >> /path/to/wallabag/var/logs/redis-firefox.log | ||
63 | |||
64 | # for Chrome import | ||
65 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-chrome.log | ||
66 | |||
58 | If you want to launch the import only for some messages and not all, you can specify this number (here 12) and the worker will stop right after the 12th message : | 67 | If you want to launch the import only for some messages and not all, you can specify this number (here 12) and the worker will stop right after the 12th message : |
59 | 68 | ||
60 | .. code:: bash | 69 | .. code:: bash |
diff --git a/docs/en/index.rst b/docs/en/index.rst index 46450b8f..beb3816e 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst | |||
@@ -30,7 +30,8 @@ The documentation is available in other languages: | |||
30 | 30 | ||
31 | user/faq | 31 | user/faq |
32 | user/installation | 32 | user/installation |
33 | user/upgrade | 33 | user/upgrade-2.0.x-2.1.y |
34 | user/upgrade-2.0.x-2.0.y | ||
34 | user/migration | 35 | user/migration |
35 | user/import | 36 | user/import |
36 | user/create_account | 37 | user/create_account |
@@ -56,3 +57,5 @@ The documentation is available in other languages: | |||
56 | developer/documentation | 57 | developer/documentation |
57 | developer/translate | 58 | developer/translate |
58 | developer/maintenance | 59 | developer/maintenance |
60 | developer/redis | ||
61 | developer/rabbitmq | ||
diff --git a/docs/en/user/import.rst b/docs/en/user/import.rst index e6c37d72..758e3816 100644 --- a/docs/en/user/import.rst +++ b/docs/en/user/import.rst | |||
@@ -23,12 +23,11 @@ Now, all is fine to migrate from Pocket. | |||
23 | Import your data into wallabag 2.x | 23 | Import your data into wallabag 2.x |
24 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 24 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
25 | 25 | ||
26 | Click on ``Import`` link in the menu, on ``Import contents`` in Pocket section | 26 | Click on ``Import`` link in the menu, on ``Import contents`` in Pocket section |
27 | and then on ``Connect to Pocket and import data``. | 27 | and then on ``Connect to Pocket and import data``. |
28 | 28 | ||
29 | You need to authorize wallabag to interact with your Pocket account. | 29 | You need to authorize wallabag to interact with your Pocket account. |
30 | Your data will be imported. Data import can be a demanding process for your server | 30 | Your data will be imported. Data import can be a demanding process for your server. |
31 | (we need to work on this import to improve it). | ||
32 | 31 | ||
33 | From Readability | 32 | From Readability |
34 | ---------------- | 33 | ---------------- |
@@ -41,15 +40,26 @@ On the tools (`https://www.readability.com/tools/<https://www.readability.com/to | |||
41 | Import your data into wallabag 2.x | 40 | Import your data into wallabag 2.x |
42 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 41 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
43 | 42 | ||
44 | Click on ``Import`` link in the menu, on ``Import contents`` in Readability section | 43 | Click on ``Import`` link in the menu, on ``Import contents`` in Readability section |
45 | and then select your json file and upload it. | 44 | and then select your json file and upload it. |
46 | 45 | ||
47 | Your data will be imported. Data import can be a demanding process for your server (we need to work on this import to improve it). | 46 | Your data will be imported. Data import can be a demanding process for your server. |
48 | 47 | ||
49 | From Instapaper | 48 | From Instapaper |
50 | --------------- | 49 | --------------- |
51 | 50 | ||
52 | *Feature not yet implemented in wallabag v2.* | 51 | Export your Instapaper data |
52 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
53 | |||
54 | On the settings (`https://www.instapaper.com/user<https://www.instapaper.com/user>`_) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like ``instapaper-export.csv``). | ||
55 | |||
56 | Import your data into wallabag 2.x | ||
57 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
58 | |||
59 | Click on ``Import`` link in the menu, on ``Import contents`` in Instapaper section | ||
60 | and then select your CSV file and upload it. | ||
61 | |||
62 | Your data will be imported. Data import can be a demanding process for your server. | ||
53 | 63 | ||
54 | From HTML or JSON file | 64 | From HTML or JSON file |
55 | ---------------------- | 65 | ---------------------- |
diff --git a/docs/en/user/upgrade.rst b/docs/en/user/upgrade-2.0.x-2.0.y.rst index 5c37be95..6a0818b3 100644 --- a/docs/en/user/upgrade.rst +++ b/docs/en/user/upgrade-2.0.x-2.0.y.rst | |||
@@ -1,17 +1,18 @@ | |||
1 | Upgrade wallabag | 1 | Upgrade from 2.0.x to 2.0.y |
2 | ================ | 2 | =========================== |
3 | 3 | ||
4 | Upgrade on a dedicated web server | 4 | Upgrade on a dedicated web server |
5 | --------------------------------- | 5 | --------------------------------- |
6 | 6 | ||
7 | The last release is published on https://www.wallabag.org/pages/download-wallabag.html. In order to upgrade your wallabag installation and get the last version, run the following commands in you wallabag folder (replace ``2.1.0`` by the last release number): | 7 | The last release is published on https://www.wallabag.org/pages/download-wallabag.html. In order to upgrade your wallabag installation and get the last version, run the following commands in you wallabag folder (replace ``2.0.8`` by the last release number): |
8 | 8 | ||
9 | :: | 9 | :: |
10 | 10 | ||
11 | git fetch origin | 11 | git fetch origin |
12 | git fetch --tags | 12 | git fetch --tags |
13 | git checkout 2.1.0 | 13 | git checkout 2.0.8 |
14 | ./install.sh | 14 | SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist |
15 | php bin/console cache:clear --env=prod | ||
15 | 16 | ||
16 | Upgrade on a shared hosting | 17 | Upgrade on a shared hosting |
17 | --------------------------- | 18 | --------------------------- |
@@ -24,7 +25,7 @@ Download the last release of wallabag: | |||
24 | 25 | ||
25 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package | 26 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package |
26 | 27 | ||
27 | (md5 hash of the package: ``4f84c725d1d6e3345eae0a406115e5ff``) | 28 | (md5 hash of the 2.0.8 package: ``4f84c725d1d6e3345eae0a406115e5ff``) |
28 | 29 | ||
29 | Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours. | 30 | Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours. |
30 | 31 | ||
diff --git a/docs/en/user/upgrade-2.0.x-2.1.y.rst b/docs/en/user/upgrade-2.0.x-2.1.y.rst new file mode 100644 index 00000000..5ae5eb43 --- /dev/null +++ b/docs/en/user/upgrade-2.0.x-2.1.y.rst | |||
@@ -0,0 +1,64 @@ | |||
1 | Upgrading from 2.0.x to 2.1.y | ||
2 | ============================= | ||
3 | |||
4 | .. warning:: | ||
5 | Before this migration, if you configured the Pocket import by adding your consumer key in Internal settings, please do a backup of it: you'll have to add it into the Config page after the upgrade. | ||
6 | |||
7 | Upgrade on a dedicated web server | ||
8 | --------------------------------- | ||
9 | |||
10 | The last release is published on https://www.wallabag.org/pages/download-wallabag.html. In order to upgrade your wallabag installation and get the last version, run the following commands in you wallabag folder (replace ``2.1.0`` by the last release number): | ||
11 | |||
12 | :: | ||
13 | |||
14 | git fetch origin | ||
15 | git fetch --tags | ||
16 | git checkout 2.1.0 | ||
17 | ASSETS=build ./install.sh | ||
18 | php bin/console doctrine:migrations:migrate --env=prod | ||
19 | php bin/console cache:clear --env=prod | ||
20 | |||
21 | Upgrade on a shared hosting | ||
22 | --------------------------- | ||
23 | |||
24 | Backup your ``app/config/parameters.yml`` file. | ||
25 | |||
26 | Download the last release of wallabag: | ||
27 | |||
28 | .. code-block:: bash | ||
29 | |||
30 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package | ||
31 | |||
32 | (md5 hash of the package: ``4f84c725d1d6e3345eae0a406115e5ff``) | ||
33 | |||
34 | Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours. | ||
35 | |||
36 | Please note that we added new parameters in this version. You have to edit ``app/config/parameters.yml`` by adding these lines (replace with your configuration) : | ||
37 | |||
38 | .. code-block:: bash | ||
39 | |||
40 | # RabbitMQ processing | ||
41 | rabbitmq_host: localhost | ||
42 | rabbitmq_port: 5672 | ||
43 | rabbitmq_user: guest | ||
44 | rabbitmq_password: guest | ||
45 | |||
46 | # Redis processing | ||
47 | redis_host: localhost | ||
48 | redis_port: 6379 | ||
49 | |||
50 | If you use SQLite, you must also copy your ``data/`` folder inside the new installation. | ||
51 | |||
52 | Empty ``var/cache`` folder. | ||
53 | |||
54 | You must run some SQL queries to upgrade your database. We assume that the table prefix is ``wallabag_`` and the database server is a MySQL one: | ||
55 | |||
56 | .. code-block:: sql | ||
57 | |||
58 | ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL; | ||
59 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry'); | ||
60 | ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL; | ||
61 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import'); | ||
62 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import'); | ||
63 | ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL; | ||
64 | DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key'; | ||
diff --git a/docs/fr/conf.py b/docs/fr/conf.py index f1fe3967..49a57e2d 100644 --- a/docs/fr/conf.py +++ b/docs/fr/conf.py | |||
@@ -12,7 +12,7 @@ source_suffix = '.rst' | |||
12 | master_doc = 'index' | 12 | master_doc = 'index' |
13 | project = u'wallabag-fr' | 13 | project = u'wallabag-fr' |
14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' | 14 | copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence' |
15 | version = '2.0.0' | 15 | version = '2.1.0' |
16 | release = version | 16 | release = version |
17 | exclude_patterns = ['_build'] | 17 | exclude_patterns = ['_build'] |
18 | pygments_style = 'sphinx' | 18 | pygments_style = 'sphinx' |
diff --git a/docs/fr/developer/docker.rst b/docs/fr/developer/docker.rst index 73cb56be..84724ed3 100644 --- a/docs/fr/developer/docker.rst +++ b/docs/fr/developer/docker.rst | |||
@@ -39,7 +39,7 @@ Exécuter wallabag | |||
39 | #. Editer ``app/config/parameters.yml`` pour remplacer les propriétés ``database_*`` | 39 | #. Editer ``app/config/parameters.yml`` pour remplacer les propriétés ``database_*`` |
40 | par les lignes commentées (celles avec des valeurs préfixées par ``env.``) | 40 | par les lignes commentées (celles avec des valeurs préfixées par ``env.``) |
41 | #. ``composer install`` pour installer les dépendances | 41 | #. ``composer install`` pour installer les dépendances |
42 | #. ``php app/console wallabag:install`` pour créer le schéma de la BDD | 42 | #. ``php bin/console wallabag:install`` pour créer le schéma de la BDD |
43 | #. ``docker-compose up`` pour démarrer les conteneurs | 43 | #. ``docker-compose up`` pour démarrer les conteneurs |
44 | #. Enfin, se rendre sur http://localhost:8080/ pour accéder à une installation | 44 | #. Enfin, se rendre sur http://localhost:8080/ pour accéder à une installation |
45 | tout propre de wallabag. | 45 | tout propre de wallabag. |
diff --git a/docs/fr/developer/rabbitmq.rst b/docs/fr/developer/rabbitmq.rst new file mode 100644 index 00000000..20182e6e --- /dev/null +++ b/docs/fr/developer/rabbitmq.rst | |||
@@ -0,0 +1,76 @@ | |||
1 | Installer RabbitMQ pour des tâches asynchrones | ||
2 | ============================================== | ||
3 | |||
4 | Pour lancer des tâches asynchrones (utile pour des imports importants par exemple), nous pouvons utiliser RabbitMQ. | ||
5 | |||
6 | Pré-requis | ||
7 | ---------- | ||
8 | |||
9 | Vous devez installer RabbitMQ sur votre serveur. | ||
10 | |||
11 | Installation | ||
12 | ~~~~~~~~~~~~ | ||
13 | |||
14 | .. code:: bash | ||
15 | |||
16 | wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc | ||
17 | apt-key add rabbitmq-signing-key-public.asc | ||
18 | apt-get update | ||
19 | apt-get install rabbitmq-server | ||
20 | |||
21 | Configuration et démarrage | ||
22 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
23 | |||
24 | .. code:: bash | ||
25 | |||
26 | rabbitmq-plugins enable rabbitmq_management # (useful to have a web interface, available at http://localhost:15672/ (guest/guest) | ||
27 | rabbitmq-server -detached | ||
28 | |||
29 | Arrêter RabbitMQ | ||
30 | ~~~~~~~~~~~~~~~~ | ||
31 | |||
32 | .. code:: bash | ||
33 | |||
34 | rabbitmqctl stop | ||
35 | |||
36 | |||
37 | Configurer RabbitMQ dans wallabag | ||
38 | --------------------------------- | ||
39 | |||
40 | Modifiez votre fichier ``parameters.yml`` pour éditer la configuration RabbitMQ. Celle par défaut devrait convenir : | ||
41 | |||
42 | .. code:: yaml | ||
43 | |||
44 | rabbitmq_host: localhost | ||
45 | rabbitmq_port: 5672 | ||
46 | rabbitmq_user: guest | ||
47 | rabbitmq_password: guest | ||
48 | |||
49 | |||
50 | Démarrer les clients RabbitMQ | ||
51 | ----------------------------- | ||
52 | |||
53 | En fonction du service dont vous souhaitez importer vos données, vous devez activer un (ou plusieurs si vous souhaitez en supporter plusieurs) cron job : | ||
54 | |||
55 | .. code:: bash | ||
56 | |||
57 | # for Pocket import | ||
58 | bin/console rabbitmq:consumer import_pocket -w | ||
59 | |||
60 | # for Readability import | ||
61 | bin/console rabbitmq:consumer import_readability -w | ||
62 | |||
63 | # for Instapaper import | ||
64 | bin/console rabbitmq:consumer import_instapaper -w | ||
65 | |||
66 | # for wallabag v1 import | ||
67 | bin/console rabbitmq:consumer import_wallabag_v1 -w | ||
68 | |||
69 | # for wallabag v2 import | ||
70 | bin/console rabbitmq:consumer import_wallabag_v2 -w | ||
71 | |||
72 | # for Firefox import | ||
73 | bin/console rabbitmq:consumer import_firefox -w | ||
74 | |||
75 | # for Chrome import | ||
76 | bin/console rabbitmq:consumer import_chrome -w | ||
diff --git a/docs/fr/developer/redis.rst b/docs/fr/developer/redis.rst new file mode 100644 index 00000000..097e375d --- /dev/null +++ b/docs/fr/developer/redis.rst | |||
@@ -0,0 +1,71 @@ | |||
1 | Installer Redis pour des tâches asynchrones | ||
2 | =========================================== | ||
3 | |||
4 | Pour lancer des tâches asynchrones (utile pour des imports importants par exemple), nous pouvons utiliser Redis. | ||
5 | |||
6 | Pré-requis | ||
7 | ---------- | ||
8 | |||
9 | Vous devez installer Redis sur votre serveur. | ||
10 | |||
11 | Installation | ||
12 | ~~~~~~~~~~~~ | ||
13 | |||
14 | .. code:: bash | ||
15 | |||
16 | apt-get install redis-server | ||
17 | |||
18 | Démarrage | ||
19 | ~~~~~~~~~ | ||
20 | |||
21 | Le serveur devrait déjà être démarré après l'installation. Si ce n'est pas le cas, vous pouvez le démarrer ainsi : | ||
22 | |||
23 | .. code:: bash | ||
24 | |||
25 | redis-server | ||
26 | |||
27 | |||
28 | Configurer Redis dans wallabag | ||
29 | ------------------------------- | ||
30 | |||
31 | Modifiez votre fichier ``parameters.yml`` pour éditer la configuration Redis. Celle par défaut devrait convenir : | ||
32 | |||
33 | .. code:: yaml | ||
34 | |||
35 | redis_host: localhost | ||
36 | redis_port: 6379 | ||
37 | |||
38 | |||
39 | Démarrer les clients Redis | ||
40 | -------------------------- | ||
41 | |||
42 | En fonction du service dont vous souhaitez importer vos données, vous devez activer un (ou plusieurs si vous souhaitez en supporter plusieurs) cron job : | ||
43 | |||
44 | .. code:: bash | ||
45 | |||
46 | # for Pocket import | ||
47 | bin/console wallabag:import:redis-worker pocket -vv >> /path/to/wallabag/var/logs/redis-pocket.log | ||
48 | |||
49 | # for Readability import | ||
50 | bin/console wallabag:import:redis-worker readability -vv >> /path/to/wallabag/var/logs/redis-readability.log | ||
51 | |||
52 | # for Instapaper import | ||
53 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-instapaper.log | ||
54 | |||
55 | # for wallabag v1 import | ||
56 | bin/console wallabag:import:redis-worker wallabag_v1 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v1.log | ||
57 | |||
58 | # for wallabag v2 import | ||
59 | bin/console wallabag:import:redis-worker wallabag_v2 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v2.log | ||
60 | |||
61 | # for Firefox import | ||
62 | bin/console wallabag:import:redis-worker firefox -vv >> /path/to/wallabag/var/logs/redis-firefox.log | ||
63 | |||
64 | # for Chrome import | ||
65 | bin/console wallabag:import:redis-worker instapaper -vv >> /path/to/wallabag/var/logs/redis-chrome.log | ||
66 | |||
67 | Si vous souhaitez démarrer l'import pour quelques messages uniquement, vous pouvez spécifier cette valeur en paramètre (ici 12) et le client va s'arrêter après le 12ème message : | ||
68 | |||
69 | .. code:: bash | ||
70 | |||
71 | bin/console wallabag:import:redis-worker pocket -vv --maxIterations=12 | ||
diff --git a/docs/fr/index.rst b/docs/fr/index.rst index dfa55afe..359b103c 100644 --- a/docs/fr/index.rst +++ b/docs/fr/index.rst | |||
@@ -31,7 +31,8 @@ La documentation est disponible dans d'autres langues : | |||
31 | 31 | ||
32 | user/faq | 32 | user/faq |
33 | user/installation | 33 | user/installation |
34 | user/upgrade | 34 | user/upgrade-2.0.x-2.1.y |
35 | user/upgrade-2.0.x-2.0.y | ||
35 | user/migration | 36 | user/migration |
36 | user/import | 37 | user/import |
37 | user/create_account | 38 | user/create_account |
@@ -56,3 +57,5 @@ La documentation est disponible dans d'autres langues : | |||
56 | developer/documentation | 57 | developer/documentation |
57 | developer/translate | 58 | developer/translate |
58 | developer/maintenance | 59 | developer/maintenance |
60 | developer/redis | ||
61 | developer/rabbitmq | ||
diff --git a/docs/fr/user/import.rst b/docs/fr/user/import.rst index 99ac602b..6f114dd6 100644 --- a/docs/fr/user/import.rst +++ b/docs/fr/user/import.rst | |||
@@ -28,7 +28,7 @@ la section Pocket puis sur ``Se connecter à Pocket et importer les données``. | |||
28 | 28 | ||
29 | Vous devez autoriser wallabag à se connecter à votre compte Pocket. | 29 | Vous devez autoriser wallabag à se connecter à votre compte Pocket. |
30 | Vos données vont être importées. L'import de données est une action qui peut être couteuse | 30 | Vos données vont être importées. L'import de données est une action qui peut être couteuse |
31 | pour votre serveur (nous devons encore travailler pour améliorer cet import). | 31 | pour votre serveur. |
32 | 32 | ||
33 | Depuis Readability | 33 | Depuis Readability |
34 | ------------------ | 34 | ------------------ |
@@ -44,12 +44,23 @@ Importez vos données dans wallabag 2.x | |||
44 | Cliquez sur le lien ``Importer`` dans le menu, sur ``Importer les contenus`` dans | 44 | Cliquez sur le lien ``Importer`` dans le menu, sur ``Importer les contenus`` dans |
45 | la section Readability et ensuite sélectionnez votre fichier json pour l'uploader. | 45 | la section Readability et ensuite sélectionnez votre fichier json pour l'uploader. |
46 | 46 | ||
47 | Vos données vont être importées. L'import de données est une action qui peut être couteuse pour votre serveur (nous devons encore travailler pour améliorer cet import). | 47 | Vos données vont être importées. L'import de données est une action qui peut être couteuse pour votre serveur. |
48 | 48 | ||
49 | Depuis Instapaper | 49 | Depuis Instapaper |
50 | ----------------- | 50 | ----------------- |
51 | 51 | ||
52 | *Fonctionnalité pas encore implémentée dans wallabag v2.* | 52 | Exportez vos données de Instapaper |
53 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
54 | |||
55 | Sur la page des paramètres (`https://www.instapaper.com/user<https://www.instapaper.com/user>`_), cliquez sur "Download .CSV file" dans la section "Export". Un fichier CSV se téléchargera (``instapaper-export.csv``). | ||
56 | |||
57 | Importez vos données dans wallabag 2.x | ||
58 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
59 | |||
60 | Cliquez sur le lien ``Importer`` dans le menu, sur ``Importer les contenus`` dans | ||
61 | la section Instapaper et ensuite sélectionnez votre fichier CSV pour l'uploader. | ||
62 | |||
63 | Vos données vont être importées. L'import de données est une action qui peut être couteuse pour votre serveur. | ||
53 | 64 | ||
54 | 65 | ||
55 | Depuis un fichier HTML ou JSON | 66 | Depuis un fichier HTML ou JSON |
diff --git a/docs/fr/user/upgrade.rst b/docs/fr/user/upgrade-2.0.x-2.0.y.rst index e3798979..d8dfac6e 100644 --- a/docs/fr/user/upgrade.rst +++ b/docs/fr/user/upgrade-2.0.x-2.0.y.rst | |||
@@ -1,17 +1,18 @@ | |||
1 | Mettre à jour wallabag | 1 | Mettre à jour de la 2.0.x à la 2.0.y |
2 | ====================== | 2 | ==================================== |
3 | 3 | ||
4 | Mise à jour sur un serveur dédié | 4 | Mise à jour sur un serveur dédié |
5 | -------------------------------- | 5 | -------------------------------- |
6 | 6 | ||
7 | La dernière version de wallabag est publiée à cette adresse : https://www.wallabag.org/pages/download-wallabag.html. Pour mettre à jour votre installation de wallabag, exécutez les commandes suivantes dans votre répertoire d'installation (remplacez ``2.1.0`` par le numéro de la dernière version) : | 7 | La dernière version de wallabag est publiée à cette adresse : https://www.wallabag.org/pages/download-wallabag.html. Pour mettre à jour votre installation de wallabag, exécutez les commandes suivantes dans votre répertoire d'installation (remplacez ``2.0.8`` par le numéro de la dernière version) : |
8 | 8 | ||
9 | :: | 9 | :: |
10 | 10 | ||
11 | git fetch origin | 11 | git fetch origin |
12 | git fetch --tags | 12 | git fetch --tags |
13 | git checkout 2.1.0 | 13 | git checkout 2.0.8 |
14 | ./install.sh | 14 | SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist |
15 | php bin/console cache:clear --env=prod | ||
15 | 16 | ||
16 | Mise à jour sur un hébergement mutualisé | 17 | Mise à jour sur un hébergement mutualisé |
17 | ---------------------------------------- | 18 | ---------------------------------------- |
@@ -24,7 +25,7 @@ Téléchargez la dernière version de wallabag : | |||
24 | 25 | ||
25 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package | 26 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package |
26 | 27 | ||
27 | (hash md5 de l'archive : ``4f84c725d1d6e3345eae0a406115e5ff``) | 28 | (hash md5 de l'archive 2.0.8 : ``4f84c725d1d6e3345eae0a406115e5ff``) |
28 | 29 | ||
29 | Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre. | 30 | Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre. |
30 | 31 | ||
diff --git a/docs/fr/user/upgrade-2.0.x-2.1.y.rst b/docs/fr/user/upgrade-2.0.x-2.1.y.rst new file mode 100644 index 00000000..a4afe768 --- /dev/null +++ b/docs/fr/user/upgrade-2.0.x-2.1.y.rst | |||
@@ -0,0 +1,65 @@ | |||
1 | Mettre à jour de la 2.0.x à la 2.1.y | ||
2 | ==================================== | ||
3 | |||
4 | .. warning:: | ||
5 | Avant cette migration, si vous aviez configuré l'import depuis Pocket en ajoutant votre consumer key dans les paramètres internes, pensez à effectuer une sauvegarde de celle-ci : vous devrez l'ajouter dans la configuration de wallabag après la mise à jour. | ||
6 | |||
7 | Mise à jour sur un serveur dédié | ||
8 | -------------------------------- | ||
9 | |||
10 | La dernière version de wallabag est publiée à cette adresse : https://www.wallabag.org/pages/download-wallabag.html. Pour mettre à jour votre installation de wallabag, exécutez les commandes suivantes dans votre répertoire d'installation (remplacez ``2.1.0`` par le numéro de la dernière version) : | ||
11 | |||
12 | :: | ||
13 | |||
14 | git fetch origin | ||
15 | git fetch --tags | ||
16 | git checkout 2.1.0 | ||
17 | ASSETS=build ./install.sh | ||
18 | php bin/console doctrine:migrations:migrate --env=prod | ||
19 | php bin/console cache:clear --env=prod | ||
20 | |||
21 | Mise à jour sur un hébergement mutualisé | ||
22 | ---------------------------------------- | ||
23 | |||
24 | Effectuez une sauvegarde du fichier ``app/config/parameters.yml``. | ||
25 | |||
26 | Téléchargez la dernière version de wallabag : | ||
27 | |||
28 | .. code-block:: bash | ||
29 | |||
30 | wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package | ||
31 | |||
32 | (hash md5 de l'archive : ``4f84c725d1d6e3345eae0a406115e5ff``) | ||
33 | |||
34 | Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre. | ||
35 | |||
36 | Nous avons ajouté de nouveaux paramètres dans cette nouvelle version. Vous devez donc éditer le fichier ``app/config/parameters.yml`` en ajoutant ces lignes (et en remplaçant par votre configuration) : | ||
37 | |||
38 | .. code-block:: bash | ||
39 | |||
40 | # RabbitMQ processing | ||
41 | rabbitmq_host: localhost | ||
42 | rabbitmq_port: 5672 | ||
43 | rabbitmq_user: guest | ||
44 | rabbitmq_password: guest | ||
45 | |||
46 | # Redis processing | ||
47 | redis_host: localhost | ||
48 | redis_port: 6379 | ||
49 | |||
50 | Si vous utilisez SQLite, vous devez également conserver le contenu du répertoire ``data/``. | ||
51 | |||
52 | Videz le répertoire ``var/cache``. | ||
53 | |||
54 | Vous allez devoir également exécuter des requêtes SQL pour mettre à jour votre base de données. Nous partons du principe que le préfixe de vos tables est ``wallabag_`` et que le serveur SQL est un serveur MySQL : | ||
55 | |||
56 | .. code-block:: sql | ||
57 | |||
58 | ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL; | ||
59 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry'); | ||
60 | ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL; | ||
61 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import'); | ||
62 | INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import'); | ||
63 | ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL; | ||
64 | DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key'; | ||
65 | |||
diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index dd17ef97..791bf80b 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php | |||
@@ -23,6 +23,38 @@ class WallabagRestController extends FOSRestController | |||
23 | } | 23 | } |
24 | 24 | ||
25 | /** | 25 | /** |
26 | * Check if an entry exist by url. | ||
27 | * | ||
28 | * @ApiDoc( | ||
29 | * parameters={ | ||
30 | * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"} | ||
31 | * } | ||
32 | * ) | ||
33 | * | ||
34 | * @return JsonResponse | ||
35 | */ | ||
36 | public function getEntriesExistsAction(Request $request) | ||
37 | { | ||
38 | $this->validateAuthentication(); | ||
39 | |||
40 | $url = $request->query->get('url', ''); | ||
41 | |||
42 | if (empty($url)) { | ||
43 | throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$user->getId()); | ||
44 | } | ||
45 | |||
46 | $res = $this->getDoctrine() | ||
47 | ->getRepository('WallabagCoreBundle:Entry') | ||
48 | ->findByUrlAndUserId($url, $this->getUser()->getId()); | ||
49 | |||
50 | $exists = false === $res ? false : true; | ||
51 | |||
52 | $json = $this->get('serializer')->serialize(['exists' => $exists], 'json'); | ||
53 | |||
54 | return (new JsonResponse())->setJson($json); | ||
55 | } | ||
56 | |||
57 | /** | ||
26 | * Retrieve all entries. It could be filtered by many options. | 58 | * Retrieve all entries. It could be filtered by many options. |
27 | * | 59 | * |
28 | * @ApiDoc( | 60 | * @ApiDoc( |
@@ -50,8 +82,8 @@ class WallabagRestController extends FOSRestController | |||
50 | $order = $request->query->get('order', 'desc'); | 82 | $order = $request->query->get('order', 'desc'); |
51 | $page = (int) $request->query->get('page', 1); | 83 | $page = (int) $request->query->get('page', 1); |
52 | $perPage = (int) $request->query->get('perPage', 30); | 84 | $perPage = (int) $request->query->get('perPage', 30); |
53 | $since = $request->query->get('since', 0); | ||
54 | $tags = $request->query->get('tags', ''); | 85 | $tags = $request->query->get('tags', ''); |
86 | $since = $request->query->get('since', 0); | ||
55 | 87 | ||
56 | $pager = $this->getDoctrine() | 88 | $pager = $this->getDoctrine() |
57 | ->getRepository('WallabagCoreBundle:Entry') | 89 | ->getRepository('WallabagCoreBundle:Entry') |
@@ -63,7 +95,20 @@ class WallabagRestController extends FOSRestController | |||
63 | $pagerfantaFactory = new PagerfantaFactory('page', 'perPage'); | 95 | $pagerfantaFactory = new PagerfantaFactory('page', 'perPage'); |
64 | $paginatedCollection = $pagerfantaFactory->createRepresentation( | 96 | $paginatedCollection = $pagerfantaFactory->createRepresentation( |
65 | $pager, | 97 | $pager, |
66 | new Route('api_get_entries', [], UrlGeneratorInterface::ABSOLUTE_URL) | 98 | new Route( |
99 | 'api_get_entries', | ||
100 | [ | ||
101 | 'archive' => $isArchived, | ||
102 | 'starred' => $isStarred, | ||
103 | 'sort' => $sort, | ||
104 | 'order' => $order, | ||
105 | 'page' => $page, | ||
106 | 'perPage' => $perPage, | ||
107 | 'tags' => $tags, | ||
108 | 'since' => $since, | ||
109 | ], | ||
110 | UrlGeneratorInterface::ABSOLUTE_URL | ||
111 | ) | ||
67 | ); | 112 | ); |
68 | 113 | ||
69 | $json = $this->get('serializer')->serialize($paginatedCollection, 'json'); | 114 | $json = $this->get('serializer')->serialize($paginatedCollection, 'json'); |
diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php index 3873d2d3..cc7c2c94 100644 --- a/src/Wallabag/CoreBundle/Command/InstallCommand.php +++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php | |||
@@ -2,6 +2,8 @@ | |||
2 | 2 | ||
3 | namespace Wallabag\CoreBundle\Command; | 3 | namespace Wallabag\CoreBundle\Command; |
4 | 4 | ||
5 | use FOS\UserBundle\Event\UserEvent; | ||
6 | use FOS\UserBundle\FOSUserEvents; | ||
5 | use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; | 7 | use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; |
6 | use Symfony\Component\Console\Helper\Table; | 8 | use Symfony\Component\Console\Helper\Table; |
7 | use Symfony\Component\Console\Input\ArrayInput; | 9 | use Symfony\Component\Console\Input\ArrayInput; |
@@ -236,14 +238,9 @@ class InstallCommand extends ContainerAwareCommand | |||
236 | 238 | ||
237 | $em->persist($user); | 239 | $em->persist($user); |
238 | 240 | ||
239 | $config = new Config($user); | 241 | // dispatch a created event so the associated config will be created |
240 | $config->setTheme($this->getContainer()->getParameter('wallabag_core.theme')); | 242 | $event = new UserEvent($user); |
241 | $config->setItemsPerPage($this->getContainer()->getParameter('wallabag_core.items_on_page')); | 243 | $this->getContainer()->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); |
242 | $config->setRssLimit($this->getContainer()->getParameter('wallabag_core.rss_limit')); | ||
243 | $config->setReadingSpeed($this->getContainer()->getParameter('wallabag_core.reading_speed')); | ||
244 | $config->setLanguage($this->getContainer()->getParameter('wallabag_core.language')); | ||
245 | |||
246 | $em->persist($config); | ||
247 | 244 | ||
248 | $this->defaultOutput->writeln(''); | 245 | $this->defaultOutput->writeln(''); |
249 | 246 | ||
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 4f75511b..91cdcae5 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php | |||
@@ -11,7 +11,6 @@ use Wallabag\CoreBundle\Entity\Config; | |||
11 | use Wallabag\CoreBundle\Entity\TaggingRule; | 11 | use Wallabag\CoreBundle\Entity\TaggingRule; |
12 | use Wallabag\CoreBundle\Form\Type\ConfigType; | 12 | use Wallabag\CoreBundle\Form\Type\ConfigType; |
13 | use Wallabag\CoreBundle\Form\Type\ChangePasswordType; | 13 | use Wallabag\CoreBundle\Form\Type\ChangePasswordType; |
14 | use Wallabag\CoreBundle\Form\Type\NewUserType; | ||
15 | use Wallabag\CoreBundle\Form\Type\RssType; | 14 | use Wallabag\CoreBundle\Form\Type\RssType; |
16 | use Wallabag\CoreBundle\Form\Type\TaggingRuleType; | 15 | use Wallabag\CoreBundle\Form\Type\TaggingRuleType; |
17 | use Wallabag\CoreBundle\Form\Type\UserInformationType; | 16 | use Wallabag\CoreBundle\Form\Type\UserInformationType; |
@@ -106,7 +105,21 @@ class ConfigController extends Controller | |||
106 | 105 | ||
107 | // handle tagging rule | 106 | // handle tagging rule |
108 | $taggingRule = new TaggingRule(); | 107 | $taggingRule = new TaggingRule(); |
109 | $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $this->generateUrl('config').'#set5']); | 108 | $action = $this->generateUrl('config').'#set5'; |
109 | |||
110 | if ($request->query->has('tagging-rule')) { | ||
111 | $taggingRule = $this->getDoctrine() | ||
112 | ->getRepository('WallabagCoreBundle:TaggingRule') | ||
113 | ->find($request->query->get('tagging-rule')); | ||
114 | |||
115 | if ($this->getUser()->getId() !== $taggingRule->getConfig()->getUser()->getId()) { | ||
116 | return $this->redirect($action); | ||
117 | } | ||
118 | |||
119 | $action = $this->generateUrl('config').'?tagging-rule='.$taggingRule->getId().'#set5'; | ||
120 | } | ||
121 | |||
122 | $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]); | ||
110 | $newTaggingRule->handleRequest($request); | 123 | $newTaggingRule->handleRequest($request); |
111 | 124 | ||
112 | if ($newTaggingRule->isValid()) { | 125 | if ($newTaggingRule->isValid()) { |
@@ -122,45 +135,12 @@ class ConfigController extends Controller | |||
122 | return $this->redirect($this->generateUrl('config').'#set5'); | 135 | return $this->redirect($this->generateUrl('config').'#set5'); |
123 | } | 136 | } |
124 | 137 | ||
125 | // handle adding new user | ||
126 | $newUser = $userManager->createUser(); | ||
127 | // enable created user by default | ||
128 | $newUser->setEnabled(true); | ||
129 | $newUserForm = $this->createForm(NewUserType::class, $newUser, [ | ||
130 | 'validation_groups' => ['Profile'], | ||
131 | 'action' => $this->generateUrl('config').'#set6', | ||
132 | ]); | ||
133 | $newUserForm->handleRequest($request); | ||
134 | |||
135 | if ($newUserForm->isValid() && $this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) { | ||
136 | $userManager->updateUser($newUser, true); | ||
137 | |||
138 | $config = new Config($newUser); | ||
139 | $config->setTheme($this->getParameter('wallabag_core.theme')); | ||
140 | $config->setItemsPerPage($this->getParameter('wallabag_core.items_on_page')); | ||
141 | $config->setRssLimit($this->getParameter('wallabag_core.rss_limit')); | ||
142 | $config->setLanguage($this->getParameter('wallabag_core.language')); | ||
143 | $config->setReadingSpeed($this->getParameter('wallabag_core.reading_speed')); | ||
144 | |||
145 | $em->persist($config); | ||
146 | |||
147 | $em->flush(); | ||
148 | |||
149 | $this->get('session')->getFlashBag()->add( | ||
150 | 'notice', | ||
151 | $this->get('translator')->trans('flashes.config.notice.user_added', ['%username%' => $newUser->getUsername()]) | ||
152 | ); | ||
153 | |||
154 | return $this->redirect($this->generateUrl('config').'#set6'); | ||
155 | } | ||
156 | |||
157 | return $this->render('WallabagCoreBundle:Config:index.html.twig', [ | 138 | return $this->render('WallabagCoreBundle:Config:index.html.twig', [ |
158 | 'form' => [ | 139 | 'form' => [ |
159 | 'config' => $configForm->createView(), | 140 | 'config' => $configForm->createView(), |
160 | 'rss' => $rssForm->createView(), | 141 | 'rss' => $rssForm->createView(), |
161 | 'pwd' => $pwdForm->createView(), | 142 | 'pwd' => $pwdForm->createView(), |
162 | 'user' => $userForm->createView(), | 143 | 'user' => $userForm->createView(), |
163 | 'new_user' => $newUserForm->createView(), | ||
164 | 'new_tagging_rule' => $newTaggingRule->createView(), | 144 | 'new_tagging_rule' => $newTaggingRule->createView(), |
165 | ], | 145 | ], |
166 | 'rss' => [ | 146 | 'rss' => [ |
@@ -210,9 +190,7 @@ class ConfigController extends Controller | |||
210 | */ | 190 | */ |
211 | public function deleteTaggingRuleAction(TaggingRule $rule) | 191 | public function deleteTaggingRuleAction(TaggingRule $rule) |
212 | { | 192 | { |
213 | if ($this->getUser()->getId() != $rule->getConfig()->getUser()->getId()) { | 193 | $this->validateRuleAction($rule); |
214 | throw $this->createAccessDeniedException('You can not access this tagging rule.'); | ||
215 | } | ||
216 | 194 | ||
217 | $em = $this->getDoctrine()->getManager(); | 195 | $em = $this->getDoctrine()->getManager(); |
218 | $em->remove($rule); | 196 | $em->remove($rule); |
@@ -227,6 +205,34 @@ class ConfigController extends Controller | |||
227 | } | 205 | } |
228 | 206 | ||
229 | /** | 207 | /** |
208 | * Edit a tagging rule. | ||
209 | * | ||
210 | * @param TaggingRule $rule | ||
211 | * | ||
212 | * @Route("/tagging-rule/edit/{id}", requirements={"id" = "\d+"}, name="edit_tagging_rule") | ||
213 | * | ||
214 | * @return RedirectResponse | ||
215 | */ | ||
216 | public function editTaggingRuleAction(TaggingRule $rule) | ||
217 | { | ||
218 | $this->validateRuleAction($rule); | ||
219 | |||
220 | return $this->redirect($this->generateUrl('config').'?tagging-rule='.$rule->getId().'#set5'); | ||
221 | } | ||
222 | |||
223 | /** | ||
224 | * Validate that a rule can be edited/deleted by the current user. | ||
225 | * | ||
226 | * @param TaggingRule $rule | ||
227 | */ | ||
228 | private function validateRuleAction(TaggingRule $rule) | ||
229 | { | ||
230 | if ($this->getUser()->getId() != $rule->getConfig()->getUser()->getId()) { | ||
231 | throw $this->createAccessDeniedException('You can not access this tagging rule.'); | ||
232 | } | ||
233 | } | ||
234 | |||
235 | /** | ||
230 | * Retrieve config for the current user. | 236 | * Retrieve config for the current user. |
231 | * If no config were found, create a new one. | 237 | * If no config were found, create a new one. |
232 | * | 238 | * |
@@ -238,6 +244,7 @@ class ConfigController extends Controller | |||
238 | ->getRepository('WallabagCoreBundle:Config') | 244 | ->getRepository('WallabagCoreBundle:Config') |
239 | ->findOneByUser($this->getUser()); | 245 | ->findOneByUser($this->getUser()); |
240 | 246 | ||
247 | // should NEVER HAPPEN ... | ||
241 | if (!$config) { | 248 | if (!$config) { |
242 | $config = new Config($this->getUser()); | 249 | $config = new Config($this->getUser()); |
243 | } | 250 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/DeveloperController.php b/src/Wallabag/CoreBundle/Controller/DeveloperController.php index 63386db0..f3492b74 100644 --- a/src/Wallabag/CoreBundle/Controller/DeveloperController.php +++ b/src/Wallabag/CoreBundle/Controller/DeveloperController.php | |||
@@ -21,7 +21,7 @@ class DeveloperController extends Controller | |||
21 | { | 21 | { |
22 | $clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); | 22 | $clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); |
23 | 23 | ||
24 | return $this->render('WallabagCoreBundle:Developer:index.html.twig', [ | 24 | return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [ |
25 | 'clients' => $clients, | 25 | 'clients' => $clients, |
26 | ]); | 26 | ]); |
27 | } | 27 | } |
@@ -52,14 +52,14 @@ class DeveloperController extends Controller | |||
52 | $this->get('translator')->trans('flashes.developer.notice.client_created', ['%name%' => $client->getName()]) | 52 | $this->get('translator')->trans('flashes.developer.notice.client_created', ['%name%' => $client->getName()]) |
53 | ); | 53 | ); |
54 | 54 | ||
55 | return $this->render('WallabagCoreBundle:Developer:client_parameters.html.twig', [ | 55 | return $this->render('@WallabagCore/themes/common/Developer/client_parameters.html.twig', [ |
56 | 'client_id' => $client->getPublicId(), | 56 | 'client_id' => $client->getPublicId(), |
57 | 'client_secret' => $client->getSecret(), | 57 | 'client_secret' => $client->getSecret(), |
58 | 'client_name' => $client->getName(), | 58 | 'client_name' => $client->getName(), |
59 | ]); | 59 | ]); |
60 | } | 60 | } |
61 | 61 | ||
62 | return $this->render('WallabagCoreBundle:Developer:client.html.twig', [ | 62 | return $this->render('@WallabagCore/themes/common/Developer/client.html.twig', [ |
63 | 'form' => $clientForm->createView(), | 63 | 'form' => $clientForm->createView(), |
64 | ]); | 64 | ]); |
65 | } | 65 | } |
@@ -96,6 +96,6 @@ class DeveloperController extends Controller | |||
96 | */ | 96 | */ |
97 | public function howtoFirstAppAction() | 97 | public function howtoFirstAppAction() |
98 | { | 98 | { |
99 | return $this->render('WallabagCoreBundle:Developer:howto_app.html.twig'); | 99 | return $this->render('@WallabagCore/themes/common/Developer/howto_app.html.twig'); |
100 | } | 100 | } |
101 | } | 101 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index 40111af0..3b28e635 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -531,7 +531,7 @@ class EntryController extends Controller | |||
531 | } | 531 | } |
532 | 532 | ||
533 | return $this->render( | 533 | return $this->render( |
534 | '@WallabagCore/themes/share.html.twig', | 534 | '@WallabagCore/themes/common/Entry/share.html.twig', |
535 | ['entry' => $entry] | 535 | ['entry' => $entry] |
536 | ); | 536 | ); |
537 | } | 537 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/ExceptionController.php b/src/Wallabag/CoreBundle/Controller/ExceptionController.php new file mode 100644 index 00000000..abfa9c2f --- /dev/null +++ b/src/Wallabag/CoreBundle/Controller/ExceptionController.php | |||
@@ -0,0 +1,40 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Controller; | ||
4 | |||
5 | use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController; | ||
6 | use Symfony\Component\HttpFoundation\Request; | ||
7 | |||
8 | /** | ||
9 | * This controller allow us to customize the error template. | ||
10 | * The only modified line from the parent template is for "WallabagCoreBundle". | ||
11 | */ | ||
12 | class ExceptionController extends BaseExceptionController | ||
13 | { | ||
14 | protected function findTemplate(Request $request, $format, $code, $showException) | ||
15 | { | ||
16 | $name = $showException ? 'exception' : 'error'; | ||
17 | if ($showException && 'html' == $format) { | ||
18 | $name = 'exception_full'; | ||
19 | } | ||
20 | |||
21 | // For error pages, try to find a template for the specific HTTP status code and format | ||
22 | if (!$showException) { | ||
23 | $template = sprintf('WallabagCoreBundle:Exception:%s.%s.twig', $name, $format); | ||
24 | if ($this->templateExists($template)) { | ||
25 | return $template; | ||
26 | } | ||
27 | } | ||
28 | |||
29 | // try to find a template for the given format | ||
30 | $template = sprintf('@Twig/Exception/%s.%s.twig', $name, $format); | ||
31 | if ($this->templateExists($template)) { | ||
32 | return $template; | ||
33 | } | ||
34 | |||
35 | // default to a generic HTML exception | ||
36 | $request->setRequestFormat('html'); | ||
37 | |||
38 | return sprintf('@Twig/Exception/%s.html.twig', $showException ? 'exception_full' : $name); | ||
39 | } | ||
40 | } | ||
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php index 2118885c..38e3b5a0 100644 --- a/src/Wallabag/CoreBundle/Controller/RssController.php +++ b/src/Wallabag/CoreBundle/Controller/RssController.php | |||
@@ -87,7 +87,7 @@ class RssController extends Controller | |||
87 | $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); | 87 | $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); |
88 | $entries->setMaxPerPage($perPage); | 88 | $entries->setMaxPerPage($perPage); |
89 | 89 | ||
90 | return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', [ | 90 | return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ |
91 | 'type' => $type, | 91 | 'type' => $type, |
92 | 'entries' => $entries, | 92 | 'entries' => $entries, |
93 | ]); | 93 | ]); |
diff --git a/src/Wallabag/CoreBundle/Controller/StaticController.php b/src/Wallabag/CoreBundle/Controller/StaticController.php index 2a57f06f..82714217 100644 --- a/src/Wallabag/CoreBundle/Controller/StaticController.php +++ b/src/Wallabag/CoreBundle/Controller/StaticController.php | |||
@@ -15,7 +15,7 @@ class StaticController extends Controller | |||
15 | $addonsUrl = $this->container->getParameter('addons_url'); | 15 | $addonsUrl = $this->container->getParameter('addons_url'); |
16 | 16 | ||
17 | return $this->render( | 17 | return $this->render( |
18 | 'WallabagCoreBundle:Static:howto.html.twig', | 18 | '@WallabagCore/themes/common/Static/howto.html.twig', |
19 | ['addonsUrl' => $addonsUrl] | 19 | ['addonsUrl' => $addonsUrl] |
20 | ); | 20 | ); |
21 | } | 21 | } |
@@ -26,7 +26,7 @@ class StaticController extends Controller | |||
26 | public function aboutAction() | 26 | public function aboutAction() |
27 | { | 27 | { |
28 | return $this->render( | 28 | return $this->render( |
29 | 'WallabagCoreBundle:Static:about.html.twig', | 29 | '@WallabagCore/themes/common/Static/about.html.twig', |
30 | [ | 30 | [ |
31 | 'version' => $this->getParameter('wallabag_core.version'), | 31 | 'version' => $this->getParameter('wallabag_core.version'), |
32 | 'paypal_url' => $this->getParameter('wallabag_core.paypal_url'), | 32 | 'paypal_url' => $this->getParameter('wallabag_core.paypal_url'), |
@@ -40,7 +40,7 @@ class StaticController extends Controller | |||
40 | public function quickstartAction() | 40 | public function quickstartAction() |
41 | { | 41 | { |
42 | return $this->render( | 42 | return $this->render( |
43 | 'WallabagCoreBundle:Static:quickstart.html.twig', | 43 | '@WallabagCore/themes/common/Static/quickstart.html.twig', |
44 | [] | 44 | [] |
45 | ); | 45 | ); |
46 | } | 46 | } |
diff --git a/src/Wallabag/CoreBundle/Helper/EntriesExport.php b/src/Wallabag/CoreBundle/Helper/EntriesExport.php index 1dfa12c8..0c627dcd 100644 --- a/src/Wallabag/CoreBundle/Helper/EntriesExport.php +++ b/src/Wallabag/CoreBundle/Helper/EntriesExport.php | |||
@@ -25,7 +25,7 @@ class EntriesExport | |||
25 | private $footerTemplate = '<div style="text-align:center;"> | 25 | private $footerTemplate = '<div style="text-align:center;"> |
26 | <p>Produced by wallabag with %EXPORT_METHOD%</p> | 26 | <p>Produced by wallabag with %EXPORT_METHOD%</p> |
27 | <p>Please open <a href="https://github.com/wallabag/wallabag/issues">an issue</a> if you have trouble with the display of this E-Book on your device.</p> | 27 | <p>Please open <a href="https://github.com/wallabag/wallabag/issues">an issue</a> if you have trouble with the display of this E-Book on your device.</p> |
28 | </div'; | 28 | </div>'; |
29 | 29 | ||
30 | /** | 30 | /** |
31 | * @param Config $craueConfig CraueConfig instance to get wallabag instance url from database | 31 | * @param Config $craueConfig CraueConfig instance to get wallabag instance url from database |
diff --git a/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php b/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php index 6ea2a4f3..40b5673d 100644 --- a/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php +++ b/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php | |||
@@ -49,7 +49,7 @@ class UsernameRssTokenConverter implements ParamConverterInterface | |||
49 | $em = $this->registry->getManagerForClass($configuration->getClass()); | 49 | $em = $this->registry->getManagerForClass($configuration->getClass()); |
50 | 50 | ||
51 | // Check, if class name is what we need | 51 | // Check, if class name is what we need |
52 | if ('Wallabag\UserBundle\Entity\User' !== $em->getClassMetadata($configuration->getClass())->getName()) { | 52 | if (null !== $em && 'Wallabag\UserBundle\Entity\User' !== $em->getClassMetadata($configuration->getClass())->getName()) { |
53 | return false; | 53 | return false; |
54 | } | 54 | } |
55 | 55 | ||
@@ -69,9 +69,8 @@ class UsernameRssTokenConverter implements ParamConverterInterface | |||
69 | $username = $request->attributes->get('username'); | 69 | $username = $request->attributes->get('username'); |
70 | $rssToken = $request->attributes->get('token'); | 70 | $rssToken = $request->attributes->get('token'); |
71 | 71 | ||
72 | // Check, if route attributes exists | 72 | if (!$request->attributes->has('username') || !$request->attributes->has('token')) { |
73 | if (null === $username || null === $rssToken) { | 73 | return false; |
74 | throw new \InvalidArgumentException('Route attribute is missing'); | ||
75 | } | 74 | } |
76 | 75 | ||
77 | // Get actual entity manager for class | 76 | // Get actual entity manager for class |
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 302e5a53..75127b7d 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php | |||
@@ -128,7 +128,7 @@ class EntryRepository extends EntityRepository | |||
128 | $qb->andWhere('e.isStarred =:isStarred')->setParameter('isStarred', (bool) $isStarred); | 128 | $qb->andWhere('e.isStarred =:isStarred')->setParameter('isStarred', (bool) $isStarred); |
129 | } | 129 | } |
130 | 130 | ||
131 | if ($since >= 0) { | 131 | if ($since > 0) { |
132 | $qb->andWhere('e.updatedAt > :since')->setParameter('since', new \DateTime(date('Y-m-d H:i:s', $since))); | 132 | $qb->andWhere('e.updatedAt > :since')->setParameter('since', new \DateTime(date('Y-m-d H:i:s', $since))); |
133 | } | 133 | } |
134 | 134 | ||
@@ -281,7 +281,7 @@ class EntryRepository extends EntityRepository | |||
281 | public function findByUrlAndUserId($url, $userId) | 281 | public function findByUrlAndUserId($url, $userId) |
282 | { | 282 | { |
283 | $res = $this->createQueryBuilder('e') | 283 | $res = $this->createQueryBuilder('e') |
284 | ->where('e.url = :url')->setParameter('url', $url) | 284 | ->where('e.url = :url')->setParameter('url', urldecode($url)) |
285 | ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) | 285 | ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) |
286 | ->getQuery() | 286 | ->getQuery() |
287 | ->getResult(); | 287 | ->getResult(); |
diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml index 23e6d3ca..d1139846 100644 --- a/src/Wallabag/CoreBundle/Resources/config/services.yml +++ b/src/Wallabag/CoreBundle/Resources/config/services.yml | |||
@@ -88,17 +88,6 @@ services: | |||
88 | arguments: | 88 | arguments: |
89 | - WallabagCoreBundle:Tag | 89 | - WallabagCoreBundle:Tag |
90 | 90 | ||
91 | wallabag_core.registration_confirmed: | ||
92 | class: Wallabag\CoreBundle\EventListener\RegistrationConfirmedListener | ||
93 | arguments: | ||
94 | - "@doctrine.orm.entity_manager" | ||
95 | - "%wallabag_core.theme%" | ||
96 | - "%wallabag_core.items_on_page%" | ||
97 | - "%wallabag_core.rss_limit%" | ||
98 | - "%wallabag_core.language%" | ||
99 | tags: | ||
100 | - { name: kernel.event_subscriber } | ||
101 | |||
102 | wallabag_core.helper.entries_export: | 91 | wallabag_core.helper.entries_export: |
103 | class: Wallabag\CoreBundle\Helper\EntriesExport | 92 | class: Wallabag\CoreBundle\Helper\EntriesExport |
104 | arguments: | 93 | arguments: |
@@ -133,3 +122,9 @@ services: | |||
133 | host: '%redis_host%' | 122 | host: '%redis_host%' |
134 | port: '%redis_port%' | 123 | port: '%redis_port%' |
135 | schema: tcp | 124 | schema: tcp |
125 | |||
126 | wallabag_core.exception_controller: | ||
127 | class: Wallabag\CoreBundle\Controller\ExceptionController | ||
128 | arguments: | ||
129 | - '@twig' | ||
130 | - '%kernel.debug%' | ||
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml index 9eeb210b..40644ff5 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Søg' | 31 | search: 'Søg' |
32 | # save_link: 'Save a link' | 32 | # save_link: 'Save a link' |
33 | back_to_unread: 'Tilbage til de ulæste artikler' | 33 | back_to_unread: 'Tilbage til de ulæste artikler' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Tilføj ny artikel' | 36 | add_new_entry: 'Tilføj ny artikel' |
36 | search: 'Søg' | 37 | search: 'Søg' |
@@ -45,6 +46,7 @@ footer: | |||
45 | # social: 'Social' | 46 | # social: 'Social' |
46 | # powered_by: 'powered by' | 47 | # powered_by: 'powered by' |
47 | about: 'Om' | 48 | about: 'Om' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Opsætning' | 52 | page_title: 'Opsætning' |
@@ -94,6 +96,7 @@ config: | |||
94 | # if_label: 'if' | 96 | # if_label: 'if' |
95 | # then_tag_as_label: 'then tag as' | 97 | # then_tag_as_label: 'then tag as' |
96 | # delete_rule_label: 'delete' | 98 | # delete_rule_label: 'delete' |
99 | # edit_rule_label: 'edit' | ||
97 | # rule_label: 'Rule' | 100 | # rule_label: 'Rule' |
98 | # tags_label: 'Tags' | 101 | # tags_label: 'Tags' |
99 | # faq: | 102 | # faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | # or: 'One rule OR another' | 130 | # or: 'One rule OR another' |
128 | # and: 'One rule AND another' | 131 | # and: 'One rule AND another' |
129 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' | 132 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Brugernavn' | ||
132 | password_label: 'Adgangskode' | ||
133 | repeat_new_password_label: 'Gentag adgangskode' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'Emailadresse' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | # page_title: 'Quickstart' | 265 | # page_title: 'Quickstart' |
266 | # more: 'More…' | ||
269 | # intro: | 267 | # intro: |
270 | # title: 'Welcome to wallabag!' | 268 | # title: 'Welcome to wallabag!' |
271 | # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." | 269 | # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." |
272 | # paragraph_2: 'Follow us!' | 270 | # paragraph_2: 'Follow us!' |
273 | # configure: | 271 | # configure: |
274 | # title: 'Configure the application' | 272 | # title: 'Configure the application' |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | # language: 'Change language and design' | 274 | # language: 'Change language and design' |
276 | # rss: 'Enable RSS feeds' | 275 | # rss: 'Enable RSS feeds' |
277 | # tagging_rules: 'Write rules to automatically tag your articles' | 276 | # tagging_rules: 'Write rules to automatically tag your articles' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | # import: 'Configure import' | 284 | # import: 'Configure import' |
286 | # first_steps: | 285 | # first_steps: |
287 | # title: 'First steps' | 286 | # title: 'First steps' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | # new_article: 'Save your first article' | 288 | # new_article: 'Save your first article' |
289 | # unread_articles: 'And classify it!' | 289 | # unread_articles: 'And classify it!' |
290 | # migrate: | 290 | # migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | # wallabag_v1: 'Migrate from wallabag v1' | 294 | # wallabag_v1: 'Migrate from wallabag v1' |
295 | # wallabag_v2: 'Migrate from wallabag v2' | 295 | # wallabag_v2: 'Migrate from wallabag v2' |
296 | # readability: 'Migrate from Readability' | 296 | # readability: 'Migrate from Readability' |
297 | # instapaper: 'Migrate from Instapaper' | ||
297 | # developer: | 298 | # developer: |
298 | # title: 'Developers' | 299 | # title: 'Developers' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | # create_application: 'Create your third application' | 301 | # create_application: 'Create your third application' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | # docs: | 303 | # docs: |
301 | # title: 'Full documentation' | 304 | # title: 'Full documentation' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | # annotate: 'Annotate your article' | 306 | # annotate: 'Annotate your article' |
303 | # export: 'Convert your articles into ePUB or PDF' | 307 | # export: 'Convert your articles into ePUB or PDF' |
304 | # search_filters: 'See how you can look for an article by using search engine and filters' | 308 | # search_filters: 'See how you can look for an article by using search engine and filters' |
@@ -351,12 +355,16 @@ import: | |||
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 356 | # firefox: |
353 | # page_title: 'Import > Firefox' | 357 | # page_title: 'Import > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | #chrome: | 360 | #chrome: |
357 | # page_title: 'Import > Chrome' | 361 | # page_title: 'Import > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | # instapaper: | ||
365 | # page_title: 'Import > Instapaper' | ||
366 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | # page_title: 'Developer' | 370 | # page_title: 'Developer' |
@@ -383,12 +391,14 @@ developer: | |||
383 | # page_title: 'Developer > New client' | 391 | # page_title: 'Developer > New client' |
384 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' | 392 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' |
385 | # form: | 393 | # form: |
394 | # name_label: 'Name of the client' | ||
386 | # redirect_uris_label: 'Redirect URIs' | 395 | # redirect_uris_label: 'Redirect URIs' |
387 | # save_label: 'Create a new client' | 396 | # save_label: 'Create a new client' |
388 | # action_back: 'Back' | 397 | # action_back: 'Back' |
389 | # client_parameter: | 398 | # client_parameter: |
390 | # page_title: 'Developer > Client parameters' | 399 | # page_title: 'Developer > Client parameters' |
391 | # page_description: 'Here are your client parameters.' | 400 | # page_description: 'Here are your client parameters.' |
401 | # field_name: 'Client name' | ||
392 | # field_id: 'Client ID' | 402 | # field_id: 'Client ID' |
393 | # field_secret: 'Client secret' | 403 | # field_secret: 'Client secret' |
394 | # back: 'Back' | 404 | # back: 'Back' |
@@ -406,6 +416,33 @@ developer: | |||
406 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' | 416 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' |
407 | # back: 'Back' | 417 | # back: 'Back' |
408 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Brugernavn' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Adgangskode' | ||
434 | repeat_new_password_label: 'Gentag adgangskode' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'Emailadresse' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
411 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml index a9ec2519..6f790744 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Suche' | 31 | search: 'Suche' |
32 | save_link: 'Link speichern' | 32 | save_link: 'Link speichern' |
33 | back_to_unread: 'Zurück zu ungelesenen Artikeln' | 33 | back_to_unread: 'Zurück zu ungelesenen Artikeln' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Neuen Artikel hinzufügen' | 36 | add_new_entry: 'Neuen Artikel hinzufügen' |
36 | search: 'Suche' | 37 | search: 'Suche' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Soziales' | 46 | social: 'Soziales' |
46 | powered_by: 'angetrieben von' | 47 | powered_by: 'angetrieben von' |
47 | about: 'Über' | 48 | about: 'Über' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Einstellungen' | 52 | page_title: 'Einstellungen' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'Wenn' | 96 | if_label: 'Wenn' |
95 | then_tag_as_label: 'dann tagge als' | 97 | then_tag_as_label: 'dann tagge als' |
96 | delete_rule_label: 'löschen' | 98 | delete_rule_label: 'löschen' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'Regel' | 100 | rule_label: 'Regel' |
98 | tags_label: 'Tags' | 101 | tags_label: 'Tags' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: 'Eine Regel ODER die andere' | 130 | or: 'Eine Regel ODER die andere' |
128 | and: 'Eine Regel UND eine andere' | 131 | and: 'Eine Regel UND eine andere' |
129 | matches: 'Tests, ob eine <i>Variable</i> auf eine <i>Suche</i> zutrifft (Groß- und Kleinschreibung wird nicht berücksichtigt).<br />Beispiel: <code>title matches "Fußball"</code>' | 132 | matches: 'Tests, ob eine <i>Variable</i> auf eine <i>Suche</i> zutrifft (Groß- und Kleinschreibung wird nicht berücksichtigt).<br />Beispiel: <code>title matches "Fußball"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Benutzername' | ||
132 | password_label: 'Kennwort' | ||
133 | repeat_new_password_label: 'Neues Kennwort wiederholen' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'E-Mail-Adresse' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Schnelleinstieg' | 265 | page_title: 'Schnelleinstieg' |
266 | # more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Willkommen zu wallabag!' | 268 | title: 'Willkommen zu wallabag!' |
271 | paragraph_1: "Wir werden dich bei der Benutzung von wallabag begleiten und dir einige Funktionen zeigen, die dich interessieren könnten." | 269 | paragraph_1: "Wir werden dich bei der Benutzung von wallabag begleiten und dir einige Funktionen zeigen, die dich interessieren könnten." |
272 | paragraph_2: 'Folge uns!' | 270 | paragraph_2: 'Folge uns!' |
273 | configure: | 271 | configure: |
274 | title: 'Anwendung konfigurieren' | 272 | title: 'Anwendung konfigurieren' |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: 'Sprache und Design ändern' | 274 | language: 'Sprache und Design ändern' |
276 | rss: 'RSS-Feeds aktivieren' | 275 | rss: 'RSS-Feeds aktivieren' |
277 | tagging_rules: 'Schreibe Regeln, um deine Beiträge automatisch zu taggen (verschlagworten)' | 276 | tagging_rules: 'Schreibe Regeln, um deine Beiträge automatisch zu taggen (verschlagworten)' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: 'Import-Einstellungen ändern' | 284 | import: 'Import-Einstellungen ändern' |
286 | first_steps: | 285 | first_steps: |
287 | title: 'Erste Schritte' | 286 | title: 'Erste Schritte' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link" | ||
288 | new_article: 'Speichere deinen ersten Artikel' | 288 | new_article: 'Speichere deinen ersten Artikel' |
289 | unread_articles: 'Und klassifiziere ihn!' | 289 | unread_articles: 'Und klassifiziere ihn!' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'von wallabag v1 migrieren' | 294 | wallabag_v1: 'von wallabag v1 migrieren' |
295 | wallabag_v2: 'von wallabag v2 migrieren' | 295 | wallabag_v2: 'von wallabag v2 migrieren' |
296 | readability: 'von Readability migrieren' | 296 | readability: 'von Readability migrieren' |
297 | instapaper: 'von Instapaper migrieren' | ||
297 | developer: | 298 | developer: |
298 | title: 'Entwickler' | 299 | title: 'Entwickler' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'Erstelle eine Anwendung und nutze die wallabag API' | 301 | create_application: 'Erstelle eine Anwendung und nutze die wallabag API' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Komplette Dokumentation' | 304 | title: 'Komplette Dokumentation' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'Anmerkungen zu Artikeln hinzufügen' | 306 | annotate: 'Anmerkungen zu Artikeln hinzufügen' |
303 | export: 'Artikel nach ePUB oder PDF konvertieren' | 307 | export: 'Artikel nach ePUB oder PDF konvertieren' |
304 | search_filters: 'Schau nach, wie du nach einem Artikel über die Such- und Filterfunktion suchen kannst' | 308 | search_filters: 'Schau nach, wie du nach einem Artikel über die Such- und Filterfunktion suchen kannst' |
@@ -345,18 +349,22 @@ import: | |||
345 | description: 'Dieser Import wird all deine Artikel aus wallabag v2 importieren. Gehe auf "Alle Artikel" und dann, in der Exportieren-Seitenleiste auf "JSON". Dabei erhältst du eine "All articles.json"-Datei.' | 349 | description: 'Dieser Import wird all deine Artikel aus wallabag v2 importieren. Gehe auf "Alle Artikel" und dann, in der Exportieren-Seitenleiste auf "JSON". Dabei erhältst du eine "All articles.json"-Datei.' |
346 | readability: | 350 | readability: |
347 | page_title: 'Aus Readability importieren' | 351 | page_title: 'Aus Readability importieren' |
348 | # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).' | 352 | # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).' |
349 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' | 353 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' |
350 | worker: | 354 | worker: |
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 356 | firefox: |
353 | # page_title: 'Import > Firefox' | 357 | page_title: 'Aus Firefox importieren' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | # chrome: | 360 | chrome: |
357 | # page_title: 'Import > Chrome' | 361 | page_title: 'Aus Chrome importieren' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | instapaper: | ||
365 | page_title: 'Aus Instapaper importieren' | ||
366 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Entwickler' | 370 | page_title: 'Entwickler' |
@@ -383,12 +391,14 @@ developer: | |||
383 | page_title: 'Entwickler > Neuer Client' | 391 | page_title: 'Entwickler > Neuer Client' |
384 | page_description: 'Du bist dabei, einen neuen Client zu erstellen. Fülle das nachfolgende Feld für die Weiterleitungs-URIs deiner Anwendung aus.' | 392 | page_description: 'Du bist dabei, einen neuen Client zu erstellen. Fülle das nachfolgende Feld für die Weiterleitungs-URIs deiner Anwendung aus.' |
385 | form: | 393 | form: |
394 | # name_label: 'Name of the client' | ||
386 | redirect_uris_label: 'Weiterleitungs-URIs' | 395 | redirect_uris_label: 'Weiterleitungs-URIs' |
387 | save_label: 'Neuen Client erstellen' | 396 | save_label: 'Neuen Client erstellen' |
388 | action_back: 'Zurück' | 397 | action_back: 'Zurück' |
389 | client_parameter: | 398 | client_parameter: |
390 | page_title: 'Entwickler > Client-Parameter' | 399 | page_title: 'Entwickler > Client-Parameter' |
391 | page_description: 'Dies sind deine Client-Parameter.' | 400 | page_description: 'Dies sind deine Client-Parameter.' |
401 | # field_name: 'Client name' | ||
392 | field_id: 'Client-ID' | 402 | field_id: 'Client-ID' |
393 | field_secret: 'Client-Secret' | 403 | field_secret: 'Client-Secret' |
394 | back: 'Zurück' | 404 | back: 'Zurück' |
@@ -406,6 +416,33 @@ developer: | |||
406 | paragraph_8: 'Wenn du alle API-Endpunkte sehen willst, werfe einen Blick auf die <a href="%link%">API-Dokumentation</a>.' | 416 | paragraph_8: 'Wenn du alle API-Endpunkte sehen willst, werfe einen Blick auf die <a href="%link%">API-Dokumentation</a>.' |
407 | back: 'Zurück' | 417 | back: 'Zurück' |
408 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Benutzername' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Kennwort' | ||
434 | repeat_new_password_label: 'Neues Kennwort wiederholen' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'E-Mail-Adresse' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
411 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml index c0d8656d..91abe162 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Search' | 31 | search: 'Search' |
32 | save_link: 'Save a link' | 32 | save_link: 'Save a link' |
33 | back_to_unread: 'Back to unread articles' | 33 | back_to_unread: 'Back to unread articles' |
34 | users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Add a new entry' | 36 | add_new_entry: 'Add a new entry' |
36 | search: 'Search' | 37 | search: 'Search' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Social' | 46 | social: 'Social' |
46 | powered_by: 'powered by' | 47 | powered_by: 'powered by' |
47 | about: 'About' | 48 | about: 'About' |
49 | stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Config' | 52 | page_title: 'Config' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'if' | 96 | if_label: 'if' |
95 | then_tag_as_label: 'then tag as' | 97 | then_tag_as_label: 'then tag as' |
96 | delete_rule_label: 'delete' | 98 | delete_rule_label: 'delete' |
99 | edit_rule_label: 'edit' | ||
97 | rule_label: 'Rule' | 100 | rule_label: 'Rule' |
98 | tags_label: 'Tags' | 101 | tags_label: 'Tags' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: 'One rule OR another' | 130 | or: 'One rule OR another' |
128 | and: 'One rule AND another' | 131 | and: 'One rule AND another' |
129 | matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' | 132 | matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Username' | ||
132 | password_label: 'Password' | ||
133 | repeat_new_password_label: 'Repeat new password' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'Email' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Quickstart' | 265 | page_title: 'Quickstart' |
266 | more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Welcome to wallabag!' | 268 | title: 'Welcome to wallabag!' |
271 | paragraph_1: "We'll accompany you on your visit to wallabag and show you some features that might interest you." | 269 | paragraph_1: "We'll accompany you on your visit to wallabag and show you some features that might interest you." |
272 | paragraph_2: 'Follow us!' | 270 | paragraph_2: 'Follow us!' |
273 | configure: | 271 | configure: |
274 | title: 'Configure the application' | 272 | title: 'Configure the application' |
273 | description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: 'Change language and design' | 274 | language: 'Change language and design' |
276 | rss: 'Enable RSS feeds' | 275 | rss: 'Enable RSS feeds' |
277 | tagging_rules: 'Write rules to automatically tag your articles' | 276 | tagging_rules: 'Write rules to automatically tag your articles' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: 'Configure import' | 284 | import: 'Configure import' |
286 | first_steps: | 285 | first_steps: |
287 | title: 'First steps' | 286 | title: 'First steps' |
287 | description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | new_article: 'Save your first article' | 288 | new_article: 'Save your first article' |
289 | unread_articles: 'And classify it!' | 289 | unread_articles: 'And classify it!' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'Migrate from wallabag v1' | 294 | wallabag_v1: 'Migrate from wallabag v1' |
295 | wallabag_v2: 'Migrate from wallabag v2' | 295 | wallabag_v2: 'Migrate from wallabag v2' |
296 | readability: 'Migrate from Readability' | 296 | readability: 'Migrate from Readability' |
297 | instapaper: 'Migrate from Instapaper' | ||
297 | developer: | 298 | developer: |
298 | title: 'Developers' | 299 | title: 'Developers' |
300 | description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'Create your third application' | 301 | create_application: 'Create your third application' |
302 | use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Full documentation' | 304 | title: 'Full documentation' |
305 | description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'Annotate your article' | 306 | annotate: 'Annotate your article' |
303 | export: 'Convert your articles into ePUB or PDF' | 307 | export: 'Convert your articles into ePUB or PDF' |
304 | search_filters: 'See how you can look for an article by using the search engine and filters' | 308 | search_filters: 'See how you can look for an article by using the search engine and filters' |
@@ -351,12 +355,16 @@ import: | |||
351 | enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | firefox: | 356 | firefox: |
353 | page_title: 'Import > Firefox' | 357 | page_title: 'Import > Firefox' |
354 | description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | chrome: | 360 | chrome: |
357 | page_title: 'Import > Chrome' | 361 | page_title: 'Import > Chrome' |
358 | description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | instapaper: | ||
365 | page_title: 'Import > Instapaper' | ||
366 | description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Developer' | 370 | page_title: 'Developer' |
@@ -408,6 +416,33 @@ developer: | |||
408 | paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' | 416 | paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' |
409 | back: 'Back' | 417 | back: 'Back' |
410 | 418 | ||
419 | user: | ||
420 | page_title: Users management | ||
421 | new_user: Create a new user | ||
422 | edit_user: Edit an existing user | ||
423 | description: "Here you can manage all users (create, edit and delete)" | ||
424 | list: | ||
425 | actions: Actions | ||
426 | edit_action: Edit | ||
427 | yes: Yes | ||
428 | no: No | ||
429 | create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Username' | ||
432 | name_label: 'Name' | ||
433 | password_label: 'Password' | ||
434 | repeat_new_password_label: 'Repeat new password' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'Email' | ||
437 | enabled_label: 'Enabled' | ||
438 | locked_label: 'Locked' | ||
439 | last_login_label: 'Last login' | ||
440 | twofactor_label: Two factor authentication | ||
441 | save: Save | ||
442 | delete: Delete | ||
443 | delete_confirm: Are you sure? | ||
444 | back_to_list: Back to list | ||
445 | |||
411 | flashes: | 446 | flashes: |
412 | config: | 447 | config: |
413 | notice: | 448 | notice: |
@@ -418,7 +453,6 @@ flashes: | |||
418 | rss_updated: 'RSS information updated' | 453 | rss_updated: 'RSS information updated' |
419 | tagging_rules_updated: 'Tagging rules updated' | 454 | tagging_rules_updated: 'Tagging rules updated' |
420 | tagging_rules_deleted: 'Tagging rule deleted' | 455 | tagging_rules_deleted: 'Tagging rule deleted' |
421 | user_added: 'User "%username%" added' | ||
422 | rss_token_updated: 'RSS token updated' | 456 | rss_token_updated: 'RSS token updated' |
423 | entry: | 457 | entry: |
424 | notice: | 458 | notice: |
@@ -449,3 +483,8 @@ flashes: | |||
449 | notice: | 483 | notice: |
450 | client_created: 'New client %name% created.' | 484 | client_created: 'New client %name% created.' |
451 | client_deleted: 'Client %name% deleted' | 485 | client_deleted: 'Client %name% deleted' |
486 | user: | ||
487 | notice: | ||
488 | added: 'User "%username%" added' | ||
489 | updated: 'User "%username%" updated' | ||
490 | deleted: 'User "%username%" deleted' | ||
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml index 1d6993db..25d2f3a2 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Buscar' | 31 | search: 'Buscar' |
32 | save_link: 'Archivar un enlace' | 32 | save_link: 'Archivar un enlace' |
33 | back_to_unread: 'Volver a los artículos sin leer' | 33 | back_to_unread: 'Volver a los artículos sin leer' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Añadir un nuevo artículo' | 36 | add_new_entry: 'Añadir un nuevo artículo' |
36 | search: 'Buscar' | 37 | search: 'Buscar' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Social' | 46 | social: 'Social' |
46 | powered_by: 'funciona por' | 47 | powered_by: 'funciona por' |
47 | about: 'Acerca de' | 48 | about: 'Acerca de' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Configuración' | 52 | page_title: 'Configuración' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'si' | 96 | if_label: 'si' |
95 | then_tag_as_label: 'Etiquete como' | 97 | then_tag_as_label: 'Etiquete como' |
96 | delete_rule_label: 'Borre' | 98 | delete_rule_label: 'Borre' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'Regla' | 100 | rule_label: 'Regla' |
98 | tags_label: 'Etiquetas' | 101 | tags_label: 'Etiquetas' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: 'Una regla U otra' | 130 | or: 'Una regla U otra' |
128 | and: 'Una regla Y la otra' | 131 | and: 'Una regla Y la otra' |
129 | matches: 'Pruebe si un <i>sujeto</i> corresponde a una <i>búsqueda</i> (insensible a mayusculas).<br />Ejemplo : <code>título coincide "football"</code>' | 132 | matches: 'Pruebe si un <i>sujeto</i> corresponde a una <i>búsqueda</i> (insensible a mayusculas).<br />Ejemplo : <code>título coincide "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Nombre de usuario' | ||
132 | password_label: 'Contraseña' | ||
133 | repeat_new_password_label: 'Confirmar la nueva contraseña' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'Email' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Comienzo rápido' | 265 | page_title: 'Comienzo rápido' |
266 | # more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Bienvenido a wallabag !' | 268 | title: 'Bienvenido a wallabag !' |
271 | paragraph_1: "Le acompañaremos a su visita de wallabag y le mostraremos algunas características que le pueden interesar." | 269 | paragraph_1: "Le acompañaremos a su visita de wallabag y le mostraremos algunas características que le pueden interesar." |
272 | paragraph_2: '¡Síganos!' | 270 | paragraph_2: '¡Síganos!' |
273 | configure: | 271 | configure: |
274 | title: 'Configure la aplicación' | 272 | title: 'Configure la aplicación' |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: 'Cambie el idioma y el diseño de la aplicación' | 274 | language: 'Cambie el idioma y el diseño de la aplicación' |
276 | rss: 'Activar los feeds RSS' | 275 | rss: 'Activar los feeds RSS' |
277 | tagging_rules: 'Escribir reglas para etiquetear automaticamente sus artículos' | 276 | tagging_rules: 'Escribir reglas para etiquetear automaticamente sus artículos' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: 'Configure importación' | 284 | import: 'Configure importación' |
286 | first_steps: | 285 | first_steps: |
287 | title: 'Primeros pasos' | 286 | title: 'Primeros pasos' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | new_article: 'Guarde su primer artículo' | 288 | new_article: 'Guarde su primer artículo' |
289 | unread_articles: '¡Y clasifíquelo!' | 289 | unread_articles: '¡Y clasifíquelo!' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'Migrar desde wallabag v1' | 294 | wallabag_v1: 'Migrar desde wallabag v1' |
295 | wallabag_v2: 'Migrar desde wallabag v2' | 295 | wallabag_v2: 'Migrar desde wallabag v2' |
296 | readability: 'Migrar desde Readability' | 296 | readability: 'Migrar desde Readability' |
297 | instapaper: 'Migrar desde Instapaper' | ||
297 | developer: | 298 | developer: |
298 | title: 'Promotores' | 299 | title: 'Promotores' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'Cree su tercera aplicación' | 301 | create_application: 'Cree su tercera aplicación' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Documentación completa' | 304 | title: 'Documentación completa' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'Anote su artículo' | 306 | annotate: 'Anote su artículo' |
303 | export: 'Convierta sus artículos a ePub o a PDF' | 307 | export: 'Convierta sus artículos a ePub o a PDF' |
304 | search_filters: 'Aprenda a utilizar el buscador y los filtros para encontrar el artículo que le interese' | 308 | search_filters: 'Aprenda a utilizar el buscador y los filtros para encontrar el artículo que le interese' |
@@ -345,18 +349,22 @@ import: | |||
345 | description: 'Va a importar sus artículos de otra instancia de wallabag v2. Vaya a Todos los artículos, entonces, en la barra lateral, oprima en "JSON". Usted tendrá un fichero "All articles.json"' | 349 | description: 'Va a importar sus artículos de otra instancia de wallabag v2. Vaya a Todos los artículos, entonces, en la barra lateral, oprima en "JSON". Usted tendrá un fichero "All articles.json"' |
346 | readability: | 350 | readability: |
347 | page_title: 'Importar > Readability' | 351 | page_title: 'Importar > Readability' |
348 | # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).' | 352 | # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).' |
349 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' | 353 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' |
350 | worker: | 354 | worker: |
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 356 | firefox: |
353 | # page_title: 'Import > Firefox' | 357 | page_title: 'Importar > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | # chrome: | 360 | chrome: |
357 | # page_title: 'Import > Chrome' | 361 | page_title: 'Importar > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | instapaper: | ||
365 | page_title: 'Importar > Instapaper' | ||
366 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Promotor' | 370 | page_title: 'Promotor' |
@@ -383,12 +391,14 @@ developer: | |||
383 | page_title: 'Promotor > Nuevo cliente' | 391 | page_title: 'Promotor > Nuevo cliente' |
384 | page_description: 'Va a crear un nuevo cliente. Por favor, llene el campo abajo para URI redirigido de su aplicación.' | 392 | page_description: 'Va a crear un nuevo cliente. Por favor, llene el campo abajo para URI redirigido de su aplicación.' |
385 | form: | 393 | form: |
394 | # name_label: 'Name of the client' | ||
386 | redirect_uris_label: 'los URI redirigidos' | 395 | redirect_uris_label: 'los URI redirigidos' |
387 | save_label: 'Crear un nuevo cliente' | 396 | save_label: 'Crear un nuevo cliente' |
388 | action_back: 'Atrás' | 397 | action_back: 'Atrás' |
389 | client_parameter: | 398 | client_parameter: |
390 | page_title: 'Promotor > Parámetros del cliente' | 399 | page_title: 'Promotor > Parámetros del cliente' |
391 | page_description: 'Aquí hay sus parámetros del cliente.' | 400 | page_description: 'Aquí hay sus parámetros del cliente.' |
401 | # field_name: 'Client name' | ||
392 | field_id: 'Identificación del cliente' | 402 | field_id: 'Identificación del cliente' |
393 | field_secret: 'Cliente secreto' | 403 | field_secret: 'Cliente secreto' |
394 | back: 'Atrás' | 404 | back: 'Atrás' |
@@ -406,6 +416,33 @@ developer: | |||
406 | paragraph_8: 'Si quiere ver todos los fines de API, se puede ver <a href="%link%">a nuestra documentación API</a>.' | 416 | paragraph_8: 'Si quiere ver todos los fines de API, se puede ver <a href="%link%">a nuestra documentación API</a>.' |
407 | back: 'Atrás' | 417 | back: 'Atrás' |
408 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Nombre de usuario' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Contraseña' | ||
434 | repeat_new_password_label: 'Confirmar la nueva contraseña' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'Email' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
411 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml index 68272f99..b02ffea0 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'جستجو' | 31 | search: 'جستجو' |
32 | save_link: 'ذخیرهٔ یک پیوند' | 32 | save_link: 'ذخیرهٔ یک پیوند' |
33 | back_to_unread: 'بازگشت به خواندهنشدهها' | 33 | back_to_unread: 'بازگشت به خواندهنشدهها' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'افزودن مقالهٔ تازه' | 36 | add_new_entry: 'افزودن مقالهٔ تازه' |
36 | search: 'جستجو' | 37 | search: 'جستجو' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'شبکههای اجتماعی' | 46 | social: 'شبکههای اجتماعی' |
46 | powered_by: 'توانمند با' | 47 | powered_by: 'توانمند با' |
47 | about: 'درباره' | 48 | about: 'درباره' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'پیکربندی' | 52 | page_title: 'پیکربندی' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'اگر' | 96 | if_label: 'اگر' |
95 | then_tag_as_label: 'این برچسب را بزن' | 97 | then_tag_as_label: 'این برچسب را بزن' |
96 | delete_rule_label: 'پاک کن' | 98 | delete_rule_label: 'پاک کن' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'قانون' | 100 | rule_label: 'قانون' |
98 | tags_label: 'برچسبها' | 101 | tags_label: 'برچسبها' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | # or: 'One rule OR another' | 130 | # or: 'One rule OR another' |
128 | # and: 'One rule AND another' | 131 | # and: 'One rule AND another' |
129 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' | 132 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'نام کاربری' | ||
132 | password_label: 'رمز' | ||
133 | repeat_new_password_label: 'رمز تازه را دوباره بنویسید' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'نشانی ایمیل' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,6 +263,7 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Quickstart' | 265 | page_title: 'Quickstart' |
266 | # more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'به wallabag خوش آمدید!!' | 268 | title: 'به wallabag خوش آمدید!!' |
271 | paragraph_1: "به شما کمک خواهیم کرد تا wallabag را بشناسید و با برخی از ویژگیهای جالبش آشنا شوید" | 269 | paragraph_1: "به شما کمک خواهیم کرد تا wallabag را بشناسید و با برخی از ویژگیهای جالبش آشنا شوید" |
@@ -285,6 +283,7 @@ quickstart: | |||
285 | import: 'درونریزی را تنظیم کنید' | 283 | import: 'درونریزی را تنظیم کنید' |
286 | first_steps: | 284 | first_steps: |
287 | title: 'گام نخست' | 285 | title: 'گام نخست' |
286 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | new_article: 'نخستین مقالهٔ خود را ذخیره کنید' | 287 | new_article: 'نخستین مقالهٔ خود را ذخیره کنید' |
289 | unread_articles: 'و آن را طبقهبندی کنید!' | 288 | unread_articles: 'و آن را طبقهبندی کنید!' |
290 | migrate: | 289 | migrate: |
@@ -294,11 +293,15 @@ quickstart: | |||
294 | wallabag_v1: 'مهاجرت از نسخهٔ یکم wallabag' | 293 | wallabag_v1: 'مهاجرت از نسخهٔ یکم wallabag' |
295 | wallabag_v2: 'مهاجرت از نسخهٔ دوم wallabag' | 294 | wallabag_v2: 'مهاجرت از نسخهٔ دوم wallabag' |
296 | readability: 'مهاجرت از نسخهٔ دوم Readability' | 295 | readability: 'مهاجرت از نسخهٔ دوم Readability' |
296 | instapaper: 'مهاجرت از نسخهٔ دوم Instapaper' | ||
297 | developer: | 297 | developer: |
298 | title: 'برنامهنویسان' | 298 | title: 'برنامهنویسان' |
299 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'برنامهٔ wallabag خود را بسازید' | 300 | create_application: 'برنامهٔ wallabag خود را بسازید' |
301 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 302 | docs: |
301 | title: 'راهنمای کامل' | 303 | title: 'راهنمای کامل' |
304 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'روی مقالههایتان یادداشت بگذارید' | 305 | annotate: 'روی مقالههایتان یادداشت بگذارید' |
303 | export: 'مقالههایتان را به قالب ePUB یا PDF دربیاورید' | 306 | export: 'مقالههایتان را به قالب ePUB یا PDF دربیاورید' |
304 | search_filters: 'به کمک موتور جستجو و فیلترها به دنبال مقالههایتان بگردید' | 307 | search_filters: 'به کمک موتور جستجو و فیلترها به دنبال مقالههایتان بگردید' |
@@ -349,14 +352,18 @@ import: | |||
349 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' | 352 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' |
350 | worker: | 353 | worker: |
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 354 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 355 | firefox: |
353 | # page_title: 'Import > Firefox' | 356 | page_title: 'درونریزی > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 357 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 358 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | # chrome: | 359 | chrome: |
357 | # page_title: 'Import > Chrome' | 360 | page_title: 'درونریزی > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 361 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 362 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
363 | instapaper: | ||
364 | page_title: 'درونریزی > Instapaper' | ||
365 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
366 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 367 | ||
361 | developer: | 368 | developer: |
362 | # page_title: 'Developer' | 369 | # page_title: 'Developer' |
@@ -383,12 +390,14 @@ developer: | |||
383 | # page_title: 'Developer > New client' | 390 | # page_title: 'Developer > New client' |
384 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' | 391 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' |
385 | # form: | 392 | # form: |
393 | # name_label: 'Name of the client' | ||
386 | # redirect_uris_label: 'Redirect URIs' | 394 | # redirect_uris_label: 'Redirect URIs' |
387 | # save_label: 'Create a new client' | 395 | # save_label: 'Create a new client' |
388 | # action_back: 'بازگشت' | 396 | # action_back: 'بازگشت' |
389 | # client_parameter: | 397 | # client_parameter: |
390 | # page_title: 'Developer > Client parameters' | 398 | # page_title: 'Developer > Client parameters' |
391 | # page_description: 'Here are your client parameters.' | 399 | # page_description: 'Here are your client parameters.' |
400 | # field_name: 'Client name' | ||
392 | # field_id: 'Client ID' | 401 | # field_id: 'Client ID' |
393 | # field_secret: 'Client secret' | 402 | # field_secret: 'Client secret' |
394 | # back: 'بازگشت' | 403 | # back: 'بازگشت' |
@@ -406,6 +415,33 @@ developer: | |||
406 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' | 415 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' |
407 | # back: 'بازگشت' | 416 | # back: 'بازگشت' |
408 | 417 | ||
418 | user: | ||
419 | # page_title: Users management | ||
420 | # new_user: Create a new user | ||
421 | # edit_user: Edit an existing user | ||
422 | # description: "Here you can manage all users (create, edit and delete)" | ||
423 | # list: | ||
424 | # actions: Actions | ||
425 | # edit_action: Edit | ||
426 | # yes: Yes | ||
427 | # no: No | ||
428 | # create_new_one: Create a new user | ||
429 | form: | ||
430 | username_label: 'نام کاربری' | ||
431 | # name_label: 'Name' | ||
432 | password_label: 'رمز' | ||
433 | repeat_new_password_label: 'رمز تازه را دوباره بنویسید' | ||
434 | plain_password_label: '????' | ||
435 | email_label: 'نشانی ایمیل' | ||
436 | # enabled_label: 'Enabled' | ||
437 | # locked_label: 'Locked' | ||
438 | # last_login_label: 'Last login' | ||
439 | # twofactor_label: Two factor authentication | ||
440 | # save: Save | ||
441 | # delete: Delete | ||
442 | # delete_confirm: Are you sure? | ||
443 | # back_to_list: Back to list | ||
444 | |||
409 | flashes: | 445 | flashes: |
410 | config: | 446 | config: |
411 | notice: | 447 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml index b28068b6..598205b0 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Recherche' | 31 | search: 'Recherche' |
32 | save_link: 'Sauvegarder un nouvel article' | 32 | save_link: 'Sauvegarder un nouvel article' |
33 | back_to_unread: 'Retour aux articles non lus' | 33 | back_to_unread: 'Retour aux articles non lus' |
34 | users_management: 'Gestion des utilisateurs' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Sauvegarder un nouvel article' | 36 | add_new_entry: 'Sauvegarder un nouvel article' |
36 | search: 'Rechercher' | 37 | search: 'Rechercher' |
@@ -45,9 +46,10 @@ footer: | |||
45 | social: 'Social' | 46 | social: 'Social' |
46 | powered_by: 'propulsé par' | 47 | powered_by: 'propulsé par' |
47 | about: 'À propos' | 48 | about: 'À propos' |
48 | page_title: 'Configuration' | 49 | stats: Depuis le %user_creation% vous avez lu %nb_archives% articles. Ce qui fait %per_day% par jour ! |
49 | 50 | ||
50 | config: | 51 | config: |
52 | page_title: 'Configuration' | ||
51 | tab_menu: | 53 | tab_menu: |
52 | settings: 'Paramètres' | 54 | settings: 'Paramètres' |
53 | rss: 'RSS' | 55 | rss: 'RSS' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'si' | 96 | if_label: 'si' |
95 | then_tag_as_label: 'alors attribuer les tags' | 97 | then_tag_as_label: 'alors attribuer les tags' |
96 | delete_rule_label: 'supprimer' | 98 | delete_rule_label: 'supprimer' |
99 | edit_rule_label: 'éditer' | ||
97 | rule_label: 'Règle' | 100 | rule_label: 'Règle' |
98 | tags_label: 'Tags' | 101 | tags_label: 'Tags' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: "Une règle OU l'autre" | 130 | or: "Une règle OU l'autre" |
128 | and: "Une règle ET l'autre" | 131 | and: "Une règle ET l'autre" |
129 | matches: 'Teste si un <i>sujet</i> correspond à une <i>recherche</i> (non sensible à la casse).<br />Exemple : <code>title matches "football"</code>' | 132 | matches: 'Teste si un <i>sujet</i> correspond à une <i>recherche</i> (non sensible à la casse).<br />Exemple : <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: "Nom d'utilisateur" | ||
132 | password_label: 'Mot de passe' | ||
133 | repeat_new_password_label: 'Confirmez votre nouveau mot de passe' | ||
134 | plain_password_label: 'Mot de passe en clair' | ||
135 | email_label: 'Adresse e-mail' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Pour bien débuter' | 265 | page_title: 'Pour bien débuter' |
266 | more: 'Et plus encore…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Bienvenue sur wallabag !' | 268 | title: 'Bienvenue sur wallabag !' |
271 | paragraph_1: "Nous allons vous accompagner pour vous faire faire le tour de la maison et vous présenter quelques fonctionnalités qui pourraient vous intéresser pour vous approprier cet outil." | 269 | paragraph_1: "Nous allons vous accompagner pour vous faire faire le tour de la maison et vous présenter quelques fonctionnalités qui pourraient vous intéresser pour vous approprier cet outil." |
272 | paragraph_2: 'Suivez-nous !' | 270 | paragraph_2: 'Suivez-nous !' |
273 | configure: | 271 | configure: |
274 | title: "Configurez l'application" | 272 | title: "Configurez l'application" |
273 | description: 'Pour voir une application qui vous correspond, allez voir du côté de la configuration de wallabag.' | ||
275 | language: "Changez la langue et le design de l'application" | 274 | language: "Changez la langue et le design de l'application" |
276 | rss: 'Activez les flux RSS' | 275 | rss: 'Activez les flux RSS' |
277 | tagging_rules: 'Écrivez des règles pour classer automatiquement vos articles' | 276 | tagging_rules: 'Écrivez des règles pour classer automatiquement vos articles' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: "Configurer l'import" | 284 | import: "Configurer l'import" |
286 | first_steps: | 285 | first_steps: |
287 | title: 'Premiers pas' | 286 | title: 'Premiers pas' |
287 | description: "Maintenant que wallabag est bien configuré, il est temps d'archiver le web. Vous pouvez cliquer sur le signe + dans le coin en haut à droite." | ||
288 | new_article: 'Ajoutez votre premier article' | 288 | new_article: 'Ajoutez votre premier article' |
289 | unread_articles: 'Et rangez-le !' | 289 | unread_articles: 'Et rangez-le !' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'Migrer depuis wallabag v1' | 294 | wallabag_v1: 'Migrer depuis wallabag v1' |
295 | wallabag_v2: 'Migrer depuis wallabag v2' | 295 | wallabag_v2: 'Migrer depuis wallabag v2' |
296 | readability: 'Migrer depuis Readability' | 296 | readability: 'Migrer depuis Readability' |
297 | instapaper: 'Migrer depuis Instapaper' | ||
297 | developer: | 298 | developer: |
298 | title: 'Pour les développeurs' | 299 | title: 'Pour les développeurs' |
300 | description: 'Nous avons aussi pensé aux développeurs : Docker, API, traductions, etc.' | ||
299 | create_application: 'Créer votre application tierce' | 301 | create_application: 'Créer votre application tierce' |
302 | use_docker: 'Utiliser Docker pour installer wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Documentation complète' | 304 | title: 'Documentation complète' |
305 | description: "Il y a tellement de fonctionnalités dans wallabag. N'hésitez pas à lire le manuel pour les connaitre et apprendre comment les utiliser." | ||
302 | annotate: 'Annoter votre article' | 306 | annotate: 'Annoter votre article' |
303 | export: 'Convertissez vos articles en ePub ou en PDF' | 307 | export: 'Convertissez vos articles en ePub ou en PDF' |
304 | search_filters: "Apprenez à utiliser le moteur de recherche et les filtres pour retrouver l'article qui vous intéresse" | 308 | search_filters: "Apprenez à utiliser le moteur de recherche et les filtres pour retrouver l'article qui vous intéresse" |
@@ -351,12 +355,16 @@ import: | |||
351 | enabled: "Les imports sont asynchrones. Une fois l'import commencé un worker externe traitera les messages un par un. Le service activé est :" | 355 | enabled: "Les imports sont asynchrones. Une fois l'import commencé un worker externe traitera les messages un par un. Le service activé est :" |
352 | firefox: | 356 | firefox: |
353 | page_title: 'Import > Firefox' | 357 | page_title: 'Import > Firefox' |
354 | description: "Cet outil va vous permettre d'importer tous vos marques-pages de Firefox. <p>Pour Firefox, ouvrez le panneau des marques-pages (Ctrl+Maj+O), puis dans « Importation et sauvegarde », choisissez « Sauvegarde... ». Vous allez récupérer un fichier .json. </p>" | 358 | description: "Cet outil va vous permettre d'importer tous vos marques-pages de Firefox. Ouvrez le panneau des marques-pages (Ctrl+Maj+O), puis dans « Importation et sauvegarde », choisissez « Sauvegarde... ». Vous allez récupérer un fichier .json. </p>" |
355 | how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne." | 359 | how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne." |
356 | chrome: | 360 | chrome: |
357 | page_title: 'Import > Chrome' | 361 | page_title: 'Import > Chrome' |
358 | description: "Cet outil va vous permettre d'importer tous vos marques-pages de Google Chrome/Chromium. Pour Google Chrome, la situation du fichier dépend de votre système d'exploitation : <ul><li>Sur GNU/Linux, allez dans le répertoire <code>~/.config/google-chrome/Default/</code></li><li>Sous Windows, il devrait se trouver à <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Sur OS X, il devrait se trouver dans le fichier <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Une fois que vous y êtes, copiez le fichier Bookmarks à un endroit où vous le retrouverez.<em><br>Notez que si vous utilisez Chromium à la place de Chrome, vous devez corriger les chemins en conséquence.</em></p>" | 362 | description: "Cet outil va vous permettre d'importer tous vos marques-pages de Google Chrome/Chromium. Pour Google Chrome, la situation du fichier dépend de votre système d'exploitation : <ul><li>Sur GNU/Linux, allez dans le répertoire <code>~/.config/google-chrome/Default/</code></li><li>Sous Windows, il devrait se trouver à <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Sur OS X, il devrait se trouver dans le fichier <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Une fois que vous y êtes, copiez le fichier Bookmarks à un endroit où vous le retrouverez.<em><br>Notez que si vous utilisez Chromium à la place de Chrome, vous devez corriger les chemins en conséquence.</em></p>" |
359 | how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne." | 363 | how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne." |
364 | instapaper: | ||
365 | page_title: 'Import > Instapaper' | ||
366 | description: 'Sur la page des paramètres (`https://www.instapaper.com/user<https://www.instapaper.com/user>`_), cliquez sur "Download .CSV file" dans la section "Export". Un fichier CSV se téléchargera ("instapaper-export.csv").' | ||
367 | how_to: "Choisissez le fichier de votre export Instapaper et cliquez sur le bouton ci-dessous pour l'importer." | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Développeur' | 370 | page_title: 'Développeur' |
@@ -408,6 +416,33 @@ developer: | |||
408 | paragraph_8: "Si vous voulez toutes les méthodes de l'API, jetez un oeil <a href=\"%link%\">à la documentation de l'API</a>." | 416 | paragraph_8: "Si vous voulez toutes les méthodes de l'API, jetez un oeil <a href=\"%link%\">à la documentation de l'API</a>." |
409 | back: 'Retour' | 417 | back: 'Retour' |
410 | 418 | ||
419 | user: | ||
420 | page_title: Gestion des utilisateurs | ||
421 | new_user: Créer un nouvel utilisateur | ||
422 | edit_user: Éditer un utilisateur existant | ||
423 | description: Ici vous pouvez gérer vos utilisateurs (création, mise à jour et suppression) | ||
424 | list: | ||
425 | actions: Actions | ||
426 | edit_action: Éditer | ||
427 | yes: Oui | ||
428 | no: Non | ||
429 | create_new_one: Créer un nouvel utilisateur | ||
430 | form: | ||
431 | username_label: "Nom d'utilisateur" | ||
432 | name_label: 'Nom' | ||
433 | password_label: 'Mot de passe' | ||
434 | repeat_new_password_label: 'Confirmez votre nouveau mot de passe' | ||
435 | plain_password_label: 'Mot de passe en clair' | ||
436 | email_label: 'Adresse e-mail' | ||
437 | enabled_label: 'Activé' | ||
438 | locked_label: 'Bloqué' | ||
439 | last_login_label: 'Dernière connexion' | ||
440 | twofactor_label: Double authentification | ||
441 | save: Sauvegarder | ||
442 | delete: Supprimer | ||
443 | delete_confirm: Êtes-vous sûr? | ||
444 | back_to_list: Revenir à la liste | ||
445 | |||
411 | flashes: | 446 | flashes: |
412 | config: | 447 | config: |
413 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml index bd98c8c0..c58c929f 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Cerca' | 31 | search: 'Cerca' |
32 | save_link: 'Salva collegamento' | 32 | save_link: 'Salva collegamento' |
33 | back_to_unread: 'Torna ai contenuti non letti' | 33 | back_to_unread: 'Torna ai contenuti non letti' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Aggiungi un nuovo contenuto' | 36 | add_new_entry: 'Aggiungi un nuovo contenuto' |
36 | search: 'Cerca' | 37 | search: 'Cerca' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Social' | 46 | social: 'Social' |
46 | powered_by: 'powered by' | 47 | powered_by: 'powered by' |
47 | about: 'About' | 48 | about: 'About' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Configurazione' | 52 | page_title: 'Configurazione' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'se' | 96 | if_label: 'se' |
95 | then_tag_as_label: 'allora tagga come' | 97 | then_tag_as_label: 'allora tagga come' |
96 | delete_rule_label: 'elimina' | 98 | delete_rule_label: 'elimina' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'Regola' | 100 | rule_label: 'Regola' |
98 | tags_label: 'Tag' | 101 | tags_label: 'Tag' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: "Una regola O un'altra" | 130 | or: "Una regola O un'altra" |
128 | and: "Una regola E un'altra" | 131 | and: "Una regola E un'altra" |
129 | matches: 'Verifica che un <i>oggetto</i> risulti in una <i>ricerca</i> (case-insensitive).<br />Esempio: <code>titolo contiene "football"</code>' | 132 | matches: 'Verifica che un <i>oggetto</i> risulti in una <i>ricerca</i> (case-insensitive).<br />Esempio: <code>titolo contiene "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Username' | ||
132 | password_label: 'Password' | ||
133 | repeat_new_password_label: 'Ripeti password' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'E-mail' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -160,6 +157,7 @@ entry: | |||
160 | status_label: 'Stato' | 157 | status_label: 'Stato' |
161 | archived_label: 'Archiviati' | 158 | archived_label: 'Archiviati' |
162 | starred_label: 'Preferiti' | 159 | starred_label: 'Preferiti' |
160 | # unread_label: 'Unread' | ||
163 | preview_picture_label: "Ha un'immagine di anteprima" | 161 | preview_picture_label: "Ha un'immagine di anteprima" |
164 | preview_picture_help: 'Immagine di anteprima' | 162 | preview_picture_help: 'Immagine di anteprima' |
165 | language_label: 'Lingua' | 163 | language_label: 'Lingua' |
@@ -265,12 +263,14 @@ howto: | |||
265 | 263 | ||
266 | quickstart: | 264 | quickstart: |
267 | page_title: 'Introduzione' | 265 | page_title: 'Introduzione' |
266 | # more: 'More…' | ||
268 | intro: | 267 | intro: |
269 | title: 'Benvenuto su wallabag!' | 268 | title: 'Benvenuto su wallabag!' |
270 | paragraph_1: "Un tour in cui ti guideremo per scoprire e che ti mostrerà delle funzionalità che potrebbero interessarti." | 269 | paragraph_1: "Un tour in cui ti guideremo per scoprire e che ti mostrerà delle funzionalità che potrebbero interessarti." |
271 | paragraph_2: 'Seguici!' | 270 | paragraph_2: 'Seguici!' |
272 | configure: | 271 | configure: |
273 | title: "Configura l'applicazione" | 272 | title: "Configura l'applicazione" |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
274 | language: 'Cambia lingua e design' | 274 | language: 'Cambia lingua e design' |
275 | rss: 'Abilita i feed RSS' | 275 | rss: 'Abilita i feed RSS' |
276 | tagging_rules: 'Scrivi delle regole per taggare automaticamente i contenuti' | 276 | tagging_rules: 'Scrivi delle regole per taggare automaticamente i contenuti' |
@@ -284,6 +284,7 @@ quickstart: | |||
284 | import: "Configura l'importazione" | 284 | import: "Configura l'importazione" |
285 | first_steps: | 285 | first_steps: |
286 | title: 'Pimi passi' | 286 | title: 'Pimi passi' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
287 | new_article: 'Salva il tuo primo contenuto' | 288 | new_article: 'Salva il tuo primo contenuto' |
288 | unread_articles: 'E classificalo!' | 289 | unread_articles: 'E classificalo!' |
289 | migrate: | 290 | migrate: |
@@ -293,11 +294,15 @@ quickstart: | |||
293 | wallabag_v1: 'Trasferisci da wallabag v1' | 294 | wallabag_v1: 'Trasferisci da wallabag v1' |
294 | wallabag_v2: 'Trasferisci da wallabag v2' | 295 | wallabag_v2: 'Trasferisci da wallabag v2' |
295 | readability: 'Trasferisci da Readability' | 296 | readability: 'Trasferisci da Readability' |
297 | instapaper: 'Trasferisci da Instapaper' | ||
296 | developer: | 298 | developer: |
297 | title: 'Sviluppatori' | 299 | title: 'Sviluppatori' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
298 | create_application: 'Crea la tua applicazione' | 301 | create_application: 'Crea la tua applicazione' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
299 | docs: | 303 | docs: |
300 | title: 'Documentazione completa' | 304 | title: 'Documentazione completa' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
301 | annotate: 'Annota il tuo contenuto' | 306 | annotate: 'Annota il tuo contenuto' |
302 | export: 'Converti i tuoi contenuti in EPUB o PDF' | 307 | export: 'Converti i tuoi contenuti in EPUB o PDF' |
303 | search_filters: 'Impara come puoi recuperare un contenuto tramite la ricerca e i filtri' | 308 | search_filters: 'Impara come puoi recuperare un contenuto tramite la ricerca e i filtri' |
@@ -348,14 +353,18 @@ import: | |||
348 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' | 353 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' |
349 | worker: | 354 | worker: |
350 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
351 | # firefox: | 356 | firefox: |
352 | # page_title: 'Import > Firefox' | 357 | page_title: 'Importa da > Firefox' |
353 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
354 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
355 | # chrome: | 360 | chrome: |
356 | # page_title: 'Import > Chrome' | 361 | page_title: 'Importa da > Chrome' |
357 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
358 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | instapaper: | ||
365 | page_title: 'Importa da > Instapaper' | ||
366 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
359 | 368 | ||
360 | developer: | 369 | developer: |
361 | page_title: 'Sviluppatori' | 370 | page_title: 'Sviluppatori' |
@@ -382,12 +391,14 @@ developer: | |||
382 | page_title: 'Sviluppatori > Nuovo client' | 391 | page_title: 'Sviluppatori > Nuovo client' |
383 | page_description: 'Stai per creare un nuovo client. Compila i campi sottostanti per il redirect URI della tua applicazione.' | 392 | page_description: 'Stai per creare un nuovo client. Compila i campi sottostanti per il redirect URI della tua applicazione.' |
384 | form: | 393 | form: |
394 | # name_label: 'Name of the client' | ||
385 | redirect_uris_label: 'Redirect URI' | 395 | redirect_uris_label: 'Redirect URI' |
386 | save_label: 'Crea un nuovo client' | 396 | save_label: 'Crea un nuovo client' |
387 | action_back: 'Indietro' | 397 | action_back: 'Indietro' |
388 | client_parameter: | 398 | client_parameter: |
389 | page_title: 'Sviluppatori > parametri Client' | 399 | page_title: 'Sviluppatori > parametri Client' |
390 | page_description: 'Questi sono i tuoi parametri del client.' | 400 | page_description: 'Questi sono i tuoi parametri del client.' |
401 | # field_name: 'Client name' | ||
391 | field_id: 'Client ID' | 402 | field_id: 'Client ID' |
392 | field_secret: 'Client secret' | 403 | field_secret: 'Client secret' |
393 | back: 'Indietro' | 404 | back: 'Indietro' |
@@ -405,6 +416,33 @@ developer: | |||
405 | paragraph_8: 'Se vuoi visualizzare tutti gli API endpoints, dai una occhiata alla <a href="%link%">documentazione delle API</a>.' | 416 | paragraph_8: 'Se vuoi visualizzare tutti gli API endpoints, dai una occhiata alla <a href="%link%">documentazione delle API</a>.' |
406 | back: 'Indietro' | 417 | back: 'Indietro' |
407 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Username' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Password' | ||
434 | repeat_new_password_label: 'Ripeti password' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'E-mail' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
408 | flashes: | 446 | flashes: |
409 | config: | 447 | config: |
410 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml index 6da9ff18..8f06434d 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml | |||
@@ -19,18 +19,19 @@ menu: | |||
19 | unread: 'Pas legits' | 19 | unread: 'Pas legits' |
20 | starred: 'Favorits' | 20 | starred: 'Favorits' |
21 | archive: 'Legits' | 21 | archive: 'Legits' |
22 | all_articles: 'Tots los articles' | 22 | all_articles: 'Totes los articles' |
23 | config: 'Configuracion' | 23 | config: 'Configuracion' |
24 | tags: 'Etiquetas' | 24 | tags: 'Etiquetas' |
25 | internal_settings: 'Configuracion interna' | 25 | internal_settings: 'Configuracion interna' |
26 | import: 'Importar' | 26 | import: 'Importar' |
27 | howto: 'Ajuda' | 27 | howto: 'Ajuda' |
28 | developer: 'Desvolopador' | 28 | developer: 'Desvolopador' |
29 | logout: 'Déconnexion' | 29 | logout: 'Desconnexion' |
30 | about: 'A prepaus' | 30 | about: 'A prepaus' |
31 | search: 'Cercar' | 31 | search: 'Cercar' |
32 | save_link: 'Enregistrar un novèl article' | 32 | save_link: 'Enregistrar un novèl article' |
33 | back_to_unread: 'Tornar als articles pas legits' | 33 | back_to_unread: 'Tornar als articles pas legits' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Enregistrar un novèl article' | 36 | add_new_entry: 'Enregistrar un novèl article' |
36 | search: 'Cercar' | 37 | search: 'Cercar' |
@@ -45,9 +46,10 @@ footer: | |||
45 | social: 'Social' | 46 | social: 'Social' |
46 | powered_by: 'propulsat per' | 47 | powered_by: 'propulsat per' |
47 | about: 'A prepaus' | 48 | about: 'A prepaus' |
48 | page_title: 'Configuracion' | 49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! |
49 | 50 | ||
50 | config: | 51 | config: |
52 | page_title: 'Configuracion' | ||
51 | tab_menu: | 53 | tab_menu: |
52 | settings: 'Paramètres' | 54 | settings: 'Paramètres' |
53 | rss: 'RSS' | 55 | rss: 'RSS' |
@@ -72,8 +74,8 @@ config: | |||
72 | form_rss: | 74 | form_rss: |
73 | description: "Los fluxes RSS fornits per wallabag vos permeton de legir vòstres articles salvagardats dins vòstre lector de fluxes preferit. Per los poder emplegar, vos cal, d'en primièr crear un geton." | 75 | description: "Los fluxes RSS fornits per wallabag vos permeton de legir vòstres articles salvagardats dins vòstre lector de fluxes preferit. Per los poder emplegar, vos cal, d'en primièr crear un geton." |
74 | token_label: 'Geton RSS' | 76 | token_label: 'Geton RSS' |
75 | no_token: 'Aucun jeton généré' | 77 | no_token: 'Pas cap de geton generat' |
76 | token_create: 'Pas cap de geton generat' | 78 | token_create: 'Creatz vòstre geton' |
77 | token_reset: 'Reïnicializatz vòstre geton' | 79 | token_reset: 'Reïnicializatz vòstre geton' |
78 | rss_links: 'URL de vòstres fluxes RSS' | 80 | rss_links: 'URL de vòstres fluxes RSS' |
79 | rss_link: | 81 | rss_link: |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'se' | 96 | if_label: 'se' |
95 | then_tag_as_label: 'alara atribuir las etiquetas' | 97 | then_tag_as_label: 'alara atribuir las etiquetas' |
96 | delete_rule_label: 'suprimir' | 98 | delete_rule_label: 'suprimir' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'Règla' | 100 | rule_label: 'Règla' |
98 | tags_label: 'Etiquetas' | 101 | tags_label: 'Etiquetas' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: "Una règla O l'autra" | 130 | or: "Una règla O l'autra" |
128 | and: "Una règla E l'autra" | 131 | and: "Una règla E l'autra" |
129 | matches: 'Teste se un <i>subjècte</i> correspond a una <i>recerca</i> (non sensibla a la cassa).<br />Exemple : <code>title matches \"football\"</code>' | 132 | matches: 'Teste se un <i>subjècte</i> correspond a una <i>recerca</i> (non sensibla a la cassa).<br />Exemple : <code>title matches \"football\"</code>' |
130 | form_new_user: | ||
131 | username_label: "Nom d'utilizaire" | ||
132 | password_label: 'Senhal' | ||
133 | repeat_new_password_label: 'Confirmatz vòstre novèl senhal' | ||
134 | plain_password_label: 'Senhal en clar' | ||
135 | email_label: 'Adreça de corrièl' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -187,7 +184,7 @@ entry: | |||
187 | re_fetch_content: 'Tornar cargar lo contengut' | 184 | re_fetch_content: 'Tornar cargar lo contengut' |
188 | delete: 'Suprimir' | 185 | delete: 'Suprimir' |
189 | add_a_tag: 'Ajustar una etiqueta' | 186 | add_a_tag: 'Ajustar una etiqueta' |
190 | share_content: 'Partatjar' | 187 | share_content: 'Partejar' |
191 | share_email_label: 'Corrièl' | 188 | share_email_label: 'Corrièl' |
192 | public_link: 'ligam public' | 189 | public_link: 'ligam public' |
193 | delete_public_link: 'suprimir lo ligam public' | 190 | delete_public_link: 'suprimir lo ligam public' |
@@ -224,7 +221,7 @@ about: | |||
224 | developped_by: 'Desvolopat per' | 221 | developped_by: 'Desvolopat per' |
225 | website: 'Site web' | 222 | website: 'Site web' |
226 | many_contributors: 'E un fum de contributors ♥ <a href="https://github.com/wallabag/wallabag/graphs/contributors">sur Github</a>' | 223 | many_contributors: 'E un fum de contributors ♥ <a href="https://github.com/wallabag/wallabag/graphs/contributors">sur Github</a>' |
227 | project_website: 'Site web del projète' | 224 | project_website: 'Site web del projècte' |
228 | license: 'Licéncia' | 225 | license: 'Licéncia' |
229 | version: 'Version' | 226 | version: 'Version' |
230 | getting_help: | 227 | getting_help: |
@@ -245,7 +242,7 @@ about: | |||
245 | 242 | ||
246 | howto: | 243 | howto: |
247 | page_title: 'Ajuda' | 244 | page_title: 'Ajuda' |
248 | page_description: "I a mai d'un biai d'enregistrar un article :" | 245 | page_description: "I a mai d'un biais d'enregistrar un article :" |
249 | top_menu: | 246 | top_menu: |
250 | browser_addons: 'Extensions de navigator' | 247 | browser_addons: 'Extensions de navigator' |
251 | mobile_apps: 'Aplicacions mobil' | 248 | mobile_apps: 'Aplicacions mobil' |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Per ben començar' | 265 | page_title: 'Per ben començar' |
266 | # more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Benvenguda sus wallabag !' | 268 | title: 'Benvenguda sus wallabag !' |
271 | paragraph_1: "Anem vos guidar per far lo torn de la proprietat e vos presentar unas fonccionalitats que vos poirián interessar per vos apropriar aquesta aisina." | 269 | paragraph_1: "Anem vos guidar per far lo torn de la proprietat e vos presentar unas fonccionalitats que vos poirián interessar per vos apropriar aquesta aisina." |
272 | paragraph_2: 'Seguètz-nos ' | 270 | paragraph_2: 'Seguètz-nos ' |
273 | configure: | 271 | configure: |
274 | title: "Configuratz l'aplicacio" | 272 | title: "Configuratz l'aplicacio" |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: "Cambiatz la lenga e l'estil de l'aplicacion" | 274 | language: "Cambiatz la lenga e l'estil de l'aplicacion" |
276 | rss: 'Activatz los fluxes RSS' | 275 | rss: 'Activatz los fluxes RSS' |
277 | tagging_rules: 'Escrivètz de règlas per classar automaticament vòstres articles' | 276 | tagging_rules: 'Escrivètz de règlas per classar automaticament vòstres articles' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: 'Configurar los impòrt' | 284 | import: 'Configurar los impòrt' |
286 | first_steps: | 285 | first_steps: |
287 | title: 'Primièrs passes' | 286 | title: 'Primièrs passes' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | new_article: 'Ajustatz vòstre primièr article' | 288 | new_article: 'Ajustatz vòstre primièr article' |
289 | unread_articles: 'E racaptatz-lo !' | 289 | unread_articles: 'E racaptatz-lo !' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'Migrar dempuèi wallabag v1' | 294 | wallabag_v1: 'Migrar dempuèi wallabag v1' |
295 | wallabag_v2: 'Migrar dempuèi wallabag v2' | 295 | wallabag_v2: 'Migrar dempuèi wallabag v2' |
296 | readability: 'Migrar dempuèi Readability' | 296 | readability: 'Migrar dempuèi Readability' |
297 | instapaper: 'Migrar dempuèi Instapaper' | ||
297 | developer: | 298 | developer: |
298 | title: 'Pels desvolopadors' | 299 | title: 'Pels desvolopadors' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'Crear vòstra aplicacion tèrça' | 301 | create_application: 'Crear vòstra aplicacion tèrça' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Documentacion complèta' | 304 | title: 'Documentacion complèta' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'Anotatar vòstre article' | 306 | annotate: 'Anotatar vòstre article' |
303 | export: 'Convertissètz vòstres articles en ePub o en PDF' | 307 | export: 'Convertissètz vòstres articles en ePub o en PDF' |
304 | search_filters: "Aprenètz a utilizar lo motor de recèrca e los filtres per retrobar l'article que vos interèssa" | 308 | search_filters: "Aprenètz a utilizar lo motor de recèrca e los filtres per retrobar l'article que vos interèssa" |
@@ -344,22 +348,26 @@ import: | |||
344 | page_title: 'Importar > Wallabag v2' | 348 | page_title: 'Importar > Wallabag v2' |
345 | description: "Aquesta aisina importarà totas vòstras donadas d'una instància mai de wallabag v2. Anatz dins totes vòstres articles, puèi, sus la barra laterala, clicatz sus \"JSON\". Traparatz un fichièr \"All articles.json\"" | 349 | description: "Aquesta aisina importarà totas vòstras donadas d'una instància mai de wallabag v2. Anatz dins totes vòstres articles, puèi, sus la barra laterala, clicatz sus \"JSON\". Traparatz un fichièr \"All articles.json\"" |
346 | readability: | 350 | readability: |
347 | page_title: 'Importer > Readability' | 351 | page_title: 'Importar > Readability' |
348 | description: "Aquesta aisina importarà totas vòstres articles de Readability. Sus la pagina de l'aisina (https://www.readability.com/tools/), clicatz sus \"Export your data\" dins la seccion \"Data Export\". Recebretz un corrièl per telecargar un json (qu'acaba pas amb un .json de fach)." | 352 | description: "Aquesta aisina importarà totas vòstres articles de Readability. Sus la pagina de l'aisina (https://www.readability.com/tools/), clicatz sus \"Export your data\" dins la seccion \"Data Export\". Recebretz un corrièl per telecargar un json (qu'acaba pas amb un .json de fach)." |
349 | how_to: "Mercés de seleccionar vòstre Readability fichièr e de clicar sul boton dejós per lo telecargar e l'importar." | 353 | how_to: "Mercés de seleccionar vòstre Readability fichièr e de clicar sul boton dejós per lo telecargar e l'importar." |
350 | worker: | 354 | worker: |
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | enabled: "L'importacion se fa de manièra asincròna. Un còp l'importacion lançada, una aisina externa s'ocuparà dels messatges un per un. Lo servici actual es : " |
352 | # firefox: | 356 | firefox: |
353 | # page_title: 'Import > Firefox' | 357 | page_title: 'Importar > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | description: "Aquesta aisina importarà totas vòstres favorits de Firefox. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | how_to: "Mercés de causir lo fichièr de salvagarda e de clicar sul boton dejós per l'importar. Notatz que lo tractament pòt durar un moment ja que totes los articles an d'èsser recuperats." |
356 | # chrome: | 360 | chrome: |
357 | # page_title: 'Import > Chrome' | 361 | page_title: 'Importar > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | description: "Aquesta aisina importarà totas vòstres favorits de Chrome. L'emplaçament del fichièr depend de vòstre sistèma operatiu : <ul><li>Sus Linux, anatz al dorsièr <code>~/.config/chromium/Default/</code></li><li>Sus Windows, deu èsser dins <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>sus OS X, deu èsser dins <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Un còp enlà, copiatz lo fichièr de favorits dins un endrech que volètz.<em><br>Notatz que s'avètz Chromium al lòc de Chrome, vos cal cambiar lo camin segon aquesta situacion.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | how_to: "Mercés de causir lo fichièr de salvagarda e de clicar sul boton dejós per l'importar. Notatz que lo tractament pòt durar un moment ja que totes los articles an d'èsser recuperats." |
364 | instapaper: | ||
365 | page_title: 'Importar > Instapaper' | ||
366 | description: "Aquesta aisina importarà totas vòstres articles d'Instapaper. Sus la pagina de paramètres (https://www.instapaper.com/user), clicatz sus \"Download .CSV file\" dins la seccion \"Export\". Un fichièr CSV serà telecargat (aital \"instapaper-export.csv\")." | ||
367 | how_to: "Mercés de causir vòstre fichièr Instapaper e de clicar sul boton dejós per lo telecargar e l'importar" | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Desvolopador' | 370 | page_title: 'Desvolopaire' |
363 | welcome_message: "Benvenguda sus l'API de wallabag" | 371 | welcome_message: "Benvenguda sus l'API de wallabag" |
364 | documentation: 'Documentacion' | 372 | documentation: 'Documentacion' |
365 | how_to_first_app: 'Cossí crear vòstra primièra aplicacion' | 373 | how_to_first_app: 'Cossí crear vòstra primièra aplicacion' |
@@ -383,16 +391,18 @@ developer: | |||
383 | page_title: 'Desvlopador > Novèl client' | 391 | page_title: 'Desvlopador > Novèl client' |
384 | page_description: "Anatz crear un novèl client. Mercés de cumplir l'url de redireccion cap a vòstra aplicacion." | 392 | page_description: "Anatz crear un novèl client. Mercés de cumplir l'url de redireccion cap a vòstra aplicacion." |
385 | form: | 393 | form: |
394 | name_label: "Nom del client" | ||
386 | redirect_uris_label: 'URLs de redireccion' | 395 | redirect_uris_label: 'URLs de redireccion' |
387 | save_label: 'Crear un novèl client' | 396 | save_label: 'Crear un novèl client' |
388 | action_back: 'Retorn' | 397 | action_back: 'Retorn' |
389 | client_parameter: | 398 | client_parameter: |
390 | page_title: 'Desvolopador > Los paramètres de vòstre client' | 399 | page_title: 'Desvolopador > Los paramètres de vòstre client' |
391 | page_description: 'Vaquí los paramètres de vòstre client' | 400 | page_description: 'Vaquí los paramètres de vòstre client' |
401 | field_name: 'Nom del client' | ||
392 | field_id: 'ID Client' | 402 | field_id: 'ID Client' |
393 | field_secret: 'Clau secreta' | 403 | field_secret: 'Clau secreta' |
394 | back: 'Retour' | 404 | back: 'Retour' |
395 | read_howto: 'Legir \"cossí crear ma primièra aplicacion\"' | 405 | read_howto: 'Legir "cossí crear ma primièra aplicacion"' |
396 | howto: | 406 | howto: |
397 | page_title: 'Desvolopador > Cossí crear ma primièra aplicacion' | 407 | page_title: 'Desvolopador > Cossí crear ma primièra aplicacion' |
398 | description: | 408 | description: |
@@ -406,6 +416,33 @@ developer: | |||
406 | paragraph_8: "Se volètz totas las adreças d'accès de l'API, donatz un còp d’uèlh <a href=\"%link%\">a la documentacion de l'API</a>." | 416 | paragraph_8: "Se volètz totas las adreças d'accès de l'API, donatz un còp d’uèlh <a href=\"%link%\">a la documentacion de l'API</a>." |
407 | back: 'Retorn' | 417 | back: 'Retorn' |
408 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: "Nom d'utilizaire" | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Senhal' | ||
434 | repeat_new_password_label: 'Confirmatz vòstre novèl senhal' | ||
435 | plain_password_label: 'Senhal en clar' | ||
436 | email_label: 'Adreça de corrièl' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
411 | notice: | 448 | notice: |
@@ -422,10 +459,10 @@ flashes: | |||
422 | notice: | 459 | notice: |
423 | entry_already_saved: 'Article ja salvargardat lo %date%' | 460 | entry_already_saved: 'Article ja salvargardat lo %date%' |
424 | entry_saved: 'Article enregistrat' | 461 | entry_saved: 'Article enregistrat' |
425 | # entry_saved_failed: 'Entry saved but fetching content failed' | 462 | entry_saved_failed: 'Article salvat mai fracàs de la recuperacion del contengut' |
426 | entry_updated: 'Article mes a jorn' | 463 | entry_updated: 'Article mes a jorn' |
427 | entry_reloaded: 'Article recargat' | 464 | entry_reloaded: 'Article recargat' |
428 | # entry_reload_failed: 'Entry reloaded but fetching content failed' | 465 | entry_reload_failed: "L'article es estat cargat de nòu mai la recuperacion del contengut a fracassat" |
429 | entry_archived: 'Article marcat coma legit' | 466 | entry_archived: 'Article marcat coma legit' |
430 | entry_unarchived: 'Article marcat coma pas legit' | 467 | entry_unarchived: 'Article marcat coma pas legit' |
431 | entry_starred: 'Article apondut dins los favorits' | 468 | entry_starred: 'Article apondut dins los favorits' |
@@ -439,10 +476,10 @@ flashes: | |||
439 | failed: "L'importacion a fracassat, mercés de tornar ensajar" | 476 | failed: "L'importacion a fracassat, mercés de tornar ensajar" |
440 | failed_on_file: "Errorr pendent du tractament de l'import. Mercés de verificar vòstre fichièr." | 477 | failed_on_file: "Errorr pendent du tractament de l'import. Mercés de verificar vòstre fichièr." |
441 | summary: "Rapòrt d'import: %imported% importats, %skipped% ja presents." | 478 | summary: "Rapòrt d'import: %imported% importats, %skipped% ja presents." |
442 | # summary_with_queue: 'Import summary: %queued% queued.' | 479 | summary_with_queue: "Rapòrt d'import : %queued% en espèra de tractament." |
443 | error: | 480 | error: |
444 | # redis_enabled_not_installed: Redis is enabled for handle asynchronous import but it looks like <u>we can't connect to it</u>. Please check Redis configuration. | 481 | redis_enabled_not_installed: "Redis es capable d'importar de manièra asincròna mai sembla que <u>podèm pas nos conectar amb el</u>. Mercés de verificar la configuracion de Redis." |
445 | # rabbit_enabled_not_installed: RabbitMQ is enabled for handle asynchronous import but it looks like <u>we can't connect to it</u>. Please check RabbitMQ configuration. | 482 | rabbit_enabled_not_installed: "RabbitMQ es capable d'importar de manièra asincròna mai sembla que <u>podèm pas nos conectar amb el</u>. Mercés de verificar la configuracion de RabbitMQ." |
446 | developer: | 483 | developer: |
447 | notice: | 484 | notice: |
448 | client_created: 'Novèl client creat' | 485 | client_created: 'Novèl client creat' |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml index f58cd039..54e669b3 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Szukaj' | 31 | search: 'Szukaj' |
32 | save_link: 'Zapisz link' | 32 | save_link: 'Zapisz link' |
33 | back_to_unread: 'Powrót do nieprzeczytanych artykułów' | 33 | back_to_unread: 'Powrót do nieprzeczytanych artykułów' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Dodaj nowy wpis' | 36 | add_new_entry: 'Dodaj nowy wpis' |
36 | search: 'Szukaj' | 37 | search: 'Szukaj' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Społeczność' | 46 | social: 'Społeczność' |
46 | powered_by: 'Kontrolowany przez' | 47 | powered_by: 'Kontrolowany przez' |
47 | about: 'O nas' | 48 | about: 'O nas' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Konfiguracja' | 52 | page_title: 'Konfiguracja' |
@@ -94,6 +96,7 @@ config: | |||
94 | if_label: 'jeżeli' | 96 | if_label: 'jeżeli' |
95 | then_tag_as_label: 'wtedy otaguj jako' | 97 | then_tag_as_label: 'wtedy otaguj jako' |
96 | delete_rule_label: 'usuń' | 98 | delete_rule_label: 'usuń' |
99 | # edit_rule_label: 'edit' | ||
97 | rule_label: 'Reguła' | 100 | rule_label: 'Reguła' |
98 | tags_label: 'Tagi' | 101 | tags_label: 'Tagi' |
99 | faq: | 102 | faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | or: 'Jedna reguła LUB inna' | 130 | or: 'Jedna reguła LUB inna' |
128 | and: 'Jedna reguła I inna' | 131 | and: 'Jedna reguła I inna' |
129 | matches: 'Sprawdź czy <i>temat</i> pasuje <i>szukaj</i> (duże lub małe litery).<br />Przykład: <code>tytuł zawiera "piłka nożna"</code>' | 132 | matches: 'Sprawdź czy <i>temat</i> pasuje <i>szukaj</i> (duże lub małe litery).<br />Przykład: <code>tytuł zawiera "piłka nożna"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Nazwa użytkownika' | ||
132 | password_label: 'Hasło' | ||
133 | repeat_new_password_label: 'Powtórz nowe hasło' | ||
134 | plain_password_label: 'Jawne hasło' | ||
135 | email_label: 'Adres email' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | page_title: 'Szybki start' | 265 | page_title: 'Szybki start' |
266 | # more: 'More…' | ||
269 | intro: | 267 | intro: |
270 | title: 'Witaj w wallabag!' | 268 | title: 'Witaj w wallabag!' |
271 | paragraph_1: "Będziemy ci towarzyszyli w Twojej poznaniu wallabag i pokażemy możliwości, które mogą cię zainteresować." | 269 | paragraph_1: "Będziemy ci towarzyszyli w Twojej poznaniu wallabag i pokażemy możliwości, które mogą cię zainteresować." |
272 | paragraph_2: 'Śledź nas!' | 270 | paragraph_2: 'Śledź nas!' |
273 | configure: | 271 | configure: |
274 | title: 'Konfiguruj aplikację' | 272 | title: 'Konfiguruj aplikację' |
273 | description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: 'Zmień język i wygląd' | 274 | language: 'Zmień język i wygląd' |
276 | rss: 'Włącz kanały RSS' | 275 | rss: 'Włącz kanały RSS' |
277 | tagging_rules: 'Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów' | 276 | tagging_rules: 'Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | import: 'Skonfigurować import' | 284 | import: 'Skonfigurować import' |
286 | first_steps: | 285 | first_steps: |
287 | title: 'Pierwsze kroki' | 286 | title: 'Pierwsze kroki' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link" | ||
288 | new_article: 'Zapisz swój pierwszy artukuł' | 288 | new_article: 'Zapisz swój pierwszy artukuł' |
289 | unread_articles: 'I sklasyfikuj go!' | 289 | unread_articles: 'I sklasyfikuj go!' |
290 | migrate: | 290 | migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | wallabag_v1: 'Migruj z wallabag v1' | 294 | wallabag_v1: 'Migruj z wallabag v1' |
295 | wallabag_v2: 'Migruj z wallabag v2' | 295 | wallabag_v2: 'Migruj z wallabag v2' |
296 | readability: 'Migruj z Readability' | 296 | readability: 'Migruj z Readability' |
297 | instapaper: 'Migruj z Instapaper' | ||
297 | developer: | 298 | developer: |
298 | title: 'Deweloperzy' | 299 | title: 'Deweloperzy' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | create_application: 'Stwórz swoją aplikację' | 301 | create_application: 'Stwórz swoją aplikację' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 303 | docs: |
301 | title: 'Pełna Dokumentacja' | 304 | title: 'Pełna Dokumentacja' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | annotate: 'Dadaj adnotację do swojego artykułu' | 306 | annotate: 'Dadaj adnotację do swojego artykułu' |
303 | export: 'Konwertuj swoje artykuły do ePUB lub PDF' | 307 | export: 'Konwertuj swoje artykuły do ePUB lub PDF' |
304 | search_filters: 'Zabacz jak możesz znaleźć artykuł dzięku użyciu silnika wyszukiwarki i filtrów' | 308 | search_filters: 'Zabacz jak możesz znaleźć artykuł dzięku użyciu silnika wyszukiwarki i filtrów' |
@@ -351,12 +355,16 @@ import: | |||
351 | enabled: "Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:" | 355 | enabled: "Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:" |
352 | firefox: | 356 | firefox: |
353 | page_title: 'Import > Firefox' | 357 | page_title: 'Import > Firefox' |
354 | description: "Ten importer zaimportuje wszystkie twoje zakładki z Firefoksa. <p>Dla Firefoksa, idź do twoich zakładek (Ctrl+Shift+O), następnie w \"Import i kopie zapasowe\", wybierz \"Utwórz kopię zapasową...\". Uzyskasz plik .json." | 358 | description: "Ten importer zaimportuje wszystkie twoje zakładki z Firefoksa. Idź do twoich zakładek (Ctrl+Shift+O), następnie w \"Import i kopie zapasowe\", wybierz \"Utwórz kopię zapasową...\". Uzyskasz plik .json." |
355 | how_to: "Wybierz swój plik z zakładkami i naciśnij poniższy przycisk, aby je zaimportować. Może to zająć dłuższą chwilę, zanim wszystkie artykuły zostaną przeniesione." | 359 | how_to: "Wybierz swój plik z zakładkami i naciśnij poniższy przycisk, aby je zaimportować. Może to zająć dłuższą chwilę, zanim wszystkie artykuły zostaną przeniesione." |
356 | chrome: | 360 | chrome: |
357 | page_title: 'Import > Chrome' | 361 | page_title: 'Import > Chrome' |
358 | description: "Ten importer zaimportuje wszystkie twoje zakładki z Chrome. Lokalizacja pliku jest zależna od twojego systemy operacyjnego : <ul><li>Pod Linuksem, idź do katalogu <code>~/.config/chromium/Default/</code></li><li>Pod Windowsem, powinien się on znajdować w <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Pod OS X, powinien się on znajdować w <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Po odnalezieniu pliku, skopiuj go w łatwo dostęne miejsce.<em><br>Jeżeli używasz Chromium zamiast Chrome, będziesz musiał odpowiednio poprawić ścieżkę dostępu.</em></p>" | 362 | description: "Ten importer zaimportuje wszystkie twoje zakładki z Chrome. Lokalizacja pliku jest zależna od twojego systemy operacyjnego : <ul><li>Pod Linuksem, idź do katalogu <code>~/.config/chromium/Default/</code></li><li>Pod Windowsem, powinien się on znajdować w <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Pod OS X, powinien się on znajdować w <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Po odnalezieniu pliku, skopiuj go w łatwo dostęne miejsce.<em><br>Jeżeli używasz Chromium zamiast Chrome, będziesz musiał odpowiednio poprawić ścieżkę dostępu.</em></p>" |
359 | how_to: "Wybierz swój plik z zakładkami i naciśnij poniższy przycisk, aby je zaimportować. Może to zająć dłuższą chwilę, zanim wszystkie artykuły zostaną przeniesione." | 363 | how_to: "Wybierz swój plik z zakładkami i naciśnij poniższy przycisk, aby je zaimportować. Może to zająć dłuższą chwilę, zanim wszystkie artykuły zostaną przeniesione." |
364 | instapaper: | ||
365 | page_title: 'Import > Instapaper' | ||
366 | description: 'Ten importer, zaimportuje wszystkie twoje artykuły z Instapaper. W ustawieniach (https://www.instapaper.com/user), kliknij na "Download .CSV file" w sekcji "Export". Otrzymasz plik CSV.' | ||
367 | how_to: 'Wybierz swój plik eksportu z Instapaper i kliknij poniższy przycisk, aby go załadować.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | page_title: 'Deweloper' | 370 | page_title: 'Deweloper' |
@@ -366,36 +374,38 @@ developer: | |||
366 | full_documentation: 'Pokaż pełne API' | 374 | full_documentation: 'Pokaż pełne API' |
367 | list_methods: 'Lista metod API' | 375 | list_methods: 'Lista metod API' |
368 | clients: | 376 | clients: |
369 | title: 'Klienci' | 377 | title: 'Klienci' |
370 | create_new: 'Utwórz nowego klienta' | 378 | create_new: 'Utwórz nowego klienta' |
371 | existing_clients: | 379 | existing_clients: |
372 | title: 'Istniejący klienci' | 380 | title: 'Istniejący klienci' |
373 | field_id: 'ID klienta' | 381 | field_id: 'ID klienta' |
374 | field_secret: 'Client secret' | 382 | field_secret: 'Client secret' |
375 | field_uris: 'Przekieruj URIs' | 383 | field_uris: 'Przekieruj URIs' |
376 | field_grant_types: 'Przyznaj pozwolenie' | 384 | field_grant_types: 'Przyznaj pozwolenie' |
377 | no_client: 'Nie ma jeszcze klienta.' | 385 | no_client: 'Nie ma jeszcze klienta.' |
378 | remove: | 386 | remove: |
379 | warn_message_1: 'Masz możliwość usunięcia tego klienta. Ta akcja jest NIEODWRACALNA !' | 387 | warn_message_1: 'Masz możliwość usunięcia tego klienta. Ta akcja jest NIEODWRACALNA !' |
380 | warn_message_2: "Jeżeli go usuniesz, aplikacje skonfigurowane z tym klientem nię będa w stanie autoryzować twojego wallabag." | 388 | warn_message_2: "Jeżeli go usuniesz, aplikacje skonfigurowane z tym klientem nię będa w stanie autoryzować twojego wallabag." |
381 | action: 'Usuń tego klienta' | 389 | action: 'Usuń tego klienta' |
382 | client: | 390 | client: |
383 | page_title: 'Deweloper > Nowy klient' | 391 | page_title: 'Deweloper > Nowy klient' |
384 | page_description: 'Tworzysz nowego klienta. Wypełnij poniższe pole w celu przekierowania URI twojej aplikacji.' | 392 | page_description: 'Tworzysz nowego klienta. Wypełnij poniższe pole w celu przekierowania URI twojej aplikacji.' |
385 | form: | 393 | form: |
386 | redirect_uris_label: 'Przekieruj adresy URI' | 394 | # name_label: 'Name of the client' |
387 | save_label: 'Stwórz nowego klienta' | 395 | redirect_uris_label: 'Przekieruj adresy URI' |
388 | action_back: 'Cofnij' | 396 | save_label: 'Stwórz nowego klienta' |
397 | action_back: 'Cofnij' | ||
389 | client_parameter: | 398 | client_parameter: |
390 | page_title: 'Deweloper > Parametry klienta' | 399 | page_title: 'Deweloper > Parametry klienta' |
391 | page_description: 'Tutaj znajdują się parametry klienta.' | 400 | page_description: 'Tutaj znajdują się parametry klienta.' |
392 | field_id: 'Client ID' | 401 | # field_name: 'Client name' |
393 | field_secret: 'Client secret' | 402 | field_id: 'Client ID' |
394 | back: 'Cofnij' | 403 | field_secret: 'Client secret' |
395 | read_howto: 'Przeczytaj jak "Stworzyć moją pierwszą aplikację"' | 404 | back: 'Cofnij' |
405 | read_howto: 'Przeczytaj jak "Stworzyć moją pierwszą aplikację"' | ||
396 | howto: | 406 | howto: |
397 | page_title: 'Deweloper > Jak stworzyć moją pierwszą aplikację' | 407 | page_title: 'Deweloper > Jak stworzyć moją pierwszą aplikację' |
398 | description: | 408 | description: |
399 | paragraph_1: 'Następujące komendy korzystają <a href="https://github.com/jkbrzt/httpie">Biblioteka HTTPie</a>. Upewnij się, czy zainstalowałeś ją w swoim systemie zanim z niej skorzystasz' | 409 | paragraph_1: 'Następujące komendy korzystają <a href="https://github.com/jkbrzt/httpie">Biblioteka HTTPie</a>. Upewnij się, czy zainstalowałeś ją w swoim systemie zanim z niej skorzystasz' |
400 | paragraph_2: 'Potrzebujesz tokena w celu nawiązania komunikacji między swoją aplikacją a API wallabag.' | 410 | paragraph_2: 'Potrzebujesz tokena w celu nawiązania komunikacji między swoją aplikacją a API wallabag.' |
401 | paragraph_3: 'W celu stworzenia tokena musisz <a href="%link%">stwórz nowego klienta</a>.' | 411 | paragraph_3: 'W celu stworzenia tokena musisz <a href="%link%">stwórz nowego klienta</a>.' |
@@ -404,7 +414,34 @@ developer: | |||
404 | paragraph_6: 'access_token jest użyteczny do wywołania API endpoint. Na przykład:' | 414 | paragraph_6: 'access_token jest użyteczny do wywołania API endpoint. Na przykład:' |
405 | paragraph_7: 'To wywołanie zwróci wszystkie twoje wpisy.' | 415 | paragraph_7: 'To wywołanie zwróci wszystkie twoje wpisy.' |
406 | paragraph_8: 'Jeżeli chcesz wyświetlić wszystkie punkty końcowe API, zobacz <a href="%link%">Dokumentacja naszego API</a>.' | 416 | paragraph_8: 'Jeżeli chcesz wyświetlić wszystkie punkty końcowe API, zobacz <a href="%link%">Dokumentacja naszego API</a>.' |
407 | back: 'Cofnij' | 417 | back: 'Cofnij' |
418 | |||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Nazwa użytkownika' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Hasło' | ||
434 | repeat_new_password_label: 'Powtórz nowe hasło' | ||
435 | plain_password_label: 'Jawne hasło' | ||
436 | email_label: 'Adres email' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
408 | 445 | ||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml index 067f7878..4e0e454c 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Căutare' | 31 | search: 'Căutare' |
32 | # save_link: 'Save a link' | 32 | # save_link: 'Save a link' |
33 | back_to_unread: 'Înapoi la articolele necitite' | 33 | back_to_unread: 'Înapoi la articolele necitite' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Introdu un nou articol' | 36 | add_new_entry: 'Introdu un nou articol' |
36 | search: 'Căutare' | 37 | search: 'Căutare' |
@@ -45,6 +46,7 @@ footer: | |||
45 | # social: 'Social' | 46 | # social: 'Social' |
46 | # powered_by: 'powered by' | 47 | # powered_by: 'powered by' |
47 | about: 'Despre' | 48 | about: 'Despre' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Configurație' | 52 | page_title: 'Configurație' |
@@ -94,6 +96,7 @@ config: | |||
94 | # if_label: 'if' | 96 | # if_label: 'if' |
95 | # then_tag_as_label: 'then tag as' | 97 | # then_tag_as_label: 'then tag as' |
96 | # delete_rule_label: 'delete' | 98 | # delete_rule_label: 'delete' |
99 | # edit_rule_label: 'edit' | ||
97 | # rule_label: 'Rule' | 100 | # rule_label: 'Rule' |
98 | # tags_label: 'Tags' | 101 | # tags_label: 'Tags' |
99 | # faq: | 102 | # faq: |
@@ -127,12 +130,6 @@ config: | |||
127 | # or: 'One rule OR another' | 130 | # or: 'One rule OR another' |
128 | # and: 'One rule AND another' | 131 | # and: 'One rule AND another' |
129 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' | 132 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Nume de utilizator' | ||
132 | password_label: 'Parolă' | ||
133 | repeat_new_password_label: 'Repeat new password' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'E-mail' | ||
136 | 133 | ||
137 | entry: | 134 | entry: |
138 | page_titles: | 135 | page_titles: |
@@ -266,12 +263,14 @@ howto: | |||
266 | 263 | ||
267 | quickstart: | 264 | quickstart: |
268 | # page_title: 'Quickstart' | 265 | # page_title: 'Quickstart' |
266 | # more: 'More…' | ||
269 | # intro: | 267 | # intro: |
270 | # title: 'Welcome to wallabag!' | 268 | # title: 'Welcome to wallabag!' |
271 | # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." | 269 | # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." |
272 | # paragraph_2: 'Follow us!' | 270 | # paragraph_2: 'Follow us!' |
273 | # configure: | 271 | # configure: |
274 | # title: 'Configure the application' | 272 | # title: 'Configure the application' |
273 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | # language: 'Change language and design' | 274 | # language: 'Change language and design' |
276 | # rss: 'Enable RSS feeds' | 275 | # rss: 'Enable RSS feeds' |
277 | # tagging_rules: 'Write rules to automatically tag your articles' | 276 | # tagging_rules: 'Write rules to automatically tag your articles' |
@@ -285,6 +284,7 @@ quickstart: | |||
285 | # import: 'Configure import' | 284 | # import: 'Configure import' |
286 | # first_steps: | 285 | # first_steps: |
287 | # title: 'First steps' | 286 | # title: 'First steps' |
287 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | # new_article: 'Save your first article' | 288 | # new_article: 'Save your first article' |
289 | # unread_articles: 'And classify it!' | 289 | # unread_articles: 'And classify it!' |
290 | # migrate: | 290 | # migrate: |
@@ -294,11 +294,15 @@ quickstart: | |||
294 | # wallabag_v1: 'Migrate from wallabag v1' | 294 | # wallabag_v1: 'Migrate from wallabag v1' |
295 | # wallabag_v2: 'Migrate from wallabag v2' | 295 | # wallabag_v2: 'Migrate from wallabag v2' |
296 | # readability: 'Migrate from Readability' | 296 | # readability: 'Migrate from Readability' |
297 | # instapaper: 'Migrate from Instapaper' | ||
297 | # developer: | 298 | # developer: |
298 | # title: 'Developers' | 299 | # title: 'Developers' |
300 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | # create_application: 'Create your third application' | 301 | # create_application: 'Create your third application' |
302 | # use_docker: 'Use Docker to install wallabag' | ||
300 | # docs: | 303 | # docs: |
301 | # title: 'Full documentation' | 304 | # title: 'Full documentation' |
305 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | # annotate: 'Annotate your article' | 306 | # annotate: 'Annotate your article' |
303 | # export: 'Convert your articles into ePUB or PDF' | 307 | # export: 'Convert your articles into ePUB or PDF' |
304 | # search_filters: 'See how you can look for an article by using search engine and filters' | 308 | # search_filters: 'See how you can look for an article by using search engine and filters' |
@@ -351,12 +355,16 @@ import: | |||
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 355 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 356 | # firefox: |
353 | # page_title: 'Import > Firefox' | 357 | # page_title: 'Import > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 358 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | # chrome: | 360 | # chrome: |
357 | # page_title: 'Import > Chrome' | 361 | # page_title: 'Import > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 362 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 363 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
364 | # instapaper: | ||
365 | # page_title: 'Import > Instapaper' | ||
366 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
367 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 368 | ||
361 | developer: | 369 | developer: |
362 | # page_title: 'Developer' | 370 | # page_title: 'Developer' |
@@ -383,12 +391,14 @@ developer: | |||
383 | # page_title: 'Developer > New client' | 391 | # page_title: 'Developer > New client' |
384 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' | 392 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' |
385 | # form: | 393 | # form: |
394 | # name_label: 'Name of the client' | ||
386 | # redirect_uris_label: 'Redirect URIs' | 395 | # redirect_uris_label: 'Redirect URIs' |
387 | # save_label: 'Create a new client' | 396 | # save_label: 'Create a new client' |
388 | # action_back: 'Back' | 397 | # action_back: 'Back' |
389 | # client_parameter: | 398 | # client_parameter: |
390 | # page_title: 'Developer > Client parameters' | 399 | # page_title: 'Developer > Client parameters' |
391 | # page_description: 'Here are your client parameters.' | 400 | # page_description: 'Here are your client parameters.' |
401 | # field_name: 'Client name' | ||
392 | # field_id: 'Client ID' | 402 | # field_id: 'Client ID' |
393 | # field_secret: 'Client secret' | 403 | # field_secret: 'Client secret' |
394 | # back: 'Back' | 404 | # back: 'Back' |
@@ -406,6 +416,33 @@ developer: | |||
406 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' | 416 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' |
407 | # back: 'Back' | 417 | # back: 'Back' |
408 | 418 | ||
419 | user: | ||
420 | # page_title: Users management | ||
421 | # new_user: Create a new user | ||
422 | # edit_user: Edit an existing user | ||
423 | # description: "Here you can manage all users (create, edit and delete)" | ||
424 | # list: | ||
425 | # actions: Actions | ||
426 | # edit_action: Edit | ||
427 | # yes: Yes | ||
428 | # no: No | ||
429 | # create_new_one: Create a new user | ||
430 | form: | ||
431 | username_label: 'Nume de utilizator' | ||
432 | # name_label: 'Name' | ||
433 | password_label: 'Parolă' | ||
434 | repeat_new_password_label: 'Repeat new password' | ||
435 | plain_password_label: '????' | ||
436 | email_label: 'E-mail' | ||
437 | # enabled_label: 'Enabled' | ||
438 | # locked_label: 'Locked' | ||
439 | # last_login_label: 'Last login' | ||
440 | # twofactor_label: Two factor authentication | ||
441 | # save: Save | ||
442 | # delete: Delete | ||
443 | # delete_confirm: Are you sure? | ||
444 | # back_to_list: Back to list | ||
445 | |||
409 | flashes: | 446 | flashes: |
410 | config: | 447 | config: |
411 | notice: | 448 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml index 62c69510..02b3aae6 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml | |||
@@ -31,6 +31,7 @@ menu: | |||
31 | search: 'Ara' | 31 | search: 'Ara' |
32 | # save_link: 'Save a link' | 32 | # save_link: 'Save a link' |
33 | back_to_unread: 'Okunmayan makalelere geri dön' | 33 | back_to_unread: 'Okunmayan makalelere geri dön' |
34 | # users_management: 'Users management' | ||
34 | top: | 35 | top: |
35 | add_new_entry: 'Yeni bir makale ekle' | 36 | add_new_entry: 'Yeni bir makale ekle' |
36 | search: 'Ara' | 37 | search: 'Ara' |
@@ -45,6 +46,7 @@ footer: | |||
45 | social: 'Sosyal' | 46 | social: 'Sosyal' |
46 | powered_by: 'powered by' | 47 | powered_by: 'powered by' |
47 | about: 'Hakkımızda' | 48 | about: 'Hakkımızda' |
49 | # stats: Since %user_creation% you read %nb_archives% articles. That is about %per_day% a day! | ||
48 | 50 | ||
49 | config: | 51 | config: |
50 | page_title: 'Yapılandırma' | 52 | page_title: 'Yapılandırma' |
@@ -127,12 +129,6 @@ config: | |||
127 | or: 'Bir kural veya birbaşkası' | 129 | or: 'Bir kural veya birbaşkası' |
128 | and: 'Bir kural ve diğeri' | 130 | and: 'Bir kural ve diğeri' |
129 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' | 131 | # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' |
130 | form_new_user: | ||
131 | username_label: 'Kullanıcı adı' | ||
132 | password_label: 'Şifre' | ||
133 | repeat_new_password_label: 'Yeni şifrenin tekrarı' | ||
134 | plain_password_label: '????' | ||
135 | email_label: 'E-posta' | ||
136 | 132 | ||
137 | entry: | 133 | entry: |
138 | page_titles: | 134 | page_titles: |
@@ -266,12 +262,14 @@ howto: | |||
266 | 262 | ||
267 | quickstart: | 263 | quickstart: |
268 | page_title: 'Hızlı başlangıç' | 264 | page_title: 'Hızlı başlangıç' |
265 | # more: 'More…' | ||
269 | intro: | 266 | intro: |
270 | title: 'wallabag' | 267 | title: 'wallabag' |
271 | paragraph_1: "wallabag kurduğunuz için teşekkür ederiz. Bu sayfada biz size eşlik edecek ve ilginizi çekecek birkaç özellik göstereceğim." | 268 | paragraph_1: "wallabag kurduğunuz için teşekkür ederiz. Bu sayfada biz size eşlik edecek ve ilginizi çekecek birkaç özellik göstereceğim." |
272 | paragraph_2: 'Bizi takip edin!' | 269 | paragraph_2: 'Bizi takip edin!' |
273 | configure: | 270 | configure: |
274 | title: 'Uygulamayı Yapılandırma' | 271 | title: 'Uygulamayı Yapılandırma' |
272 | # description: 'In order to have an application which suits you, have a look into the configuration of wallabag.' | ||
275 | language: 'Dili ve tasarımı değiştirme' | 273 | language: 'Dili ve tasarımı değiştirme' |
276 | rss: 'RSS akışını aktifleştirme' | 274 | rss: 'RSS akışını aktifleştirme' |
277 | # tagging_rules: 'Write rules to automatically tag your articles' | 275 | # tagging_rules: 'Write rules to automatically tag your articles' |
@@ -285,6 +283,7 @@ quickstart: | |||
285 | # import: 'Configure import' | 283 | # import: 'Configure import' |
286 | first_steps: | 284 | first_steps: |
287 | title: 'İlk adım' | 285 | title: 'İlk adım' |
286 | # description: "Now wallabag is well configured, it's time to archive the web. You can click on the top right sign + to add a link." | ||
288 | new_article: 'İlk makalenizi kaydedin' | 287 | new_article: 'İlk makalenizi kaydedin' |
289 | unread_articles: 'Ve bunu sınıflandırın!' | 288 | unread_articles: 'Ve bunu sınıflandırın!' |
290 | migrate: | 289 | migrate: |
@@ -294,11 +293,15 @@ quickstart: | |||
294 | wallabag_v1: "wallabag v1 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" | 293 | wallabag_v1: "wallabag v1 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" |
295 | wallabag_v2: "wallabag v2 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" | 294 | wallabag_v2: "wallabag v2 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" |
296 | readability: "Readability üzerindeki verilerinizi wallabag'e aktarın'" | 295 | readability: "Readability üzerindeki verilerinizi wallabag'e aktarın'" |
296 | instapaper: "Instapaper üzerindeki verilerinizi wallabag'e aktarın'" | ||
297 | developer: | 297 | developer: |
298 | # title: 'Developers' | 298 | # title: 'Developers' |
299 | # description: 'We also thought to the developers: Docker, API, translations, etc.' | ||
299 | # create_application: 'Create your third application' | 300 | # create_application: 'Create your third application' |
301 | # use_docker: 'Use Docker to install wallabag' | ||
300 | docs: | 302 | docs: |
301 | title: 'Dokümantasyon' | 303 | title: 'Dokümantasyon' |
304 | # description: "There are so much features in wallabag. Don't hesitate to read the manual to know them and to learn how to use them." | ||
302 | # annotate: 'Annotate your article' | 305 | # annotate: 'Annotate your article' |
303 | export: 'Makalelerinizi ePUB ya da PDF formatına çevirme' | 306 | export: 'Makalelerinizi ePUB ya da PDF formatına çevirme' |
304 | search_filters: 'Makaleleri görüntülemek için arama motorlarını ve filteri kullanma' | 307 | search_filters: 'Makaleleri görüntülemek için arama motorlarını ve filteri kullanma' |
@@ -349,14 +352,18 @@ import: | |||
349 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' | 352 | # how_to: 'Please select your Readability export and click on the below button to upload and import it.' |
350 | worker: | 353 | worker: |
351 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" | 354 | # enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:" |
352 | # firefox: | 355 | firefox: |
353 | # page_title: 'Import > Firefox' | 356 | page_title: 'İçe Aktar > Firefox' |
354 | # description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." | 357 | # description: "This importer will import all your Firefox bookmarks. Just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file." |
355 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 358 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
356 | # chrome: | 359 | chrome: |
357 | # page_title: 'Import > Chrome' | 360 | page_title: 'İçe Aktar > Chrome' |
358 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" | 361 | # description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>" |
359 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." | 362 | # how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched." |
363 | instapaper: | ||
364 | page_title: 'İçe Aktar > Instapaper' | ||
365 | # description: 'This importer will import all your Instapaper articles. On the settings (https://www.instapaper.com/user) page, click on "Download .CSV file" in the "Export" section. A CSV file will be downloaded (like "instapaper-export.csv").' | ||
366 | # how_to: 'Please select your Instapaper export and click on the below button to upload and import it.' | ||
360 | 367 | ||
361 | developer: | 368 | developer: |
362 | # page_title: 'Developer' | 369 | # page_title: 'Developer' |
@@ -383,12 +390,14 @@ developer: | |||
383 | # page_title: 'Developer > New client' | 390 | # page_title: 'Developer > New client' |
384 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' | 391 | # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' |
385 | # form: | 392 | # form: |
393 | # name_label: 'Name of the client' | ||
386 | # redirect_uris_label: 'Redirect URIs' | 394 | # redirect_uris_label: 'Redirect URIs' |
387 | # save_label: 'Create a new client' | 395 | # save_label: 'Create a new client' |
388 | # action_back: 'Back' | 396 | # action_back: 'Back' |
389 | # client_parameter: | 397 | # client_parameter: |
390 | # page_title: 'Developer > Client parameters' | 398 | # page_title: 'Developer > Client parameters' |
391 | # page_description: 'Here are your client parameters.' | 399 | # page_description: 'Here are your client parameters.' |
400 | # field_name: 'Client name' | ||
392 | # field_id: 'Client ID' | 401 | # field_id: 'Client ID' |
393 | # field_secret: 'Client secret' | 402 | # field_secret: 'Client secret' |
394 | # back: 'Back' | 403 | # back: 'Back' |
@@ -406,6 +415,33 @@ developer: | |||
406 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' | 415 | # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' |
407 | # back: 'Back' | 416 | # back: 'Back' |
408 | 417 | ||
418 | user: | ||
419 | # page_title: Users management | ||
420 | # new_user: Create a new user | ||
421 | # edit_user: Edit an existing user | ||
422 | # description: "Here you can manage all users (create, edit and delete)" | ||
423 | # list: | ||
424 | # actions: Actions | ||
425 | # edit_action: Edit | ||
426 | # yes: Yes | ||
427 | # no: No | ||
428 | # create_new_one: Create a new user | ||
429 | form: | ||
430 | username_label: 'Kullanıcı adı' | ||
431 | # name_label: 'Name' | ||
432 | password_label: 'Şifre' | ||
433 | repeat_new_password_label: 'Yeni şifrenin tekrarı' | ||
434 | plain_password_label: '????' | ||
435 | email_label: 'E-posta' | ||
436 | # enabled_label: 'Enabled' | ||
437 | # locked_label: 'Locked' | ||
438 | # last_login_label: 'Last login' | ||
439 | # twofactor_label: Two factor authentication | ||
440 | # save: Save | ||
441 | # delete: Delete | ||
442 | # delete_confirm: Are you sure? | ||
443 | # back_to_list: Back to list | ||
444 | |||
409 | flashes: | 445 | flashes: |
410 | config: | 446 | config: |
411 | notice: | 447 | notice: |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/validators.da.yml b/src/Wallabag/CoreBundle/Resources/translations/validators.da.yml index dfe2c64d..313339ed 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/validators.da.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/validators.da.yml | |||
@@ -1,6 +1,6 @@ | |||
1 | validator: | 1 | validator: |
2 | password_must_match: 'De indtastede adgangskoder skal være ens' | 2 | password_must_match: 'De indtastede adgangskoder skal være ens' |
3 | password_too_short: 'Adgangskoden skal være mindst 8 tegn' | 3 | password_too_short: 'Adgangskoden skal være mindst 8 tegn' |
4 | # password_wrong_value: 'Wrong value for your current password' | 4 | # password_wrong_value: 'Wrong value for your current password' |
5 | # item_per_page_too_high: 'This will certainly kill the app' | 5 | # item_per_page_too_high: 'This will certainly kill the app' |
6 | # rss_limit_too_hight: 'This will certainly kill the app' | 6 | # rss_limit_too_hight: 'This will certainly kill the app' |
diff --git a/src/Wallabag/CoreBundle/Resources/translations/validators.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/validators.tr.yml index 80ab470a..1b358965 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/validators.tr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/validators.tr.yml | |||
@@ -1,6 +1,6 @@ | |||
1 | validator: | 1 | validator: |
2 | # password_must_match: 'The password fields must match.' | 2 | # password_must_match: 'The password fields must match.' |
3 | # password_too_short: 'Password should by at least 8 chars long' | 3 | # password_too_short: 'Password should by at least 8 chars long' |
4 | # password_wrong_value: 'Wrong value for your current password' | 4 | # password_wrong_value: 'Wrong value for your current password' |
5 | # item_per_page_too_high: 'This will certainly kill the app' | 5 | # item_per_page_too_high: 'This will certainly kill the app' |
6 | # rss_limit_too_hight: 'This will certainly kill the app' | 6 | # rss_limit_too_hight: 'This will certainly kill the app' |
diff --git a/src/Wallabag/CoreBundle/Resources/views/base.html.twig b/src/Wallabag/CoreBundle/Resources/views/base.html.twig index 0f88901a..a1a9a136 100644 --- a/src/Wallabag/CoreBundle/Resources/views/base.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/base.html.twig | |||
@@ -43,7 +43,7 @@ | |||
43 | {% block scripts %} | 43 | {% block scripts %} |
44 | {% endblock %} | 44 | {% endblock %} |
45 | 45 | ||
46 | <title>wallabag - {% block title %}{% endblock %}</title> | 46 | <title>{% block title %}{% endblock %} – wallabag</title> |
47 | {% endblock %} | 47 | {% endblock %} |
48 | </head> | 48 | </head> |
49 | 49 | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig index 6446cf2c..ff7ef73a 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig | |||
@@ -191,6 +191,7 @@ | |||
191 | « {{ tagging_rule.rule }} » | 191 | « {{ tagging_rule.rule }} » |
192 | {{ 'config.form_rules.then_tag_as_label'|trans }} | 192 | {{ 'config.form_rules.then_tag_as_label'|trans }} |
193 | « {{ tagging_rule.tags|join(', ') }} » | 193 | « {{ tagging_rule.tags|join(', ') }} » |
194 | <a href="{{ path('edit_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="tool mode_edit">✎</a> | ||
194 | <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="tool delete icon-trash icon"></a> | 195 | <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="tool delete icon-trash icon"></a> |
195 | </li> | 196 | </li> |
196 | {% endfor %} | 197 | {% endfor %} |
@@ -301,46 +302,4 @@ | |||
301 | </table> | 302 | </table> |
302 | </div> | 303 | </div> |
303 | </div> | 304 | </div> |
304 | |||
305 | {% if is_granted('ROLE_SUPER_ADMIN') %} | ||
306 | <h2>{{ 'config.tab_menu.new_user'|trans }}</h2> | ||
307 | |||
308 | {{ form_start(form.new_user) }} | ||
309 | {{ form_errors(form.new_user) }} | ||
310 | |||
311 | <fieldset class="w500p inline"> | ||
312 | <div class="row"> | ||
313 | {{ form_label(form.new_user.username) }} | ||
314 | {{ form_errors(form.new_user.username) }} | ||
315 | {{ form_widget(form.new_user.username) }} | ||
316 | </div> | ||
317 | </fieldset> | ||
318 | |||
319 | <fieldset class="w500p inline"> | ||
320 | <div class="row"> | ||
321 | {{ form_label(form.new_user.plainPassword.first) }} | ||
322 | {{ form_errors(form.new_user.plainPassword.first) }} | ||
323 | {{ form_widget(form.new_user.plainPassword.first) }} | ||
324 | </div> | ||
325 | </fieldset> | ||
326 | |||
327 | <fieldset class="w500p inline"> | ||
328 | <div class="row"> | ||
329 | {{ form_label(form.new_user.plainPassword.second) }} | ||
330 | {{ form_errors(form.new_user.plainPassword.second) }} | ||
331 | {{ form_widget(form.new_user.plainPassword.second) }} | ||
332 | </div> | ||
333 | </fieldset> | ||
334 | |||
335 | <fieldset class="w500p inline"> | ||
336 | <div class="row"> | ||
337 | {{ form_label(form.new_user.email) }} | ||
338 | {{ form_errors(form.new_user.email) }} | ||
339 | {{ form_widget(form.new_user.email) }} | ||
340 | </div> | ||
341 | </fieldset> | ||
342 | |||
343 | {{ form_rest(form.new_user) }} | ||
344 | {% endif %} | ||
345 | </form> | ||
346 | {% endblock %} | 305 | {% endblock %} |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig index 8d841b4c..1c0430e8 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig | |||
@@ -1,7 +1,7 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | 1 | {% extends "WallabagCoreBundle::layout.html.twig" %} |
2 | 2 | ||
3 | {% block title %} | 3 | {% block title %} |
4 | {% include "@WallabagCore/themes/_title.html.twig" %} | 4 | {% include "@WallabagCore/themes/common/Entry/_title.html.twig" %} |
5 | {% endblock %} | 5 | {% endblock %} |
6 | 6 | ||
7 | {% block content %} | 7 | {% block content %} |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Exception/error.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Exception/error.html.twig new file mode 100644 index 00000000..b52634fd --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Exception/error.html.twig | |||
@@ -0,0 +1,24 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'error.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block body_class %}login{% endblock %} | ||
6 | |||
7 | {% block menu %}{% endblock %} | ||
8 | {% block messages %}{% endblock %} | ||
9 | {% block header %}{% endblock %} | ||
10 | |||
11 | {% block content %} | ||
12 | <main class="valign-wrapper"> | ||
13 | <div class="valign row"> | ||
14 | <div class="card sw"> | ||
15 | <div class="center"><img src="{{ asset('bundles/wallabagcore/themes/_global/img/logo-w.png') }}" alt="wallabag logo" /></div> | ||
16 | <h2>{{ status_code }}: {{ status_text }}</h2> | ||
17 | <p>{{ exception.message }}</p> | ||
18 | </div> | ||
19 | </div> | ||
20 | </main> | ||
21 | {% endblock %} | ||
22 | |||
23 | {% block footer %} | ||
24 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/about.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/about.html.twig deleted file mode 100644 index 918249dc..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/about.html.twig +++ /dev/null | |||
@@ -1,169 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'about.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <h2>{{ 'about.top_menu.who_behind_wallabag'|trans }}</h2> | ||
7 | |||
8 | <dl> | ||
9 | <dt>{{ 'about.who_behind_wallabag.developped_by'|trans }}</dt> | ||
10 | <dd><a href="mailto:nicolas@loeuillet.org">Nicolas Lœuillet</a> — <a href="http://www.loeuillet.org">{{ 'about.who_behind_wallabag.website'|trans }}</a></dd> | ||
11 | <dd>Thomas Citharel — <a href="https://tcit.fr">{{ 'about.who_behind_wallabag.website'|trans }}</a></dd> | ||
12 | <dd>Jérémy Benoist — <a href="http://www.j0k3r.net">{{ 'about.who_behind_wallabag.website'|trans }}</a></dd> | ||
13 | |||
14 | <dt>{{ 'about.who_behind_wallabag.many_contributors'|trans|raw }}</dt> | ||
15 | |||
16 | <dt>{{ 'about.who_behind_wallabag.project_website'|trans }}</dt> | ||
17 | <dd><a href="https://www.wallabag.org">https://www.wallabag.org</a></dd> | ||
18 | |||
19 | <dt>{{ 'about.who_behind_wallabag.license'|trans }}: <a href="http://en.wikipedia.org/wiki/MIT_License">MIT</a></dt> | ||
20 | |||
21 | <dt>{{ 'about.who_behind_wallabag.version'|trans }}: {{ version }}</dt> | ||
22 | </dl> | ||
23 | |||
24 | <h2>{{ 'about.top_menu.getting_help'|trans }}</h2> | ||
25 | |||
26 | <dl> | ||
27 | <dt>{{ 'about.getting_help.documentation'|trans }}</dt> | ||
28 | <dd><a href="http://doc.wallabag.org/en/master/">english</a></dd> | ||
29 | <dd><a href="http://doc.wallabag.org/fr/master/">français</a></dd> | ||
30 | |||
31 | <dt>{{ 'about.getting_help.bug_reports'|trans }}</dt> | ||
32 | <dd>{{ 'about.getting_help.support'|trans|raw }}</dd> | ||
33 | </dl> | ||
34 | |||
35 | <h2>{{ 'about.top_menu.helping'|trans }}</h2> | ||
36 | |||
37 | <p>{{ 'about.helping.description'|trans }}</p> | ||
38 | |||
39 | <dl> | ||
40 | <dd>{{ 'about.helping.by_contributing_2'|trans }} <a href="https://github.com/wallabag/wallabag/issues/1254">{{ 'about.helping.by_contributing'|trans }}</a></dd> | ||
41 | <dd><a href="{{ paypal_url }}">{{ 'about.helping.by_paypal'|trans }}</a></dd> | ||
42 | </dl> | ||
43 | |||
44 | <h2>{{ 'about.top_menu.contributors'|trans }}</h2> | ||
45 | <p><a href="https://github.com/wallabag/wallabag/graphs/contributors">{{ 'about.contributors.description'|trans }}</a></p> | ||
46 | |||
47 | <h2>{{ 'about.top_menu.third_party'|trans }}</h2> | ||
48 | <p>{{ 'about.third_party.description'|trans }}</p> | ||
49 | <table class="striped"> | ||
50 | <tr> | ||
51 | <th>{{ 'about.third_party.package'|trans }}</th> | ||
52 | <th>{{ 'about.third_party.license'|trans }}</th> | ||
53 | </tr> | ||
54 | <tr><td>behat/transliterator</td><td>Artistic 1.0</td></tr> | ||
55 | <tr><td>CraueConfigBundle</td><td>MIT</td></tr> | ||
56 | <tr><td>doctrine/annotations</td><td>MIT</td></tr> | ||
57 | <tr><td>doctrine/cache</td><td>MIT</td></tr> | ||
58 | <tr><td>doctrine/collections</td><td>MIT</td></tr> | ||
59 | <tr><td>doctrine/common</td><td>MIT</td></tr> | ||
60 | <tr><td>doctrine/dbal</td><td>MIT</td></tr> | ||
61 | <tr><td>doctrine/doctrine-bundle</td><td>MIT</td></tr> | ||
62 | <tr><td>doctrine/doctrine-cache-bundle</td><td>MIT</td></tr> | ||
63 | <tr><td>doctrine/doctrine-migrations-bundle</td><td>MIT</td></tr> | ||
64 | <tr><td>doctrine/inflector</td><td>MIT</td></tr> | ||
65 | <tr><td>doctrine/instantiator</td><td>MIT</td></tr> | ||
66 | <tr><td>doctrine/lexer</td><td>MIT</td></tr> | ||
67 | <tr><td>doctrine/migrations</td><td>LGPL-2.1</td></tr> | ||
68 | <tr><td>doctrine/orm</td><td>MIT</td></tr> | ||
69 | <tr><td>friendsofsymfony/oauth-server-bundle</td><td>MIT</td></tr> | ||
70 | <tr><td>friendsofsymfony/oauth2-php</td><td>MIT</td></tr> | ||
71 | <tr><td>friendsofsymfony/rest-bundle</td><td>MIT</td></tr> | ||
72 | <tr><td>friendsofsymfony/user-bundle</td><td>MIT</td></tr> | ||
73 | <tr><td>gedmo/doctrine-extensions</td><td>MIT</td></tr> | ||
74 | <tr><td>grandt/binstring</td><td>LGPL-2.1</td></tr> | ||
75 | <tr><td>grandt/phpepub</td><td>LGPL-2.1</td></tr> | ||
76 | <tr><td>grandt/phpresizegif</td><td>LGPL-2.1</td></tr> | ||
77 | <tr><td>grandt/phpzipmerge</td><td>LGPL-2.1</td></tr> | ||
78 | <tr><td>grandt/relativepath</td><td>LGPL-2.1</td></tr> | ||
79 | <tr><td>guzzlehttp/guzzle</td><td>MIT</td></tr> | ||
80 | <tr><td>guzzlehttp/ringphp</td><td>MIT</td></tr> | ||
81 | <tr><td>guzzlehttp/streams</td><td>MIT</td></tr> | ||
82 | <tr><td>hoa/compiler</td><td>BSD-3-Clause</td></tr> | ||
83 | <tr><td>hoa/consistency</td><td>BSD-3-Clause</td></tr> | ||
84 | <tr><td>hoa/event</td><td>BSD-3-Clause</td></tr> | ||
85 | <tr><td>hoa/exception</td><td>BSD-3-Clause</td></tr> | ||
86 | <tr><td>hoa/file</td><td>BSD-3-Clause</td></tr> | ||
87 | <tr><td>hoa/iterator</td><td>BSD-3-Clause</td></tr> | ||
88 | <tr><td>hoa/math</td><td>BSD-3-Clause</td></tr> | ||
89 | <tr><td>hoa/protocol</td><td>BSD-3-Clause</td></tr> | ||
90 | <tr><td>hoa/regex</td><td>BSD-3-Clause</td></tr> | ||
91 | <tr><td>hoa/ruler</td><td>BSD-3-Clausev | ||
92 | <tr><td>hoa/stream</td><td>BSD-3-Clause</td></tr> | ||
93 | <tr><td>hoa/ustring</td><td>BSD-3-Clause</td></tr> | ||
94 | <tr><td>hoa/visitor</td><td>BSD-3-Clause</td></tr> | ||
95 | <tr><td>hoa/zformat</td><td>BSD-3-Clause</td></tr> | ||
96 | <tr><td>htmlawed/htmlawed</td><td>GPL-2.0+ or LGPL-3.0</td></tr> | ||
97 | <tr><td>incenteev/composer-parameter-handler</td><td>MIT</td></tr> | ||
98 | <tr><td>j0k3r/graby</td><td>AGPL-3.0</td></tr> | ||
99 | <tr><td>j0k3r/graby-site-config</td><td>AGPL-3.0</td></tr> | ||
100 | <tr><td>j0k3r/php-readability</td><td>Apache-2.0</td></tr> | ||
101 | <tr><td>j0k3r/safecurl</td><td>MIT</td></tr> | ||
102 | <tr><td>jdorn/sql-formatter</td><td>MIT</td></tr> | ||
103 | <tr><td>jms/metadata</td><td>Apache</td></tr> | ||
104 | <tr><td>jms/parser-lib</td><td>Apache2</td></tr> | ||
105 | <tr><td>jms/serializer</td><td>Apache2</td></tr> | ||
106 | <tr><td>jms/serializer-bundle</td><td>Apache2</td></tr> | ||
107 | <tr><td>kphoen/rulerz</td><td>MIT</td></tr> | ||
108 | <tr><td>kphoen/rulerz-bundle</td><td>MIT</td></tr> | ||
109 | <tr><td>kriswallsmith/assetic</td><td>MIT</td></tr> | ||
110 | <tr><td>lexik/form-filter-bundle</td><td>MIT</td></tr> | ||
111 | <tr><td>liip/theme-bundle</td><td>MIT</td></tr> | ||
112 | <tr><td>mgargano/simplehtmldom</td><td>MIT</td></tr> | ||
113 | <tr><td>michelf/php-markdown</td><td>BSD-3-Clause</td></tr> | ||
114 | <tr><td>monolog/monolog</td><td>MIT</td></tr> | ||
115 | <tr><td>neitanod/forceutf8</td><td>BSD-3-Clause</td></tr> | ||
116 | <tr><td>nelmio/api-doc-bundle</td><td>MIT</td></tr> | ||
117 | <tr><td>nelmio/cors-bundle</td><td>MIT</td></tr> | ||
118 | <tr><td>ocramius/proxy-manager</td><td>MIT</td></tr> | ||
119 | <tr><td>pagerfanta/pagerfanta</td><td>MIT</td></tr> | ||
120 | <tr><td>paragonie/random_compat</td><td>MIT</td></tr> | ||
121 | <tr><td>phpcollection/phpcollection</td><td>Apache2</td></tr> | ||
122 | <tr><td>phpoption/phpoption</td><td>Apache2</td></tr> | ||
123 | <tr><td>phpzip/phpzip</td><td>LGPL-2.1</td></tr> | ||
124 | <tr><td>psr/log</td><td>MIT</td></tr> | ||
125 | <tr><td>react/promise</td><td>MIT</td></tr> | ||
126 | <tr><td>scheb/two-factor-bundle</td><td>MIT</td></tr> | ||
127 | <tr><td>sensio/distribution-bundle</td><td>MIT</td></tr> | ||
128 | <tr><td>sensio/framework-extra-bundle</td><td>MIT</td></tr> | ||
129 | <tr><td>sensiolabs/security-checker</td><td>MIT</td></tr> | ||
130 | <tr><td>simplepie/simplepie</td><td>BSD-3-Clause</td></tr> | ||
131 | <tr><td>smalot/pdfparser</td><td>GPL-3.0</td></tr> | ||
132 | <tr><td>sonata-project/google-authenticator</td><td>MIT</td></tr> | ||
133 | <tr><td>stof/doctrine-extensions-bundle</td><td>MIT</td></tr> | ||
134 | <tr><td>swiftmailer/swiftmailer</td><td>MIT</td></tr> | ||
135 | <tr><td>symfony/assetic-bundle</td><td>MIT</td></tr> | ||
136 | <tr><td>symfony/monolog-bundle</td><td>MIT</td></tr> | ||
137 | <tr><td>All of Symfony</td><td>MIT-licenced</td></tr> | ||
138 | <tr><td>tecnickcom/tcpdf</td><td>LGPLv3</td></tr> | ||
139 | <tr><td>twig/extensions</td><td>MIT</td></tr> | ||
140 | <tr><td>twig/twig</td><td>BSD-3-Clause</td></tr> | ||
141 | <tr><td>wallabag/php-mobi</td><td>Apache-2.0</td></tr> | ||
142 | <tr><td>willdurand/hateoas</td><td>MIT</td></tr> | ||
143 | <tr><td>willdurand/hateoas-bundle</td><td>MIT</td></tr> | ||
144 | <tr><td>willdurand/jsonp-callback-validator</td><td>MIT</td></tr> | ||
145 | <tr><td>willdurand/negotiation</td><td>MIT</td></tr> | ||
146 | <tr><td>zendframework/zend-code</td><td>BSD-3-Clause</td></tr> | ||
147 | <tr><td>zendframework/zend-eventmanager</td><td>BSD-3-Clause</td></tr> | ||
148 | <tr><td>doctrine/data-fixtures</td><td>MIT</td></tr> | ||
149 | <tr><td>doctrine/doctrine-fixtures-bundle</td><td>MIT</td></tr> | ||
150 | <tr><td>phpdocumentor/reflection-docblock</td><td>MIT</td></tr> | ||
151 | <tr><td>phpspec/prophecy</td><td>MIT</td></tr> | ||
152 | <tr><td>phpunit/php-code-coverage</td><td>BSD-3-Clause</td></tr> | ||
153 | <tr><td>phpunit/php-file-iterator</td><td>BSD-3-Clause</td></tr> | ||
154 | <tr><td>phpunit/php-text-template</td><td>BSD-3-Clause</td></tr> | ||
155 | <tr><td>phpunit/php-timer</td><td>BSD-3-Clause</td></tr> | ||
156 | <tr><td>phpunit/php-token-stream</td><td>BSD-3-Clause</td></tr> | ||
157 | <tr><td>phpunit/phpunit</td><td>BSD-3-Clause</td></tr> | ||
158 | <tr><td>phpunit/phpunit-mock-objects</td><td>BSD-3-Clause</td></tr> | ||
159 | <tr><td>sebastian/comparator</td><td>BSD-3-Clause</td></tr> | ||
160 | <tr><td>sebastian/diff</td><td>BSD-3-Clause</td></tr> | ||
161 | <tr><td>sebastian/environment</td><td>BSD-3-Clause</td></tr> | ||
162 | <tr><td>sebastian/exporter</td><td>BSD-3-Clause</td></tr> | ||
163 | <tr><td>sebastian/global-state</td><td>BSD-3-Clause</td></tr> | ||
164 | <tr><td>sebastian/recursion-context</td><td>BSD-3-Clause</td></tr> | ||
165 | <tr><td>sebastian/version</td><td>BSD-3-Clause</td></tr> | ||
166 | <tr><td>sensio/generator-bundle</td><td>MIT</td></tr> | ||
167 | <tr><td>symfony/phpunit-bridge</td><td>MIT</td></tr> | ||
168 | </table> | ||
169 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig deleted file mode 100644 index b529a0ac..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'howto.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <h2>{{ 'howto.page_title'|trans }}</h2> | ||
7 | |||
8 | <p>{{ 'howto.page_description'|trans }}</p> | ||
9 | <ul> | ||
10 | <li><a href="{{ path('new') }}">{{ 'howto.form.description'|trans }}</a></li> | ||
11 | </ul> | ||
12 | <h3>{{ 'howto.top_menu.browser_addons'|trans }}</h3> | ||
13 | <ul> | ||
14 | <li><a href="{{ addonsUrl.firefox }}" target="_blank">{{ 'howto.browser_addons.firefox'|trans }}</a></li> | ||
15 | <li><a href="{{ addonsUrl.chrome }}" target="_blank">{{ 'howto.browser_addons.chrome'|trans }}</a></li> | ||
16 | </ul> | ||
17 | <h3>{{ 'howto.top_menu.mobile_apps'|trans }}</h3> | ||
18 | <ul> | ||
19 | <li>Android: <a href="{{ addonsUrl.f_droid }}" target="_blank">{{ 'howto.mobile_apps.android.via_f_droid'|trans }}</a> / <a href="{{ addonsUrl.google_play }}" target="_blank">{{ 'howto.mobile_apps.android.via_google_play'|trans }}</a></li> | ||
20 | <li>iOS: <a href="{{ addonsUrl.ios }}" target="_blank">{{ 'howto.mobile_apps.ios'|trans }}</a></li> | ||
21 | <li>Windows Phone: <a href="{{ addonsUrl.windows }}" target="_blank">{{ 'howto.mobile_apps.windows'|trans }}</a></li> | ||
22 | </ul> | ||
23 | <h3>{{ 'howto.top_menu.bookmarklet'|trans }}</h3> | ||
24 | <p> | ||
25 | {{ 'howto.bookmarklet.description'|trans }} | ||
26 | {% include 'WallabagCoreBundle::_bookmarklet.html.twig' %} | ||
27 | |||
28 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig deleted file mode 100644 index ea1c1cbe..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig +++ /dev/null | |||
@@ -1,67 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'quickstart.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <h3>{{ 'quickstart.intro.title'|trans }}</h3> | ||
8 | <p>{{ 'quickstart.intro.paragraph_1'|trans }}</p> | ||
9 | <p>{{ 'quickstart.intro.paragraph_2'|trans }}</p> | ||
10 | |||
11 | <h4>{{ 'quickstart.configure.title'|trans }}</h4> | ||
12 | <ul> | ||
13 | <li><a href="{{ path('config') }}">{{ 'quickstart.configure.language'|trans }}</a></li> | ||
14 | <li><a href="{{ path('config') }}#set2">{{ 'quickstart.configure.rss'|trans }}</a></li> | ||
15 | <li><a href="{{ path('config') }}#set5">{{ 'quickstart.configure.tagging_rules'|trans }}</a></li> | ||
16 | </ul> | ||
17 | |||
18 | {% if is_granted('ROLE_SUPER_ADMIN') %} | ||
19 | <h4>{{ 'quickstart.admin.title'|trans }}</h4> | ||
20 | <p>{{ 'quickstart.admin.description'|trans }}</p> | ||
21 | <ul> | ||
22 | <li><a href="{{ path('config') }}#set6">{{ 'quickstart.admin.new_user'|trans }}</a></li> | ||
23 | <li><a href="{{ path('craue_config_settings_modify') }}#set-analytics">{{ 'quickstart.admin.analytics'|trans }}</a></li> | ||
24 | <li><a href="{{ path('craue_config_settings_modify') }}#set-entry">{{ 'quickstart.admin.sharing'|trans }}</a></li> | ||
25 | <li><a href="{{ path('craue_config_settings_modify') }}#set-export">{{ 'quickstart.admin.export'|trans }}</a></li> | ||
26 | <li><a href="{{ path('craue_config_settings_modify') }}#set-import">{{ 'quickstart.admin.import'|trans }}</a></li> | ||
27 | </ul> | ||
28 | {% endif %} | ||
29 | |||
30 | <h4>{{ 'quickstart.first_steps.title'|trans }}</h4> | ||
31 | <ul> | ||
32 | <li><a href="{{ path('new') }}">{{ 'quickstart.first_steps.new_article'|trans }}</a></li> | ||
33 | <li><a href="{{ path('unread') }}">{{ 'quickstart.first_steps.unread_articles'|trans }}</a></li> | ||
34 | </ul> | ||
35 | |||
36 | <h4>{{ 'quickstart.migrate.title'|trans }}</h4> | ||
37 | <p>{{ 'quickstart.migrate.description'|trans }}</p> | ||
38 | <ul> | ||
39 | <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li> | ||
40 | <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li> | ||
41 | <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li> | ||
42 | <li><a href="{{ path('import_readability') }}">{{ 'quickstart.migrate.readability'|trans }}</a></li> | ||
43 | </ul> | ||
44 | |||
45 | <h4>{{ 'quickstart.developer.title'|trans }}</h4> | ||
46 | <ul> | ||
47 | <li><a href="{{ path('developer') }}">{{ 'quickstart.developer.create_application'|trans }}</a></li> | ||
48 | </ul> | ||
49 | |||
50 | <h4>{{ 'quickstart.docs.title'|trans }}</h4> | ||
51 | <ul> | ||
52 | <li><a href="http://doc.wallabag.org/en/master/user/annotations.html">{{ 'quickstart.docs.annotate'|trans }}</a></li> | ||
53 | <li><a href="http://doc.wallabag.org/en/master/user/download_articles.html">{{ 'quickstart.docs.export'|trans }}</a></li> | ||
54 | <li><a href="http://doc.wallabag.org/en/master/user/filters.html">{{ 'quickstart.docs.search_filters'|trans }}</a></li> | ||
55 | <li><a href="http://doc.wallabag.org/en/master/user/errors_during_fetching.html">{{ 'quickstart.docs.fetching_errors'|trans }}</a></li> | ||
56 | <li><a href="http://doc.wallabag.org/">{{ 'quickstart.docs.all_docs'|trans }}</a></li> | ||
57 | </ul> | ||
58 | |||
59 | <h4>{{ 'quickstart.support.title'|trans }}</h4> | ||
60 | <p>{{ 'quickstart.support.description'|trans }}</p> | ||
61 | <ul> | ||
62 | <li><a href="https://github.com/wallabag/wallabag/issues/">{{ 'quickstart.support.github'|trans }}</a></li> | ||
63 | <li><a href="mailto:hello@wallabag.org">{{ 'quickstart.support.email'|trans }}</a></li> | ||
64 | <li><a href="https://gitter.im/wallabag/wallabag">{{ 'quickstart.support.gitter'|trans }}</a></li> | ||
65 | </ul> | ||
66 | |||
67 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig index 4fd4d317..30fd0d85 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig | |||
@@ -42,6 +42,7 @@ | |||
42 | </li>--> | 42 | </li>--> |
43 | <li><a href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a></li> | 43 | <li><a href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a></li> |
44 | {% if is_granted('ROLE_SUPER_ADMIN') %} | 44 | {% if is_granted('ROLE_SUPER_ADMIN') %} |
45 | <li><a href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a></li> | ||
45 | <li><a href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a></li> | 46 | <li><a href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a></li> |
46 | {% endif %} | 47 | {% endif %} |
47 | <li><a href="{{ path('import') }}">{{ 'menu.left.import'|trans }}</a></li> | 48 | <li><a href="{{ path('import') }}">{{ 'menu.left.import'|trans }}</a></li> |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/client.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig index 8a5da71a..8a5da71a 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/client.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/client_parameters.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig index b498cceb..b498cceb 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/client_parameters.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/howto_app.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig index acbc2c88..acbc2c88 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/howto_app.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig index 3430c0d4..3430c0d4 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Developer/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/_title.html.twig index d1c2f203..d1c2f203 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/_title.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig index 288bb54f..288bb54f 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.xml.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/share.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig index b82b3d3d..b82b3d3d 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/share.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Mail/forgotPassword.txt.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Mail/forgotPassword.txt.twig new file mode 100644 index 00000000..631bcb88 --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Mail/forgotPassword.txt.twig | |||
@@ -0,0 +1,6 @@ | |||
1 | Hello {{username}}! | ||
2 | |||
3 | To reset your password - please visit {{confirmationUrl}} | ||
4 | |||
5 | Regards, | ||
6 | Wallabag bot | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/_bookmarklet.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/_bookmarklet.html.twig index 966a84db..966a84db 100644 --- a/src/Wallabag/CoreBundle/Resources/views/_bookmarklet.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/_bookmarklet.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/about.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/about.html.twig index d0b94279..d0b94279 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/about.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/about.html.twig | |||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/howto.html.twig index 6a177d6b..67a10190 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/howto.html.twig | |||
@@ -35,7 +35,7 @@ | |||
35 | <div class="col s12"> | 35 | <div class="col s12"> |
36 | <h5>{{ 'howto.top_menu.bookmarklet'|trans }}</h5> | 36 | <h5>{{ 'howto.top_menu.bookmarklet'|trans }}</h5> |
37 | {{ 'howto.bookmarklet.description'|trans }} | 37 | {{ 'howto.bookmarklet.description'|trans }} |
38 | {% include 'WallabagCoreBundle::_bookmarklet.html.twig' %} | 38 | {% include '@WallabagCore/themes/common/Static/_bookmarklet.html.twig' %} |
39 | </div> | 39 | </div> |
40 | 40 | ||
41 | </div> | 41 | </div> |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/quickstart.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/quickstart.html.twig new file mode 100644 index 00000000..226bafea --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Static/quickstart.html.twig | |||
@@ -0,0 +1,119 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'quickstart.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel settings"> | ||
10 | |||
11 | <div class="row"> | ||
12 | <h3>{{ 'quickstart.intro.title'|trans }}</h3> | ||
13 | |||
14 | <ul class="row data"> | ||
15 | <li class="col l4 m6 s12"> | ||
16 | <div class="card teal darken-1"> | ||
17 | <div class="card-content white-text"> | ||
18 | <span class="card-title">{{ 'quickstart.configure.title'|trans }}</span> | ||
19 | <p>{{ 'quickstart.configure.description'|trans }}</p> | ||
20 | </div> | ||
21 | <div class="card-action"> | ||
22 | <ul> | ||
23 | <li><a href="{{ path('config') }}">{{ 'quickstart.configure.language'|trans }}</a></li> | ||
24 | <li><a href="{{ path('config') }}#set2">{{ 'quickstart.configure.rss'|trans }}</a></li> | ||
25 | <li><a href="{{ path('config') }}#set5">{{ 'quickstart.more'|trans }}</a></li> | ||
26 | </ul> | ||
27 | </div> | ||
28 | </div> | ||
29 | </li> | ||
30 | |||
31 | <li class="col l4 m6 s12"> | ||
32 | <div class="card green darken-1"> | ||
33 | <div class="card-content white-text"> | ||
34 | <span class="card-title">{{ 'quickstart.first_steps.title'|trans }}</span> | ||
35 | <p>{{ 'quickstart.first_steps.description'|trans }}</p> | ||
36 | </div> | ||
37 | <div class="card-action"> | ||
38 | <ul> | ||
39 | <li><a href="{{ path('new') }}">{{ 'quickstart.first_steps.new_article'|trans }}</a></li> | ||
40 | <li><a href="{{ path('unread') }}">{{ 'quickstart.first_steps.unread_articles'|trans }}</a></li> | ||
41 | </ul> | ||
42 | </div> | ||
43 | </div> | ||
44 | </li> | ||
45 | |||
46 | <li class="col l4 m6 s12"> | ||
47 | <div class="card light-green darken-1"> | ||
48 | <div class="card-content white-text"> | ||
49 | <span class="card-title">{{ 'quickstart.migrate.title'|trans }}</span> | ||
50 | <p>{{ 'quickstart.migrate.description'|trans }}</p> | ||
51 | </div> | ||
52 | <div class="card-action"> | ||
53 | <ul> | ||
54 | <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li> | ||
55 | <li><a href="{{ path('import_readability') }}">{{ 'quickstart.migrate.readability'|trans }}</a></li> | ||
56 | <li><a href="{{ path('import_instapaper') }}">{{ 'quickstart.migrate.instapaper'|trans }}</a></li> | ||
57 | <li><a href="{{ path('import') }}">{{ 'quickstart.more'|trans }}</a></li> | ||
58 | </ul> | ||
59 | </div> | ||
60 | </div> | ||
61 | </li> | ||
62 | |||
63 | <li class="col l4 m6 s12"> | ||
64 | <div class="card blue darken-1"> | ||
65 | <div class="card-content white-text"> | ||
66 | <span class="card-title">{{ 'quickstart.developer.title'|trans }}</span> | ||
67 | <p>{{ 'quickstart.developer.description'|trans }}</p> | ||
68 | </div> | ||
69 | <div class="card-action"> | ||
70 | <ul> | ||
71 | <li><a href="{{ path('developer') }}">{{ 'quickstart.developer.create_application'|trans }}</a></li> | ||
72 | <li><a href="http://doc.wallabag.org/en/master/developer/docker.html">{{ 'quickstart.developer.use_docker'|trans }}</a></li> | ||
73 | <li><a href="http://doc.wallabag.org/en/master/index.html#dev-docs">{{ 'quickstart.more'|trans }}</a></li> | ||
74 | </ul> | ||
75 | </div> | ||
76 | </div> | ||
77 | </li> | ||
78 | |||
79 | <li class="col l4 m6 s12"> | ||
80 | <div class="card light-blue darken-1"> | ||
81 | <div class="card-content white-text"> | ||
82 | <span class="card-title">{{ 'quickstart.docs.title'|trans }}</span> | ||
83 | <p>{{ 'quickstart.docs.description'|trans }}</p> | ||
84 | </div> | ||
85 | <div class="card-action"> | ||
86 | <ul> | ||
87 | <li><a href="http://doc.wallabag.org/en/master/user/annotations.html">{{ 'quickstart.docs.annotate'|trans }}</a></li> | ||
88 | <li><a href="http://doc.wallabag.org/en/master/user/download_articles.html">{{ 'quickstart.docs.export'|trans }}</a></li> | ||
89 | <li><a href="http://doc.wallabag.org/">{{ 'quickstart.docs.all_docs'|trans }}</a></li> | ||
90 | </ul> | ||
91 | </div> | ||
92 | </div> | ||
93 | </li> | ||
94 | |||
95 | <li class="col l4 m6 s12"> | ||
96 | <div class="card cyan darken-1"> | ||
97 | <div class="card-content white-text"> | ||
98 | <span class="card-title">{{ 'quickstart.support.title'|trans }}</span> | ||
99 | <p>{{ 'quickstart.support.description'|trans }}</p> | ||
100 | </div> | ||
101 | <div class="card-action"> | ||
102 | <ul> | ||
103 | <li><a href="https://github.com/wallabag/wallabag/issues/">{{ 'quickstart.support.github'|trans }}</a></li> | ||
104 | <li><a href="mailto:hello@wallabag.org">{{ 'quickstart.support.email'|trans }}</a></li> | ||
105 | <li><a href="https://gitter.im/wallabag/wallabag">{{ 'quickstart.support.gitter'|trans }}</a></li> | ||
106 | </ul> | ||
107 | </div> | ||
108 | </div> | ||
109 | </li> | ||
110 | |||
111 | </ul> | ||
112 | |||
113 | </div> | ||
114 | |||
115 | </div> | ||
116 | </div> | ||
117 | </div> | ||
118 | |||
119 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig index 5330c353..270c077f 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig | |||
@@ -16,9 +16,6 @@ | |||
16 | <li class="tab col s3"><a href="#set3">{{ 'config.tab_menu.user_info'|trans }}</a></li> | 16 | <li class="tab col s3"><a href="#set3">{{ 'config.tab_menu.user_info'|trans }}</a></li> |
17 | <li class="tab col s3"><a href="#set4">{{ 'config.tab_menu.password'|trans }}</a></li> | 17 | <li class="tab col s3"><a href="#set4">{{ 'config.tab_menu.password'|trans }}</a></li> |
18 | <li class="tab col s3"><a href="#set5">{{ 'config.tab_menu.rules'|trans }}</a></li> | 18 | <li class="tab col s3"><a href="#set5">{{ 'config.tab_menu.rules'|trans }}</a></li> |
19 | {% if is_granted('ROLE_SUPER_ADMIN') %} | ||
20 | <li class="tab col s3"><a href="#set6">{{ 'config.tab_menu.new_user'|trans }}</a></li> | ||
21 | {% endif %} | ||
22 | </ul> | 19 | </ul> |
23 | </div> | 20 | </div> |
24 | 21 | ||
@@ -157,11 +154,9 @@ | |||
157 | <div class="row"> | 154 | <div class="row"> |
158 | <div class="input-field col s12"> | 155 | <div class="input-field col s12"> |
159 | {{ 'config.form_user.two_factor_description'|trans }} | 156 | {{ 'config.form_user.two_factor_description'|trans }} |
160 | </div> | ||
161 | </div> | ||
162 | 157 | ||
163 | <div class="row"> | 158 | <br /> |
164 | <div class="input-field col s12"> | 159 | |
165 | {{ form_widget(form.user.twoFactorAuthentication) }} | 160 | {{ form_widget(form.user.twoFactorAuthentication) }} |
166 | {{ form_label(form.user.twoFactorAuthentication) }} | 161 | {{ form_label(form.user.twoFactorAuthentication) }} |
167 | {{ form_errors(form.user.twoFactorAuthentication) }} | 162 | {{ form_errors(form.user.twoFactorAuthentication) }} |
@@ -218,6 +213,9 @@ | |||
218 | « {{ tagging_rule.rule }} » | 213 | « {{ tagging_rule.rule }} » |
219 | {{ 'config.form_rules.then_tag_as_label'|trans }} | 214 | {{ 'config.form_rules.then_tag_as_label'|trans }} |
220 | « {{ tagging_rule.tags|join(', ') }} » | 215 | « {{ tagging_rule.tags|join(', ') }} » |
216 | <a href="{{ path('edit_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}"> | ||
217 | <i class="tool grey-text mode_edit material-icons">mode_edit</i> | ||
218 | </a> | ||
221 | <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}"> | 219 | <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}"> |
222 | <i class="tool grey-text delete material-icons">delete</i> | 220 | <i class="tool grey-text delete material-icons">delete</i> |
223 | </a> | 221 | </a> |
@@ -336,49 +334,6 @@ | |||
336 | </div> | 334 | </div> |
337 | </div> | 335 | </div> |
338 | </div> | 336 | </div> |
339 | |||
340 | {% if is_granted('ROLE_SUPER_ADMIN') %} | ||
341 | <div id="set6" class="col s12"> | ||
342 | {{ form_start(form.new_user) }} | ||
343 | {{ form_errors(form.new_user) }} | ||
344 | |||
345 | <div class="row"> | ||
346 | <div class="input-field col s12"> | ||
347 | {{ form_label(form.new_user.username) }} | ||
348 | {{ form_errors(form.new_user.username) }} | ||
349 | {{ form_widget(form.new_user.username) }} | ||
350 | </div> | ||
351 | </div> | ||
352 | |||
353 | <div class="row"> | ||
354 | <div class="input-field col s12"> | ||
355 | {{ form_label(form.new_user.plainPassword.first) }} | ||
356 | {{ form_errors(form.new_user.plainPassword.first) }} | ||
357 | {{ form_widget(form.new_user.plainPassword.first) }} | ||
358 | </div> | ||
359 | </div> | ||
360 | |||
361 | <div class="row"> | ||
362 | <div class="input-field col s12"> | ||
363 | {{ form_label(form.new_user.plainPassword.second) }} | ||
364 | {{ form_errors(form.new_user.plainPassword.second) }} | ||
365 | {{ form_widget(form.new_user.plainPassword.second) }} | ||
366 | </div> | ||
367 | </div> | ||
368 | |||
369 | <div class="row"> | ||
370 | <div class="input-field col s12"> | ||
371 | {{ form_label(form.new_user.email) }} | ||
372 | {{ form_errors(form.new_user.email) }} | ||
373 | {{ form_widget(form.new_user.email) }} | ||
374 | </div> | ||
375 | </div> | ||
376 | |||
377 | {{ form_widget(form.new_user.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} | ||
378 | {{ form_rest(form.new_user) }} | ||
379 | </form> | ||
380 | </div> | ||
381 | {% endif %} | ||
382 | </div> | 337 | </div> |
383 | 338 | ||
384 | </div> | 339 | </div> |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client.html.twig deleted file mode 100644 index 8a5da71a..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client.html.twig +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'developer.client.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <div class="row"> | ||
7 | <div class="col s12"> | ||
8 | <div class="card-panel settings"> | ||
9 | |||
10 | <div class="row"> | ||
11 | <p>{{ 'developer.client.page_description'|trans }}</p> | ||
12 | {{ form_start(form) }} | ||
13 | {{ form_errors(form) }} | ||
14 | |||
15 | <div class="input-field col s12"> | ||
16 | {{ form_label(form.name) }} | ||
17 | {{ form_errors(form.name) }} | ||
18 | {{ form_widget(form.name) }} | ||
19 | </div> | ||
20 | |||
21 | <div class="input-field col s12"> | ||
22 | {{ form_label(form.redirect_uris) }} | ||
23 | {{ form_errors(form.redirect_uris) }} | ||
24 | {{ form_widget(form.redirect_uris) }} | ||
25 | </div> | ||
26 | |||
27 | <a href="{{ path('developer') }}" class="waves-effect waves-light grey btn">{{ 'developer.client.action_back'|trans }}</a> | ||
28 | {{ form_widget(form.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} | ||
29 | |||
30 | {{ form_rest(form) }} | ||
31 | </div> | ||
32 | |||
33 | </div> | ||
34 | </div> | ||
35 | </div> | ||
36 | |||
37 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client_parameters.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client_parameters.html.twig deleted file mode 100644 index b498cceb..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/client_parameters.html.twig +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'developer.client_parameter.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <div class="row"> | ||
7 | <div class="col s12"> | ||
8 | <div class="card-panel settings"> | ||
9 | <div class="row"> | ||
10 | <p>{{ 'developer.client_parameter.page_description'|trans }}</p> | ||
11 | <ul> | ||
12 | <li>{{ 'developer.client_parameter.field_name'|trans }}: <strong><pre>{{ client_name }}</pre></strong></li> | ||
13 | <li>{{ 'developer.client_parameter.field_id'|trans }}: <strong><pre>{{ client_id }}</pre></strong></li> | ||
14 | <li>{{ 'developer.client_parameter.field_secret'|trans }}: <strong><pre>{{ client_secret }}</pre></strong></li> | ||
15 | </ul> | ||
16 | |||
17 | <a href="{{ path('developer') }}" class="waves-effect waves-light grey btn">{{ 'developer.client_parameter.back'|trans }}</a> | ||
18 | <a href="{{ path('developer_howto_firstapp') }}" class="btn waves-effect waves-light">{{ 'developer.client_parameter.read_howto'|trans }}</a> | ||
19 | </div> | ||
20 | </div> | ||
21 | </div> | ||
22 | </div> | ||
23 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/howto_app.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/howto_app.html.twig deleted file mode 100644 index acbc2c88..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/howto_app.html.twig +++ /dev/null | |||
@@ -1,63 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'developer.howto.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block css %} | ||
6 | {{ parent() }} | ||
7 | <link rel="stylesheet" href="{{ asset('https://cdnjs.cloudflare.com/ajax/libs/prism/1.4.1/themes/prism-dark.min.css') }}"> | ||
8 | {% endblock %} | ||
9 | |||
10 | {% block content %} | ||
11 | <div class="row"> | ||
12 | <div class="col s12"> | ||
13 | <div class="card-panel settings"> | ||
14 | |||
15 | <div class="row"> | ||
16 | <p>{{ 'developer.howto.description.paragraph_1'|trans|raw }}</p> | ||
17 | <p>{{ 'developer.howto.description.paragraph_2'|trans }}</p> | ||
18 | <p>{{ 'developer.howto.description.paragraph_3'|trans({'%link%': path('developer_create_client')})|raw }}</p> | ||
19 | <p>{{ 'developer.howto.description.paragraph_4'|trans }}</p> | ||
20 | <p> | ||
21 | <pre><code class="language-bash">http POST http://v2.wallabag.org/oauth/v2/token \ | ||
22 | grant_type=password \ | ||
23 | client_id=12_5um6nz50ceg4088c0840wwc0kgg44g00kk84og044ggkscso0k \ | ||
24 | client_secret=3qd12zpeaxes8cwg8c0404g888co4wo8kc4gcw0occww8cgw4k \ | ||
25 | username=yourUsername \ | ||
26 | password=yourPassw0rd</code></pre> | ||
27 | </p> | ||
28 | <p>{{ 'developer.howto.description.paragraph_5'|trans }}</p> | ||
29 | <p> | ||
30 | <pre><code class="language-bash">HTTP/1.1 200 OK | ||
31 | Cache-Control: no-store, private | ||
32 | Connection: close | ||
33 | Content-Type: application/json | ||
34 | Date: Tue, 06 Oct 2015 18:24:03 GMT | ||
35 | Host: localhost:8000 | ||
36 | Pragma: no-cache | ||
37 | X-Debug-Token: be00a1 | ||
38 | X-Debug-Token-Link: /profiler/be00a1 | ||
39 | X-Powered-By: PHP/5.5.9-1ubuntu4.13 | ||
40 | { | ||
41 | "access_token": "ZWFjNjA3ZWMwYWVmYzRkYTBlMmQ3NTllYmVhOGJiZDE0ZTg1NjE4MjczOTVlNzM0ZTRlMWQ0MmRlMmYwNTk5Mw", | ||
42 | "expires_in": 3600, | ||
43 | "refresh_token": "ODBjODU1NWUwNmUzZTBkNDQ5YWVlZTVlMjQ2Y2I0OWM2NTM1ZGM2M2Y3MDhjMTViM2U2MzYxYzRkMDk5ODRlZg", | ||
44 | "scope": null, | ||
45 | "token_type": "bearer" | ||
46 | }</code></pre> | ||
47 | </p> | ||
48 | <p>{{ 'developer.howto.description.paragraph_6'|trans }}</p> | ||
49 | <p> | ||
50 | <pre><code class="language-bash">http GET http://v2.wallabag.org/api/entries.json \ | ||
51 | "Authorization:Bearer ZWFjNjA3ZWMwYWVmYzRkYTBlMmQ3NTllYmVhOGJiZDE0ZTg1NjE4MjczOTVlNzM0ZTRlMWQ0MmRlMmYwNTk5Mw"</code></pre> | ||
52 | </p> | ||
53 | <p>{{ 'developer.howto.description.paragraph_7'|trans }}</p> | ||
54 | <p>{{ 'developer.howto.description.paragraph_8'|trans({'%link%': path('nelmio_api_doc_index')})|raw }}</p> | ||
55 | <p><a href="{{ path('developer') }}" class="waves-effect waves-light grey btn">{{ 'developer.howto.back'|trans }}</a></p> | ||
56 | </div> | ||
57 | |||
58 | </div> | ||
59 | </div> | ||
60 | </div> | ||
61 | <script src="{{ asset('https://cdnjs.cloudflare.com/ajax/libs/prism/1.4.1/prism.min.js') }}"></script> | ||
62 | <script src="{{ asset('https://cdnjs.cloudflare.com/ajax/libs/prism/1.4.1/components/prism-bash.min.js') }}"></script> | ||
63 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/index.html.twig deleted file mode 100644 index 3430c0d4..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Developer/index.html.twig +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'developer.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <div class="row"> | ||
7 | <div class="col s12"> | ||
8 | <div class="card-panel settings"> | ||
9 | |||
10 | <div class="row"> | ||
11 | <h3>{{ 'developer.welcome_message'|trans }}</h3> | ||
12 | |||
13 | <h4>{{ 'developer.documentation'|trans }}</h4> | ||
14 | |||
15 | <ul> | ||
16 | <li><a href="{{ path('developer_howto_firstapp') }}">{{ 'developer.how_to_first_app'|trans }}</a></li> | ||
17 | <li><a href="http://doc.wallabag.org/en/master/developer/api.html">{{ 'developer.full_documentation'|trans }}</a></li> | ||
18 | <li><a href="{{ path('nelmio_api_doc_index') }}">{{ 'developer.list_methods'|trans }}</a></li> | ||
19 | </ul> | ||
20 | |||
21 | <h4>{{ 'developer.clients.title'|trans }}</h4> | ||
22 | <ul> | ||
23 | <li><a href="{{ path('developer_create_client') }}">{{ 'developer.clients.create_new'|trans }}</a></li> | ||
24 | </ul> | ||
25 | |||
26 | <h4>{{ 'developer.existing_clients.title'|trans }}</h4> | ||
27 | {% if clients %} | ||
28 | <ul class="collapsible" data-collapsible="expandable"> | ||
29 | {% for client in clients %} | ||
30 | <li> | ||
31 | <div class="collapsible-header">{{ client.name }} - #{{ client.id }}</div> | ||
32 | <div class="collapsible-body"> | ||
33 | <table class="striped"> | ||
34 | <tr> | ||
35 | <td>{{ 'developer.existing_clients.field_id'|trans }}</td> | ||
36 | <td><strong><code>{{ client.id }}_{{ client.randomId }}</code></strong></td> | ||
37 | </tr> | ||
38 | <tr> | ||
39 | <td>{{ 'developer.existing_clients.field_secret'|trans }}</td> | ||
40 | <td><strong><code>{{ client.secret }}</code></strong></td> | ||
41 | </tr> | ||
42 | <tr> | ||
43 | <td>{{ 'developer.existing_clients.field_uris'|trans }}</td> | ||
44 | <td><strong><code>{{ client.redirectUris|json_encode() }}</code></strong></td> | ||
45 | </tr> | ||
46 | <tr> | ||
47 | <td>{{ 'developer.existing_clients.field_grant_types'|trans }}</td> | ||
48 | <td><strong><code>{{ client.allowedGrantTypes|json_encode() }}</code></strong></td> | ||
49 | </tr> | ||
50 | </table> | ||
51 | <p> | ||
52 | {{ 'developer.remove.warn_message_1'|trans({'%name%': client.name }) }}<br/> | ||
53 | {{ 'developer.remove.warn_message_2'|trans({'%name%': client.name }) }}<br/> | ||
54 | <a class="waves-effect waves-light red btn" href="{{ path('developer_delete_client', {'id': client.id}) }}">{{ 'developer.remove.action'|trans({'%name%': client.name }) }}</a> | ||
55 | </p> | ||
56 | </div> | ||
57 | </li> | ||
58 | {% endfor %} | ||
59 | </ul> | ||
60 | {% else %} | ||
61 | {{ 'developer.existing_clients.no_client'|trans }} | ||
62 | {% endif %} | ||
63 | </div> | ||
64 | |||
65 | </div> | ||
66 | </div> | ||
67 | </div> | ||
68 | |||
69 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig index 1c5057dd..01fde953 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig | |||
@@ -1,7 +1,7 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | 1 | {% extends "WallabagCoreBundle::layout.html.twig" %} |
2 | 2 | ||
3 | {% block title %} | 3 | {% block title %} |
4 | {% include "@WallabagCore/themes/_title.html.twig" %} | 4 | {% include "@WallabagCore/themes/common/Entry/_title.html.twig" %} |
5 | {% endblock %} | 5 | {% endblock %} |
6 | 6 | ||
7 | {% block content %} | 7 | {% block content %} |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.xml.twig deleted file mode 100644 index 288bb54f..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.xml.twig +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"> | ||
3 | <channel> | ||
4 | <title>wallabag — {{type}} feed</title> | ||
5 | <link>{{ url('unread') }}</link> | ||
6 | <pubDate>{{ "now"|date('D, d M Y H:i:s') }}</pubDate> | ||
7 | <generator>wallabag</generator> | ||
8 | <description>wallabag {{type}} elements</description> | ||
9 | |||
10 | {% for entry in entries %} | ||
11 | |||
12 | <item> | ||
13 | <title><![CDATA[{{ entry.title }}]]></title> | ||
14 | <source url="{{ url('view', { 'id': entry.id }) }}">wallabag</source> | ||
15 | <link>{{ entry.url }}</link> | ||
16 | <guid>{{ entry.url }}</guid> | ||
17 | <pubDate>{{ entry.createdAt|date('D, d M Y H:i:s') }}</pubDate> | ||
18 | <description> | ||
19 | <![CDATA[{%- if entry.readingTime > 0 -%}{{ 'entry.list.reading_time_minutes'|trans({'%readingTime%': entry.readingTime}) }}{%- else -%}{{ 'entry.list.reading_time_less_one_minute'|trans|raw }}{%- endif %}{{ entry.content|raw -}}]]> | ||
20 | </description> | ||
21 | </item> | ||
22 | |||
23 | {% endfor %} | ||
24 | |||
25 | </channel> | ||
26 | </rss> | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Exception/error.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Exception/error.html.twig new file mode 100644 index 00000000..6be78edb --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Exception/error.html.twig | |||
@@ -0,0 +1,30 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'error.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block body_class %}login{% endblock %} | ||
6 | |||
7 | {% block menu %}{% endblock %} | ||
8 | {% block messages %}{% endblock %} | ||
9 | |||
10 | {% block content %} | ||
11 | <main class="valign-wrapper"> | ||
12 | <div class="valign row"> | ||
13 | <div class="card sw"> | ||
14 | <div class="center"><img src="{{ asset('bundles/wallabagcore/themes/_global/img/logo-other_themes.png') }}" alt="wallabag logo" /></div> | ||
15 | <div class="card-content"> | ||
16 | <div class="row"> | ||
17 | <h5>{{ status_code }}: {{ status_text }}</h5> | ||
18 | <p>{{ exception.message }}</p> | ||
19 | {# {% for trace in exception.trace %} | ||
20 | <p>{{ trace.class }} - {{ trace.type }} - {{ trace.file }} - {{ trace.line }}</p> | ||
21 | {% endfor %} #} | ||
22 | </div> | ||
23 | </div> | ||
24 | </div> | ||
25 | </div> | ||
26 | </main> | ||
27 | {% endblock %} | ||
28 | |||
29 | {% block footer %} | ||
30 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig deleted file mode 100644 index 8cbf4ab4..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig +++ /dev/null | |||
@@ -1,77 +0,0 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'quickstart.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel settings"> | ||
10 | |||
11 | <div class="row"> | ||
12 | <h3>{{ 'quickstart.intro.title'|trans }}</h3> | ||
13 | <p>{{ 'quickstart.intro.paragraph_1'|trans }}</p> | ||
14 | <p>{{ 'quickstart.intro.paragraph_2'|trans }}</p> | ||
15 | |||
16 | <h4>{{ 'quickstart.configure.title'|trans }}</h4> | ||
17 | <ul> | ||
18 | <li><a href="{{ path('config') }}">{{ 'quickstart.configure.language'|trans }}</a></li> | ||
19 | <li><a href="{{ path('config') }}#set2">{{ 'quickstart.configure.rss'|trans }}</a></li> | ||
20 | <li><a href="{{ path('config') }}#set5">{{ 'quickstart.configure.tagging_rules'|trans }}</a></li> | ||
21 | </ul> | ||
22 | |||
23 | {% if is_granted('ROLE_SUPER_ADMIN') %} | ||
24 | <h4>{{ 'quickstart.admin.title'|trans }}</h4> | ||
25 | <p>{{ 'quickstart.admin.description'|trans }}</p> | ||
26 | <ul> | ||
27 | <li><a href="{{ path('config') }}#set6">{{ 'quickstart.admin.new_user'|trans }}</a></li> | ||
28 | <li><a href="{{ path('craue_config_settings_modify') }}#set-analytics">{{ 'quickstart.admin.analytics'|trans }}</a></li> | ||
29 | <li><a href="{{ path('craue_config_settings_modify') }}#set-entry">{{ 'quickstart.admin.sharing'|trans }}</a></li> | ||
30 | <li><a href="{{ path('craue_config_settings_modify') }}#set-export">{{ 'quickstart.admin.export'|trans }}</a></li> | ||
31 | <li><a href="{{ path('craue_config_settings_modify') }}#set-import">{{ 'quickstart.admin.import'|trans }}</a></li> | ||
32 | </ul> | ||
33 | {% endif %} | ||
34 | |||
35 | <h4>{{ 'quickstart.first_steps.title'|trans }}</h4> | ||
36 | <ul> | ||
37 | <li><a href="{{ path('new') }}">{{ 'quickstart.first_steps.new_article'|trans }}</a></li> | ||
38 | <li><a href="{{ path('unread') }}">{{ 'quickstart.first_steps.unread_articles'|trans }}</a></li> | ||
39 | </ul> | ||
40 | |||
41 | <h4>{{ 'quickstart.migrate.title'|trans }}</h4> | ||
42 | <p>{{ 'quickstart.migrate.description'|trans }}</p> | ||
43 | <ul> | ||
44 | <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li> | ||
45 | <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li> | ||
46 | <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li> | ||
47 | <li><a href="{{ path('import_readability') }}">{{ 'quickstart.migrate.readability'|trans }}</a></li> | ||
48 | </ul> | ||
49 | |||
50 | <h4>{{ 'quickstart.developer.title'|trans }}</h4> | ||
51 | <ul> | ||
52 | <li><a href="{{ path('developer') }}">{{ 'quickstart.developer.create_application'|trans }}</a></li> | ||
53 | </ul> | ||
54 | |||
55 | <h4>{{ 'quickstart.docs.title'|trans }}</h4> | ||
56 | <ul> | ||
57 | <li><a href="http://doc.wallabag.org/en/master/user/annotations.html">{{ 'quickstart.docs.annotate'|trans }}</a></li> | ||
58 | <li><a href="http://doc.wallabag.org/en/master/user/download_articles.html">{{ 'quickstart.docs.export'|trans }}</a></li> | ||
59 | <li><a href="http://doc.wallabag.org/en/master/user/filters.html">{{ 'quickstart.docs.search_filters'|trans }}</a></li> | ||
60 | <li><a href="http://doc.wallabag.org/en/master/user/errors_during_fetching.html">{{ 'quickstart.docs.fetching_errors'|trans }}</a></li> | ||
61 | <li><a href="http://doc.wallabag.org/">{{ 'quickstart.docs.all_docs'|trans }}</a></li> | ||
62 | </ul> | ||
63 | |||
64 | <h4>{{ 'quickstart.support.title'|trans }}</h4> | ||
65 | <p>{{ 'quickstart.support.description'|trans }}</p> | ||
66 | <ul> | ||
67 | <li><a href="https://github.com/wallabag/wallabag/issues/">{{ 'quickstart.support.github'|trans }}</a></li> | ||
68 | <li><a href="mailto:hello@wallabag.org">{{ 'quickstart.support.email'|trans }}</a></li> | ||
69 | <li><a href="https://gitter.im/wallabag/wallabag">{{ 'quickstart.support.gitter'|trans }}</a></li> | ||
70 | </ul> | ||
71 | </div> | ||
72 | |||
73 | </div> | ||
74 | </div> | ||
75 | </div> | ||
76 | |||
77 | {% endblock %} | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig index df05e2a4..c7d6d70d 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig | |||
@@ -45,7 +45,7 @@ | |||
45 | <li class="bold {% if currentRoute == 'archive' %}active{% endif %}"> | 45 | <li class="bold {% if currentRoute == 'archive' %}active{% endif %}"> |
46 | <a class="waves-effect" href="{{ path('archive') }}">{{ 'menu.left.archive'|trans }} <span class="numberItems grey-text">{{ count_entries('archive') }}</span></a> | 46 | <a class="waves-effect" href="{{ path('archive') }}">{{ 'menu.left.archive'|trans }} <span class="numberItems grey-text">{{ count_entries('archive') }}</span></a> |
47 | </li> | 47 | </li> |
48 | <li class="bold border-bottom {% if currentRoute == 'all' %}active{% endif %}"> | 48 | <li class="bold {% if currentRoute == 'all' %}active{% endif %}"> |
49 | <a class="waves-effect" href="{{ path('all') }}">{{ 'menu.left.all_articles'|trans }} <span class="numberItems grey-text">{{ count_entries('all') }}</span></a> | 49 | <a class="waves-effect" href="{{ path('all') }}">{{ 'menu.left.all_articles'|trans }} <span class="numberItems grey-text">{{ count_entries('all') }}</span></a> |
50 | </li> | 50 | </li> |
51 | <li class="bold border-bottom {% if currentRoute == 'tags' %}active{% endif %}"> | 51 | <li class="bold border-bottom {% if currentRoute == 'tags' %}active{% endif %}"> |
@@ -55,6 +55,10 @@ | |||
55 | <a class="waves-effect" href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a> | 55 | <a class="waves-effect" href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a> |
56 | </li> | 56 | </li> |
57 | {% if is_granted('ROLE_SUPER_ADMIN') %} | 57 | {% if is_granted('ROLE_SUPER_ADMIN') %} |
58 | <li class="bold {% if currentRoute starts with 'user_' %}active{% endif %}"> | ||
59 | <a class="waves-effect" href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a> | ||
60 | </li> | ||
61 | |||
58 | <li class="bold border-bottom {% if currentRoute == 'craue_config_settings_modify' %}active{% endif %}"> | 62 | <li class="bold border-bottom {% if currentRoute == 'craue_config_settings_modify' %}active{% endif %}"> |
59 | <a class="waves-effect" href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a> | 63 | <a class="waves-effect" href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a> |
60 | </li> | 64 | </li> |
@@ -122,8 +126,19 @@ | |||
122 | <footer class="page-footer cyan darken-2"> | 126 | <footer class="page-footer cyan darken-2"> |
123 | <div class="footer-copyright"> | 127 | <div class="footer-copyright"> |
124 | <div class="container"> | 128 | <div class="container"> |
125 | <p>{{ 'footer.wallabag.powered_by'|trans }} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p> | 129 | <div class="row"> |
126 | <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a> | 130 | <div class="col s8"> |
131 | <p> | ||
132 | {{ display_stats() }} | ||
133 | </p> | ||
134 | </div> | ||
135 | <div class="col s4"> | ||
136 | <p> | ||
137 | {{ 'footer.wallabag.powered_by'|trans }} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a> – | ||
138 | <a class="grey-text text-lighten-4" href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans|lower }}</a> | ||
139 | </p> | ||
140 | </div> | ||
141 | </div> | ||
127 | </div> | 142 | </div> |
128 | </div> | 143 | </div> |
129 | </footer> | 144 | </footer> |
diff --git a/src/Wallabag/CoreBundle/Twig/WallabagExtension.php b/src/Wallabag/CoreBundle/Twig/WallabagExtension.php index fb4c7412..783cde3e 100644 --- a/src/Wallabag/CoreBundle/Twig/WallabagExtension.php +++ b/src/Wallabag/CoreBundle/Twig/WallabagExtension.php | |||
@@ -5,6 +5,7 @@ namespace Wallabag\CoreBundle\Twig; | |||
5 | use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; | 5 | use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; |
6 | use Wallabag\CoreBundle\Repository\EntryRepository; | 6 | use Wallabag\CoreBundle\Repository\EntryRepository; |
7 | use Wallabag\CoreBundle\Repository\TagRepository; | 7 | use Wallabag\CoreBundle\Repository\TagRepository; |
8 | use Symfony\Component\Translation\TranslatorInterface; | ||
8 | 9 | ||
9 | class WallabagExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface | 10 | class WallabagExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface |
10 | { | 11 | { |
@@ -12,13 +13,15 @@ class WallabagExtension extends \Twig_Extension implements \Twig_Extension_Globa | |||
12 | private $entryRepository; | 13 | private $entryRepository; |
13 | private $tagRepository; | 14 | private $tagRepository; |
14 | private $lifeTime; | 15 | private $lifeTime; |
16 | private $translator; | ||
15 | 17 | ||
16 | public function __construct(EntryRepository $entryRepository = null, TagRepository $tagRepository = null, TokenStorageInterface $tokenStorage = null, $lifeTime = 0) | 18 | public function __construct(EntryRepository $entryRepository, TagRepository $tagRepository, TokenStorageInterface $tokenStorage, $lifeTime, TranslatorInterface $translator) |
17 | { | 19 | { |
18 | $this->entryRepository = $entryRepository; | 20 | $this->entryRepository = $entryRepository; |
19 | $this->tagRepository = $tagRepository; | 21 | $this->tagRepository = $tagRepository; |
20 | $this->tokenStorage = $tokenStorage; | 22 | $this->tokenStorage = $tokenStorage; |
21 | $this->lifeTime = $lifeTime; | 23 | $this->lifeTime = $lifeTime; |
24 | $this->translator = $translator; | ||
22 | } | 25 | } |
23 | 26 | ||
24 | public function getFilters() | 27 | public function getFilters() |
@@ -33,6 +36,7 @@ class WallabagExtension extends \Twig_Extension implements \Twig_Extension_Globa | |||
33 | return array( | 36 | return array( |
34 | new \Twig_SimpleFunction('count_entries', [$this, 'countEntries']), | 37 | new \Twig_SimpleFunction('count_entries', [$this, 'countEntries']), |
35 | new \Twig_SimpleFunction('count_tags', [$this, 'countTags']), | 38 | new \Twig_SimpleFunction('count_tags', [$this, 'countTags']), |
39 | new \Twig_SimpleFunction('display_stats', [$this, 'displayStats']), | ||
36 | ); | 40 | ); |
37 | } | 41 | } |
38 | 42 | ||
@@ -107,6 +111,40 @@ class WallabagExtension extends \Twig_Extension implements \Twig_Extension_Globa | |||
107 | return $this->tagRepository->countAllTags($user->getId()); | 111 | return $this->tagRepository->countAllTags($user->getId()); |
108 | } | 112 | } |
109 | 113 | ||
114 | /** | ||
115 | * Display a single line about reading stats. | ||
116 | * | ||
117 | * @return string | ||
118 | */ | ||
119 | public function displayStats() | ||
120 | { | ||
121 | $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null; | ||
122 | |||
123 | if (null === $user || !is_object($user)) { | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | $query = $this->entryRepository->getBuilderForArchiveByUser($user->getId()) | ||
128 | ->select('e.id') | ||
129 | ->groupBy('e.id') | ||
130 | ->getQuery(); | ||
131 | |||
132 | $query->useQueryCache(true); | ||
133 | $query->useResultCache(true); | ||
134 | $query->setResultCacheLifetime($this->lifeTime); | ||
135 | |||
136 | $nbArchives = count($query->getArrayResult()); | ||
137 | |||
138 | $interval = $user->getCreatedAt()->diff(new \DateTime('now')); | ||
139 | $nbDays = (int) $interval->format('%a') ?: 1; | ||
140 | |||
141 | return $this->translator->trans('footer.stats', [ | ||
142 | '%user_creation%' => $user->getCreatedAt()->format('F jS, Y'), | ||
143 | '%nb_archives%' => $nbArchives, | ||
144 | '%per_day%' => round($nbArchives / $nbDays, 2), | ||
145 | ]); | ||
146 | } | ||
147 | |||
110 | public function getName() | 148 | public function getName() |
111 | { | 149 | { |
112 | return 'wallabag_extension'; | 150 | return 'wallabag_extension'; |
diff --git a/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php b/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php index 5f90e00f..c2c11f11 100644 --- a/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php +++ b/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php | |||
@@ -17,7 +17,7 @@ class RedisWorkerCommand extends ContainerAwareCommand | |||
17 | $this | 17 | $this |
18 | ->setName('wallabag:import:redis-worker') | 18 | ->setName('wallabag:import:redis-worker') |
19 | ->setDescription('Launch Redis worker') | 19 | ->setDescription('Launch Redis worker') |
20 | ->addArgument('serviceName', InputArgument::REQUIRED, 'Service to use: wallabag_v1, wallabag_v2, pocket or readability') | 20 | ->addArgument('serviceName', InputArgument::REQUIRED, 'Service to use: wallabag_v1, wallabag_v2, pocket, readability, firefox, chrome or instapaper') |
21 | ->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stoping', false) | 21 | ->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stoping', false) |
22 | ; | 22 | ; |
23 | } | 23 | } |
diff --git a/src/Wallabag/ImportBundle/Controller/ImportController.php b/src/Wallabag/ImportBundle/Controller/ImportController.php index 36a2a399..15de75ff 100644 --- a/src/Wallabag/ImportBundle/Controller/ImportController.php +++ b/src/Wallabag/ImportBundle/Controller/ImportController.php | |||
@@ -38,7 +38,11 @@ class ImportController extends Controller | |||
38 | $nbRabbitMessages = $this->getTotalMessageInRabbitQueue('pocket') | 38 | $nbRabbitMessages = $this->getTotalMessageInRabbitQueue('pocket') |
39 | + $this->getTotalMessageInRabbitQueue('readability') | 39 | + $this->getTotalMessageInRabbitQueue('readability') |
40 | + $this->getTotalMessageInRabbitQueue('wallabag_v1') | 40 | + $this->getTotalMessageInRabbitQueue('wallabag_v1') |
41 | + $this->getTotalMessageInRabbitQueue('wallabag_v2'); | 41 | + $this->getTotalMessageInRabbitQueue('wallabag_v2') |
42 | + $this->getTotalMessageInRabbitQueue('firefox') | ||
43 | + $this->getTotalMessageInRabbitQueue('chrome') | ||
44 | + $this->getTotalMessageInRabbitQueue('instapaper') | ||
45 | ; | ||
42 | } catch (\Exception $e) { | 46 | } catch (\Exception $e) { |
43 | $rabbitNotInstalled = true; | 47 | $rabbitNotInstalled = true; |
44 | } | 48 | } |
@@ -49,7 +53,11 @@ class ImportController extends Controller | |||
49 | $nbRedisMessages = $redis->llen('wallabag.import.pocket') | 53 | $nbRedisMessages = $redis->llen('wallabag.import.pocket') |
50 | + $redis->llen('wallabag.import.readability') | 54 | + $redis->llen('wallabag.import.readability') |
51 | + $redis->llen('wallabag.import.wallabag_v1') | 55 | + $redis->llen('wallabag.import.wallabag_v1') |
52 | + $redis->llen('wallabag.import.wallabag_v2'); | 56 | + $redis->llen('wallabag.import.wallabag_v2') |
57 | + $redis->llen('wallabag.import.firefox') | ||
58 | + $redis->llen('wallabag.import.chrome') | ||
59 | + $redis->llen('wallabag.import.instapaper') | ||
60 | ; | ||
53 | } catch (\Exception $e) { | 61 | } catch (\Exception $e) { |
54 | $redisNotInstalled = true; | 62 | $redisNotInstalled = true; |
55 | } | 63 | } |
diff --git a/src/Wallabag/ImportBundle/Controller/InstapaperController.php b/src/Wallabag/ImportBundle/Controller/InstapaperController.php new file mode 100644 index 00000000..c3fc8a39 --- /dev/null +++ b/src/Wallabag/ImportBundle/Controller/InstapaperController.php | |||
@@ -0,0 +1,77 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\ImportBundle\Controller; | ||
4 | |||
5 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
6 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | ||
7 | use Symfony\Component\HttpFoundation\Request; | ||
8 | use Wallabag\ImportBundle\Form\Type\UploadImportType; | ||
9 | |||
10 | class InstapaperController extends Controller | ||
11 | { | ||
12 | /** | ||
13 | * @Route("/instapaper", name="import_instapaper") | ||
14 | */ | ||
15 | public function indexAction(Request $request) | ||
16 | { | ||
17 | $form = $this->createForm(UploadImportType::class); | ||
18 | $form->handleRequest($request); | ||
19 | |||
20 | $instapaper = $this->get('wallabag_import.instapaper.import'); | ||
21 | $instapaper->setUser($this->getUser()); | ||
22 | |||
23 | if ($this->get('craue_config')->get('import_with_rabbitmq')) { | ||
24 | $instapaper->setProducer($this->get('old_sound_rabbit_mq.import_instapaper_producer')); | ||
25 | } elseif ($this->get('craue_config')->get('import_with_redis')) { | ||
26 | $instapaper->setProducer($this->get('wallabag_import.producer.redis.instapaper')); | ||
27 | } | ||
28 | |||
29 | if ($form->isValid()) { | ||
30 | $file = $form->get('file')->getData(); | ||
31 | $markAsRead = $form->get('mark_as_read')->getData(); | ||
32 | $name = 'instapaper_'.$this->getUser()->getId().'.csv'; | ||
33 | |||
34 | if (null !== $file && in_array($file->getClientMimeType(), $this->getParameter('wallabag_import.allow_mimetypes')) && $file->move($this->getParameter('wallabag_import.resource_dir'), $name)) { | ||
35 | $res = $instapaper | ||
36 | ->setFilepath($this->getParameter('wallabag_import.resource_dir').'/'.$name) | ||
37 | ->setMarkAsRead($markAsRead) | ||
38 | ->import(); | ||
39 | |||
40 | $message = 'flashes.import.notice.failed'; | ||
41 | |||
42 | if (true === $res) { | ||
43 | $summary = $instapaper->getSummary(); | ||
44 | $message = $this->get('translator')->trans('flashes.import.notice.summary', [ | ||
45 | '%imported%' => $summary['imported'], | ||
46 | '%skipped%' => $summary['skipped'], | ||
47 | ]); | ||
48 | |||
49 | if (0 < $summary['queued']) { | ||
50 | $message = $this->get('translator')->trans('flashes.import.notice.summary_with_queue', [ | ||
51 | '%queued%' => $summary['queued'], | ||
52 | ]); | ||
53 | } | ||
54 | |||
55 | unlink($this->getParameter('wallabag_import.resource_dir').'/'.$name); | ||
56 | } | ||
57 | |||
58 | $this->get('session')->getFlashBag()->add( | ||
59 | 'notice', | ||
60 | $message | ||
61 | ); | ||
62 | |||
63 | return $this->redirect($this->generateUrl('homepage')); | ||
64 | } else { | ||
65 | $this->get('session')->getFlashBag()->add( | ||
66 | 'notice', | ||
67 | 'flashes.import.notice.failed_on_file' | ||
68 | ); | ||
69 | } | ||
70 | } | ||
71 | |||
72 | return $this->render('WallabagImportBundle:Instapaper:index.html.twig', [ | ||
73 | 'form' => $form->createView(), | ||
74 | 'import' => $instapaper, | ||
75 | ]); | ||
76 | } | ||
77 | } | ||
diff --git a/src/Wallabag/ImportBundle/Import/AbstractImport.php b/src/Wallabag/ImportBundle/Import/AbstractImport.php index a1a14576..764b390a 100644 --- a/src/Wallabag/ImportBundle/Import/AbstractImport.php +++ b/src/Wallabag/ImportBundle/Import/AbstractImport.php | |||
@@ -106,6 +106,10 @@ abstract class AbstractImport implements ImportInterface | |||
106 | $i = 1; | 106 | $i = 1; |
107 | 107 | ||
108 | foreach ($entries as $importedEntry) { | 108 | foreach ($entries as $importedEntry) { |
109 | if ($this->markAsRead) { | ||
110 | $importedEntry = $this->setEntryAsRead($importedEntry); | ||
111 | } | ||
112 | |||
109 | $entry = $this->parseEntry($importedEntry); | 113 | $entry = $this->parseEntry($importedEntry); |
110 | 114 | ||
111 | if (null === $entry) { | 115 | if (null === $entry) { |
diff --git a/src/Wallabag/ImportBundle/Import/BrowserImport.php b/src/Wallabag/ImportBundle/Import/BrowserImport.php index e15443c4..9d75685b 100644 --- a/src/Wallabag/ImportBundle/Import/BrowserImport.php +++ b/src/Wallabag/ImportBundle/Import/BrowserImport.php | |||
@@ -45,6 +45,8 @@ abstract class BrowserImport extends AbstractImport | |||
45 | $data = json_decode(file_get_contents($this->filepath), true); | 45 | $data = json_decode(file_get_contents($this->filepath), true); |
46 | 46 | ||
47 | if (empty($data)) { | 47 | if (empty($data)) { |
48 | $this->logger->error('Wallabag Browser: no entries in imported file'); | ||
49 | |||
48 | return false; | 50 | return false; |
49 | } | 51 | } |
50 | 52 | ||
diff --git a/src/Wallabag/ImportBundle/Import/InstapaperImport.php b/src/Wallabag/ImportBundle/Import/InstapaperImport.php new file mode 100644 index 00000000..cf4c785c --- /dev/null +++ b/src/Wallabag/ImportBundle/Import/InstapaperImport.php | |||
@@ -0,0 +1,140 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\ImportBundle\Import; | ||
4 | |||
5 | use Wallabag\CoreBundle\Entity\Entry; | ||
6 | |||
7 | class InstapaperImport extends AbstractImport | ||
8 | { | ||
9 | private $filepath; | ||
10 | |||
11 | /** | ||
12 | * {@inheritdoc} | ||
13 | */ | ||
14 | public function getName() | ||
15 | { | ||
16 | return 'Instapaper'; | ||
17 | } | ||
18 | |||
19 | /** | ||
20 | * {@inheritdoc} | ||
21 | */ | ||
22 | public function getUrl() | ||
23 | { | ||
24 | return 'import_instapaper'; | ||
25 | } | ||
26 | |||
27 | /** | ||
28 | * {@inheritdoc} | ||
29 | */ | ||
30 | public function getDescription() | ||
31 | { | ||
32 | return 'import.instapaper.description'; | ||
33 | } | ||
34 | |||
35 | /** | ||
36 | * Set file path to the json file. | ||
37 | * | ||
38 | * @param string $filepath | ||
39 | */ | ||
40 | public function setFilepath($filepath) | ||
41 | { | ||
42 | $this->filepath = $filepath; | ||
43 | |||
44 | return $this; | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * {@inheritdoc} | ||
49 | */ | ||
50 | public function import() | ||
51 | { | ||
52 | if (!$this->user) { | ||
53 | $this->logger->error('InstapaperImport: user is not defined'); | ||
54 | |||
55 | return false; | ||
56 | } | ||
57 | |||
58 | if (!file_exists($this->filepath) || !is_readable($this->filepath)) { | ||
59 | $this->logger->error('InstapaperImport: unable to read file', ['filepath' => $this->filepath]); | ||
60 | |||
61 | return false; | ||
62 | } | ||
63 | |||
64 | $entries = []; | ||
65 | $handle = fopen($this->filepath, 'r'); | ||
66 | while (($data = fgetcsv($handle, 10240)) !== false) { | ||
67 | if ('URL' === $data[0]) { | ||
68 | continue; | ||
69 | } | ||
70 | |||
71 | $entries[] = [ | ||
72 | 'url' => $data[0], | ||
73 | 'title' => $data[1], | ||
74 | 'status' => $data[3], | ||
75 | 'is_archived' => $data[3] === 'Archive' || $data[3] === 'Starred', | ||
76 | 'is_starred' => $data[3] === 'Starred', | ||
77 | 'content_type' => '', | ||
78 | 'language' => '', | ||
79 | ]; | ||
80 | } | ||
81 | fclose($handle); | ||
82 | |||
83 | if (empty($entries)) { | ||
84 | $this->logger->error('InstapaperImport: no entries in imported file'); | ||
85 | |||
86 | return false; | ||
87 | } | ||
88 | |||
89 | if ($this->producer) { | ||
90 | $this->parseEntriesForProducer($entries); | ||
91 | |||
92 | return true; | ||
93 | } | ||
94 | |||
95 | $this->parseEntries($entries); | ||
96 | |||
97 | return true; | ||
98 | } | ||
99 | |||
100 | /** | ||
101 | * {@inheritdoc} | ||
102 | */ | ||
103 | public function parseEntry(array $importedEntry) | ||
104 | { | ||
105 | $existingEntry = $this->em | ||
106 | ->getRepository('WallabagCoreBundle:Entry') | ||
107 | ->findByUrlAndUserId($importedEntry['url'], $this->user->getId()); | ||
108 | |||
109 | if (false !== $existingEntry) { | ||
110 | ++$this->skippedEntries; | ||
111 | |||
112 | return; | ||
113 | } | ||
114 | |||
115 | $entry = new Entry($this->user); | ||
116 | $entry->setUrl($importedEntry['url']); | ||
117 | $entry->setTitle($importedEntry['title']); | ||
118 | |||
119 | // update entry with content (in case fetching failed, the given entry will be return) | ||
120 | $entry = $this->fetchContent($entry, $importedEntry['url'], $importedEntry); | ||
121 | |||
122 | $entry->setArchived($importedEntry['is_archived']); | ||
123 | $entry->setStarred($importedEntry['is_starred']); | ||
124 | |||
125 | $this->em->persist($entry); | ||
126 | ++$this->importedEntries; | ||
127 | |||
128 | return $entry; | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * {@inheritdoc} | ||
133 | */ | ||
134 | protected function setEntryAsRead(array $importedEntry) | ||
135 | { | ||
136 | $importedEntry['is_archived'] = 1; | ||
137 | |||
138 | return $importedEntry; | ||
139 | } | ||
140 | } | ||
diff --git a/src/Wallabag/ImportBundle/Import/ReadabilityImport.php b/src/Wallabag/ImportBundle/Import/ReadabilityImport.php index fa2b7053..b8c0f777 100644 --- a/src/Wallabag/ImportBundle/Import/ReadabilityImport.php +++ b/src/Wallabag/ImportBundle/Import/ReadabilityImport.php | |||
@@ -64,6 +64,8 @@ class ReadabilityImport extends AbstractImport | |||
64 | $data = json_decode(file_get_contents($this->filepath), true); | 64 | $data = json_decode(file_get_contents($this->filepath), true); |
65 | 65 | ||
66 | if (empty($data) || empty($data['bookmarks'])) { | 66 | if (empty($data) || empty($data['bookmarks'])) { |
67 | $this->logger->error('ReadabilityImport: no entries in imported file'); | ||
68 | |||
67 | return false; | 69 | return false; |
68 | } | 70 | } |
69 | 71 | ||
diff --git a/src/Wallabag/ImportBundle/Import/WallabagImport.php b/src/Wallabag/ImportBundle/Import/WallabagImport.php index 3754e4a9..702da057 100644 --- a/src/Wallabag/ImportBundle/Import/WallabagImport.php +++ b/src/Wallabag/ImportBundle/Import/WallabagImport.php | |||
@@ -58,6 +58,8 @@ abstract class WallabagImport extends AbstractImport | |||
58 | $data = json_decode(file_get_contents($this->filepath), true); | 58 | $data = json_decode(file_get_contents($this->filepath), true); |
59 | 59 | ||
60 | if (empty($data)) { | 60 | if (empty($data)) { |
61 | $this->logger->error('WallabagImport: no entries in imported file'); | ||
62 | |||
61 | return false; | 63 | return false; |
62 | } | 64 | } |
63 | 65 | ||
diff --git a/src/Wallabag/ImportBundle/Resources/config/rabbit.yml b/src/Wallabag/ImportBundle/Resources/config/rabbit.yml index 6ada6302..70b8a0d4 100644 --- a/src/Wallabag/ImportBundle/Resources/config/rabbit.yml +++ b/src/Wallabag/ImportBundle/Resources/config/rabbit.yml | |||
@@ -14,6 +14,13 @@ services: | |||
14 | - "@wallabag_user.user_repository" | 14 | - "@wallabag_user.user_repository" |
15 | - "@wallabag_import.readability.import" | 15 | - "@wallabag_import.readability.import" |
16 | - "@logger" | 16 | - "@logger" |
17 | wallabag_import.consumer.amqp.instapaper: | ||
18 | class: Wallabag\ImportBundle\Consumer\AMQPEntryConsumer | ||
19 | arguments: | ||
20 | - "@doctrine.orm.entity_manager" | ||
21 | - "@wallabag_user.user_repository" | ||
22 | - "@wallabag_import.instapaper.import" | ||
23 | - "@logger" | ||
17 | wallabag_import.consumer.amqp.wallabag_v1: | 24 | wallabag_import.consumer.amqp.wallabag_v1: |
18 | class: Wallabag\ImportBundle\Consumer\AMQPEntryConsumer | 25 | class: Wallabag\ImportBundle\Consumer\AMQPEntryConsumer |
19 | arguments: | 26 | arguments: |
diff --git a/src/Wallabag/ImportBundle/Resources/config/redis.yml b/src/Wallabag/ImportBundle/Resources/config/redis.yml index c9c2cf26..0a81e1b5 100644 --- a/src/Wallabag/ImportBundle/Resources/config/redis.yml +++ b/src/Wallabag/ImportBundle/Resources/config/redis.yml | |||
@@ -20,6 +20,26 @@ services: | |||
20 | - "@wallabag_import.readability.import" | 20 | - "@wallabag_import.readability.import" |
21 | - "@logger" | 21 | - "@logger" |
22 | 22 | ||
23 | # instapaper | ||
24 | wallabag_import.queue.redis.instapaper: | ||
25 | class: Simpleue\Queue\RedisQueue | ||
26 | arguments: | ||
27 | - "@wallabag_core.redis.client" | ||
28 | - "wallabag.import.instapaper" | ||
29 | |||
30 | wallabag_import.producer.redis.instapaper: | ||
31 | class: Wallabag\ImportBundle\Redis\Producer | ||
32 | arguments: | ||
33 | - "@wallabag_import.queue.redis.instapaper" | ||
34 | |||
35 | wallabag_import.consumer.redis.instapaper: | ||
36 | class: Wallabag\ImportBundle\Consumer\RedisEntryConsumer | ||
37 | arguments: | ||
38 | - "@doctrine.orm.entity_manager" | ||
39 | - "@wallabag_user.user_repository" | ||
40 | - "@wallabag_import.instapaper.import" | ||
41 | - "@logger" | ||
42 | |||
23 | 43 | ||
24 | wallabag_import.queue.redis.pocket: | 44 | wallabag_import.queue.redis.pocket: |
25 | class: Simpleue\Queue\RedisQueue | 45 | class: Simpleue\Queue\RedisQueue |
diff --git a/src/Wallabag/ImportBundle/Resources/config/services.yml b/src/Wallabag/ImportBundle/Resources/config/services.yml index 990f336d..89adc71b 100644 --- a/src/Wallabag/ImportBundle/Resources/config/services.yml +++ b/src/Wallabag/ImportBundle/Resources/config/services.yml | |||
@@ -57,6 +57,16 @@ services: | |||
57 | tags: | 57 | tags: |
58 | - { name: wallabag_import.import, alias: readability } | 58 | - { name: wallabag_import.import, alias: readability } |
59 | 59 | ||
60 | wallabag_import.instapaper.import: | ||
61 | class: Wallabag\ImportBundle\Import\InstapaperImport | ||
62 | arguments: | ||
63 | - "@doctrine.orm.entity_manager" | ||
64 | - "@wallabag_core.content_proxy" | ||
65 | calls: | ||
66 | - [ setLogger, [ "@logger" ]] | ||
67 | tags: | ||
68 | - { name: wallabag_import.import, alias: instapaper } | ||
69 | |||
60 | wallabag_import.firefox.import: | 70 | wallabag_import.firefox.import: |
61 | class: Wallabag\ImportBundle\Import\FirefoxImport | 71 | class: Wallabag\ImportBundle\Import\FirefoxImport |
62 | arguments: | 72 | arguments: |
diff --git a/src/Wallabag/ImportBundle/Resources/views/Instapaper/index.html.twig b/src/Wallabag/ImportBundle/Resources/views/Instapaper/index.html.twig new file mode 100644 index 00000000..5789361f --- /dev/null +++ b/src/Wallabag/ImportBundle/Resources/views/Instapaper/index.html.twig | |||
@@ -0,0 +1,45 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'import.instapaper.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | <div class="row"> | ||
7 | <div class="col s12"> | ||
8 | <div class="card-panel settings"> | ||
9 | {% include 'WallabagImportBundle:Import:_workerEnabled.html.twig' %} | ||
10 | |||
11 | <div class="row"> | ||
12 | <blockquote>{{ import.description|trans }}</blockquote> | ||
13 | <p>{{ 'import.instapaper.how_to'|trans }}</p> | ||
14 | |||
15 | <div class="col s12"> | ||
16 | {{ form_start(form, {'method': 'POST'}) }} | ||
17 | {{ form_errors(form) }} | ||
18 | <div class="row"> | ||
19 | <div class="file-field input-field col s12"> | ||
20 | {{ form_errors(form.file) }} | ||
21 | <div class="btn"> | ||
22 | <span>{{ form.file.vars.label|trans }}</span> | ||
23 | {{ form_widget(form.file) }} | ||
24 | </div> | ||
25 | <div class="file-path-wrapper"> | ||
26 | <input class="file-path validate" type="text"> | ||
27 | </div> | ||
28 | </div> | ||
29 | <div class="input-field col s6 with-checkbox"> | ||
30 | <h6>{{ 'import.form.mark_as_read_title'|trans }}</h6> | ||
31 | {{ form_widget(form.mark_as_read) }} | ||
32 | {{ form_label(form.mark_as_read) }} | ||
33 | </div> | ||
34 | </div> | ||
35 | |||
36 | {{ form_widget(form.save, { 'attr': {'class': 'btn waves-effect waves-light'} }) }} | ||
37 | |||
38 | {{ form_rest(form) }} | ||
39 | </form> | ||
40 | </div> | ||
41 | </div> | ||
42 | </div> | ||
43 | </div> | ||
44 | </div> | ||
45 | {% endblock %} | ||
diff --git a/src/Wallabag/UserBundle/Controller/ManageController.php b/src/Wallabag/UserBundle/Controller/ManageController.php new file mode 100644 index 00000000..92ee2b41 --- /dev/null +++ b/src/Wallabag/UserBundle/Controller/ManageController.php | |||
@@ -0,0 +1,149 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\UserBundle\Controller; | ||
4 | |||
5 | use FOS\UserBundle\Event\UserEvent; | ||
6 | use FOS\UserBundle\FOSUserEvents; | ||
7 | use Symfony\Component\HttpFoundation\Request; | ||
8 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
9 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; | ||
10 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | ||
11 | use Wallabag\UserBundle\Entity\User; | ||
12 | use Wallabag\CoreBundle\Entity\Config; | ||
13 | |||
14 | /** | ||
15 | * User controller. | ||
16 | */ | ||
17 | class ManageController extends Controller | ||
18 | { | ||
19 | /** | ||
20 | * Lists all User entities. | ||
21 | * | ||
22 | * @Route("/", name="user_index") | ||
23 | * @Method("GET") | ||
24 | */ | ||
25 | public function indexAction() | ||
26 | { | ||
27 | $em = $this->getDoctrine()->getManager(); | ||
28 | |||
29 | $users = $em->getRepository('WallabagUserBundle:User')->findAll(); | ||
30 | |||
31 | return $this->render('WallabagUserBundle:Manage:index.html.twig', array( | ||
32 | 'users' => $users, | ||
33 | )); | ||
34 | } | ||
35 | |||
36 | /** | ||
37 | * Creates a new User entity. | ||
38 | * | ||
39 | * @Route("/new", name="user_new") | ||
40 | * @Method({"GET", "POST"}) | ||
41 | */ | ||
42 | public function newAction(Request $request) | ||
43 | { | ||
44 | $userManager = $this->container->get('fos_user.user_manager'); | ||
45 | |||
46 | $user = $userManager->createUser(); | ||
47 | // enable created user by default | ||
48 | $user->setEnabled(true); | ||
49 | |||
50 | $form = $this->createForm('Wallabag\UserBundle\Form\NewUserType', $user, [ | ||
51 | 'validation_groups' => ['Profile'], | ||
52 | ]); | ||
53 | $form->handleRequest($request); | ||
54 | |||
55 | if ($form->isSubmitted() && $form->isValid()) { | ||
56 | $userManager->updateUser($user); | ||
57 | |||
58 | // dispatch a created event so the associated config will be created | ||
59 | $event = new UserEvent($user, $request); | ||
60 | $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); | ||
61 | |||
62 | $this->get('session')->getFlashBag()->add( | ||
63 | 'notice', | ||
64 | $this->get('translator')->trans('flashes.user.notice.added', ['%username%' => $user->getUsername()]) | ||
65 | ); | ||
66 | |||
67 | return $this->redirectToRoute('user_edit', array('id' => $user->getId())); | ||
68 | } | ||
69 | |||
70 | return $this->render('WallabagUserBundle:Manage:new.html.twig', array( | ||
71 | 'user' => $user, | ||
72 | 'form' => $form->createView(), | ||
73 | )); | ||
74 | } | ||
75 | |||
76 | /** | ||
77 | * Displays a form to edit an existing User entity. | ||
78 | * | ||
79 | * @Route("/{id}/edit", name="user_edit") | ||
80 | * @Method({"GET", "POST"}) | ||
81 | */ | ||
82 | public function editAction(Request $request, User $user) | ||
83 | { | ||
84 | $deleteForm = $this->createDeleteForm($user); | ||
85 | $editForm = $this->createForm('Wallabag\UserBundle\Form\UserType', $user); | ||
86 | $editForm->handleRequest($request); | ||
87 | |||
88 | if ($editForm->isSubmitted() && $editForm->isValid()) { | ||
89 | $em = $this->getDoctrine()->getManager(); | ||
90 | $em->persist($user); | ||
91 | $em->flush(); | ||
92 | |||
93 | $this->get('session')->getFlashBag()->add( | ||
94 | 'notice', | ||
95 | $this->get('translator')->trans('flashes.user.notice.updated', ['%username%' => $user->getUsername()]) | ||
96 | ); | ||
97 | |||
98 | return $this->redirectToRoute('user_edit', array('id' => $user->getId())); | ||
99 | } | ||
100 | |||
101 | return $this->render('WallabagUserBundle:Manage:edit.html.twig', array( | ||
102 | 'user' => $user, | ||
103 | 'edit_form' => $editForm->createView(), | ||
104 | 'delete_form' => $deleteForm->createView(), | ||
105 | 'twofactor_auth' => $this->getParameter('twofactor_auth'), | ||
106 | )); | ||
107 | } | ||
108 | |||
109 | /** | ||
110 | * Deletes a User entity. | ||
111 | * | ||
112 | * @Route("/{id}", name="user_delete") | ||
113 | * @Method("DELETE") | ||
114 | */ | ||
115 | public function deleteAction(Request $request, User $user) | ||
116 | { | ||
117 | $form = $this->createDeleteForm($user); | ||
118 | $form->handleRequest($request); | ||
119 | |||
120 | if ($form->isSubmitted() && $form->isValid()) { | ||
121 | $this->get('session')->getFlashBag()->add( | ||
122 | 'notice', | ||
123 | $this->get('translator')->trans('flashes.user.notice.deleted', ['%username%' => $user->getUsername()]) | ||
124 | ); | ||
125 | |||
126 | $em = $this->getDoctrine()->getManager(); | ||
127 | $em->remove($user); | ||
128 | $em->flush(); | ||
129 | } | ||
130 | |||
131 | return $this->redirectToRoute('user_index'); | ||
132 | } | ||
133 | |||
134 | /** | ||
135 | * Creates a form to delete a User entity. | ||
136 | * | ||
137 | * @param User $user The User entity | ||
138 | * | ||
139 | * @return \Symfony\Component\Form\Form The form | ||
140 | */ | ||
141 | private function createDeleteForm(User $user) | ||
142 | { | ||
143 | return $this->createFormBuilder() | ||
144 | ->setAction($this->generateUrl('user_delete', array('id' => $user->getId()))) | ||
145 | ->setMethod('DELETE') | ||
146 | ->getForm() | ||
147 | ; | ||
148 | } | ||
149 | } | ||
diff --git a/src/Wallabag/UserBundle/Entity/User.php b/src/Wallabag/UserBundle/Entity/User.php index dfed8e47..d98ae76a 100644 --- a/src/Wallabag/UserBundle/Entity/User.php +++ b/src/Wallabag/UserBundle/Entity/User.php | |||
@@ -64,7 +64,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
64 | protected $entries; | 64 | protected $entries; |
65 | 65 | ||
66 | /** | 66 | /** |
67 | * @ORM\OneToOne(targetEntity="Wallabag\CoreBundle\Entity\Config", mappedBy="user") | 67 | * @ORM\OneToOne(targetEntity="Wallabag\CoreBundle\Entity\Config", mappedBy="user", cascade={"remove"}) |
68 | */ | 68 | */ |
69 | protected $config; | 69 | protected $config; |
70 | 70 | ||
diff --git a/src/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListener.php b/src/Wallabag/UserBundle/EventListener/CreateConfigListener.php index 10586126..15f4ac3d 100644 --- a/src/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListener.php +++ b/src/Wallabag/UserBundle/EventListener/CreateConfigListener.php | |||
@@ -1,39 +1,49 @@ | |||
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | namespace Wallabag\CoreBundle\EventListener; | 3 | namespace Wallabag\UserBundle\EventListener; |
4 | 4 | ||
5 | use Doctrine\ORM\EntityManager; | 5 | use Doctrine\ORM\EntityManager; |
6 | use FOS\UserBundle\Event\FilterUserResponseEvent; | 6 | use FOS\UserBundle\Event\UserEvent; |
7 | use FOS\UserBundle\FOSUserEvents; | 7 | use FOS\UserBundle\FOSUserEvents; |
8 | use Symfony\Component\EventDispatcher\EventDispatcherInterface; | 8 | use Symfony\Component\EventDispatcher\EventDispatcherInterface; |
9 | use Symfony\Component\EventDispatcher\EventSubscriberInterface; | 9 | use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
10 | use Wallabag\CoreBundle\Entity\Config; | 10 | use Wallabag\CoreBundle\Entity\Config; |
11 | 11 | ||
12 | class RegistrationConfirmedListener implements EventSubscriberInterface | 12 | /** |
13 | * This listener will create the associated configuration when a user register. | ||
14 | * This configuration will be created right after the registration (no matter if it needs an email validation). | ||
15 | */ | ||
16 | class CreateConfigListener implements EventSubscriberInterface | ||
13 | { | 17 | { |
14 | private $em; | 18 | private $em; |
15 | private $theme; | 19 | private $theme; |
16 | private $itemsOnPage; | 20 | private $itemsOnPage; |
17 | private $rssLimit; | 21 | private $rssLimit; |
18 | private $language; | 22 | private $language; |
23 | private $readingSpeed; | ||
19 | 24 | ||
20 | public function __construct(EntityManager $em, $theme, $itemsOnPage, $rssLimit, $language) | 25 | public function __construct(EntityManager $em, $theme, $itemsOnPage, $rssLimit, $language, $readingSpeed) |
21 | { | 26 | { |
22 | $this->em = $em; | 27 | $this->em = $em; |
23 | $this->theme = $theme; | 28 | $this->theme = $theme; |
24 | $this->itemsOnPage = $itemsOnPage; | 29 | $this->itemsOnPage = $itemsOnPage; |
25 | $this->rssLimit = $rssLimit; | 30 | $this->rssLimit = $rssLimit; |
26 | $this->language = $language; | 31 | $this->language = $language; |
32 | $this->readingSpeed = $readingSpeed; | ||
27 | } | 33 | } |
28 | 34 | ||
29 | public static function getSubscribedEvents() | 35 | public static function getSubscribedEvents() |
30 | { | 36 | { |
31 | return [ | 37 | return [ |
32 | FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate', | 38 | // when a user register using the normal form |
39 | FOSUserEvents::REGISTRATION_COMPLETED => 'createConfig', | ||
40 | // when we manually create a user using the command line | ||
41 | // OR when we create it from the config UI | ||
42 | FOSUserEvents::USER_CREATED => 'createConfig', | ||
33 | ]; | 43 | ]; |
34 | } | 44 | } |
35 | 45 | ||
36 | public function authenticate(FilterUserResponseEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null) | 46 | public function createConfig(UserEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null) |
37 | { | 47 | { |
38 | if (!$event->getUser()->isEnabled()) { | 48 | if (!$event->getUser()->isEnabled()) { |
39 | return; | 49 | return; |
@@ -44,6 +54,8 @@ class RegistrationConfirmedListener implements EventSubscriberInterface | |||
44 | $config->setItemsPerPage($this->itemsOnPage); | 54 | $config->setItemsPerPage($this->itemsOnPage); |
45 | $config->setRssLimit($this->rssLimit); | 55 | $config->setRssLimit($this->rssLimit); |
46 | $config->setLanguage($this->language); | 56 | $config->setLanguage($this->language); |
57 | $config->setReadingSpeed($this->readingSpeed); | ||
58 | |||
47 | $this->em->persist($config); | 59 | $this->em->persist($config); |
48 | $this->em->flush(); | 60 | $this->em->flush(); |
49 | } | 61 | } |
diff --git a/src/Wallabag/CoreBundle/Form/Type/NewUserType.php b/src/Wallabag/UserBundle/Form/NewUserType.php index 6a6f63d1..ad5a2405 100644 --- a/src/Wallabag/CoreBundle/Form/Type/NewUserType.php +++ b/src/Wallabag/UserBundle/Form/NewUserType.php | |||
@@ -1,6 +1,6 @@ | |||
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | namespace Wallabag\CoreBundle\Form\Type; | 3 | namespace Wallabag\UserBundle\Form; |
4 | 4 | ||
5 | use Symfony\Component\Form\AbstractType; | 5 | use Symfony\Component\Form\AbstractType; |
6 | use Symfony\Component\Form\Extension\Core\Type\EmailType; | 6 | use Symfony\Component\Form\Extension\Core\Type\EmailType; |
@@ -19,13 +19,13 @@ class NewUserType extends AbstractType | |||
19 | $builder | 19 | $builder |
20 | ->add('username', TextType::class, [ | 20 | ->add('username', TextType::class, [ |
21 | 'required' => true, | 21 | 'required' => true, |
22 | 'label' => 'config.form_new_user.username_label', | 22 | 'label' => 'user.form.username_label', |
23 | ]) | 23 | ]) |
24 | ->add('plainPassword', RepeatedType::class, [ | 24 | ->add('plainPassword', RepeatedType::class, [ |
25 | 'type' => PasswordType::class, | 25 | 'type' => PasswordType::class, |
26 | 'invalid_message' => 'validator.password_must_match', | 26 | 'invalid_message' => 'validator.password_must_match', |
27 | 'first_options' => ['label' => 'config.form_new_user.password_label'], | 27 | 'first_options' => ['label' => 'user.form.password_label'], |
28 | 'second_options' => ['label' => 'config.form_new_user.repeat_new_password_label'], | 28 | 'second_options' => ['label' => 'user.form.repeat_new_password_label'], |
29 | 'constraints' => [ | 29 | 'constraints' => [ |
30 | new Constraints\Length([ | 30 | new Constraints\Length([ |
31 | 'min' => 8, | 31 | 'min' => 8, |
@@ -33,13 +33,13 @@ class NewUserType extends AbstractType | |||
33 | ]), | 33 | ]), |
34 | new Constraints\NotBlank(), | 34 | new Constraints\NotBlank(), |
35 | ], | 35 | ], |
36 | 'label' => 'config.form_new_user.plain_password_label', | 36 | 'label' => 'user.form.plain_password_label', |
37 | ]) | 37 | ]) |
38 | ->add('email', EmailType::class, [ | 38 | ->add('email', EmailType::class, [ |
39 | 'label' => 'config.form_new_user.email_label', | 39 | 'label' => 'user.form.email_label', |
40 | ]) | 40 | ]) |
41 | ->add('save', SubmitType::class, [ | 41 | ->add('save', SubmitType::class, [ |
42 | 'label' => 'config.form.save', | 42 | 'label' => 'user.form.save', |
43 | ]) | 43 | ]) |
44 | ; | 44 | ; |
45 | } | 45 | } |
diff --git a/src/Wallabag/UserBundle/Form/UserType.php b/src/Wallabag/UserBundle/Form/UserType.php new file mode 100644 index 00000000..cfa67793 --- /dev/null +++ b/src/Wallabag/UserBundle/Form/UserType.php | |||
@@ -0,0 +1,61 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\UserBundle\Form; | ||
4 | |||
5 | use Symfony\Component\Form\AbstractType; | ||
6 | use Symfony\Component\Form\FormBuilderInterface; | ||
7 | use Symfony\Component\OptionsResolver\OptionsResolver; | ||
8 | use Symfony\Component\Form\Extension\Core\Type\CheckboxType; | ||
9 | use Symfony\Component\Form\Extension\Core\Type\SubmitType; | ||
10 | use Symfony\Component\Form\Extension\Core\Type\TextType; | ||
11 | use Symfony\Component\Form\Extension\Core\Type\EmailType; | ||
12 | |||
13 | class UserType extends AbstractType | ||
14 | { | ||
15 | /** | ||
16 | * @param FormBuilderInterface $builder | ||
17 | * @param array $options | ||
18 | */ | ||
19 | public function buildForm(FormBuilderInterface $builder, array $options) | ||
20 | { | ||
21 | $builder | ||
22 | ->add('name', TextType::class, [ | ||
23 | 'required' => false, | ||
24 | 'label' => 'user.form.name_label', | ||
25 | ]) | ||
26 | ->add('username', TextType::class, [ | ||
27 | 'required' => true, | ||
28 | 'label' => 'user.form.username_label', | ||
29 | ]) | ||
30 | ->add('email', EmailType::class, [ | ||
31 | 'required' => true, | ||
32 | 'label' => 'user.form.email_label', | ||
33 | ]) | ||
34 | ->add('enabled', CheckboxType::class, [ | ||
35 | 'required' => false, | ||
36 | 'label' => 'user.form.enabled_label', | ||
37 | ]) | ||
38 | ->add('locked', CheckboxType::class, [ | ||
39 | 'required' => false, | ||
40 | 'label' => 'user.form.locked_label', | ||
41 | ]) | ||
42 | ->add('twoFactorAuthentication', CheckboxType::class, [ | ||
43 | 'required' => false, | ||
44 | 'label' => 'user.form.twofactor_label', | ||
45 | ]) | ||
46 | ->add('save', SubmitType::class, [ | ||
47 | 'label' => 'user.form.save', | ||
48 | ]) | ||
49 | ; | ||
50 | } | ||
51 | |||
52 | /** | ||
53 | * @param OptionsResolver $resolver | ||
54 | */ | ||
55 | public function configureOptions(OptionsResolver $resolver) | ||
56 | { | ||
57 | $resolver->setDefaults(array( | ||
58 | 'data_class' => 'Wallabag\UserBundle\Entity\User', | ||
59 | )); | ||
60 | } | ||
61 | } | ||
diff --git a/src/Wallabag/UserBundle/Resources/config/services.yml b/src/Wallabag/UserBundle/Resources/config/services.yml index 05830555..eb9c8e67 100644 --- a/src/Wallabag/UserBundle/Resources/config/services.yml +++ b/src/Wallabag/UserBundle/Resources/config/services.yml | |||
@@ -20,3 +20,15 @@ services: | |||
20 | factory: [ "@doctrine.orm.default_entity_manager", getRepository ] | 20 | factory: [ "@doctrine.orm.default_entity_manager", getRepository ] |
21 | arguments: | 21 | arguments: |
22 | - WallabagUserBundle:User | 22 | - WallabagUserBundle:User |
23 | |||
24 | wallabag_user.create_config: | ||
25 | class: Wallabag\UserBundle\EventListener\CreateConfigListener | ||
26 | arguments: | ||
27 | - "@doctrine.orm.entity_manager" | ||
28 | - "%wallabag_core.theme%" | ||
29 | - "%wallabag_core.items_on_page%" | ||
30 | - "%wallabag_core.rss_limit%" | ||
31 | - "%wallabag_core.language%" | ||
32 | - "%wallabag_core.reading_speed%" | ||
33 | tags: | ||
34 | - { name: kernel.event_subscriber } | ||
diff --git a/src/Wallabag/UserBundle/Resources/views/Manage/edit.html.twig b/src/Wallabag/UserBundle/Resources/views/Manage/edit.html.twig new file mode 100644 index 00000000..d5cf99c3 --- /dev/null +++ b/src/Wallabag/UserBundle/Resources/views/Manage/edit.html.twig | |||
@@ -0,0 +1,86 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'user.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel"> | ||
10 | <div class="row"> | ||
11 | <div class="input-field col s12"> | ||
12 | <h4>{{ 'user.edit_user'|trans }}</h4> | ||
13 | |||
14 | <div id="set6" class="col s12"> | ||
15 | {{ form_start(edit_form) }} | ||
16 | {{ form_errors(edit_form) }} | ||
17 | |||
18 | <div class="row"> | ||
19 | <div class="input-field col s12"> | ||
20 | {{ form_label(edit_form.name) }} | ||
21 | {{ form_errors(edit_form.name) }} | ||
22 | {{ form_widget(edit_form.name) }} | ||
23 | </div> | ||
24 | </div> | ||
25 | |||
26 | <div class="row"> | ||
27 | <div class="input-field col s12"> | ||
28 | {{ form_label(edit_form.username) }} | ||
29 | {{ form_errors(edit_form.username) }} | ||
30 | {{ form_widget(edit_form.username) }} | ||
31 | </div> | ||
32 | </div> | ||
33 | |||
34 | <div class="row"> | ||
35 | <div class="input-field col s12"> | ||
36 | {{ form_label(edit_form.email) }} | ||
37 | {{ form_errors(edit_form.email) }} | ||
38 | {{ form_widget(edit_form.email) }} | ||
39 | </div> | ||
40 | </div> | ||
41 | |||
42 | <div class="row"> | ||
43 | <div class="input-field col s12"> | ||
44 | {{ form_widget(edit_form.enabled) }} | ||
45 | {{ form_label(edit_form.enabled) }} | ||
46 | {{ form_errors(edit_form.enabled) }} | ||
47 | </div> | ||
48 | </div> | ||
49 | |||
50 | <div class="row"> | ||
51 | <div class="input-field col s12"> | ||
52 | {{ form_widget(edit_form.locked) }} | ||
53 | {{ form_label(edit_form.locked) }} | ||
54 | {{ form_errors(edit_form.locked) }} | ||
55 | </div> | ||
56 | </div> | ||
57 | |||
58 | {% if twofactor_auth %} | ||
59 | <div class="row"> | ||
60 | <div class="input-field col s12"> | ||
61 | {{ form_widget(edit_form.twoFactorAuthentication) }} | ||
62 | {{ form_label(edit_form.twoFactorAuthentication) }} | ||
63 | {{ form_errors(edit_form.twoFactorAuthentication) }} | ||
64 | </div> | ||
65 | </div> | ||
66 | {% endif %} | ||
67 | |||
68 | <br/> | ||
69 | |||
70 | {{ form_widget(edit_form.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} | ||
71 | {{ form_rest(edit_form) }} | ||
72 | </form> | ||
73 | <p> | ||
74 | {{ form_start(delete_form) }} | ||
75 | <button {% if app.user.id == user.id %}disabled="disabled"{% endif %} onclick="return confirm('{{ 'user.form.delete_confirm'|trans|escape('js') }}')" type="submit" class="btn waves-effect waves-light red">{{ 'user.form.delete'|trans }}</button> | ||
76 | {{ form_end(delete_form) }} | ||
77 | </p> | ||
78 | <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('user_index') }}">{{ 'user.form.back_to_list'|trans }}</a></p> | ||
79 | </div> | ||
80 | </div> | ||
81 | </div> | ||
82 | </div> | ||
83 | </div> | ||
84 | </div> | ||
85 | |||
86 | {% endblock %} | ||
diff --git a/src/Wallabag/UserBundle/Resources/views/Manage/index.html.twig b/src/Wallabag/UserBundle/Resources/views/Manage/index.html.twig new file mode 100644 index 00000000..996bdb1a --- /dev/null +++ b/src/Wallabag/UserBundle/Resources/views/Manage/index.html.twig | |||
@@ -0,0 +1,48 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'user.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel"> | ||
10 | <div class="row"> | ||
11 | <div class="input-field col s12"> | ||
12 | <p class="help">{{ 'user.description'|trans|raw }}</p> | ||
13 | |||
14 | <table class="bordered"> | ||
15 | <thead> | ||
16 | <tr> | ||
17 | <th>{{ 'user.form.username_label'|trans }}</th> | ||
18 | <th>{{ 'user.form.email_label'|trans }}</th> | ||
19 | <th>{{ 'user.form.last_login_label'|trans }}</th> | ||
20 | <th>{{ 'user.form.locked_label'|trans }}</th> | ||
21 | <th>{{ 'user.list.actions'|trans }}</th> | ||
22 | </tr> | ||
23 | </thead> | ||
24 | <tbody> | ||
25 | {% for user in users %} | ||
26 | <tr> | ||
27 | <td>{{ user.username }}</td> | ||
28 | <td>{{ user.email }}</td> | ||
29 | <td>{% if user.lastLogin %}{{ user.lastLogin|date('Y-m-d H:i:s') }}{% endif %}</td> | ||
30 | <td>{% if user.locked %}{{ 'user.list.yes'|trans }}{% else %}{{ 'user.list.no'|trans }}{% endif %}</td> | ||
31 | <td> | ||
32 | <a href="{{ path('user_edit', { 'id': user.id }) }}">{{ 'user.list.edit_action'|trans }}</a> | ||
33 | </td> | ||
34 | </tr> | ||
35 | {% endfor %} | ||
36 | </tbody> | ||
37 | </table> | ||
38 | <br /> | ||
39 | <p> | ||
40 | <a href="{{ path('user_new') }}" class="waves-effect waves-light btn">{{ 'user.list.create_new_one'|trans }}</a> | ||
41 | </p> | ||
42 | </div> | ||
43 | </div> | ||
44 | </div> | ||
45 | </div> | ||
46 | </div> | ||
47 | |||
48 | {% endblock %} | ||
diff --git a/src/Wallabag/UserBundle/Resources/views/Manage/new.html.twig b/src/Wallabag/UserBundle/Resources/views/Manage/new.html.twig new file mode 100644 index 00000000..8c894c04 --- /dev/null +++ b/src/Wallabag/UserBundle/Resources/views/Manage/new.html.twig | |||
@@ -0,0 +1,61 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'user.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel"> | ||
10 | <div class="row"> | ||
11 | <div class="input-field col s12"> | ||
12 | <h4>{{ 'user.new_user'|trans }}</h4> | ||
13 | |||
14 | <div id="set6" class="col s12"> | ||
15 | {{ form_start(form) }} | ||
16 | {{ form_errors(form) }} | ||
17 | |||
18 | <div class="row"> | ||
19 | <div class="input-field col s12"> | ||
20 | {{ form_label(form.username) }} | ||
21 | {{ form_errors(form.username) }} | ||
22 | {{ form_widget(form.username) }} | ||
23 | </div> | ||
24 | </div> | ||
25 | |||
26 | <div class="row"> | ||
27 | <div class="input-field col s12"> | ||
28 | {{ form_label(form.plainPassword.first) }} | ||
29 | {{ form_errors(form.plainPassword.first) }} | ||
30 | {{ form_widget(form.plainPassword.first) }} | ||
31 | </div> | ||
32 | </div> | ||
33 | |||
34 | <div class="row"> | ||
35 | <div class="input-field col s12"> | ||
36 | {{ form_label(form.plainPassword.second) }} | ||
37 | {{ form_errors(form.plainPassword.second) }} | ||
38 | {{ form_widget(form.plainPassword.second) }} | ||
39 | </div> | ||
40 | </div> | ||
41 | |||
42 | <div class="row"> | ||
43 | <div class="input-field col s12"> | ||
44 | {{ form_label(form.email) }} | ||
45 | {{ form_errors(form.email) }} | ||
46 | {{ form_widget(form.email) }} | ||
47 | </div> | ||
48 | </div> | ||
49 | |||
50 | {{ form_widget(form.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} | ||
51 | {{ form_rest(form) }} | ||
52 | </form> | ||
53 | <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('user_index') }}">{{ 'user.form.back_to_list'|trans }}</a></p> | ||
54 | </div> | ||
55 | </div> | ||
56 | </div> | ||
57 | </div> | ||
58 | </div> | ||
59 | </div> | ||
60 | |||
61 | {% endblock %} | ||
diff --git a/src/Wallabag/UserBundle/Resources/views/Registration/checkEmail.html.twig b/src/Wallabag/UserBundle/Resources/views/Registration/check_email.html.twig index 50937276..50937276 100644 --- a/src/Wallabag/UserBundle/Resources/views/Registration/checkEmail.html.twig +++ b/src/Wallabag/UserBundle/Resources/views/Registration/check_email.html.twig | |||
diff --git a/src/Wallabag/UserBundle/Resources/views/manage.html.twig b/src/Wallabag/UserBundle/Resources/views/manage.html.twig new file mode 100644 index 00000000..c614c55f --- /dev/null +++ b/src/Wallabag/UserBundle/Resources/views/manage.html.twig | |||
@@ -0,0 +1,43 @@ | |||
1 | {% extends "WallabagCoreBundle::layout.html.twig" %} | ||
2 | |||
3 | {% block title %}{{ 'user.manage.page_title'|trans }}{% endblock %} | ||
4 | |||
5 | {% block content %} | ||
6 | |||
7 | <div class="row"> | ||
8 | <div class="col s12"> | ||
9 | <div class="card-panel"> | ||
10 | <div class="row"> | ||
11 | <div class="input-field col s12"> | ||
12 | <p class="help">{{ 'user.manage.description'|trans|raw }}</p> | ||
13 | |||
14 | <table class="bordered"> | ||
15 | <thead> | ||
16 | <tr> | ||
17 | <th>{{ 'user.manage.field.username'|trans }}</th> | ||
18 | <th>{{ 'user.manage.field.email'|trans }}</th> | ||
19 | <th>{{ 'user.manage.field.last_login'|trans }}</th> | ||
20 | <th>{{ 'user.manage.field.locked'|trans }}</th> | ||
21 | <th>{{ 'user.manage.action'|trans }}</th> | ||
22 | </tr> | ||
23 | </thead> | ||
24 | |||
25 | <tbody> | ||
26 | {% for user in users %} | ||
27 | <tr> | ||
28 | <td>{{ user.username }}</td> | ||
29 | <td>{{ user.email }}</td> | ||
30 | <td>{{ user.lastLogin|date('d/m/Y H:i:s') }}</td> | ||
31 | <td>{{ user.locked ? 'yes' : 'no' }}</td> | ||
32 | <td>edit - delete</td> | ||
33 | </tr> | ||
34 | {% endfor %} | ||
35 | </tbody> | ||
36 | </table> | ||
37 | </div> | ||
38 | </div> | ||
39 | </div> | ||
40 | </div> | ||
41 | </div> | ||
42 | |||
43 | {% endblock %} | ||
diff --git a/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php index 101c20eb..fd72b8f2 100644 --- a/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php | |||
@@ -78,6 +78,53 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
78 | ); | 78 | ); |
79 | } | 79 | } |
80 | 80 | ||
81 | public function testGetEntriesWithFullOptions() | ||
82 | { | ||
83 | $this->client->request('GET', '/api/entries', [ | ||
84 | 'archive' => 1, | ||
85 | 'starred' => 1, | ||
86 | 'sort' => 'updated', | ||
87 | 'order' => 'asc', | ||
88 | 'page' => 1, | ||
89 | 'perPage' => 2, | ||
90 | 'tags' => 'foo', | ||
91 | 'since' => 1443274283, | ||
92 | ]); | ||
93 | |||
94 | $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | ||
95 | |||
96 | $content = json_decode($this->client->getResponse()->getContent(), true); | ||
97 | |||
98 | $this->assertGreaterThanOrEqual(1, count($content)); | ||
99 | $this->assertArrayHasKey('items', $content['_embedded']); | ||
100 | $this->assertGreaterThanOrEqual(0, $content['total']); | ||
101 | $this->assertEquals(1, $content['page']); | ||
102 | $this->assertEquals(2, $content['limit']); | ||
103 | $this->assertGreaterThanOrEqual(1, $content['pages']); | ||
104 | |||
105 | $this->assertArrayHasKey('_links', $content); | ||
106 | $this->assertArrayHasKey('self', $content['_links']); | ||
107 | $this->assertArrayHasKey('first', $content['_links']); | ||
108 | $this->assertArrayHasKey('last', $content['_links']); | ||
109 | |||
110 | foreach (['self', 'first', 'last'] as $link) { | ||
111 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
112 | $this->assertContains('archive=1', $content['_links'][$link]['href']); | ||
113 | $this->assertContains('starred=1', $content['_links'][$link]['href']); | ||
114 | $this->assertContains('sort=updated', $content['_links'][$link]['href']); | ||
115 | $this->assertContains('order=asc', $content['_links'][$link]['href']); | ||
116 | $this->assertContains('tags=foo', $content['_links'][$link]['href']); | ||
117 | $this->assertContains('since=1443274283', $content['_links'][$link]['href']); | ||
118 | } | ||
119 | |||
120 | $this->assertTrue( | ||
121 | $this->client->getResponse()->headers->contains( | ||
122 | 'Content-Type', | ||
123 | 'application/json' | ||
124 | ) | ||
125 | ); | ||
126 | } | ||
127 | |||
81 | public function testGetStarredEntries() | 128 | public function testGetStarredEntries() |
82 | { | 129 | { |
83 | $this->client->request('GET', '/api/entries', ['starred' => 1, 'sort' => 'updated']); | 130 | $this->client->request('GET', '/api/entries', ['starred' => 1, 'sort' => 'updated']); |
@@ -92,6 +139,17 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
92 | $this->assertEquals(1, $content['page']); | 139 | $this->assertEquals(1, $content['page']); |
93 | $this->assertGreaterThanOrEqual(1, $content['pages']); | 140 | $this->assertGreaterThanOrEqual(1, $content['pages']); |
94 | 141 | ||
142 | $this->assertArrayHasKey('_links', $content); | ||
143 | $this->assertArrayHasKey('self', $content['_links']); | ||
144 | $this->assertArrayHasKey('first', $content['_links']); | ||
145 | $this->assertArrayHasKey('last', $content['_links']); | ||
146 | |||
147 | foreach (['self', 'first', 'last'] as $link) { | ||
148 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
149 | $this->assertContains('starred=1', $content['_links'][$link]['href']); | ||
150 | $this->assertContains('sort=updated', $content['_links'][$link]['href']); | ||
151 | } | ||
152 | |||
95 | $this->assertTrue( | 153 | $this->assertTrue( |
96 | $this->client->getResponse()->headers->contains( | 154 | $this->client->getResponse()->headers->contains( |
97 | 'Content-Type', | 155 | 'Content-Type', |
@@ -114,6 +172,16 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
114 | $this->assertEquals(1, $content['page']); | 172 | $this->assertEquals(1, $content['page']); |
115 | $this->assertGreaterThanOrEqual(1, $content['pages']); | 173 | $this->assertGreaterThanOrEqual(1, $content['pages']); |
116 | 174 | ||
175 | $this->assertArrayHasKey('_links', $content); | ||
176 | $this->assertArrayHasKey('self', $content['_links']); | ||
177 | $this->assertArrayHasKey('first', $content['_links']); | ||
178 | $this->assertArrayHasKey('last', $content['_links']); | ||
179 | |||
180 | foreach (['self', 'first', 'last'] as $link) { | ||
181 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
182 | $this->assertContains('archive=1', $content['_links'][$link]['href']); | ||
183 | } | ||
184 | |||
117 | $this->assertTrue( | 185 | $this->assertTrue( |
118 | $this->client->getResponse()->headers->contains( | 186 | $this->client->getResponse()->headers->contains( |
119 | 'Content-Type', | 187 | 'Content-Type', |
@@ -136,6 +204,16 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
136 | $this->assertEquals(1, $content['page']); | 204 | $this->assertEquals(1, $content['page']); |
137 | $this->assertGreaterThanOrEqual(1, $content['pages']); | 205 | $this->assertGreaterThanOrEqual(1, $content['pages']); |
138 | 206 | ||
207 | $this->assertArrayHasKey('_links', $content); | ||
208 | $this->assertArrayHasKey('self', $content['_links']); | ||
209 | $this->assertArrayHasKey('first', $content['_links']); | ||
210 | $this->assertArrayHasKey('last', $content['_links']); | ||
211 | |||
212 | foreach (['self', 'first', 'last'] as $link) { | ||
213 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
214 | $this->assertContains('tags='.urlencode('foo,bar'), $content['_links'][$link]['href']); | ||
215 | } | ||
216 | |||
139 | $this->assertTrue( | 217 | $this->assertTrue( |
140 | $this->client->getResponse()->headers->contains( | 218 | $this->client->getResponse()->headers->contains( |
141 | 'Content-Type', | 219 | 'Content-Type', |
@@ -146,7 +224,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
146 | 224 | ||
147 | public function testGetDatedEntries() | 225 | public function testGetDatedEntries() |
148 | { | 226 | { |
149 | $this->client->request('GET', '/api/entries', ['since' => 1]); | 227 | $this->client->request('GET', '/api/entries', ['since' => 1443274283]); |
150 | 228 | ||
151 | $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | 229 | $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); |
152 | 230 | ||
@@ -158,6 +236,16 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
158 | $this->assertEquals(1, $content['page']); | 236 | $this->assertEquals(1, $content['page']); |
159 | $this->assertGreaterThanOrEqual(1, $content['pages']); | 237 | $this->assertGreaterThanOrEqual(1, $content['pages']); |
160 | 238 | ||
239 | $this->assertArrayHasKey('_links', $content); | ||
240 | $this->assertArrayHasKey('self', $content['_links']); | ||
241 | $this->assertArrayHasKey('first', $content['_links']); | ||
242 | $this->assertArrayHasKey('last', $content['_links']); | ||
243 | |||
244 | foreach (['self', 'first', 'last'] as $link) { | ||
245 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
246 | $this->assertContains('since=1443274283', $content['_links'][$link]['href']); | ||
247 | } | ||
248 | |||
161 | $this->assertTrue( | 249 | $this->assertTrue( |
162 | $this->client->getResponse()->headers->contains( | 250 | $this->client->getResponse()->headers->contains( |
163 | 'Content-Type', | 251 | 'Content-Type', |
@@ -181,6 +269,16 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
181 | $this->assertEquals(1, $content['page']); | 269 | $this->assertEquals(1, $content['page']); |
182 | $this->assertEquals(1, $content['pages']); | 270 | $this->assertEquals(1, $content['pages']); |
183 | 271 | ||
272 | $this->assertArrayHasKey('_links', $content); | ||
273 | $this->assertArrayHasKey('self', $content['_links']); | ||
274 | $this->assertArrayHasKey('first', $content['_links']); | ||
275 | $this->assertArrayHasKey('last', $content['_links']); | ||
276 | |||
277 | foreach (['self', 'first', 'last'] as $link) { | ||
278 | $this->assertArrayHasKey('href', $content['_links'][$link]); | ||
279 | $this->assertContains('since='.($future->getTimestamp() + 1000), $content['_links'][$link]['href']); | ||
280 | } | ||
281 | |||
184 | $this->assertTrue( | 282 | $this->assertTrue( |
185 | $this->client->getResponse()->headers->contains( | 283 | $this->client->getResponse()->headers->contains( |
186 | 'Content-Type', | 284 | 'Content-Type', |
@@ -684,4 +782,26 @@ class WallabagRestControllerTest extends WallabagApiTestCase | |||
684 | 782 | ||
685 | $this->assertEquals(true, $content['is_starred']); | 783 | $this->assertEquals(true, $content['is_starred']); |
686 | } | 784 | } |
785 | |||
786 | public function testGetEntriesExists() | ||
787 | { | ||
788 | $this->client->request('GET', '/api/entries/exists?url=http://0.0.0.0/entry2'); | ||
789 | |||
790 | $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | ||
791 | |||
792 | $content = json_decode($this->client->getResponse()->getContent(), true); | ||
793 | |||
794 | $this->assertEquals(true, $content['exists']); | ||
795 | } | ||
796 | |||
797 | public function testGetEntriesExistsWhichDoesNotExists() | ||
798 | { | ||
799 | $this->client->request('GET', '/api/entries/exists?url=http://google.com/entry2'); | ||
800 | |||
801 | $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); | ||
802 | |||
803 | $content = json_decode($this->client->getResponse()->getContent(), true); | ||
804 | |||
805 | $this->assertEquals(false, $content['exists']); | ||
806 | } | ||
687 | } | 807 | } |
diff --git a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php index 7193f9b0..1954c654 100644 --- a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php | |||
@@ -28,7 +28,6 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
28 | $this->assertCount(1, $crawler->filter('button[id=config_save]')); | 28 | $this->assertCount(1, $crawler->filter('button[id=config_save]')); |
29 | $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]')); | 29 | $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]')); |
30 | $this->assertCount(1, $crawler->filter('button[id=update_user_save]')); | 30 | $this->assertCount(1, $crawler->filter('button[id=update_user_save]')); |
31 | $this->assertCount(1, $crawler->filter('button[id=new_user_save]')); | ||
32 | $this->assertCount(1, $crawler->filter('button[id=rss_config_save]')); | 31 | $this->assertCount(1, $crawler->filter('button[id=rss_config_save]')); |
33 | } | 32 | } |
34 | 33 | ||
@@ -56,8 +55,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
56 | 55 | ||
57 | $crawler = $client->followRedirect(); | 56 | $crawler = $client->followRedirect(); |
58 | 57 | ||
59 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | 58 | $this->assertContains('flashes.config.notice.config_saved', $crawler->filter('body')->extract(['_text'])[0]); |
60 | $this->assertContains('flashes.config.notice.config_saved', $alert[0]); | ||
61 | } | 59 | } |
62 | 60 | ||
63 | public function testChangeReadingSpeed() | 61 | public function testChangeReadingSpeed() |
@@ -213,8 +211,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
213 | 211 | ||
214 | $crawler = $client->followRedirect(); | 212 | $crawler = $client->followRedirect(); |
215 | 213 | ||
216 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | 214 | $this->assertContains('flashes.config.notice.password_updated', $crawler->filter('body')->extract(['_text'])[0]); |
217 | $this->assertContains('flashes.config.notice.password_updated', $alert[0]); | ||
218 | } | 215 | } |
219 | 216 | ||
220 | public function dataForUserFailed() | 217 | public function dataForUserFailed() |
@@ -285,120 +282,6 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
285 | $this->assertContains('flashes.config.notice.user_updated', $alert[0]); | 282 | $this->assertContains('flashes.config.notice.user_updated', $alert[0]); |
286 | } | 283 | } |
287 | 284 | ||
288 | public function dataForNewUserFailed() | ||
289 | { | ||
290 | return [ | ||
291 | [ | ||
292 | [ | ||
293 | 'new_user[username]' => '', | ||
294 | 'new_user[plainPassword][first]' => '', | ||
295 | 'new_user[plainPassword][second]' => '', | ||
296 | 'new_user[email]' => '', | ||
297 | ], | ||
298 | 'fos_user.username.blank', | ||
299 | ], | ||
300 | [ | ||
301 | [ | ||
302 | 'new_user[username]' => 'a', | ||
303 | 'new_user[plainPassword][first]' => 'mypassword', | ||
304 | 'new_user[plainPassword][second]' => 'mypassword', | ||
305 | 'new_user[email]' => '', | ||
306 | ], | ||
307 | 'fos_user.username.short', | ||
308 | ], | ||
309 | [ | ||
310 | [ | ||
311 | 'new_user[username]' => 'wallace', | ||
312 | 'new_user[plainPassword][first]' => 'mypassword', | ||
313 | 'new_user[plainPassword][second]' => 'mypassword', | ||
314 | 'new_user[email]' => 'test', | ||
315 | ], | ||
316 | 'fos_user.email.invalid', | ||
317 | ], | ||
318 | [ | ||
319 | [ | ||
320 | 'new_user[username]' => 'admin', | ||
321 | 'new_user[plainPassword][first]' => 'wallacewallace', | ||
322 | 'new_user[plainPassword][second]' => 'wallacewallace', | ||
323 | 'new_user[email]' => 'wallace@wallace.me', | ||
324 | ], | ||
325 | 'fos_user.username.already_used', | ||
326 | ], | ||
327 | [ | ||
328 | [ | ||
329 | 'new_user[username]' => 'wallace', | ||
330 | 'new_user[plainPassword][first]' => 'mypassword1', | ||
331 | 'new_user[plainPassword][second]' => 'mypassword2', | ||
332 | 'new_user[email]' => 'wallace@wallace.me', | ||
333 | ], | ||
334 | 'validator.password_must_match', | ||
335 | ], | ||
336 | ]; | ||
337 | } | ||
338 | |||
339 | /** | ||
340 | * @dataProvider dataForNewUserFailed | ||
341 | */ | ||
342 | public function testNewUserFailed($data, $expectedMessage) | ||
343 | { | ||
344 | $this->logInAs('admin'); | ||
345 | $client = $this->getClient(); | ||
346 | |||
347 | $crawler = $client->request('GET', '/config'); | ||
348 | |||
349 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
350 | |||
351 | $form = $crawler->filter('button[id=new_user_save]')->form(); | ||
352 | |||
353 | $crawler = $client->submit($form, $data); | ||
354 | |||
355 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
356 | |||
357 | $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text'])); | ||
358 | $this->assertContains($expectedMessage, $alert[0]); | ||
359 | } | ||
360 | |||
361 | public function testNewUserCreated() | ||
362 | { | ||
363 | $this->logInAs('admin'); | ||
364 | $client = $this->getClient(); | ||
365 | |||
366 | $crawler = $client->request('GET', '/config'); | ||
367 | |||
368 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
369 | |||
370 | $form = $crawler->filter('button[id=new_user_save]')->form(); | ||
371 | |||
372 | $data = [ | ||
373 | 'new_user[username]' => 'wallace', | ||
374 | 'new_user[plainPassword][first]' => 'wallace1', | ||
375 | 'new_user[plainPassword][second]' => 'wallace1', | ||
376 | 'new_user[email]' => 'wallace@wallace.me', | ||
377 | ]; | ||
378 | |||
379 | $client->submit($form, $data); | ||
380 | |||
381 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
382 | |||
383 | $crawler = $client->followRedirect(); | ||
384 | |||
385 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | ||
386 | $this->assertContains('flashes.config.notice.user_added', $alert[0]); | ||
387 | |||
388 | $em = $client->getContainer()->get('doctrine.orm.entity_manager'); | ||
389 | $user = $em | ||
390 | ->getRepository('WallabagUserBundle:User') | ||
391 | ->findOneByUsername('wallace'); | ||
392 | |||
393 | $this->assertTrue(false !== $user); | ||
394 | $this->assertTrue($user->isEnabled()); | ||
395 | $this->assertEquals('material', $user->getConfig()->getTheme()); | ||
396 | $this->assertEquals(12, $user->getConfig()->getItemsPerPage()); | ||
397 | $this->assertEquals(50, $user->getConfig()->getRssLimit()); | ||
398 | $this->assertEquals('en', $user->getConfig()->getLanguage()); | ||
399 | $this->assertEquals(1, $user->getConfig()->getReadingSpeed()); | ||
400 | } | ||
401 | |||
402 | public function testRssUpdateResetToken() | 285 | public function testRssUpdateResetToken() |
403 | { | 286 | { |
404 | $this->logInAs('admin'); | 287 | $this->logInAs('admin'); |
@@ -474,8 +357,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
474 | 357 | ||
475 | $crawler = $client->followRedirect(); | 358 | $crawler = $client->followRedirect(); |
476 | 359 | ||
477 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | 360 | $this->assertContains('flashes.config.notice.rss_updated', $crawler->filter('body')->extract(['_text'])[0]); |
478 | $this->assertContains('flashes.config.notice.rss_updated', $alert[0]); | ||
479 | } | 361 | } |
480 | 362 | ||
481 | public function dataForRssFailed() | 363 | public function dataForRssFailed() |
@@ -540,8 +422,32 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
540 | 422 | ||
541 | $crawler = $client->followRedirect(); | 423 | $crawler = $client->followRedirect(); |
542 | 424 | ||
543 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | 425 | $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]); |
544 | $this->assertContains('flashes.config.notice.tagging_rules_updated', $alert[0]); | 426 | |
427 | $editLink = $crawler->filter('.mode_edit')->last()->link(); | ||
428 | |||
429 | $crawler = $client->click($editLink); | ||
430 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
431 | $this->assertContains('?tagging-rule=', $client->getResponse()->headers->get('location')); | ||
432 | |||
433 | $crawler = $client->followRedirect(); | ||
434 | |||
435 | $form = $crawler->filter('button[id=tagging_rule_save]')->form(); | ||
436 | |||
437 | $data = [ | ||
438 | 'tagging_rule[rule]' => 'readingTime <= 30', | ||
439 | 'tagging_rule[tags]' => 'short reading', | ||
440 | ]; | ||
441 | |||
442 | $client->submit($form, $data); | ||
443 | |||
444 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
445 | |||
446 | $crawler = $client->followRedirect(); | ||
447 | |||
448 | $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]); | ||
449 | |||
450 | $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]); | ||
545 | 451 | ||
546 | $deleteLink = $crawler->filter('.delete')->last()->link(); | 452 | $deleteLink = $crawler->filter('.delete')->last()->link(); |
547 | 453 | ||
@@ -549,8 +455,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
549 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | 455 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); |
550 | 456 | ||
551 | $crawler = $client->followRedirect(); | 457 | $crawler = $client->followRedirect(); |
552 | $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(['_text'])); | 458 | $this->assertContains('flashes.config.notice.tagging_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]); |
553 | $this->assertContains('flashes.config.notice.tagging_rules_deleted', $alert[0]); | ||
554 | } | 459 | } |
555 | 460 | ||
556 | public function dataForTaggingRuleFailed() | 461 | public function dataForTaggingRuleFailed() |
@@ -613,7 +518,23 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
613 | ->getRepository('WallabagCoreBundle:TaggingRule') | 518 | ->getRepository('WallabagCoreBundle:TaggingRule') |
614 | ->findAll()[0]; | 519 | ->findAll()[0]; |
615 | 520 | ||
616 | $crawler = $client->request('GET', '/tagging-rule/delete/'.$rule->getId()); | 521 | $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId()); |
522 | |||
523 | $this->assertEquals(403, $client->getResponse()->getStatusCode()); | ||
524 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | ||
525 | $this->assertContains('You can not access this tagging rule', $body[0]); | ||
526 | } | ||
527 | |||
528 | public function testEditingTaggingRuleFromAnOtherUser() | ||
529 | { | ||
530 | $this->logInAs('bob'); | ||
531 | $client = $this->getClient(); | ||
532 | |||
533 | $rule = $client->getContainer()->get('doctrine.orm.entity_manager') | ||
534 | ->getRepository('WallabagCoreBundle:TaggingRule') | ||
535 | ->findAll()[0]; | ||
536 | |||
537 | $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId()); | ||
617 | 538 | ||
618 | $this->assertEquals(403, $client->getResponse()->getStatusCode()); | 539 | $this->assertEquals(403, $client->getResponse()->getStatusCode()); |
619 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | 540 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); |
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php index a74c17d9..c40e10a5 100644 --- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php | |||
@@ -29,7 +29,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
29 | 29 | ||
30 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | 30 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); |
31 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | 31 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); |
32 | $this->assertContains('quickstart.intro.paragraph_1', $body[0]); | 32 | $this->assertContains('quickstart.intro.title', $body[0]); |
33 | 33 | ||
34 | // Test if quickstart is disabled when user has 1 entry | 34 | // Test if quickstart is disabled when user has 1 entry |
35 | $crawler = $client->request('GET', '/new'); | 35 | $crawler = $client->request('GET', '/new'); |
@@ -160,6 +160,50 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
160 | $this->assertContains('/view/', $client->getResponse()->getTargetUrl()); | 160 | $this->assertContains('/view/', $client->getResponse()->getTargetUrl()); |
161 | } | 161 | } |
162 | 162 | ||
163 | public function testPostNewOkUrlExistWithAccent() | ||
164 | { | ||
165 | $this->logInAs('admin'); | ||
166 | $client = $this->getClient(); | ||
167 | |||
168 | $url = 'http://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing'; | ||
169 | |||
170 | $crawler = $client->request('GET', '/new'); | ||
171 | |||
172 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
173 | |||
174 | $form = $crawler->filter('form[name=entry]')->form(); | ||
175 | |||
176 | $data = [ | ||
177 | 'entry[url]' => $url, | ||
178 | ]; | ||
179 | |||
180 | $client->submit($form, $data); | ||
181 | |||
182 | $crawler = $client->request('GET', '/new'); | ||
183 | |||
184 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
185 | |||
186 | $form = $crawler->filter('form[name=entry]')->form(); | ||
187 | |||
188 | $data = [ | ||
189 | 'entry[url]' => $url, | ||
190 | ]; | ||
191 | |||
192 | $client->submit($form, $data); | ||
193 | |||
194 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
195 | $this->assertContains('/view/', $client->getResponse()->getTargetUrl()); | ||
196 | |||
197 | $em = $client->getContainer() | ||
198 | ->get('doctrine.orm.entity_manager'); | ||
199 | $entry = $em | ||
200 | ->getRepository('WallabagCoreBundle:Entry') | ||
201 | ->findOneByUrl(urldecode($url)); | ||
202 | |||
203 | $em->remove($entry); | ||
204 | $em->flush(); | ||
205 | } | ||
206 | |||
163 | /** | 207 | /** |
164 | * This test will require an internet connection. | 208 | * This test will require an internet connection. |
165 | */ | 209 | */ |
diff --git a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php index 71652760..2c32393f 100644 --- a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php | |||
@@ -47,7 +47,7 @@ class TagControllerTest extends WallabagCoreTestCase | |||
47 | 47 | ||
48 | $this->assertEquals(1, count($entry->getTags())); | 48 | $this->assertEquals(1, count($entry->getTags())); |
49 | 49 | ||
50 | # tag already exists and already assigned | 50 | // tag already exists and already assigned |
51 | $client->submit($form, $data); | 51 | $client->submit($form, $data); |
52 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | 52 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); |
53 | 53 | ||
@@ -58,7 +58,7 @@ class TagControllerTest extends WallabagCoreTestCase | |||
58 | 58 | ||
59 | $this->assertEquals(1, count($newEntry->getTags())); | 59 | $this->assertEquals(1, count($newEntry->getTags())); |
60 | 60 | ||
61 | # tag already exists but still not assigned to this entry | 61 | // tag already exists but still not assigned to this entry |
62 | $data = [ | 62 | $data = [ |
63 | 'tag[label]' => 'foo', | 63 | 'tag[label]' => 'foo', |
64 | ]; | 64 | ]; |
diff --git a/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php b/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php index e29b58b5..2e6fccfb 100644 --- a/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php +++ b/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php | |||
@@ -125,16 +125,14 @@ class UsernameRssTokenConverterTest extends \PHPUnit_Framework_TestCase | |||
125 | $this->assertTrue($converter->supports($params)); | 125 | $this->assertTrue($converter->supports($params)); |
126 | } | 126 | } |
127 | 127 | ||
128 | /** | ||
129 | * @expectedException InvalidArgumentException | ||
130 | * @expectedExceptionMessage Route attribute is missing | ||
131 | */ | ||
132 | public function testApplyEmptyRequest() | 128 | public function testApplyEmptyRequest() |
133 | { | 129 | { |
134 | $params = new ParamConverter([]); | 130 | $params = new ParamConverter([]); |
135 | $converter = new UsernameRssTokenConverter(); | 131 | $converter = new UsernameRssTokenConverter(); |
136 | 132 | ||
137 | $converter->apply(new Request(), $params); | 133 | $res = $converter->apply(new Request(), $params); |
134 | |||
135 | $this->assertFalse($res); | ||
138 | } | 136 | } |
139 | 137 | ||
140 | /** | 138 | /** |
diff --git a/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php b/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php index 8ec2a75a..b1c8c946 100644 --- a/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php +++ b/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php | |||
@@ -8,7 +8,23 @@ class WallabagExtensionTest extends \PHPUnit_Framework_TestCase | |||
8 | { | 8 | { |
9 | public function testRemoveWww() | 9 | public function testRemoveWww() |
10 | { | 10 | { |
11 | $extension = new WallabagExtension(); | 11 | $entryRepository = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') |
12 | ->disableOriginalConstructor() | ||
13 | ->getMock(); | ||
14 | |||
15 | $tagRepository = $this->getMockBuilder('Wallabag\CoreBundle\Repository\TagRepository') | ||
16 | ->disableOriginalConstructor() | ||
17 | ->getMock(); | ||
18 | |||
19 | $tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface') | ||
20 | ->disableOriginalConstructor() | ||
21 | ->getMock(); | ||
22 | |||
23 | $translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface') | ||
24 | ->disableOriginalConstructor() | ||
25 | ->getMock(); | ||
26 | |||
27 | $extension = new WallabagExtension($entryRepository, $tagRepository, $tokenStorage, 0, $translator); | ||
12 | 28 | ||
13 | $this->assertEquals('lemonde.fr', $extension->removeWww('www.lemonde.fr')); | 29 | $this->assertEquals('lemonde.fr', $extension->removeWww('www.lemonde.fr')); |
14 | $this->assertEquals('lemonde.fr', $extension->removeWww('lemonde.fr')); | 30 | $this->assertEquals('lemonde.fr', $extension->removeWww('lemonde.fr')); |
diff --git a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php index 75b7ee0b..4f103921 100644 --- a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php +++ b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php | |||
@@ -83,7 +83,7 @@ abstract class WallabagCoreTestCase extends WebTestCase | |||
83 | 83 | ||
84 | /** | 84 | /** |
85 | * Check if Redis is installed. | 85 | * Check if Redis is installed. |
86 | * If not, mark test as skip | 86 | * If not, mark test as skip. |
87 | */ | 87 | */ |
88 | protected function checkRedis() | 88 | protected function checkRedis() |
89 | { | 89 | { |
diff --git a/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php index b6783a56..0bc40bdd 100644 --- a/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php +++ b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php | |||
@@ -24,6 +24,6 @@ class ImportControllerTest extends WallabagCoreTestCase | |||
24 | $crawler = $client->request('GET', '/import/'); | 24 | $crawler = $client->request('GET', '/import/'); |
25 | 25 | ||
26 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | 26 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); |
27 | $this->assertEquals(6, $crawler->filter('blockquote')->count()); | 27 | $this->assertEquals(7, $crawler->filter('blockquote')->count()); |
28 | } | 28 | } |
29 | } | 29 | } |
diff --git a/tests/Wallabag/ImportBundle/Controller/InstapaperControllerTest.php b/tests/Wallabag/ImportBundle/Controller/InstapaperControllerTest.php new file mode 100644 index 00000000..9df08e75 --- /dev/null +++ b/tests/Wallabag/ImportBundle/Controller/InstapaperControllerTest.php | |||
@@ -0,0 +1,196 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Tests\Wallabag\ImportBundle\Controller; | ||
4 | |||
5 | use Tests\Wallabag\CoreBundle\WallabagCoreTestCase; | ||
6 | use Symfony\Component\HttpFoundation\File\UploadedFile; | ||
7 | |||
8 | class InstapaperControllerTest extends WallabagCoreTestCase | ||
9 | { | ||
10 | public function testImportInstapaper() | ||
11 | { | ||
12 | $this->logInAs('admin'); | ||
13 | $client = $this->getClient(); | ||
14 | |||
15 | $crawler = $client->request('GET', '/import/instapaper'); | ||
16 | |||
17 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
18 | $this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count()); | ||
19 | $this->assertEquals(1, $crawler->filter('input[type=file]')->count()); | ||
20 | } | ||
21 | |||
22 | public function testImportInstapaperWithRabbitEnabled() | ||
23 | { | ||
24 | $this->logInAs('admin'); | ||
25 | $client = $this->getClient(); | ||
26 | |||
27 | $client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 1); | ||
28 | |||
29 | $crawler = $client->request('GET', '/import/instapaper'); | ||
30 | |||
31 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
32 | $this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count()); | ||
33 | $this->assertEquals(1, $crawler->filter('input[type=file]')->count()); | ||
34 | |||
35 | $client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 0); | ||
36 | } | ||
37 | |||
38 | public function testImportInstapaperBadFile() | ||
39 | { | ||
40 | $this->logInAs('admin'); | ||
41 | $client = $this->getClient(); | ||
42 | |||
43 | $crawler = $client->request('GET', '/import/instapaper'); | ||
44 | $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form(); | ||
45 | |||
46 | $data = [ | ||
47 | 'upload_import_file[file]' => '', | ||
48 | ]; | ||
49 | |||
50 | $client->submit($form, $data); | ||
51 | |||
52 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
53 | } | ||
54 | |||
55 | public function testImportInstapaperWithRedisEnabled() | ||
56 | { | ||
57 | $this->checkRedis(); | ||
58 | $this->logInAs('admin'); | ||
59 | $client = $this->getClient(); | ||
60 | $client->getContainer()->get('craue_config')->set('import_with_redis', 1); | ||
61 | |||
62 | $crawler = $client->request('GET', '/import/instapaper'); | ||
63 | |||
64 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); | ||
65 | $this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count()); | ||
66 | $this->assertEquals(1, $crawler->filter('input[type=file]')->count()); | ||
67 | |||
68 | $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form(); | ||
69 | |||
70 | $file = new UploadedFile(__DIR__.'/../fixtures/instapaper-export.csv', 'instapaper.csv'); | ||
71 | |||
72 | $data = [ | ||
73 | 'upload_import_file[file]' => $file, | ||
74 | ]; | ||
75 | |||
76 | $client->submit($form, $data); | ||
77 | |||
78 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
79 | |||
80 | $crawler = $client->followRedirect(); | ||
81 | |||
82 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | ||
83 | $this->assertContains('flashes.import.notice.summary', $body[0]); | ||
84 | |||
85 | $this->assertNotEmpty($client->getContainer()->get('wallabag_core.redis.client')->lpop('wallabag.import.instapaper')); | ||
86 | |||
87 | $client->getContainer()->get('craue_config')->set('import_with_redis', 0); | ||
88 | } | ||
89 | |||
90 | public function testImportInstapaperWithFile() | ||
91 | { | ||
92 | $this->logInAs('admin'); | ||
93 | $client = $this->getClient(); | ||
94 | |||
95 | $crawler = $client->request('GET', '/import/instapaper'); | ||
96 | $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form(); | ||
97 | |||
98 | $file = new UploadedFile(__DIR__.'/../fixtures/instapaper-export.csv', 'instapaper.csv'); | ||
99 | |||
100 | $data = [ | ||
101 | 'upload_import_file[file]' => $file, | ||
102 | ]; | ||
103 | |||
104 | $client->submit($form, $data); | ||
105 | |||
106 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
107 | |||
108 | $crawler = $client->followRedirect(); | ||
109 | |||
110 | $content = $client->getContainer() | ||
111 | ->get('doctrine.orm.entity_manager') | ||
112 | ->getRepository('WallabagCoreBundle:Entry') | ||
113 | ->findByUrlAndUserId( | ||
114 | 'http://www.liberation.fr/societe/2012/12/06/baumettes-un-tour-en-cellule_865551', | ||
115 | $this->getLoggedInUserId() | ||
116 | ); | ||
117 | |||
118 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | ||
119 | $this->assertContains('flashes.import.notice.summary', $body[0]); | ||
120 | |||
121 | $this->assertNotEmpty($content->getMimetype()); | ||
122 | $this->assertNotEmpty($content->getPreviewPicture()); | ||
123 | $this->assertNotEmpty($content->getLanguage()); | ||
124 | $this->assertEquals(0, count($content->getTags())); | ||
125 | $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt()); | ||
126 | } | ||
127 | |||
128 | public function testImportInstapaperWithFileAndMarkAllAsRead() | ||
129 | { | ||
130 | $this->logInAs('admin'); | ||
131 | $client = $this->getClient(); | ||
132 | |||
133 | $crawler = $client->request('GET', '/import/instapaper'); | ||
134 | $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form(); | ||
135 | |||
136 | $file = new UploadedFile(__DIR__.'/../fixtures/instapaper-export.csv', 'instapaper-read.csv'); | ||
137 | |||
138 | $data = [ | ||
139 | 'upload_import_file[file]' => $file, | ||
140 | 'upload_import_file[mark_as_read]' => 1, | ||
141 | ]; | ||
142 | |||
143 | $client->submit($form, $data); | ||
144 | |||
145 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
146 | |||
147 | $crawler = $client->followRedirect(); | ||
148 | |||
149 | $content1 = $client->getContainer() | ||
150 | ->get('doctrine.orm.entity_manager') | ||
151 | ->getRepository('WallabagCoreBundle:Entry') | ||
152 | ->findByUrlAndUserId( | ||
153 | 'https://redditblog.com/2016/09/20/amp-and-reactredux/', | ||
154 | $this->getLoggedInUserId() | ||
155 | ); | ||
156 | |||
157 | $this->assertTrue($content1->isArchived()); | ||
158 | |||
159 | $content2 = $client->getContainer() | ||
160 | ->get('doctrine.orm.entity_manager') | ||
161 | ->getRepository('WallabagCoreBundle:Entry') | ||
162 | ->findByUrlAndUserId( | ||
163 | 'https://medium.com/@the_minh/why-foursquare-swarm-is-still-my-favourite-social-network-e38228493e6c', | ||
164 | $this->getLoggedInUserId() | ||
165 | ); | ||
166 | |||
167 | $this->assertTrue($content2->isArchived()); | ||
168 | |||
169 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | ||
170 | $this->assertContains('flashes.import.notice.summary', $body[0]); | ||
171 | } | ||
172 | |||
173 | public function testImportInstapaperWithEmptyFile() | ||
174 | { | ||
175 | $this->logInAs('admin'); | ||
176 | $client = $this->getClient(); | ||
177 | |||
178 | $crawler = $client->request('GET', '/import/instapaper'); | ||
179 | $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form(); | ||
180 | |||
181 | $file = new UploadedFile(__DIR__.'/../fixtures/test.txt', 'test.txt'); | ||
182 | |||
183 | $data = [ | ||
184 | 'upload_import_file[file]' => $file, | ||
185 | ]; | ||
186 | |||
187 | $client->submit($form, $data); | ||
188 | |||
189 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
190 | |||
191 | $crawler = $client->followRedirect(); | ||
192 | |||
193 | $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); | ||
194 | $this->assertContains('flashes.import.notice.failed', $body[0]); | ||
195 | } | ||
196 | } | ||
diff --git a/tests/Wallabag/ImportBundle/Import/InstapaperImportTest.php b/tests/Wallabag/ImportBundle/Import/InstapaperImportTest.php new file mode 100644 index 00000000..75900bd7 --- /dev/null +++ b/tests/Wallabag/ImportBundle/Import/InstapaperImportTest.php | |||
@@ -0,0 +1,233 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Tests\Wallabag\ImportBundle\Import; | ||
4 | |||
5 | use Wallabag\ImportBundle\Import\InstapaperImport; | ||
6 | use Wallabag\UserBundle\Entity\User; | ||
7 | use Wallabag\CoreBundle\Entity\Entry; | ||
8 | use Wallabag\ImportBundle\Redis\Producer; | ||
9 | use Monolog\Logger; | ||
10 | use Monolog\Handler\TestHandler; | ||
11 | use Simpleue\Queue\RedisQueue; | ||
12 | use M6Web\Component\RedisMock\RedisMockFactory; | ||
13 | |||
14 | class InstapaperImportTest extends \PHPUnit_Framework_TestCase | ||
15 | { | ||
16 | protected $user; | ||
17 | protected $em; | ||
18 | protected $logHandler; | ||
19 | protected $contentProxy; | ||
20 | |||
21 | private function getInstapaperImport($unsetUser = false) | ||
22 | { | ||
23 | $this->user = new User(); | ||
24 | |||
25 | $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager') | ||
26 | ->disableOriginalConstructor() | ||
27 | ->getMock(); | ||
28 | |||
29 | $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy') | ||
30 | ->disableOriginalConstructor() | ||
31 | ->getMock(); | ||
32 | |||
33 | $import = new InstapaperImport($this->em, $this->contentProxy); | ||
34 | |||
35 | $this->logHandler = new TestHandler(); | ||
36 | $logger = new Logger('test', [$this->logHandler]); | ||
37 | $import->setLogger($logger); | ||
38 | |||
39 | if (false === $unsetUser) { | ||
40 | $import->setUser($this->user); | ||
41 | } | ||
42 | |||
43 | return $import; | ||
44 | } | ||
45 | |||
46 | public function testInit() | ||
47 | { | ||
48 | $instapaperImport = $this->getInstapaperImport(); | ||
49 | |||
50 | $this->assertEquals('Instapaper', $instapaperImport->getName()); | ||
51 | $this->assertNotEmpty($instapaperImport->getUrl()); | ||
52 | $this->assertEquals('import.instapaper.description', $instapaperImport->getDescription()); | ||
53 | } | ||
54 | |||
55 | public function testImport() | ||
56 | { | ||
57 | $instapaperImport = $this->getInstapaperImport(); | ||
58 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv'); | ||
59 | |||
60 | $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') | ||
61 | ->disableOriginalConstructor() | ||
62 | ->getMock(); | ||
63 | |||
64 | $entryRepo->expects($this->exactly(3)) | ||
65 | ->method('findByUrlAndUserId') | ||
66 | ->willReturn(false); | ||
67 | |||
68 | $this->em | ||
69 | ->expects($this->any()) | ||
70 | ->method('getRepository') | ||
71 | ->willReturn($entryRepo); | ||
72 | |||
73 | $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry') | ||
74 | ->disableOriginalConstructor() | ||
75 | ->getMock(); | ||
76 | |||
77 | $this->contentProxy | ||
78 | ->expects($this->exactly(3)) | ||
79 | ->method('updateEntry') | ||
80 | ->willReturn($entry); | ||
81 | |||
82 | $res = $instapaperImport->import(); | ||
83 | |||
84 | $this->assertTrue($res); | ||
85 | $this->assertEquals(['skipped' => 0, 'imported' => 3, 'queued' => 0], $instapaperImport->getSummary()); | ||
86 | } | ||
87 | |||
88 | public function testImportAndMarkAllAsRead() | ||
89 | { | ||
90 | $instapaperImport = $this->getInstapaperImport(); | ||
91 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv'); | ||
92 | |||
93 | $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') | ||
94 | ->disableOriginalConstructor() | ||
95 | ->getMock(); | ||
96 | |||
97 | $entryRepo->expects($this->exactly(3)) | ||
98 | ->method('findByUrlAndUserId') | ||
99 | ->will($this->onConsecutiveCalls(false, true, true)); | ||
100 | |||
101 | $this->em | ||
102 | ->expects($this->any()) | ||
103 | ->method('getRepository') | ||
104 | ->willReturn($entryRepo); | ||
105 | |||
106 | $this->contentProxy | ||
107 | ->expects($this->once()) | ||
108 | ->method('updateEntry') | ||
109 | ->willReturn(new Entry($this->user)); | ||
110 | |||
111 | // check that every entry persisted are archived | ||
112 | $this->em | ||
113 | ->expects($this->once()) | ||
114 | ->method('persist') | ||
115 | ->with($this->callback(function ($persistedEntry) { | ||
116 | return $persistedEntry->isArchived(); | ||
117 | })); | ||
118 | |||
119 | $res = $instapaperImport->setMarkAsRead(true)->import(); | ||
120 | |||
121 | $this->assertTrue($res); | ||
122 | |||
123 | $this->assertEquals(['skipped' => 2, 'imported' => 1, 'queued' => 0], $instapaperImport->getSummary()); | ||
124 | } | ||
125 | |||
126 | public function testImportWithRabbit() | ||
127 | { | ||
128 | $instapaperImport = $this->getInstapaperImport(); | ||
129 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv'); | ||
130 | |||
131 | $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') | ||
132 | ->disableOriginalConstructor() | ||
133 | ->getMock(); | ||
134 | |||
135 | $entryRepo->expects($this->never()) | ||
136 | ->method('findByUrlAndUserId'); | ||
137 | |||
138 | $this->em | ||
139 | ->expects($this->never()) | ||
140 | ->method('getRepository'); | ||
141 | |||
142 | $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry') | ||
143 | ->disableOriginalConstructor() | ||
144 | ->getMock(); | ||
145 | |||
146 | $this->contentProxy | ||
147 | ->expects($this->never()) | ||
148 | ->method('updateEntry'); | ||
149 | |||
150 | $producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer') | ||
151 | ->disableOriginalConstructor() | ||
152 | ->getMock(); | ||
153 | |||
154 | $producer | ||
155 | ->expects($this->exactly(3)) | ||
156 | ->method('publish'); | ||
157 | |||
158 | $instapaperImport->setProducer($producer); | ||
159 | |||
160 | $res = $instapaperImport->setMarkAsRead(true)->import(); | ||
161 | |||
162 | $this->assertTrue($res); | ||
163 | $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $instapaperImport->getSummary()); | ||
164 | } | ||
165 | |||
166 | public function testImportWithRedis() | ||
167 | { | ||
168 | $instapaperImport = $this->getInstapaperImport(); | ||
169 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv'); | ||
170 | |||
171 | $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') | ||
172 | ->disableOriginalConstructor() | ||
173 | ->getMock(); | ||
174 | |||
175 | $entryRepo->expects($this->never()) | ||
176 | ->method('findByUrlAndUserId'); | ||
177 | |||
178 | $this->em | ||
179 | ->expects($this->never()) | ||
180 | ->method('getRepository'); | ||
181 | |||
182 | $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry') | ||
183 | ->disableOriginalConstructor() | ||
184 | ->getMock(); | ||
185 | |||
186 | $this->contentProxy | ||
187 | ->expects($this->never()) | ||
188 | ->method('updateEntry'); | ||
189 | |||
190 | $factory = new RedisMockFactory(); | ||
191 | $redisMock = $factory->getAdapter('Predis\Client', true); | ||
192 | |||
193 | $queue = new RedisQueue($redisMock, 'instapaper'); | ||
194 | $producer = new Producer($queue); | ||
195 | |||
196 | $instapaperImport->setProducer($producer); | ||
197 | |||
198 | $res = $instapaperImport->setMarkAsRead(true)->import(); | ||
199 | |||
200 | $this->assertTrue($res); | ||
201 | $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $instapaperImport->getSummary()); | ||
202 | |||
203 | $this->assertNotEmpty($redisMock->lpop('instapaper')); | ||
204 | } | ||
205 | |||
206 | public function testImportBadFile() | ||
207 | { | ||
208 | $instapaperImport = $this->getInstapaperImport(); | ||
209 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/wallabag-v1.jsonx'); | ||
210 | |||
211 | $res = $instapaperImport->import(); | ||
212 | |||
213 | $this->assertFalse($res); | ||
214 | |||
215 | $records = $this->logHandler->getRecords(); | ||
216 | $this->assertContains('InstapaperImport: unable to read file', $records[0]['message']); | ||
217 | $this->assertEquals('ERROR', $records[0]['level_name']); | ||
218 | } | ||
219 | |||
220 | public function testImportUserNotDefined() | ||
221 | { | ||
222 | $instapaperImport = $this->getInstapaperImport(true); | ||
223 | $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv'); | ||
224 | |||
225 | $res = $instapaperImport->import(); | ||
226 | |||
227 | $this->assertFalse($res); | ||
228 | |||
229 | $records = $this->logHandler->getRecords(); | ||
230 | $this->assertContains('InstapaperImport: user is not defined', $records[0]['message']); | ||
231 | $this->assertEquals('ERROR', $records[0]['level_name']); | ||
232 | } | ||
233 | } | ||
diff --git a/tests/Wallabag/ImportBundle/fixtures/instapaper-export.csv b/tests/Wallabag/ImportBundle/fixtures/instapaper-export.csv new file mode 100644 index 00000000..28a4c8e6 --- /dev/null +++ b/tests/Wallabag/ImportBundle/fixtures/instapaper-export.csv | |||
@@ -0,0 +1,4 @@ | |||
1 | URL,Title,Selection,Folder | ||
2 | http://www.liberation.fr/societe/2012/12/06/baumettes-un-tour-en-cellule_865551,Baumettes : un tour en cellule,,Unread | ||
3 | https://redditblog.com/2016/09/20/amp-and-reactredux/,AMP and React+Redux: Why Not?,,Archive | ||
4 | https://medium.com/@the_minh/why-foursquare-swarm-is-still-my-favourite-social-network-e38228493e6c,Why Foursquare / Swarm is still my favourite social network,,Starred | ||
diff --git a/tests/Wallabag/UserBundle/Controller/ManageControllerTest.php b/tests/Wallabag/UserBundle/Controller/ManageControllerTest.php new file mode 100644 index 00000000..19b824b8 --- /dev/null +++ b/tests/Wallabag/UserBundle/Controller/ManageControllerTest.php | |||
@@ -0,0 +1,82 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\UserBundle\Tests\Controller; | ||
4 | |||
5 | use Tests\Wallabag\CoreBundle\WallabagCoreTestCase; | ||
6 | |||
7 | class ManageControllerTest extends WallabagCoreTestCase | ||
8 | { | ||
9 | public function testLogin() | ||
10 | { | ||
11 | $client = $this->getClient(); | ||
12 | |||
13 | $client->request('GET', '/users/'); | ||
14 | |||
15 | $this->assertEquals(302, $client->getResponse()->getStatusCode()); | ||
16 | $this->assertContains('login', $client->getResponse()->headers->get('location')); | ||
17 | } | ||
18 | |||
19 | public function testCompleteScenario() | ||
20 | { | ||
21 | $this->logInAs('admin'); | ||
22 | $client = $this->getClient(); | ||
23 | |||
24 | // Create a new user in the database | ||
25 | $crawler = $client->request('GET', '/users/'); | ||
26 | $this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET /users/"); | ||
27 | $crawler = $client->click($crawler->selectLink('user.list.create_new_one')->link()); | ||
28 | |||
29 | // Fill in the form and submit it | ||
30 | $form = $crawler->selectButton('user.form.save')->form(array( | ||
31 | 'new_user[username]' => 'test_user', | ||
32 | 'new_user[email]' => 'test@test.io', | ||
33 | 'new_user[plainPassword][first]' => 'test', | ||
34 | 'new_user[plainPassword][second]' => 'test', | ||
35 | )); | ||
36 | |||
37 | $client->submit($form); | ||
38 | $client->followRedirect(); | ||
39 | $crawler = $client->request('GET', '/users/'); | ||
40 | |||
41 | // Check data in the show view | ||
42 | $this->assertGreaterThan(0, $crawler->filter('td:contains("test_user")')->count(), 'Missing element td:contains("test_user")'); | ||
43 | |||
44 | // Edit the user | ||
45 | $crawler = $client->click($crawler->selectLink('user.list.edit_action')->last()->link()); | ||
46 | |||
47 | $form = $crawler->selectButton('user.form.save')->form(array( | ||
48 | 'user[name]' => 'Foo User', | ||
49 | 'user[username]' => 'test_user', | ||
50 | 'user[email]' => 'test@test.io', | ||
51 | 'user[enabled]' => true, | ||
52 | 'user[locked]' => false, | ||
53 | )); | ||
54 | |||
55 | $client->submit($form); | ||
56 | $crawler = $client->followRedirect(); | ||
57 | |||
58 | // Check the element contains an attribute with value equals "Foo User" | ||
59 | $this->assertGreaterThan(0, $crawler->filter('[value="Foo User"]')->count(), 'Missing element [value="Foo User"]'); | ||
60 | |||
61 | $crawler = $client->request('GET', '/users/'); | ||
62 | $crawler = $client->click($crawler->selectLink('user.list.edit_action')->last()->link()); | ||
63 | |||
64 | // Delete the user | ||
65 | $client->submit($crawler->selectButton('user.form.delete')->form()); | ||
66 | $crawler = $client->followRedirect(); | ||
67 | |||
68 | // Check the user has been delete on the list | ||
69 | $this->assertNotRegExp('/Foo User/', $client->getResponse()->getContent()); | ||
70 | } | ||
71 | |||
72 | public function testDeleteDisabledForLoggedUser() | ||
73 | { | ||
74 | $this->logInAs('admin'); | ||
75 | $client = $this->getClient(); | ||
76 | |||
77 | $crawler = $client->request('GET', '/users/'.$this->getLoggedInUserId().'/edit'); | ||
78 | $disabled = $crawler->selectButton('user.form.delete')->extract('disabled'); | ||
79 | |||
80 | $this->assertEquals('disabled', $disabled[0]); | ||
81 | } | ||
82 | } | ||
diff --git a/tests/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListenerTest.php b/tests/Wallabag/UserBundle/EventListener/CreateConfigListenerTest.php index e45722fa..0cebd3e4 100644 --- a/tests/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListenerTest.php +++ b/tests/Wallabag/UserBundle/EventListener/CreateConfigListenerTest.php | |||
@@ -1,6 +1,6 @@ | |||
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | namespace Tests\Wallabag\CoreBundle\EventListener; | 3 | namespace Tests\Wallabag\UserBundle\EventListener; |
4 | 4 | ||
5 | use FOS\UserBundle\Event\FilterUserResponseEvent; | 5 | use FOS\UserBundle\Event\FilterUserResponseEvent; |
6 | use FOS\UserBundle\FOSUserEvents; | 6 | use FOS\UserBundle\FOSUserEvents; |
@@ -8,10 +8,10 @@ use Symfony\Component\EventDispatcher\EventDispatcher; | |||
8 | use Symfony\Component\HttpFoundation\Request; | 8 | use Symfony\Component\HttpFoundation\Request; |
9 | use Symfony\Component\HttpFoundation\Response; | 9 | use Symfony\Component\HttpFoundation\Response; |
10 | use Wallabag\CoreBundle\Entity\Config; | 10 | use Wallabag\CoreBundle\Entity\Config; |
11 | use Wallabag\CoreBundle\EventListener\RegistrationConfirmedListener; | 11 | use Wallabag\UserBundle\EventListener\CreateConfigListener; |
12 | use Wallabag\UserBundle\Entity\User; | 12 | use Wallabag\UserBundle\Entity\User; |
13 | 13 | ||
14 | class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase | 14 | class CreateConfigListenerTest extends \PHPUnit_Framework_TestCase |
15 | { | 15 | { |
16 | private $em; | 16 | private $em; |
17 | private $listener; | 17 | private $listener; |
@@ -25,12 +25,13 @@ class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase | |||
25 | ->disableOriginalConstructor() | 25 | ->disableOriginalConstructor() |
26 | ->getMock(); | 26 | ->getMock(); |
27 | 27 | ||
28 | $this->listener = new RegistrationConfirmedListener( | 28 | $this->listener = new CreateConfigListener( |
29 | $this->em, | 29 | $this->em, |
30 | 'baggy', | 30 | 'baggy', |
31 | 20, | 31 | 20, |
32 | 50, | 32 | 50, |
33 | 'fr' | 33 | 'fr', |
34 | 1 | ||
34 | ); | 35 | ); |
35 | 36 | ||
36 | $this->dispatcher = new EventDispatcher(); | 37 | $this->dispatcher = new EventDispatcher(); |
@@ -55,7 +56,7 @@ class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase | |||
55 | $this->em->expects($this->never())->method('flush'); | 56 | $this->em->expects($this->never())->method('flush'); |
56 | 57 | ||
57 | $this->dispatcher->dispatch( | 58 | $this->dispatcher->dispatch( |
58 | FOSUserEvents::REGISTRATION_CONFIRMED, | 59 | FOSUserEvents::REGISTRATION_COMPLETED, |
59 | $event | 60 | $event |
60 | ); | 61 | ); |
61 | } | 62 | } |
@@ -76,6 +77,7 @@ class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase | |||
76 | $config->setItemsPerPage(20); | 77 | $config->setItemsPerPage(20); |
77 | $config->setRssLimit(50); | 78 | $config->setRssLimit(50); |
78 | $config->setLanguage('fr'); | 79 | $config->setLanguage('fr'); |
80 | $config->setReadingSpeed(1); | ||
79 | 81 | ||
80 | $this->em->expects($this->once()) | 82 | $this->em->expects($this->once()) |
81 | ->method('persist') | 83 | ->method('persist') |
@@ -84,7 +86,7 @@ class RegistrationConfirmedListenerTest extends \PHPUnit_Framework_TestCase | |||
84 | ->method('flush'); | 86 | ->method('flush'); |
85 | 87 | ||
86 | $this->dispatcher->dispatch( | 88 | $this->dispatcher->dispatch( |
87 | FOSUserEvents::REGISTRATION_CONFIRMED, | 89 | FOSUserEvents::REGISTRATION_COMPLETED, |
88 | $event | 90 | $event |
89 | ); | 91 | ); |
90 | } | 92 | } |
diff --git a/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php b/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php index f670c925..441d6519 100644 --- a/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php +++ b/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php | |||
@@ -37,7 +37,7 @@ class AuthCodeMailerTest extends \PHPUnit_Framework_TestCase | |||
37 | ); | 37 | ); |
38 | $this->mailer = new \Swift_Mailer($transport); | 38 | $this->mailer = new \Swift_Mailer($transport); |
39 | 39 | ||
40 | $twigTemplate = <<<TWIG | 40 | $twigTemplate = <<<'TWIG' |
41 | {% block subject %}subject{% endblock %} | 41 | {% block subject %}subject{% endblock %} |
42 | {% block body_html %}html body {{ code }}{% endblock %} | 42 | {% block body_html %}html body {{ code }}{% endblock %} |
43 | {% block body_text %}text body {{ support_url }}{% endblock %} | 43 | {% block body_text %}text body {{ support_url }}{% endblock %} |