aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag
diff options
context:
space:
mode:
Diffstat (limited to 'src/Wallabag')
-rw-r--r--src/Wallabag/AnnotationBundle/Entity/Annotation.php6
-rw-r--r--src/Wallabag/CoreBundle/Command/InstallCommand.php23
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php4
-rw-r--r--src/Wallabag/CoreBundle/Entity/Entry.php2
-rw-r--r--src/Wallabag/CoreBundle/Helper/ContentProxy.php34
-rw-r--r--src/Wallabag/CoreBundle/Helper/EntriesExport.php34
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.de.yml450
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml438
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php85
-rw-r--r--src/Wallabag/ImportBundle/Controller/PocketController.php9
-rw-r--r--src/Wallabag/ImportBundle/Import/PocketImport.php2
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagV1Import.php25
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagV2Import.php32
-rw-r--r--src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php23
-rw-r--r--src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php2
-rw-r--r--src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php10
-rw-r--r--src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php11
-rw-r--r--src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json31
20 files changed, 690 insertions, 535 deletions
diff --git a/src/Wallabag/AnnotationBundle/Entity/Annotation.php b/src/Wallabag/AnnotationBundle/Entity/Annotation.php
index db9590b0..90ee7c2d 100644
--- a/src/Wallabag/AnnotationBundle/Entity/Annotation.php
+++ b/src/Wallabag/AnnotationBundle/Entity/Annotation.php
@@ -82,7 +82,7 @@ class Annotation
82 /* 82 /*
83 * @param User $user 83 * @param User $user
84 */ 84 */
85 public function __construct(\Wallabag\UserBundle\Entity\User $user) 85 public function __construct(User $user)
86 { 86 {
87 $this->user = $user; 87 $this->user = $user;
88 } 88 }
@@ -204,7 +204,7 @@ class Annotation
204 /** 204 /**
205 * Set user. 205 * Set user.
206 * 206 *
207 * @param string $user 207 * @param User $user
208 * 208 *
209 * @return Annotation 209 * @return Annotation
210 */ 210 */
@@ -218,7 +218,7 @@ class Annotation
218 /** 218 /**
219 * Get user. 219 * Get user.
220 * 220 *
221 * @return string 221 * @return User
222 */ 222 */
223 public function getUser() 223 public function getUser()
224 { 224 {
diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php
index c9dad0df..2d73a9ad 100644
--- a/src/Wallabag/CoreBundle/Command/InstallCommand.php
+++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php
@@ -83,7 +83,8 @@ class InstallCommand extends ContainerAwareCommand
83 $help = 'Needs one of sqlite, mysql or pgsql PDO drivers'; 83 $help = 'Needs one of sqlite, mysql or pgsql PDO drivers';
84 } 84 }
85 85
86 $rows[] = array($label, $status, $help); 86 $rows = [];
87 $rows[] = [$label, $status, $help];
87 88
88 foreach ($this->functionExists as $functionRequired) { 89 foreach ($this->functionExists as $functionRequired) {
89 $label = '<comment>'.$functionRequired.'</comment>'; 90 $label = '<comment>'.$functionRequired.'</comment>';
@@ -97,12 +98,12 @@ class InstallCommand extends ContainerAwareCommand
97 $help = 'You need the '.$functionRequired.' function activated'; 98 $help = 'You need the '.$functionRequired.' function activated';
98 } 99 }
99 100
100 $rows[] = array($label, $status, $help); 101 $rows[] = [$label, $status, $help];
101 } 102 }
102 103
103 $table = new Table($this->defaultOutput); 104 $table = new Table($this->defaultOutput);
104 $table 105 $table
105 ->setHeaders(array('Checked', 'Status', 'Recommendation')) 106 ->setHeaders(['Checked', 'Status', 'Recommendation'])
106 ->setRows($rows) 107 ->setRows($rows)
107 ->render(); 108 ->render();
108 109
@@ -126,7 +127,7 @@ class InstallCommand extends ContainerAwareCommand
126 $this->defaultOutput->writeln('Droping database, creating database and schema, clearing the cache'); 127 $this->defaultOutput->writeln('Droping database, creating database and schema, clearing the cache');
127 128
128 $this 129 $this
129 ->runCommand('doctrine:database:drop', array('--force' => true)) 130 ->runCommand('doctrine:database:drop', ['--force' => true])
130 ->runCommand('doctrine:database:create') 131 ->runCommand('doctrine:database:create')
131 ->runCommand('doctrine:schema:create') 132 ->runCommand('doctrine:schema:create')
132 ->runCommand('cache:clear') 133 ->runCommand('cache:clear')
@@ -158,7 +159,7 @@ class InstallCommand extends ContainerAwareCommand
158 $this->defaultOutput->writeln('Droping database, creating database and schema'); 159 $this->defaultOutput->writeln('Droping database, creating database and schema');
159 160
160 $this 161 $this
161 ->runCommand('doctrine:database:drop', array('--force' => true)) 162 ->runCommand('doctrine:database:drop', ['--force' => true])
162 ->runCommand('doctrine:database:create') 163 ->runCommand('doctrine:database:create')
163 ->runCommand('doctrine:schema:create') 164 ->runCommand('doctrine:schema:create')
164 ; 165 ;
@@ -168,7 +169,7 @@ class InstallCommand extends ContainerAwareCommand
168 $this->defaultOutput->writeln('Droping schema and creating schema'); 169 $this->defaultOutput->writeln('Droping schema and creating schema');
169 170
170 $this 171 $this
171 ->runCommand('doctrine:schema:drop', array('--force' => true)) 172 ->runCommand('doctrine:schema:drop', ['--force' => true])
172 ->runCommand('doctrine:schema:create') 173 ->runCommand('doctrine:schema:create')
173 ; 174 ;
174 } 175 }
@@ -388,19 +389,19 @@ class InstallCommand extends ContainerAwareCommand
388 * @param string $command 389 * @param string $command
389 * @param array $parameters Parameters to this command (usually 'force' => true) 390 * @param array $parameters Parameters to this command (usually 'force' => true)
390 */ 391 */
391 protected function runCommand($command, $parameters = array()) 392 protected function runCommand($command, $parameters = [])
392 { 393 {
393 $parameters = array_merge( 394 $parameters = array_merge(
394 array('command' => $command), 395 ['command' => $command],
395 $parameters, 396 $parameters,
396 array( 397 [
397 '--no-debug' => true, 398 '--no-debug' => true,
398 '--env' => $this->defaultInput->getOption('env') ?: 'dev', 399 '--env' => $this->defaultInput->getOption('env') ?: 'dev',
399 ) 400 ]
400 ); 401 );
401 402
402 if ($this->defaultInput->getOption('no-interaction')) { 403 if ($this->defaultInput->getOption('no-interaction')) {
403 $parameters = array_merge($parameters, array('--no-interaction' => true)); 404 $parameters = array_merge($parameters, ['--no-interaction' => true]);
404 } 405 }
405 406
406 $this->getApplication()->setAutoExit(false); 407 $this->getApplication()->setAutoExit(false);
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index 1a0b80ac..fa633031 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -92,13 +92,11 @@ class EntryController extends Controller
92 } 92 }
93 93
94 /** 94 /**
95 * @param Request $request
96 *
97 * @Route("/new", name="new") 95 * @Route("/new", name="new")
98 * 96 *
99 * @return \Symfony\Component\HttpFoundation\Response 97 * @return \Symfony\Component\HttpFoundation\Response
100 */ 98 */
101 public function addEntryAction(Request $request) 99 public function addEntryAction()
102 { 100 {
103 return $this->render('WallabagCoreBundle:Entry:new.html.twig'); 101 return $this->render('WallabagCoreBundle:Entry:new.html.twig');
104 } 102 }
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php
index 8f4ddf61..1271f1f5 100644
--- a/src/Wallabag/CoreBundle/Entity/Entry.php
+++ b/src/Wallabag/CoreBundle/Entity/Entry.php
@@ -187,7 +187,7 @@ class Entry
187 /* 187 /*
188 * @param User $user 188 * @param User $user
189 */ 189 */
190 public function __construct(\Wallabag\UserBundle\Entity\User $user) 190 public function __construct(User $user)
191 { 191 {
192 $this->user = $user; 192 $this->user = $user;
193 $this->tags = new ArrayCollection(); 193 $this->tags = new ArrayCollection();
diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php
index ba90b731..ed4a220d 100644
--- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php
+++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php
@@ -32,14 +32,21 @@ class ContentProxy
32 * Fetch content using graby and hydrate given entry with results information. 32 * Fetch content using graby and hydrate given entry with results information.
33 * In case we couldn't find content, we'll try to use Open Graph data. 33 * In case we couldn't find content, we'll try to use Open Graph data.
34 * 34 *
35 * @param Entry $entry Entry to update 35 * We can also force the content, in case of an import from the v1 for example, so the function won't
36 * @param string $url Url to grab content for 36 * fetch the content from the website but rather use information given with the $content parameter.
37 *
38 * @param Entry $entry Entry to update
39 * @param string $url Url to grab content for
40 * @param array $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
37 * 41 *
38 * @return Entry 42 * @return Entry
39 */ 43 */
40 public function updateEntry(Entry $entry, $url) 44 public function updateEntry(Entry $entry, $url, array $content = [])
41 { 45 {
42 $content = $this->graby->fetchContent($url); 46 // do we have to fetch the content or the provided one is ok?
47 if (empty($content) || false === $this->validateContent($content)) {
48 $content = $this->graby->fetchContent($url);
49 }
43 50
44 $title = $content['title']; 51 $title = $content['title'];
45 if (!$title && isset($content['open_graph']['og_title'])) { 52 if (!$title && isset($content['open_graph']['og_title'])) {
@@ -62,7 +69,11 @@ class ContentProxy
62 $entry->setLanguage($content['language']); 69 $entry->setLanguage($content['language']);
63 $entry->setMimetype($content['content_type']); 70 $entry->setMimetype($content['content_type']);
64 $entry->setReadingTime(Utils::getReadingTime($html)); 71 $entry->setReadingTime(Utils::getReadingTime($html));
65 $entry->setDomainName(parse_url($entry->getUrl(), PHP_URL_HOST)); 72
73 $domainName = parse_url($entry->getUrl(), PHP_URL_HOST);
74 if (false !== $domainName) {
75 $entry->setDomainName($domainName);
76 }
66 77
67 if (isset($content['open_graph']['og_image'])) { 78 if (isset($content['open_graph']['og_image'])) {
68 $entry->setPreviewPicture($content['open_graph']['og_image']); 79 $entry->setPreviewPicture($content['open_graph']['og_image']);
@@ -113,4 +124,17 @@ class ContentProxy
113 } 124 }
114 } 125 }
115 } 126 }
127
128 /**
129 * Validate that the given content as enough value to be used
130 * instead of fetch the content from the url.
131 *
132 * @param array $content
133 *
134 * @return bool true if valid otherwise false
135 */
136 private function validateContent(array $content)
137 {
138 return isset($content['title']) && isset($content['html']) && isset($content['url']) && isset($content['language']) && isset($content['content_type']);
139 }
116} 140}
diff --git a/src/Wallabag/CoreBundle/Helper/EntriesExport.php b/src/Wallabag/CoreBundle/Helper/EntriesExport.php
index 6ecdf019..82004a6d 100644
--- a/src/Wallabag/CoreBundle/Helper/EntriesExport.php
+++ b/src/Wallabag/CoreBundle/Helper/EntriesExport.php
@@ -81,27 +81,9 @@ class EntriesExport
81 */ 81 */
82 public function exportAs($format) 82 public function exportAs($format)
83 { 83 {
84 switch ($format) { 84 $functionName = 'produce'.ucfirst($format);
85 case 'epub': 85 if (method_exists($this, $functionName)) {
86 return $this->produceEpub(); 86 return $this->$functionName();
87
88 case 'mobi':
89 return $this->produceMobi();
90
91 case 'pdf':
92 return $this->producePDF();
93
94 case 'csv':
95 return $this->produceCSV();
96
97 case 'json':
98 return $this->produceJSON();
99
100 case 'xml':
101 return $this->produceXML();
102
103 case 'txt':
104 return $this->produceTXT();
105 } 87 }
106 88
107 throw new \InvalidArgumentException(sprintf('The format "%s" is not yet supported.', $format)); 89 throw new \InvalidArgumentException(sprintf('The format "%s" is not yet supported.', $format));
@@ -242,7 +224,7 @@ class EntriesExport
242 /** 224 /**
243 * Use TCPDF to dump a .pdf file. 225 * Use TCPDF to dump a .pdf file.
244 */ 226 */
245 private function producePDF() 227 private function producePdf()
246 { 228 {
247 $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 229 $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
248 230
@@ -296,7 +278,7 @@ class EntriesExport
296 /** 278 /**
297 * Inspired from CsvFileDumper. 279 * Inspired from CsvFileDumper.
298 */ 280 */
299 private function produceCSV() 281 private function produceCsv()
300 { 282 {
301 $delimiter = ';'; 283 $delimiter = ';';
302 $enclosure = '"'; 284 $enclosure = '"';
@@ -336,7 +318,7 @@ class EntriesExport
336 ); 318 );
337 } 319 }
338 320
339 private function produceJSON() 321 private function produceJson()
340 { 322 {
341 return Response::create( 323 return Response::create(
342 $this->prepareSerializingContent('json'), 324 $this->prepareSerializingContent('json'),
@@ -349,7 +331,7 @@ class EntriesExport
349 ); 331 );
350 } 332 }
351 333
352 private function produceXML() 334 private function produceXml()
353 { 335 {
354 return Response::create( 336 return Response::create(
355 $this->prepareSerializingContent('xml'), 337 $this->prepareSerializingContent('xml'),
@@ -362,7 +344,7 @@ class EntriesExport
362 ); 344 );
363 } 345 }
364 346
365 private function produceTXT() 347 private function produceTxt()
366 { 348 {
367 $content = ''; 349 $content = '';
368 $bar = str_repeat('=', 100); 350 $bar = str_repeat('=', 100);
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index 34f567b1..ff6255b7 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -1,59 +1,59 @@
1security: 1security:
2 login: 2 login:
3 # page_title: 'Welcome to wallabag!' 3 page_title: 'Willkommen bei wallabag!'
4 keep_logged_in: 'Angemeldet bleiben' 4 keep_logged_in: 'Angemeldet bleiben'
5 forgot_password: 'Kennwort vergessen?' 5 forgot_password: 'Kennwort vergessen?'
6 submit: 'Anmelden' 6 submit: 'Anmelden'
7 # register: 'Register' 7 register: 'Registrieren'
8 username: 'Benutzername' 8 username: 'Benutzername'
9 password: 'Kennwort' 9 password: 'Kennwort'
10 # cancel: 'Cancel' 10 cancel: 'Abbrechen'
11 resetting: 11 resetting:
12 description: "Gib unten deine E-Mail-Adresse ein und wir senden dir eine Anleitung für das Zurücksetzen deines Kennworts." 12 description: "Gib unten deine E-Mail-Adresse ein und wir senden dir eine Anleitung für das Zurücksetzen deines Kennworts."
13 register: 13 register:
14 # page_title: 'Create an account' 14 page_title: 'Account erstellen'
15 # go_to_account: 'Go to your account' 15 go_to_account: 'Gehe zu deinem Account'
16 16
17menu: 17menu:
18 left: 18 left:
19 unread: 'Ungelesen' 19 unread: 'Ungelesen'
20 starred: 'Favoriten' 20 starred: 'Favoriten'
21 archive: 'Archiv' 21 archive: 'Archiv'
22 all_articles: 'Alle artikel' 22 all_articles: 'Alle Artikel'
23 config: 'Konfiguration' 23 config: 'Konfiguration'
24 tags: 'Tags' 24 tags: 'Tags'
25 # internal_settings: 'Internal Settings' 25 internal_settings: 'Interne Einstellungen'
26 # import: 'Import' 26 import: 'Importieren'
27 howto: 'How-to' 27 howto: 'How-To'
28 # developer: 'Developer' 28 developer: 'Entwickler'
29 logout: 'Abmelden' 29 logout: 'Abmelden'
30 about: 'Über' 30 about: 'Über'
31 search: 'Suche' 31 search: 'Suche'
32 # save_link: 'Save a link' 32 save_link: 'Link speichern'
33 back_to_unread: 'Zurück zu ungelesenen Artikeln' 33 back_to_unread: 'Zurück zu ungelesenen Artikeln'
34 top: 34 top:
35 add_new_entry: 'Neuen Artikel hinzufügen' 35 add_new_entry: 'Neuen Artikel hinzufügen'
36 search: 'Suche' 36 search: 'Suche'
37 filter_entries: 'Artikel filtern' 37 filter_entries: 'Artikel filtern'
38 # export: 'Export' 38 export: 'Exportieren'
39 search_form: 39 search_form:
40 input_label: 'Suchbegriff hier eingeben' 40 input_label: 'Suchbegriff hier eingeben'
41 41
42footer: 42footer:
43 wallabag: 43 wallabag:
44 # elsewhere: 'Take wallabag with you' 44 elsewhere: 'Nimm wallabag mit dir mit'
45 # social: 'Social' 45 social: 'Soziales'
46 # powered_by: 'powered by' 46 powered_by: 'angetrieben von'
47 about: 'Über' 47 about: 'Über'
48 48
49config: 49config:
50 page_title: 'Config' 50 page_title: 'Einstellungen'
51 tab_menu: 51 tab_menu:
52 settings: 'Einstellungen' 52 settings: 'Einstellungen'
53 rss: 'RSS' 53 rss: 'RSS'
54 user_info: 'Benutzer-Information' 54 user_info: 'Benutzer-Information'
55 password: 'Kennwort' 55 password: 'Kennwort'
56 # rules: 'Tagging rules' 56 rules: 'Tagging-Regeln'
57 new_user: 'Benutzer hinzufügen' 57 new_user: 'Benutzer hinzufügen'
58 form: 58 form:
59 save: 'Speichern' 59 save: 'Speichern'
@@ -62,12 +62,12 @@ config:
62 items_per_page_label: 'Einträge pro Seite' 62 items_per_page_label: 'Einträge pro Seite'
63 language_label: 'Sprache' 63 language_label: 'Sprache'
64 reading_speed: 64 reading_speed:
65 # label: 'Reading speed' 65 label: 'Lesegeschwindigkeit'
66 # help_message: 'You can use online tools to estimate your reading speed:' 66 help_message: 'Du kannst Online-Tools nutzen, um deine Lesegeschwindigkeit herauszufinden.'
67 # 100_word: 'I read ~100 words per minute' 67 100_word: 'Ich lese ~100 rter pro Minute'
68 # 200_word: 'I read ~200 words per minute' 68 200_word: 'Ich lese ~200 rter pro Minute'
69 # 300_word: 'I read ~300 words per minute' 69 300_word: 'Ich lese ~300 rter pro Minute'
70 # 400_word: 'I read ~400 words per minute' 70 400_word: 'Ich lese ~400 rter pro Minute'
71 form_rss: 71 form_rss:
72 description: 'Die RSS-Feeds von wallabag erlauben es dir, deine gespeicherten Artikel mit deinem bevorzugten RSS-Reader zu lesen. Vorher musst du jedoch einen Token erstellen.' 72 description: 'Die RSS-Feeds von wallabag erlauben es dir, deine gespeicherten Artikel mit deinem bevorzugten RSS-Reader zu lesen. Vorher musst du jedoch einen Token erstellen.'
73 token_label: 'RSS-token' 73 token_label: 'RSS-token'
@@ -79,53 +79,53 @@ config:
79 unread: 'ungelesen' 79 unread: 'ungelesen'
80 starred: 'favoriten' 80 starred: 'favoriten'
81 archive: 'archiv' 81 archive: 'archiv'
82 # rss_limit: 'Number of items in the feed' 82 rss_limit: 'Anzahl der Einträge im Feed'
83 form_user: 83 form_user:
84 # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion" 84 two_factor_description: "Wenn du die Zwei-Faktor-Authentifizierung aktivierst, erhältst du eine E-Mail mit einem Code bei jeder nicht vertraulichen Verbindung"
85 name_label: 'Name' 85 name_label: 'Name'
86 email_label: 'E-Mail-Adresse' 86 email_label: 'E-Mail-Adresse'
87 # twoFactorAuthentication_label: 'Two factor authentication' 87 twoFactorAuthentication_label: 'Zwei-Faktor-Authentifizierung'
88 form_password: 88 form_password:
89 old_password_label: 'Altes Kennwort' 89 old_password_label: 'Altes Kennwort'
90 new_password_label: 'Neues Kennwort' 90 new_password_label: 'Neues Kennwort'
91 repeat_new_password_label: 'Neues Kennwort wiederholen' 91 repeat_new_password_label: 'Neues Kennwort wiederholen'
92 form_rules: 92 form_rules:
93 # if_label: 'if' 93 if_label: 'Wenn'
94 # then_tag_as_label: 'then tag as' 94 then_tag_as_label: 'dann tagge als'
95 # delete_rule_label: 'delete' 95 delete_rule_label: 'löschen'
96 # rule_label: 'Rule' 96 rule_label: 'Regel'
97 # tags_label: 'Tags' 97 tags_label: 'Tags'
98 # faq: 98 faq:
99 # title: 'FAQ' 99 title: 'FAQ'
100 # tagging_rules_definition_title: 'What does « tagging rules » mean?' 100 tagging_rules_definition_title: 'Was bedeuten die "Tagging-Regeln"?'
101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.' 101 tagging_rules_definition_description: 'Dies sind Regeln von wallabag, um neu hinzugefügte Einträge autmatisch zu taggen.<br />Jedes Mal, wenn ein neuer Eintrag hinzufügt wird, werden die Tagging-Regeln angewandt. Dies erleichtert dir die Arbeit, deine Einträge manuell zu klassifizieren.'
102 # how_to_use_them_title: 'How do I use them?' 102 how_to_use_them_title: 'Wie nutze ich sie?'
103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »' 103 how_to_use_them_description: 'Nehmen wir an, du möchtest deine Einträge als "<i>schnell lesbar</i>" taggen, wenn die Lesezeit kürzer als drei Minuten ist.<br />In diesem Falle solltest du "readingTime &lt;= 3" in das <i>Regel</i>-Feld und "<i>schnell lesbar</i>" in das <i>Tags</i>-Feld schreiben.<br />Mehrere Tags können gleichzeitig hinzugefügt werden, indem sie durch ein Kommata getrennt werden: "<i>schnell lesbar, interessant</i>"<br />Komplexe Regeln können durch vordefinierte Operatoren geschrieben werden: if "<i>readingTime &gt;= 5 AND domainName = "github.com"</i>" then tag as "<i>long reading, github </i>"'
104 # variables_available_title: 'Which variables and operators can I use to write rules?' 104 variables_available_title: 'Welche Variablen und Operatoren kann ich nutzen, um Regeln zu schreiben?'
105 # variables_available_description: 'The following variables and operators can be used to create tagging rules:' 105 variables_available_description: 'Die folgenden Variablen und Operatoren können genutzt werden, um Tagging-Regeln zu erstellen:'
106 # meaning: 'Meaning' 106 meaning: 'Bedeutung'
107 # variable_description: 107 variable_description:
108 # label: 'Variable' 108 label: 'Variable'
109 # title: 'Title of the entry' 109 title: 'Titel des Eintrags'
110 # url: 'URL of the entry' 110 url: 'URL des Eintrags'
111 # isArchived: 'Whether the entry is archived or not' 111 isArchived: 'gibt an, ob der Eintrag archiviert ist oder nicht'
112 # isStarred: 'Whether the entry is starred or not' 112 isStarred: 'gibt an, ob der Eintrag favorisiert ist oder nicht'
113 # content: "The entry's content" 113 content: "Inhalt des Eintrags"
114 # language: "The entry's language" 114 language: "Sprache des Eintrags"
115 # mimetype: "The entry's mime-type" 115 mimetype: "MIME-Typ des Eintrags"
116 # readingTime: "The estimated entry's reading time, in minutes" 116 readingTime: "Die geschätzte Lesezeit in Minuten"
117 # domainName: 'The domain name of the entry' 117 domainName: 'Der Domain-Name des Eintrags'
118 # operator_description: 118 operator_description:
119 # label: 'Operator' 119 label: 'Operator'
120 # less_than: 'Less than...' 120 less_than: 'Weniger oder gleich als…'
121 # strictly_less_than: 'Strictly less than...' 121 strictly_less_than: 'Weniger als…'
122 # greater_than: 'Greater than...' 122 greater_than: 'Größer oder gleich als…'
123 # strictly_greater_than: 'Strictly greater than...' 123 strictly_greater_than: 'Größer als…'
124 # equal_to: 'Equal to...' 124 equal_to: 'gleich'
125 # not_equal_to: 'Not equal to...' 125 not_equal_to: 'ungleich'
126 # or: 'One rule OR another' 126 or: 'Eine Regel ODER die andere'
127 # and: 'One rule AND another' 127 and: 'Eine Regel UND eine andere'
128 # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' 128 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>'
129 form_new_user: 129 form_new_user:
130 username_label: 'Benutzername' 130 username_label: 'Benutzername'
131 password_label: 'Kennwort' 131 password_label: 'Kennwort'
@@ -135,12 +135,12 @@ config:
135 135
136entry: 136entry:
137 page_titles: 137 page_titles:
138 # unread: 'Unread entries' 138 unread: 'Ungelesene Einträge'
139 # starred: 'Starred entries' 139 starred: 'Favorisierte Einträge'
140 # archive: 'Archived entries' 140 archive: 'Archivierte Einträge'
141 # filtered: 'Filtered entries' 141 filtered: 'Gefilterte Einträge'
142 list: 142 list:
143 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 143 number_on_the_page: '{0} Es gibt keine Einträge.|{1} Es gibt einen Eintrag.|]1,Inf[ Es gibt %count% Einträge.'
144 reading_time: 'geschätzte Lesezeit' 144 reading_time: 'geschätzte Lesezeit'
145 reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min' 145 reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min'
146 reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min'
@@ -148,7 +148,7 @@ entry:
148 toogle_as_read: 'Gelesen-Status ändern' 148 toogle_as_read: 'Gelesen-Status ändern'
149 toogle_as_star: 'Favoriten-Status ändern' 149 toogle_as_star: 'Favoriten-Status ändern'
150 delete: 'Löschen' 150 delete: 'Löschen'
151 # export_title: 'Export' 151 export_title: 'Exportieren'
152 filters: 152 filters:
153 title: 'Filters' 153 title: 'Filters'
154 status_label: 'Status' 154 status_label: 'Status'
@@ -171,35 +171,35 @@ entry:
171 filter: 'Filter' 171 filter: 'Filter'
172 view: 172 view:
173 left_menu: 173 left_menu:
174 # back_to_top: 'Back to top' 174 back_to_top: 'Nach oben'
175 back_to_homepage: 'Zurück' 175 back_to_homepage: 'Zurück'
176 set_as_read: 'Als gelesen markieren' 176 set_as_read: 'Als gelesen markieren'
177 # set_as_unread: 'Mark as unread' 177 set_as_unread: 'Als ungelesen markieren'
178 set_as_favorite: 'Favorisieren' 178 set_as_favorite: 'Favorisieren'
179 view_original_article: 'Original-Artikel' 179 view_original_article: 'Original-Artikel'
180 # re_fetch_content: 'Re-fetch content' 180 re_fetch_content: 'Inhalt neu laden'
181 delete: 'Löschen' 181 delete: 'Löschen'
182 add_a_tag: 'Tag hinzufügen' 182 add_a_tag: 'Tag hinzufügen'
183 share_content: 'Teilen' 183 share_content: 'Teilen'
184 # share_email_label: 'Email' 184 share_email_label: 'E-Mail'
185 download: 'Herunterladen' 185 download: 'Herunterladen'
186 # print: 'Print' 186 print: 'Drucken'
187 problem: 187 problem:
188 label: 'Probleme?' 188 label: 'Probleme?'
189 description: 'Erscheint dieser Artikel falsch?' 189 description: 'Erscheint dieser Artikel falsch?'
190 edit_title: 'Titel ändern' 190 edit_title: 'Titel ändern'
191 original_article: 'original' 191 original_article: 'original'
192 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 192 annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %nbAnnotations% Anmerkungen'
193 new: 193 new:
194 page_title: 'Neuen Artikel speichern' 194 page_title: 'Neuen Artikel speichern'
195 placeholder: 'http://website.com' 195 placeholder: 'https://website.de'
196 form_new: 196 form_new:
197 url_label: Url 197 url_label: URL
198 edit: 198 edit:
199 # page_title: 'Edit an entry' 199 page_title: 'Eintrag bearbeiten'
200 # title_label: 'Title' 200 title_label: 'Titel'
201 # url_label: 'Url' 201 url_label: 'URL'
202 # is_public_label: 'Public' 202 is_public_label: 'Öffentlich'
203 save_label: 'Speichern' 203 save_label: 'Speichern'
204 204
205about: 205about:
@@ -208,7 +208,7 @@ about:
208 who_behind_wallabag: 'Wer steht hinter wallabag' 208 who_behind_wallabag: 'Wer steht hinter wallabag'
209 getting_help: 'Hilfe bekommen' 209 getting_help: 'Hilfe bekommen'
210 helping: 'wallabag unterstützen' 210 helping: 'wallabag unterstützen'
211 contributors: 'Contributors' 211 contributors: 'Unterstützer'
212 third_party: 'Third-party libraries' 212 third_party: 'Third-party libraries'
213 who_behind_wallabag: 213 who_behind_wallabag:
214 developped_by: 'Entwickelt von' 214 developped_by: 'Entwickelt von'
@@ -225,17 +225,17 @@ about:
225 description: 'wallabag ist kostenlos und Open-Source. Du kannst uns helfen:' 225 description: 'wallabag ist kostenlos und Open-Source. Du kannst uns helfen:'
226 by_contributing: 'indem du zu dem Projekt beiträgst:' 226 by_contributing: 'indem du zu dem Projekt beiträgst:'
227 by_contributing_2: 'ein Issue listet alle unsere Bedürfnisse:' 227 by_contributing_2: 'ein Issue listet alle unsere Bedürfnisse:'
228 by_paypal: 'via Paypal' 228 by_paypal: 'via PayPal'
229 contributors: 229 contributors:
230 # description: 'Thank you to contributors on wallabag web application' 230 description: 'Ein Dankeschön an die Unterstützer von wallabag'
231 third_party: 231 third_party:
232 # description: 'Here are the list of third-party libraries used in wallabag (with their licenses):' 232 description: 'Hier ist eine Liste der verwendeten Bibliotheken in wallabag (mit den jeweiligen Lizenzen):'
233 # package: 'Package' 233 package: 'Paket'
234 license: 'Lizenz' 234 license: 'Lizenz'
235 235
236howto: 236howto:
237 page_title: 'How-to' 237 page_title: 'How-To'
238 # page_description: 'There are several ways to save an article:' 238 page_description: 'Es gibt mehrere Möglichkeiten, einen Artikel zu speichern:'
239 top_menu: 239 top_menu:
240 browser_addons: 'Browser-Addons' 240 browser_addons: 'Browser-Addons'
241 mobile_apps: 'Apps' 241 mobile_apps: 'Apps'
@@ -249,162 +249,162 @@ howto:
249 android: 249 android:
250 via_f_droid: 'via F-Droid' 250 via_f_droid: 'via F-Droid'
251 via_google_play: 'via Google Play' 251 via_google_play: 'via Google Play'
252 # ios: 'on the iTunes Store' 252 ios: 'im iTunes-Store'
253 # windows: 'on the Microsoft Store' 253 windows: 'im Microsoft-Store'
254 bookmarklet: 254 bookmarklet:
255 description: 'Ziehe diesen Link in deine Lesezeichenleiste:' 255 description: 'Ziehe diesen Link in deine Lesezeichenleiste:'
256 256
257quickstart: 257quickstart:
258 # page_title: 'Quickstart' 258 page_title: 'Schnelleinstieg'
259 # intro: 259 intro:
260 # title: 'Welcome to wallabag!' 260 title: 'Willkommen zu wallabag!'
261 # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." 261 paragraph_1: "Wir werden dich bei der Benutzung von wallabag begleiten und dir einige Funktionen zeigen, die dich interessieren könnten."
262 # paragraph_2: 'Follow us!' 262 paragraph_2: 'Folge uns!'
263 # configure: 263 configure:
264 # title: 'Configure the application' 264 title: 'Anwendung konfigurieren'
265 # language: 'Change language and design' 265 language: 'Sprache und Design ändern'
266 # rss: 'Enable RSS feeds' 266 rss: 'RSS-Feeds aktivieren'
267 # tagging_rules: 'Write rules to automatically tag your articles' 267 tagging_rules: 'Schreibe Regeln, um deine Beiträge automatisch zu taggen (verschlagworten)'
268 # admin: 268 admin:
269 # title: 'Administration' 269 title: 'Administration'
270 # description: 'As an administrator, you have privileges on wallabag. You can:' 270 description: 'Als Adminstrator hast du einige Privilegien. Du kannst:'
271 # new_user: 'Create a new user' 271 new_user: 'Einen neuen Nutzer anlegen'
272 # analytics: 'Configure analytics' 272 analytics: 'das Tracking konfigurieren'
273 # sharing: 'Enable some parameters about article sharing' 273 sharing: 'Einige Parameter für das Teilen von Artikel setzen'
274 # export: 'Configure export' 274 export: 'Export-Einstellungen ändern'
275 # import: 'Configure import' 275 import: 'Import-Einstellungen ändern'
276 # first_steps: 276 first_steps:
277 # title: 'First steps' 277 title: 'Erste Schritte'
278 # new_article: 'Save your first article' 278 new_article: 'Speichere deinen ersten Artikel'
279 # unread_articles: 'And classify it!' 279 unread_articles: 'Und klassifiziere ihn!'
280 # migrate: 280 migrate:
281 # title: 'Migrate from an existing service' 281 title: 'Von einem anderen Dienst migrieren'
282 # description: "Are you using another service? We'll help you to retrieve your data on wallabag." 282 description: "Du nutzt einen anderen Dienst? Wir helfen dir, um deine Daten zu wallabag zu transportieren."
283 # pocket: 'Migrate from Pocket' 283 pocket: 'von Pocket migrieren'
284 # wallabag_v1: 'Migrate from wallabag v1' 284 wallabag_v1: 'von wallabag v1 migrieren'
285 # wallabag_v2: 'Migrate from wallabag v2' 285 wallabag_v2: 'von wallabag v2 migrieren'
286 # developer: 286 developer:
287 # title: 'Developers' 287 title: 'Entwickler'
288 # create_application: 'Create your third application' 288 create_application: 'Erstelle eine Anwendung und nutze die wallabag API'
289 # docs: 289 docs:
290 # title: 'Full documentation' 290 title: 'Komplette Dokumentation'
291 # annotate: 'Annotate your article' 291 annotate: 'Anmerkungen zu Artikeln hinzufügen'
292 # export: 'Convert your articles into ePUB or PDF' 292 export: 'Artikel nach ePUB oder PDF konvertieren'
293 # search_filters: 'See how you can look for an article by using search engine and filters' 293 search_filters: 'Schau nach, wie du nach einem Artikel über die Such- und Filterfunktion suchen kannst'
294 # fetching_errors: 'What can I do if an article encounters errors during fetching?' 294 fetching_errors: 'Was kann ich machen, wenn ein Artikel Fehler beim Herunterladen des Inhalts zeigt?'
295 # all_docs: 'And so many other articles!' 295 all_docs: 'Und viele weitere Artikel!'
296 # support: 296 support:
297 # title: 'Support' 297 title: 'Support'
298 # description: 'If you need some help, we are here for you.' 298 description: 'Wenn du Hilfe brauchst, wir sind für dich da.'
299 # github: 'On GitHub' 299 github: 'Auf GitHub'
300 # email: 'By email' 300 email: 'Über E-Mail'
301 # gitter: 'On Gitter' 301 gitter: 'Auf Gitter'
302 302
303tag: 303tag:
304 page_title: 'Tags' 304 page_title: 'Tags'
305 list: 305 list:
306 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 306 number_on_the_page: '{0} Es gibt keine Tags.|{1} Es gibt einen Tag.|]1,Inf[ Es gibt %count% Tags.'
307 307
308import: 308import:
309 # page_title: 'Import' 309 page_title: 'Importieren'
310 # page_description: 'Welcome to wallabag importer. Please select your previous service that you want to migrate.' 310 page_description: 'Willkommen beim wallabag-Importer. Wähle deinen vorherigen Service aus, von dem du die Daten migrieren willst.'
311 # action: 311 action:
312 # import_contents: 'Import contents' 312 import_contents: 'Inhalte importieren'
313 # form: 313 form:
314 # mark_as_read_title: 'Mark all as read?' 314 mark_as_read_title: 'Alle als gelesen markieren?'
315 # mark_as_read_label: 'Mark all imported entries as read' 315 mark_as_read_label: 'Alle importierten Einträge als gelesen markieren'
316 # file_label: 'File' 316 file_label: 'Datei'
317 # save_label: 'Upload file' 317 save_label: 'Datei hochladen'
318 # pocket: 318 pocket:
319 # page_title: 'Import > Pocket' 319 page_title: 'Aus Pocket importieren'
320 # description: "This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag." 320 description: "Dieser Importer wird all deine Pocket-Daten importieren. Pocket erlaubt es uns nicht, den Inhalt zu migrieren, daher wird der lesbare Inhalt erneut von wallabag heruntergeladen."
321 # config_missing: 321 config_missing:
322 # description: "Pocket import isn't configured." 322 description: "Pocket-Import ist nicht konfiguriert."
323 # admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.' 323 admin_message: 'Du musst noch den %keyurls%a pocket_consumer_key%keyurle% definieren.'
324 # user_message: 'Your server admin needs to define an API Key for Pocket.' 324 user_message: 'Der Server-Administrator muss noch einen API-Key für Pocket konfigurieren.'
325 # authorize_message: 'You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.' 325 authorize_message: 'Du kannst deine Daten von deinem Pocket-Account importieren. Dazu musst du nur den nachfolgenden Button klicken und die Anwendung authentifizieren, sich mit getpocket.com zu verbinden.'
326 # connect_to_pocket: 'Connect to Pocket and import data' 326 connect_to_pocket: 'Mit Pocket verbinden und Daten importieren'
327 # wallabag_v1: 327 wallabag_v1:
328 # page_title: 'Import > Wallabag v1' 328 page_title: 'Aus wallabag v1 importieren'
329 # description: 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.' 329 description: 'Dieser Import wird all deine Artikel aus wallabag v1 importieren. Klicke auf der Konfigurations-Seite auf "JSON-Export" im "wallabag-Daten exportieren"-Abschnitt. Du erhältst eine "wallabag-export-1-xxxx-xx-xx.json"-Datei.'
330 # how_to: 'Please select your wallabag export and click on the below button to upload and import it.' 330 how_to: 'Wähle die Export-Datei aus und klicke den nachfolgenden Button, um diese hochzuladen und zu importieren.'
331 # wallabag_v2: 331 wallabag_v2:
332 # page_title: 'Import > Wallabag v2' 332 page_title: 'Aus wallabag v2 importieren'
333 # description: 'This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.' 333 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.'
334 334
335developer: 335developer:
336 # page_title: 'Developer' 336 page_title: 'Entwickler'
337 # welcome_message: 'Welcome to the wallabag API' 337 welcome_message: 'Willkomen zur wallabag-API'
338 # documentation: 'Documentation' 338 documentation: 'Dokumentation'
339 # how_to_first_app: 'How to create my first application' 339 how_to_first_app: 'Wie erstelle ich meine erste Anwendung'
340 # full_documentation: 'View full API documentation' 340 full_documentation: 'Komplette API-Dokumentation einsehen'
341 # clients: 341 clients:
342 # title: 'Clients' 342 title: 'Clients'
343 # create_new: 'Create a new client' 343 create_new: 'Neuen Client erstellen'
344 # existing_clients: 344 existing_clients:
345 # title: 'Existing clients' 345 title: 'Bestehende Clients'
346 # field_id: 'Client ID' 346 field_id: 'Client-ID'
347 # field_secret: 'Client secret' 347 field_secret: 'Client-Secret'
348 # field_uris: 'Redirect URIs' 348 field_uris: 'Weiterleitungs-URIs'
349 # field_grant_types: 'Grant type allowed' 349 field_grant_types: "Erlaubte grant_types"
350 # no_client: 'No client yet.' 350 no_client: 'Bisher kein Client.'
351 # remove: 351 remove:
352 # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' 352 warn_message_1: 'Du hast die Möglichkeit, diesen Client zu entfernen. DIESE AKTION IST NICHT WIDERRUFBAR!'
353 # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." 353 warn_message_2: "Wenn du ihn entfernst, hat keine der damit konfigurierten Anwendungen mehr die Möglichkeit, sich in deinen wallabag-Account anzumelden."
354 # action: 'Remove this client' 354 action: 'Client entfernen'
355 # client: 355 client:
356 # page_title: 'Developer > New client' 356 page_title: 'Entwickler > Neuer Client'
357 # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' 357 page_description: 'Du bist dabei, einen neuen Client zu erstellen. Fülle das nachfolgende Feld für die Weiterleitungs-URIs deiner Anwendung aus.'
358 # form: 358 form:
359 # redirect_uris_label: 'Redirect URIs' 359 redirect_uris_label: 'Weiterleitungs-URIs'
360 # save_label: 'Create a new client' 360 save_label: 'Neuen Client erstellen'
361 # action_back: 'Back' 361 action_back: 'Zurück'
362 # client_parameter: 362 client_parameter:
363 # page_title: 'Developer > Client parameters' 363 page_title: 'Entwickler > Client-Parameter'
364 # page_description: 'Here are your client parameters.' 364 page_description: 'Dies sind deine Client-Parameter.'
365 # field_id: 'Client ID' 365 field_id: 'Client-ID'
366 # field_secret: 'Client secret' 366 field_secret: 'Client-Secret'
367 # back: 'Back' 367 back: 'Zurück'
368 # read_howto: 'Read the howto "Create my first application"' 368 read_howto: 'Lese des How-To zu "Wie erstelle ich meine erste Anwendung"'
369 # howto: 369 howto:
370 # page_title: 'Developer > How to create my first application' 370 page_title: 'Entwickler > Wie erstelle ich meine erste Anwendung'
371 # description: 371 description:
372 # paragraph_1: 'The following commands make use of the <a href="https://github.com/jkbrzt/httpie">HTTPie library</a>. Make sure it is installed on your system before using it.' 372 paragraph_1: 'Die folgenden Befehle machen Gebrauch von der <a href="https://github.com/jkbrzt/httpie">HTTPie-Bibliothek</a>. Stelle sicher, dass sie auf deinem System installiert ist, bevor du fortfährst.'
373 # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' 373 paragraph_2: 'Du benötigst einen Token, damit deine Anwendung mit der wallabag-API kommunizieren kann.'
374 # paragraph_3: 'To create this token, you need <a href="%link%">to create a new client</a>.' 374 paragraph_3: 'Um diesen Token zu erstellen, muss <a href="%link%">ein neuer Client erstellt werden</a>.'
375 # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' 375 paragraph_4: 'Nun erstelle deinen Token (ersetze client_id, client_secret, username und password mit deinen Werten):'
376 # paragraph_5: 'The API will return a response like this:' 376 paragraph_5: 'Die API wird eine Antwort der folgenden Art zurückgeben:'
377 # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' 377 paragraph_6: 'Der access_token ist nützlich, um die API aufzurufen. Beispiel:'
378 # paragraph_7: 'This call will return all the entries for your user.' 378 paragraph_7: 'Dieser Aufruf wird alle Einträge für den Nutzer zurückgeben.'
379 # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' 379 paragraph_8: 'Wenn du alle API-Endpunkte sehen willst, werfe einen Blick auf die <a href="%link%">API-Dokumentation</a>.'
380 # back: 'Back' 380 back: 'Zurück'
381 381
382validator: 382validator:
383 # password_must_match: 'The password fields must match.' 383 password_must_match: 'Die Kennwort-Felder müssen übereinstimmen.'
384 # password_too_short: 'Password should by at least 8 chars long' 384 password_too_short: 'Kennwort-Mindestlänge von acht Zeichen nicht erfüllt'
385 # password_wrong_value: 'Wrong value for your current password' 385 password_wrong_value: 'Falscher Wert r dein aktuelles Kennwort'
386 # item_per_page_too_high: 'This will certainly kill the app' 386 item_per_page_too_high: 'Dies wird die Anwendung möglicherweise beenden'
387 # rss_limit_too_hight: 'This will certainly kill the app' 387 rss_limit_too_hight: 'Dies wird die Anwendung möglicherweise beenden'
388 388
389flashes: 389flashes:
390 config: 390 config:
391 notice: 391 notice:
392 config_saved: 'Konfiguration gespeichert. Einige Einstellungen werden erst nach einer erneuten Anmeldung übernommen.' 392 config_saved: 'Konfiguration gespeichert. Einige Einstellungen werden erst nach einer erneuten Anmeldung übernommen.'
393 password_updated: 'Kennwort aktualisiert' 393 password_updated: 'Kennwort aktualisiert'
394 # password_not_updated_demo: "In demonstration mode, you can't change password for this user." 394 password_not_updated_demo: "Im Test-Modus kannst du das Kennwort nicht ändern."
395 user_updated: 'Information aktualisiert' 395 user_updated: 'Information aktualisiert'
396 rss_updated: 'RSS-Informationen aktualisiert' 396 rss_updated: 'RSS-Informationen aktualisiert'
397 # tagging_rules_updated: 'Tagging rules updated' 397 tagging_rules_updated: 'Tagging-Regeln aktualisiert'
398 # tagging_rules_deleted: 'Tagging rule deleted' 398 tagging_rules_deleted: 'Tagging-Regel gelöscht'
399 # user_added: 'User "%username%" added' 399 user_added: 'Benutzer "%username%" erstellt'
400 # rss_token_updated: 'RSS token updated' 400 rss_token_updated: 'RSS-Token aktualisiert'
401 entry: 401 entry:
402 notice: 402 notice:
403 # entry_already_saved: 'Entry already saved on %date%' 403 entry_already_saved: 'Eintrag bereits am %date% gespeichert'
404 # entry_saved: 'Entry saved' 404 entry_saved: 'Eintag gespeichert'
405 # entry_updated: 'Entry updated' 405 entry_updated: 'Eintrag aktualisiert'
406 # entry_reloaded: 'Entry reloaded' 406 entry_reloaded: 'Eintrag neugeladen'
407 # entry_reload_failed: 'Failed to reload entry' 407 entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen'
408 entry_archived: 'Artikel archiviert' 408 entry_archived: 'Artikel archiviert'
409 entry_unarchived: 'Artikel dearchiviert' 409 entry_unarchived: 'Artikel dearchiviert'
410 entry_starred: 'Artikel favorisiert' 410 entry_starred: 'Artikel favorisiert'
@@ -412,13 +412,13 @@ flashes:
412 entry_deleted: 'Artikel gelöscht' 412 entry_deleted: 'Artikel gelöscht'
413 tag: 413 tag:
414 notice: 414 notice:
415 # tag_added: 'Tag added' 415 tag_added: 'Tag hinzugefügt'
416 import: 416 import:
417 notice: 417 notice:
418 # failed: 'Import failed, please try again.' 418 failed: 'Import fehlgeschlagen, bitte erneut probieren.'
419 # failed_on_file: 'Error while processing import. Please verify your import file.' 419 failed_on_file: 'Fehler während des Imports. Bitte überprüfe deine Import-Datei.'
420 # summary: 'Import summary: %imported% imported, %skipped% already saved.' 420 summary: 'Import-Zusammenfassung: %imported% importiert, %skipped% bereits gespeichert.'
421 developer: 421 developer:
422 notice: 422 notice:
423 # client_created: 'New client created.' 423 client_created: 'Neuer Client erstellt.'
424 # client_deleted: 'Client deleted' 424 client_deleted: 'Client gelöscht'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index daeac4bf..1ca3e6b0 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -1,18 +1,18 @@
1security: 1security:
2 login: 2 login:
3 # page_title: 'Welcome to wallabag!' 3 page_title: 'Witaj w wallabag!'
4 keep_logged_in: 'Zapamiętaj mnie' 4 keep_logged_in: 'Zapamiętaj mnie'
5 forgot_password: 'Zapomniałeś hasła' 5 forgot_password: 'Zapomniałeś hasła'
6 submit: 'Loguj' 6 submit: 'Loguj'
7 # register: 'Register' 7 register: 'Zarejestruj'
8 username: 'Nazwa użytkownika' 8 username: 'Nazwa użytkownika'
9 password: 'Hasło' 9 password: 'Hasło'
10 # cancel: 'Cancel' 10 cancel: 'Anuluj'
11 resetting: 11 resetting:
12 description: "Wpisz swój adres email poniżej. Wyślemy Ci instrukcję resetowania hasła" 12 description: "Wpisz swój adres email poniżej. Wyślemy Ci instrukcję resetowania hasła"
13 register: 13 register:
14 # page_title: 'Create an account' 14 page_title: 'Utwórz konto'
15 # go_to_account: 'Go to your account' 15 go_to_account: 'Idź do konta'
16 16
17menu: 17menu:
18 left: 18 left:
@@ -22,38 +22,38 @@ menu:
22 all_articles: 'Wszystkie' 22 all_articles: 'Wszystkie'
23 config: 'Konfiguracja' 23 config: 'Konfiguracja'
24 tags: 'Tagi' 24 tags: 'Tagi'
25 # internal_settings: 'Internal Settings' 25 internal_settings: 'Wewnętrzne ustawienia'
26 # import: 'Import' 26 import: 'Importuj'
27 howto: 'Howto' 27 howto: 'Howto'
28 # developer: 'Developer' 28 developer: 'Deweloper'
29 logout: 'Wyloguj' 29 logout: 'Wyloguj'
30 about: 'O nas' 30 about: 'O nas'
31 search: 'Szukaj' 31 search: 'Szukaj'
32 # save_link: 'Save a 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 top: 34 top:
35 add_new_entry: 'Dodaj nowy wpis' 35 add_new_entry: 'Dodaj nowy wpis'
36 search: 'Szukaj' 36 search: 'Szukaj'
37 filter_entries: 'Filtruj wpisy' 37 filter_entries: 'Filtruj wpisy'
38 # export: 'Export' 38 export: 'Eksportuj'
39 search_form: 39 search_form:
40 input_label: 'Wpisz swoje zapytanie tutaj' 40 input_label: 'Wpisz swoje zapytanie tutaj'
41 41
42footer: 42footer:
43 wallabag: 43 wallabag:
44 # elsewhere: 'Take wallabag with you' 44 elsewhere: 'Weż wallabag ze so'
45 # social: 'Social' 45 social: 'Społeczność'
46 # powered_by: 'powered by' 46 powered_by: 'Kontrolowany przez'
47 about: 'O nas' 47 about: 'O nas'
48 48
49config: 49config:
50 page_title: 'Konfiguracja' 50 page_title: 'Konfiguracja'
51 tab_menu: 51 tab_menu:
52 # settings: 'Settings' 52 settings: 'Ustawienia'
53 rss: 'Kanał RSS' 53 rss: 'Kanał RSS'
54 user_info: 'Informacje o użytkowniku' 54 user_info: 'Informacje o użytkowniku'
55 password: 'Hasło' 55 password: 'Hasło'
56 # rules: 'Tagging rules' 56 rules: 'Zasady tagowania'
57 new_user: 'Dodaj użytkownika' 57 new_user: 'Dodaj użytkownika'
58 form: 58 form:
59 save: 'Zapisz' 59 save: 'Zapisz'
@@ -62,12 +62,12 @@ config:
62 items_per_page_label: 'Ilość elementóœ na stronie' 62 items_per_page_label: 'Ilość elementóœ na stronie'
63 language_label: 'Język' 63 language_label: 'Język'
64 reading_speed: 64 reading_speed:
65 # label: 'Reading speed' 65 label: 'Prędkość czytania'
66 # help_message: 'You can use online tools to estimate your reading speed:' 66 help_message: 'Możesz skorzystać z narzędzi online do określenia twojej prędkości czytania:'
67 # 100_word: 'I read ~100 words per minute' 67 100_word: 'Czytam ~100 słów na minutę'
68 # 200_word: 'I read ~200 words per minute' 68 200_word: 'Czytam ~200 słów na minutę'
69 # 300_word: 'I read ~300 words per minute' 69 300_word: 'Czytam ~300 słów na minutę'
70 # 400_word: 'I read ~400 words per minute' 70 400_word: 'Czytam ~400 słów na minutę'
71 form_rss: 71 form_rss:
72 description: 'Kanały RSS prowadzone przez wallabag pozwalają Ci na czytanie twoich zapisanych artykułów w twoium ulubionym czytniku RSS. Musisz najpierw wynegenerować tokena.‌' 72 description: 'Kanały RSS prowadzone przez wallabag pozwalają Ci na czytanie twoich zapisanych artykułów w twoium ulubionym czytniku RSS. Musisz najpierw wynegenerować tokena.‌'
73 token_label: 'Token RSS' 73 token_label: 'Token RSS'
@@ -81,66 +81,66 @@ config:
81 archive: 'archiwum' 81 archive: 'archiwum'
82 rss_limit: 'Link do RSS' 82 rss_limit: 'Link do RSS'
83 form_user: 83 form_user:
84 # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion" 84 two_factor_description: "Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanyum połączeniu"
85 name_label: 'Nazwa' 85 name_label: 'Nazwa'
86 email_label: 'Adres email' 86 email_label: 'Adres email'
87 # twoFactorAuthentication_label: 'Two factor authentication' 87 twoFactorAuthentication_label: 'Autoryzacja dwuetapowa'
88 form_password: 88 form_password:
89 old_password_label: 'Stare hasło' 89 old_password_label: 'Stare hasło'
90 new_password_label: 'Nowe hasło' 90 new_password_label: 'Nowe hasło'
91 repeat_new_password_label: 'Powtórz nowe hasło' 91 repeat_new_password_label: 'Powtórz nowe hasło'
92 form_rules: 92 form_rules:
93 # if_label: 'if' 93 if_label: 'jeżeli'
94 # then_tag_as_label: 'then tag as' 94 then_tag_as_label: 'wtedy otaguj jako'
95 delete_rule_label: 'usuń' 95 delete_rule_label: 'usuń'
96 # rule_label: 'Rule' 96 rule_label: 'Reguła'
97 # tags_label: 'Tags' 97 tags_label: 'Tagi'
98 # faq: 98 faq:
99 # title: 'FAQ' 99 title: 'FAQ'
100 # tagging_rules_definition_title: 'What does « tagging rules » mean?' 100 tagging_rules_definition_title: 'Co oznaczają « reguły tagowania » ?'
101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.' 101 tagging_rules_definition_description: 'Istnieją reguły używane przez wallabag służące do automatycznego tagowania nowych wpisów.<br />Za każdym razem kiedy dodasz nowi wpis, zostaną użyte wszystkie skonfigurowane przez ciebie regułu. Dzięki temu unikniesz konieczności ręcznego ich klasyfikowania.'
102 # how_to_use_them_title: 'How do I use them?' 102 how_to_use_them_title: 'Jak ich użyć?'
103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »' 103 how_to_use_them_description: 'Załóżmy, że chcesz otagować nowe wpisy jako « <i>do szybkiego przeczytania</i> » jeżeli czas czytania wynosi mniej niż 3 minuty.<br />W tym przypadku ponienieneś umieścić « czasCzytania &lt;= 3 » w polu <i>Reguła</i> i « <i><do szybkiego przeczytania/i> » w polu <i>Tagi</i>.<br />Wiele tagów może zostać dodanych jednocześnie rozdzielając je przecinkami: « <i>do szybkiego przeczytania, koniecznie przeczytać</i> »<br />Kompleksowe reguły mogą być napisane przy użyciu operatorów: jeżeli « <i>czasCzytania &gt;= 5 I nazwaDomeny = "github.com"</i> » wtedy otagój jako « <i>dłuższy tekst, github </i> »'
104 # variables_available_title: 'Which variables and operators can I use to write rules?' 104 variables_available_title: 'Jakich zmiennych i operatorów mogę użyć przy pisaniu reguł?'
105 # variables_available_description: 'The following variables and operators can be used to create tagging rules:' 105 variables_available_description: 'Następujące zmienne i operatory mogą być użyte przy tworzeniu reguł tagowania:'
106 # meaning: 'Meaning' 106 meaning: 'Znaczenie'
107 # variable_description: 107 variable_description:
108 # label: 'Variable' 108 label: 'Zmienna'
109 # title: 'Title of the entry' 109 title: 'Tyt wpisu'
110 # url: 'URL of the entry' 110 url: 'Adres URL wpisu'
111 # isArchived: 'Whether the entry is archived or not' 111 isArchived: 'Czy wpis został zarchiwizowany czy nie'
112 # isStarred: 'Whether the entry is starred or not' 112 isStarred: 'Czy wpis został oznaczony gwiazdką czy nie'
113 # content: "The entry's content" 113 content: 'Zawartość wpisu'
114 # language: "The entry's language" 114 language: 'Język wpisu'
115 # mimetype: "The entry's mime-type" 115 mimetype: 'Mime-type wpisu'
116 # readingTime: "The estimated entry's reading time, in minutes" 116 readingTime: 'Szacunkowy czas czytania wpisu w minutach'
117 # domainName: 'The domain name of the entry' 117 domainName: 'Nazwa domeny wpisu'
118 # operator_description: 118 operator_description:
119 # label: 'Operator' 119 label: 'Operator'
120 # less_than: 'Less than...' 120 less_than: 'Mniej n...'
121 # strictly_less_than: 'Strictly less than...' 121 strictly_less_than: 'Wyłącznie mniej n...'
122 # greater_than: 'Greater than...' 122 greater_than: 'Więcej n...'
123 # strictly_greater_than: 'Strictly greater than...' 123 strictly_greater_than: 'Wyłącznie więcej n...'
124 # equal_to: 'Equal to...' 124 equal_to: 'Równe...'
125 # not_equal_to: 'Not equal to...' 125 not_equal_to: 'Nierówny...'
126 # or: 'One rule OR another' 126 or: 'Jedna reguła LUB inna'
127 # and: 'One rule AND another' 127 and: 'Jedna reguła I inna'
128 # matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>' 128 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>'
129 form_new_user: 129 form_new_user:
130 username_label: 'Nazwa użytkownika' 130 username_label: 'Nazwa użytkownika'
131 password_label: 'Hasło' 131 password_label: 'Hasło'
132 repeat_new_password_label: 'Powtórz nowe hasło' 132 repeat_new_password_label: 'Powtórz nowe hasło'
133 plain_password_label: '????' 133 plain_password_label: 'Jawne hasło'
134 email_label: 'Adres email' 134 email_label: 'Adres email'
135 135
136entry: 136entry:
137 page_titles: 137 page_titles:
138 # unread: 'Unread entries' 138 unread: 'Nieprzeczytane wpisy'
139 # starred: 'Starred entries' 139 starred: 'Wpisy oznaczone gwiazdką'
140 # archive: 'Archived entries' 140 archive: 'Zarchiwizowane wpisy'
141 # filtered: 'Filtered entries' 141 filtered: 'Odfiltrowane wpisy'
142 list: 142 list:
143 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 143 number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ %count% wpisy.'
144 reading_time: 'szacunkowy czas czytania' 144 reading_time: 'szacunkowy czas czytania'
145 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min' 145 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min'
146 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min'
@@ -148,7 +148,7 @@ entry:
148 toogle_as_read: 'Oznacz jako przeczytane' 148 toogle_as_read: 'Oznacz jako przeczytane'
149 toogle_as_star: 'Oznacz jako ulubione' 149 toogle_as_star: 'Oznacz jako ulubione'
150 delete: 'Usuń' 150 delete: 'Usuń'
151 # export_title: 'Export' 151 export_title: 'Export'
152 filters: 152 filters:
153 title: 'Filtry' 153 title: 'Filtry'
154 status_label: 'Status' 154 status_label: 'Status'
@@ -171,35 +171,35 @@ entry:
171 filter: 'Filtruj' 171 filter: 'Filtruj'
172 view: 172 view:
173 left_menu: 173 left_menu:
174 # back_to_top: 'Back to top' 174 back_to_top: 'Wróć na górę'
175 back_to_homepage: 'Cofnij' 175 back_to_homepage: 'Cofnij'
176 set_as_read: 'Oznacz jako przeczytane' 176 set_as_read: 'Oznacz jako przeczytane'
177 # set_as_unread: 'Mark as unread' 177 set_as_unread: 'Oznacz jako nieprzeczytane'
178 set_as_favorite: 'Ulubione' 178 set_as_favorite: 'Ulubione'
179 view_original_article: 'Oryginalny artykuł' 179 view_original_article: 'Oryginalny artykuł'
180 # re_fetch_content: 'Re-fetch content' 180 re_fetch_content: 'Pobierz ponownie treść'
181 delete: 'Usuń' 181 delete: 'Usuń'
182 add_a_tag: 'Dodaj tag' 182 add_a_tag: 'Dodaj tag'
183 share_content: 'Udostępnij' 183 share_content: 'Udostępnij'
184 share_email_label: 'Adres email' 184 share_email_label: 'Adres email'
185 download: 'Pobierz' 185 download: 'Pobierz'
186 # print: 'Print' 186 print: 'Drukuj'
187 problem: 187 problem:
188 label: 'Problemy' 188 label: 'Problemy'
189 description: 'Czy ten artykuł wygląda źle?' 189 description: 'Czy ten artykuł wygląda źle?'
190 edit_title: 'Edytuj tytuł' 190 edit_title: 'Edytuj tytuł'
191 original_article: 'oryginalny' 191 original_article: 'oryginalny'
192 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 192 annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %nbAnnotations% adnotacji'
193 new: 193 new:
194 page_title: 'Zapisz nowy wpis' 194 page_title: 'Zapisz nowy wpis'
195 placeholder: 'http://website.com' 195 placeholder: 'http://website.com'
196 form_new: 196 form_new:
197 url_label: Url 197 url_label: Url
198 edit: 198 edit:
199 # page_title: 'Edit an entry' 199 page_title: 'Edytuj wpis'
200 # title_label: 'Title' 200 title_label: 'Tyt'
201 # url_label: 'Url' 201 url_label: 'Adres URL'
202 # is_public_label: 'Public' 202 is_public_label: 'Publiczny'
203 save_label: 'Zapisz' 203 save_label: 'Zapisz'
204 204
205about: 205about:
@@ -208,8 +208,8 @@ about:
208 who_behind_wallabag: 'Kto stoi za wallabag' 208 who_behind_wallabag: 'Kto stoi za wallabag'
209 getting_help: 'Pomoc' 209 getting_help: 'Pomoc'
210 helping: 'Pomóż wallabag' 210 helping: 'Pomóż wallabag'
211 # contributors: 'Contributors' 211 contributors: 'Osoby, które pomogły przy projekcie'
212 # third_party: 'Third-party libraries' 212 third_party: 'Biblioteki Third-party'
213 who_behind_wallabag: 213 who_behind_wallabag:
214 developped_by: 'Stworzony przez' 214 developped_by: 'Stworzony przez'
215 website: 'strona internetowa' 215 website: 'strona internetowa'
@@ -220,22 +220,22 @@ about:
220 getting_help: 220 getting_help:
221 documentation: 'Dokumentacja' 221 documentation: 'Dokumentacja'
222 bug_reports: 'Raportuj błędy' 222 bug_reports: 'Raportuj błędy'
223 support: '<a href="https://support.wallabag.org">Na naszeej stronie wsparcia technicznego</a> lub <a href="https://github.com/wallabag/wallabag/issues">na GitHubie</a>' 223 support: '<a href="https://support.wallabag.org">Na naszej stronie wsparcia technicznego</a> lub <a href="https://github.com/wallabag/wallabag/issues">na GitHubie</a>'
224 helping: 224 helping:
225 description: 'wallabag jest darmowy i otwartoźródłowy. Możesz nam pomóc:' 225 description: 'wallabag jest darmowy i otwartoźródłowy. Możesz nam pomóc:'
226 by_contributing: 'przez przyłączenie się do projektu:' 226 by_contributing: 'przez przyłączenie się do projektu:'
227 by_contributing_2: 'lista wszystkich naszych potrzeb' 227 by_contributing_2: 'lista wszystkich naszych potrzeb'
228 by_paypal: 'przez Paypal' 228 by_paypal: 'przez Paypal'
229 contributors: 229 contributors:
230 # description: 'Thank you to contributors on wallabag web application' 230 description: 'Podziękuj osobą, które przyczyniły s do projektu przez aplikację webo'
231 third_party: 231 third_party:
232 # description: 'Here are the list of third-party libraries used in wallabag (with their licenses):' 232 description: 'Tutaj znajduje się lista Third-party bibliotek użytych w wallabag (z ich licencjami):'
233 # package: 'Package' 233 package: 'Paczka'
234 license: 'Licencja' 234 license: 'Licencja'
235 235
236howto: 236howto:
237 page_title: 'Howto' 237 page_title: 'Howto'
238 # page_description: 'There are several ways to save an article:' 238 page_description: 'Sposoby zapisania artykułu:'
239 top_menu: 239 top_menu:
240 browser_addons: 'Wtyczki dla przeglądarki' 240 browser_addons: 'Wtyczki dla przeglądarki'
241 mobile_apps: 'Aplikacje mobilne' 241 mobile_apps: 'Aplikacje mobilne'
@@ -243,148 +243,148 @@ howto:
243 form: 243 form:
244 description: 'Podziękuj przez ten formularz' 244 description: 'Podziękuj przez ten formularz'
245 browser_addons: 245 browser_addons:
246 firefox: 'Standardowe rozszerzenia dla Firefox' 246 firefox: 'Standardowe rozszerzenie dla Firefox'
247 chrome: 'Rozszerzenie dla Chrome' 247 chrome: 'Rozszerzenie dla Chrome'
248 mobile_apps: 248 mobile_apps:
249 android: 249 android:
250 via_f_droid: 'przez F-Droid' 250 via_f_droid: 'w F-Droid'
251 via_google_play: 'przez Google Play' 251 via_google_play: 'w Google Play'
252 ios: 'przez iTunes Store' 252 ios: 'w iTunes Store'
253 windows: 'przez Microsoft Store' 253 windows: 'w Microsoft Store'
254 bookmarklet: 254 bookmarklet:
255 description: 'Przeciągnij i upuść ten link na swój pasek zakładek' 255 description: 'Przeciągnij i upuść ten link na swój pasek zakładek'
256 256
257quickstart: 257quickstart:
258 # page_title: 'Quickstart' 258 page_title: 'Szybki start'
259 # intro: 259 intro:
260 # title: 'Welcome to wallabag!' 260 title: 'Witaj w wallabag!'
261 # paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." 261 paragraph_1: "Będziemy ci towarzyszyli w Twojej poznaniu wallabag i pokażemy możliwości, które mogą cię zainteresować."
262 # paragraph_2: 'Follow us!' 262 paragraph_2: 'Śledź nas!'
263 # configure: 263 configure:
264 # title: 'Configure the application' 264 title: 'Konfiguruj aplikację'
265 # language: 'Change language and design' 265 language: 'Zmień język i wygląd'
266 # rss: 'Enable RSS feeds' 266 rss: 'Włącz kanały RSS'
267 # tagging_rules: 'Write rules to automatically tag your articles' 267 tagging_rules: 'Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów'
268 # admin: 268 admin:
269 # title: 'Administration' 269 title: 'Administracja'
270 # description: 'As an administrator, you have privileges on wallabag. You can:' 270 description: 'Jako administrator wallabag, możesz:'
271 # new_user: 'Create a new user' 271 new_user: 'Tworzyć nowego użytkownika'
272 # analytics: 'Configure analytics' 272 analytics: 'Configure analytics'
273 # sharing: 'Enable some parameters about article sharing' 273 sharing: 'Włączyć pewne parametry dotyczące udostępniania artykułów'
274 # export: 'Configure export' 274 export: 'Skonfigurować eksport'
275 # import: 'Configure import' 275 import: 'Skonfigurować import'
276 # first_steps: 276 first_steps:
277 # title: 'First steps' 277 title: 'Pierwsze kroki'
278 # new_article: 'Save your first article' 278 new_article: 'Zapisz swój pierwszy artukuł'
279 # unread_articles: 'And classify it!' 279 unread_articles: 'I sklasyfikuj go!'
280 # migrate: 280 migrate:
281 # title: 'Migrate from an existing service' 281 title: 'Migruj w istniejącej usługi'
282 # description: "Are you using another service? We'll help you to retrieve your data on wallabag." 282 description: "ywasz innej usługi? Pomożemy ci pobrać twoje dane do wallabag."
283 # pocket: 'Migrate from Pocket' 283 pocket: 'Migruj z Pocket'
284 # wallabag_v1: 'Migrate from wallabag v1' 284 wallabag_v1: 'Migruj z wallabag v1'
285 # wallabag_v2: 'Migrate from wallabag v2' 285 wallabag_v2: 'Migruj z wallabag v2'
286 # developer: 286 developer:
287 # title: 'Developers' 287 title: 'Deweloperzy'
288 # create_application: 'Create your third application' 288 create_application: 'Strz swoją aplikację'
289 # docs: 289 docs:
290 # title: 'Full documentation' 290 title: 'Pełna Dokumentacja'
291 # annotate: 'Annotate your article' 291 annotate: 'Dadaj adnotację do swojego artykułu'
292 # export: 'Convert your articles into ePUB or PDF' 292 export: 'Konwertuj swoje artykuły do ePUB lub PDF'
293 # search_filters: 'See how you can look for an article by using search engine and filters' 293 search_filters: 'Zabacz jak możesz znaleźć artykuł dzięku yciu silnika wyszukiwarki i filtrów'
294 # fetching_errors: 'What can I do if an article encounters errors during fetching?' 294 fetching_errors: 'Co mo zrobić jeżeli artukuł napotka błędy podczas pobierania?'
295 # all_docs: 'And so many other articles!' 295 all_docs: 'I wiele innych artykułów!'
296 # support: 296 support:
297 # title: 'Support' 297 title: 'Wsparcie'
298 # description: 'If you need some help, we are here for you.' 298 description: 'Jeżeli potrzebujesz pomocy, jesteśmy tutaj dla ciebie.'
299 # github: 'On GitHub' 299 github: 'na GitHubie'
300 # email: 'By email' 300 email: 'przez email'
301 # gitter: 'On Gitter' 301 gitter: 'na Gitterze'
302 302
303tag: 303tag:
304 page_title: 'Tagi' 304 page_title: 'Tagi'
305 list: 305 list:
306 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 306 number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ %count% tagi.'
307 307
308import: 308import:
309 # page_title: 'Import' 309 page_title: 'Import'
310 # page_description: 'Welcome to wallabag importer. Please select your previous service that you want to migrate.' 310 page_description: 'Witaj w importerze Wallabag. Wybierz swo poprzednią usługę, z której chcech migrować.'
311 # action: 311 action:
312 # import_contents: 'Import contents' 312 import_contents: 'Import zawartości'
313 # form: 313 form:
314 # mark_as_read_title: 'Mark all as read?' 314 mark_as_read_title: 'Oznaczyć wszystkie jako przeczytane?'
315 # mark_as_read_label: 'Mark all imported entries as read' 315 mark_as_read_label: 'Oznacz wszystkie zaimportowane wpisy jako przeczytane'
316 # file_label: 'File' 316 file_label: 'Plik'
317 # save_label: 'Upload file' 317 save_label: 'aduj plik'
318 # pocket: 318 pocket:
319 # page_title: 'Import > Pocket' 319 page_title: 'Import > Pocket'
320 # description: "This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag." 320 description: "Ten importer, zaimportuje dane z usługi Pocket. Pocket nie pozwala na nam na pobranie zawartości ze swojej usługi, więc kontent każdego arthykuł\u zostanie ponownie pobrany przez wallabag."
321 # config_missing: 321 config_missing:
322 # description: "Pocket import isn't configured." 322 description: "Import z Pocket nie jest skonfigurowany."
323 # admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.' 323 admin_message: 'Musisz zdefiniować %keyurls%a pocket_consumer_key%keyurle%.'
324 # user_message: 'Your server admin needs to define an API Key for Pocket.' 324 user_message: 'Admin twojego servera musi zdefiniować API Key dla Pocket.'
325 # authorize_message: 'You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.' 325 authorize_message: 'Możesz zaimportować dane ze swojego konta Pocket. Kliknij poniższy przycisk i autoryzuj aplikacje aby połączyć się z getpocket.com.'
326 # connect_to_pocket: 'Connect to Pocket and import data' 326 connect_to_pocket: 'Połącz z Pocket i importuj dane'
327 # wallabag_v1: 327 wallabag_v1:
328 # page_title: 'Import > Wallabag v1' 328 page_title: 'Import > Wallabag v1'
329 # description: 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.' 329 description: 'Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v1. Na swojej stronie konfiguracyjnej kliknij "JSON eksport" w sekcji "Eksportuj swoje dane wallabag". Otrzymasz plik "wallabag-export-1-xxxx-xx-xx.json".'
330 # how_to: 'Please select your wallabag export and click on the below button to upload and import it.' 330 how_to: 'Wybierz swój plik eksportu z wallabag i kliknij poniższy przycisk, aby go załadować.'
331 # wallabag_v2: 331 wallabag_v2:
332 # page_title: 'Import > Wallabag v2' 332 page_title: 'Import > Wallabag v2'
333 # description: 'This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.' 333 description: 'Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v2. Idź do wszystkich artykułów, a następnie na panelu exportu kliknij na "JSON". Otrzymasz plik "All articles.json".'
334 334
335developer: 335developer:
336 # page_title: 'Developer' 336 page_title: 'Deweloper'
337 # welcome_message: 'Welcome to the wallabag API' 337 welcome_message: 'Witaj w API wallabag'
338 # documentation: 'Documentation' 338 documentation: 'Dokumentacja'
339 # how_to_first_app: 'How to create my first application' 339 how_to_first_app: 'Jak stworzyć moją pierws aplikację'
340 # full_documentation: 'View full API documentation' 340 full_documentation: 'Pokaż pełne API'
341 # clients: 341 clients:
342 # title: 'Clients' 342 title: 'Klienci'
343 # create_new: 'Create a new client' 343 create_new: 'Utwórz nowego klienta'
344 # existing_clients: 344 existing_clients:
345 # title: 'Existing clients' 345 title: 'Istniejący klienci'
346 # field_id: 'Client ID' 346 field_id: 'Client ID'
347 # field_secret: 'Client secret' 347 field_secret: 'Client secret'
348 # field_uris: 'Redirect URIs' 348 field_uris: 'Przekieruj URIs'
349 # field_grant_types: 'Grant type allowed' 349 field_grant_types: 'Przyznaj pozwolenie'
350 # no_client: 'No client yet.' 350 no_client: 'Nie ma jeszcze klienta.'
351 # remove: 351 remove:
352 # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' 352 warn_message_1: 'Masz możliwość usunięcia tego klienta. Ta akcja jest NIEODWRACALNA !'
353 # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." 353 warn_message_2: "Jeżeli go usuniesz, aplikacje skonfigurowane z tym klientem nię będa w stanie autoryzować twojego wallabag."
354 # action: 'Remove this client' 354 action: 'Usuń tego klienta'
355 # client: 355 client:
356 # page_title: 'Developer > New client' 356 page_title: 'Deweloper > Nowy klient'
357 # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' 357 page_description: 'Tworzysz nowego klienta. Wypełnij poniższe pole w celu przekierowania URI twojej aplikacji.'
358 # form: 358 form:
359 # redirect_uris_label: 'Redirect URIs' 359 redirect_uris_label: 'Przekieruj adresy URI'
360 # save_label: 'Create a new client' 360 save_label: 'Stwórz nowego klienta'
361 # action_back: 'Cofnij' 361 action_back: 'Cofnij'
362 # client_parameter: 362 client_parameter:
363 # page_title: 'Developer > Client parameters' 363 page_title: 'Deweloper > Parametry klienta'
364 # page_description: 'Here are your client parameters.' 364 page_description: 'Tutaj znajdu się parametry klienta.'
365 # field_id: 'Client ID' 365 field_id: 'Client ID'
366 # field_secret: 'Client secret' 366 field_secret: 'Client secret'
367 # back: 'Cofnij' 367 back: 'Cofnij'
368 # read_howto: 'Read the howto "Create my first application"' 368 read_howto: 'Przeczytaj jak "Stworzyć moją pierws aplikację"'
369 # howto: 369 howto:
370 # page_title: 'Developer > How to create my first application' 370 page_title: 'Deweloper > Jak stworzyć moją pierws aplikację'
371 # description: 371 description:
372 # paragraph_1: 'The following commands make use of the <a href="https://github.com/jkbrzt/httpie">HTTPie library</a>. Make sure it is installed on your system before using it.' 372 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'
373 # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' 373 paragraph_2: 'Potrzebujesz tokena w celu nawiązania komunikacji między swoją aplikacją a API wallabag.'
374 # paragraph_3: 'To create this token, you need <a href="%link%">to create a new client</a>.' 374 paragraph_3: 'W celu stworzenia tokena musisz <a href="%link%">strz nowego klienta</a>.'
375 # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' 375 paragraph_4: 'Teraz, utwórz tokena (zmień client_id, client_secret, username i password z poprawnymi wartościami):'
376 # paragraph_5: 'The API will return a response like this:' 376 paragraph_5: 'API powinno zwrócić taką informację:'
377 # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' 377 paragraph_6: 'access_token jest użyteczny do wywołania API endpoint. Na przykład:'
378 # paragraph_7: 'This call will return all the entries for your user.' 378 paragraph_7: 'To wywołanie zwróci wszystkie twoje wpisy.'
379 # paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.' 379 paragraph_8: 'Jeżeli chcesz wyświetlić wszystkie punkty końcowe API, zobacz <a href="%link%">Dokumentacja naszego API</a>.'
380 # back: 'Cofnij' 380 back: 'Cofnij'
381 381
382validator: 382validator:
383 password_must_match: 'Hasło w polach musi być takie same' 383 password_must_match: 'Hasło w polach musi być takie same'
384 password_too_short: 'Hasło powinno mieć minimum 8 znaków długości' 384 password_too_short: 'Hasło powinno mieć minimum 8 znaków długości'
385 # password_wrong_value: 'Wrong value for your current password' 385 password_wrong_value: 'Twoje obecne hasło jest błędne'
386 # item_per_page_too_high: 'This will certainly kill the app' 386 item_per_page_too_high: 'To może spowodować problemy z aplikacją'
387 # rss_limit_too_hight: 'This will certainly kill the app' 387 rss_limit_too_hight: 'To może spowodować problemy z aplikacją'
388 388
389flashes: 389flashes:
390 config: 390 config:
@@ -394,17 +394,17 @@ flashes:
394 password_not_updated_demo: "In demonstration mode, you can't change password for this user." 394 password_not_updated_demo: "In demonstration mode, you can't change password for this user."
395 user_updated: 'Informacje zaktualizowane' 395 user_updated: 'Informacje zaktualizowane'
396 rss_updated: 'Informacje RSS zaktualizowane' 396 rss_updated: 'Informacje RSS zaktualizowane'
397 # tagging_rules_updated: 'Tagging rules updated' 397 tagging_rules_updated: 'Reguły tagowania zaktualizowane'
398 # tagging_rules_deleted: 'Tagging rule deleted' 398 tagging_rules_deleted: 'Reguła tagowania usunięta'
399 # user_added: 'User "%username%" added' 399 user_added: 'Użytkownik "%username%" dodany'
400 # rss_token_updated: 'RSS token updated' 400 rss_token_updated: 'Token kanału RSS zaktualizowany'
401 entry: 401 entry:
402 notice: 402 notice:
403 # entry_already_saved: 'Entry already saved on %date%' 403 entry_already_saved: 'Wpis już został dodany %date%'
404 # entry_saved: 'Entry saved' 404 entry_saved: 'Wpis zapisany'
405 # entry_updated: 'Entry updated' 405 entry_updated: 'Wpis zaktualizowany'
406 # entry_reloaded: 'Entry reloaded' 406 entry_reloaded: 'Wpis ponownie załadowany'
407 # entry_reload_failed: 'Failed to reload entry' 407 entry_reload_failed: 'Błąd ponownego załadowania'
408 entry_archived: 'Wpis dodany do archiwum' 408 entry_archived: 'Wpis dodany do archiwum'
409 entry_unarchived: 'Wpis usunięty z archiwum' 409 entry_unarchived: 'Wpis usunięty z archiwum'
410 entry_starred: 'Wpis oznaczony gwiazdką' 410 entry_starred: 'Wpis oznaczony gwiazdką'
@@ -412,13 +412,13 @@ flashes:
412 entry_deleted: 'Wpis usunięty' 412 entry_deleted: 'Wpis usunięty'
413 tag: 413 tag:
414 notice: 414 notice:
415 # tag_added: 'Tag added' 415 tag_added: 'Tag dodany'
416 import: 416 import:
417 notice: 417 notice:
418 # failed: 'Import failed, please try again.' 418 failed: 'Nieudany import, prosimy spróbować ponownie.'
419 # failed_on_file: 'Error while processing import. Please verify your import file.' 419 failed_on_file: 'Błąd podczas ptrzetwarzania pliku. Sprawdż swój importowany plik.'
420 # summary: 'Import summary: %imported% imported, %skipped% already saved.' 420 summary: 'Podsumowanie importu: %imported% zaimportowane, %skipped% już zapisane.'
421 developer: 421 developer:
422 notice: 422 notice:
423 # client_created: 'New client created.' 423 client_created: 'Nowy klient utworzony.'
424 # client_deleted: 'Client deleted' 424 client_deleted: 'Klient usunięty'
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 0ce06962..bac92ffa 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
@@ -66,7 +66,7 @@
66 {% for flashMessage in app.session.flashbag.get('notice') %} 66 {% for flashMessage in app.session.flashbag.get('notice') %}
67 <div class="messages success"> 67 <div class="messages success">
68 <a href="#" class="closeMessage">×</a> 68 <a href="#" class="closeMessage">×</a>
69 <p>{{ flashMessage }}</p> 69 <p>{{ flashMessage|trans }}</p>
70 </div> 70 </div>
71 {% endfor %} 71 {% endfor %}
72{% endblock %} 72{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
index 4eebf18f..032d2d9b 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
@@ -116,7 +116,7 @@
116 {% if craue_setting('share_diaspora') %} 116 {% if craue_setting('share_diaspora') %}
117 <li> 117 <li>
118 <a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}&notes=&v=1&noui=1&jump=doclose" target="_blank" class="tool diaspora icon-image icon-image--diaspora" title="diaspora}"> 118 <a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}&notes=&v=1&noui=1&jump=doclose" target="_blank" class="tool diaspora icon-image icon-image--diaspora" title="diaspora}">
119 <span>diaspora}</span> 119 <span>diaspora*</span>
120 </a> 120 </a>
121 </li> 121 </li>
122 {% endif %} 122 {% endif %}
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php b/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
index f58b5828..74bfb054 100644
--- a/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
+++ b/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
@@ -10,6 +10,40 @@ use Wallabag\UserBundle\Entity\User;
10 10
11class ContentProxyTest extends \PHPUnit_Framework_TestCase 11class ContentProxyTest extends \PHPUnit_Framework_TestCase
12{ 12{
13 public function testWithBadUrl()
14 {
15 $tagger = $this->getTaggerMock();
16 $tagger->expects($this->once())
17 ->method('tag');
18
19 $graby = $this->getMockBuilder('Graby\Graby')
20 ->setMethods(array('fetchContent'))
21 ->disableOriginalConstructor()
22 ->getMock();
23
24 $graby->expects($this->any())
25 ->method('fetchContent')
26 ->willReturn(array(
27 'html' => false,
28 'title' => '',
29 'url' => '',
30 'content_type' => '',
31 'language' => '',
32 ));
33
34 $proxy = new ContentProxy($graby, $tagger, $this->getTagRepositoryMock(), $this->getLogger());
35 $entry = $proxy->updateEntry(new Entry(new User()), 'http://user@:80');
36
37 $this->assertEquals('http://user@:80', $entry->getUrl());
38 $this->assertEmpty($entry->getTitle());
39 $this->assertEquals('<p>Unable to retrieve readable content.</p>', $entry->getContent());
40 $this->assertEmpty($entry->getPreviewPicture());
41 $this->assertEmpty($entry->getMimetype());
42 $this->assertEmpty($entry->getLanguage());
43 $this->assertEquals(0.0, $entry->getReadingTime());
44 $this->assertEquals(false, $entry->getDomainName());
45 }
46
13 public function testWithEmptyContent() 47 public function testWithEmptyContent()
14 { 48 {
15 $tagger = $this->getTaggerMock(); 49 $tagger = $this->getTaggerMock();
@@ -121,6 +155,57 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
121 $this->assertEquals('1.1.1.1', $entry->getDomainName()); 155 $this->assertEquals('1.1.1.1', $entry->getDomainName());
122 } 156 }
123 157
158 public function testWithForcedContent()
159 {
160 $tagger = $this->getTaggerMock();
161 $tagger->expects($this->once())
162 ->method('tag');
163
164 $graby = $this->getMockBuilder('Graby\Graby')->getMock();
165
166 $proxy = new ContentProxy($graby, $tagger, $this->getTagRepositoryMock(), $this->getLogger());
167 $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
168 'html' => str_repeat('this is my content', 325),
169 'title' => 'this is my title',
170 'url' => 'http://1.1.1.1',
171 'content_type' => 'text/html',
172 'language' => 'fr',
173 ]);
174
175 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
176 $this->assertEquals('this is my title', $entry->getTitle());
177 $this->assertContains('this is my content', $entry->getContent());
178 $this->assertEquals('text/html', $entry->getMimetype());
179 $this->assertEquals('fr', $entry->getLanguage());
180 $this->assertEquals(4.0, $entry->getReadingTime());
181 $this->assertEquals('1.1.1.1', $entry->getDomainName());
182 }
183
184 public function testTaggerThrowException()
185 {
186 $graby = $this->getMockBuilder('Graby\Graby')
187 ->disableOriginalConstructor()
188 ->getMock();
189
190 $tagger = $this->getTaggerMock();
191 $tagger->expects($this->once())
192 ->method('tag')
193 ->will($this->throwException(new \Exception()));
194
195 $tagRepo = $this->getTagRepositoryMock();
196 $proxy = new ContentProxy($graby, $tagger, $tagRepo, $this->getLogger());
197
198 $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
199 'html' => str_repeat('this is my content', 325),
200 'title' => 'this is my title',
201 'url' => 'http://1.1.1.1',
202 'content_type' => 'text/html',
203 'language' => 'fr',
204 ]);
205
206 $this->assertCount(0, $entry->getTags());
207 }
208
124 public function testAssignTagsWithArrayAndExtraSpaces() 209 public function testAssignTagsWithArrayAndExtraSpaces()
125 { 210 {
126 $graby = $this->getMockBuilder('Graby\Graby') 211 $graby = $this->getMockBuilder('Graby\Graby')
diff --git a/src/Wallabag/ImportBundle/Controller/PocketController.php b/src/Wallabag/ImportBundle/Controller/PocketController.php
index 1d804219..11ce649d 100644
--- a/src/Wallabag/ImportBundle/Controller/PocketController.php
+++ b/src/Wallabag/ImportBundle/Controller/PocketController.php
@@ -38,6 +38,15 @@ class PocketController extends Controller
38 $requestToken = $this->get('wallabag_import.pocket.import') 38 $requestToken = $this->get('wallabag_import.pocket.import')
39 ->getRequestToken($this->generateUrl('import', array(), UrlGeneratorInterface::ABSOLUTE_URL)); 39 ->getRequestToken($this->generateUrl('import', array(), UrlGeneratorInterface::ABSOLUTE_URL));
40 40
41 if (false === $requestToken) {
42 $this->get('session')->getFlashBag()->add(
43 'notice',
44 'flashes.import.notice.failed'
45 );
46
47 return $this->redirect($this->generateUrl('import_pocket'));
48 }
49
41 $this->get('session')->set('import.pocket.code', $requestToken); 50 $this->get('session')->set('import.pocket.code', $requestToken);
42 $this->get('session')->set('mark_as_read', $request->request->get('form')['mark_as_read']); 51 $this->get('session')->set('mark_as_read', $request->request->get('form')['mark_as_read']);
43 52
diff --git a/src/Wallabag/ImportBundle/Import/PocketImport.php b/src/Wallabag/ImportBundle/Import/PocketImport.php
index 4499ce69..f598e611 100644
--- a/src/Wallabag/ImportBundle/Import/PocketImport.php
+++ b/src/Wallabag/ImportBundle/Import/PocketImport.php
@@ -68,7 +68,7 @@ class PocketImport implements ImportInterface
68 * 68 *
69 * @param string $redirectUri Redirect url in case of error 69 * @param string $redirectUri Redirect url in case of error
70 * 70 *
71 * @return string request_token for callback method 71 * @return string|false request_token for callback method
72 */ 72 */
73 public function getRequestToken($redirectUri) 73 public function getRequestToken($redirectUri)
74 { 74 {
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
index 173a587f..82160bae 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
@@ -7,7 +7,6 @@ use Psr\Log\NullLogger;
7use Doctrine\ORM\EntityManager; 7use Doctrine\ORM\EntityManager;
8use Wallabag\CoreBundle\Entity\Entry; 8use Wallabag\CoreBundle\Entity\Entry;
9use Wallabag\UserBundle\Entity\User; 9use Wallabag\UserBundle\Entity\User;
10use Wallabag\CoreBundle\Tools\Utils;
11use Wallabag\CoreBundle\Helper\ContentProxy; 10use Wallabag\CoreBundle\Helper\ContentProxy;
12 11
13class WallabagV1Import implements ImportInterface 12class WallabagV1Import implements ImportInterface
@@ -153,19 +152,25 @@ class WallabagV1Import implements ImportInterface
153 continue; 152 continue;
154 } 153 }
155 154
156 // @see ContentProxy->updateEntry 155 $data = [
157 $entry = new Entry($this->user); 156 'title' => $importedEntry['title'],
158 $entry->setUrl($importedEntry['url']); 157 'html' => $importedEntry['content'],
158 'url' => $importedEntry['url'],
159 'content_type' => '',
160 'language' => '',
161 ];
159 162
163 // force content to be refreshed in case on bad fetch in the v1 installation
160 if (in_array($importedEntry['title'], $untitled)) { 164 if (in_array($importedEntry['title'], $untitled)) {
161 $entry = $this->contentProxy->updateEntry($entry, $importedEntry['url']); 165 $data = [];
162 } else {
163 $entry->setContent($importedEntry['content']);
164 $entry->setTitle($importedEntry['title']);
165 $entry->setReadingTime(Utils::getReadingTime($importedEntry['content']));
166 $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST));
167 } 166 }
168 167
168 $entry = $this->contentProxy->updateEntry(
169 new Entry($this->user),
170 $importedEntry['url'],
171 $data
172 );
173
169 if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') { 174 if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') {
170 $this->contentProxy->assignTagsToEntry( 175 $this->contentProxy->assignTagsToEntry(
171 $entry, 176 $entry,
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
index 0a32864e..b31d63a3 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
@@ -47,25 +47,29 @@ class WallabagV2Import extends WallabagV1Import implements ImportInterface
47 continue; 47 continue;
48 } 48 }
49 49
50 // @see ContentProxy->updateEntry 50 $importedEntry['html'] = $importedEntry['content'];
51 $entry = new Entry($this->user); 51 $importedEntry['content_type'] = $importedEntry['mimetype'];
52 $entry->setUrl($importedEntry['url']); 52
53 $entry->setTitle($importedEntry['title']); 53 $entry = $this->contentProxy->updateEntry(
54 $entry->setArchived($importedEntry['is_archived'] || $this->markAsRead); 54 new Entry($this->user),
55 $entry->setStarred($importedEntry['is_starred']); 55 $importedEntry['url'],
56 $entry->setContent($importedEntry['content']); 56 $importedEntry
57 $entry->setReadingTime($importedEntry['reading_time']); 57 );
58 $entry->setDomainName($importedEntry['domain_name']); 58
59 if (isset($importedEntry['mimetype'])) { 59 if (array_key_exists('tags', $importedEntry) && !empty($importedEntry['tags'])) {
60 $entry->setMimetype($importedEntry['mimetype']); 60 $this->contentProxy->assignTagsToEntry(
61 } 61 $entry,
62 if (isset($importedEntry['language'])) { 62 $importedEntry['tags']
63 $entry->setLanguage($importedEntry['language']); 63 );
64 } 64 }
65
65 if (isset($importedEntry['preview_picture'])) { 66 if (isset($importedEntry['preview_picture'])) {
66 $entry->setPreviewPicture($importedEntry['preview_picture']); 67 $entry->setPreviewPicture($importedEntry['preview_picture']);
67 } 68 }
68 69
70 $entry->setArchived($importedEntry['is_archived'] || $this->markAsRead);
71 $entry->setStarred($importedEntry['is_starred']);
72
69 $this->em->persist($entry); 73 $this->em->persist($entry);
70 ++$this->importedEntries; 74 ++$this->importedEntries;
71 75
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php b/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
index 174641fd..403fe9b0 100644
--- a/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
@@ -17,11 +17,34 @@ class PocketControllerTest extends WallabagCoreTestCase
17 $this->assertEquals(1, $crawler->filter('button[type=submit]')->count()); 17 $this->assertEquals(1, $crawler->filter('button[type=submit]')->count());
18 } 18 }
19 19
20 public function testImportPocketAuthBadToken()
21 {
22 $this->logInAs('admin');
23 $client = $this->getClient();
24
25 $crawler = $client->request('GET', '/import/pocket/auth');
26
27 $this->assertEquals(302, $client->getResponse()->getStatusCode());
28 }
29
20 public function testImportPocketAuth() 30 public function testImportPocketAuth()
21 { 31 {
32 $this->markTestSkipped('PocketImport: Find a way to properly mock a service.');
33
22 $this->logInAs('admin'); 34 $this->logInAs('admin');
23 $client = $this->getClient(); 35 $client = $this->getClient();
24 36
37 $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
38 ->disableOriginalConstructor()
39 ->getMock();
40
41 $pocketImport
42 ->expects($this->once())
43 ->method('getRequestToken')
44 ->willReturn('token');
45
46 $client->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
47
25 $crawler = $client->request('GET', '/import/pocket/auth'); 48 $crawler = $client->request('GET', '/import/pocket/auth');
26 49
27 $this->assertEquals(301, $client->getResponse()->getStatusCode()); 50 $this->assertEquals(301, $client->getResponse()->getStatusCode());
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php b/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php
index bcbd6305..490f9ede 100644
--- a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php
@@ -53,6 +53,7 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
53 $this->assertEmpty($content->getMimetype()); 53 $this->assertEmpty($content->getMimetype());
54 $this->assertEmpty($content->getPreviewPicture()); 54 $this->assertEmpty($content->getPreviewPicture());
55 $this->assertEmpty($content->getLanguage()); 55 $this->assertEmpty($content->getLanguage());
56 $this->assertEquals(0, count($content->getTags()));
56 57
57 $content = $client->getContainer() 58 $content = $client->getContainer()
58 ->get('doctrine.orm.entity_manager') 59 ->get('doctrine.orm.entity_manager')
@@ -65,6 +66,7 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
65 $this->assertNotEmpty($content->getMimetype()); 66 $this->assertNotEmpty($content->getMimetype());
66 $this->assertNotEmpty($content->getPreviewPicture()); 67 $this->assertNotEmpty($content->getPreviewPicture());
67 $this->assertNotEmpty($content->getLanguage()); 68 $this->assertNotEmpty($content->getLanguage());
69 $this->assertEquals(2, count($content->getTags()));
68 } 70 }
69 71
70 public function testImportWallabagWithEmptyFile() 72 public function testImportWallabagWithEmptyFile()
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php b/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
index 496cf2d3..3ef852e5 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
@@ -2,8 +2,9 @@
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Wallabag\ImportBundle\Tests\Import;
4 4
5use Wallabag\UserBundle\Entity\User;
6use Wallabag\ImportBundle\Import\WallabagV1Import; 5use Wallabag\ImportBundle\Import\WallabagV1Import;
6use Wallabag\UserBundle\Entity\User;
7use Wallabag\CoreBundle\Entity\Entry;
7use Monolog\Logger; 8use Monolog\Logger;
8use Monolog\Handler\TestHandler; 9use Monolog\Handler\TestHandler;
9 10
@@ -71,7 +72,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
71 ->getMock(); 72 ->getMock();
72 73
73 $this->contentProxy 74 $this->contentProxy
74 ->expects($this->once()) 75 ->expects($this->exactly(3))
75 ->method('updateEntry') 76 ->method('updateEntry')
76 ->willReturn($entry); 77 ->willReturn($entry);
77 78
@@ -99,6 +100,11 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
99 ->method('getRepository') 100 ->method('getRepository')
100 ->willReturn($entryRepo); 101 ->willReturn($entryRepo);
101 102
103 $this->contentProxy
104 ->expects($this->exactly(3))
105 ->method('updateEntry')
106 ->willReturn(new Entry($this->user));
107
102 // check that every entry persisted are archived 108 // check that every entry persisted are archived
103 $this->em 109 $this->em
104 ->expects($this->any()) 110 ->expects($this->any())
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php b/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
index 341b1076..dbefdee3 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
@@ -4,6 +4,7 @@ namespace Wallabag\ImportBundle\Tests\Import;
4 4
5use Wallabag\ImportBundle\Import\WallabagV2Import; 5use Wallabag\ImportBundle\Import\WallabagV2Import;
6use Wallabag\UserBundle\Entity\User; 6use Wallabag\UserBundle\Entity\User;
7use Wallabag\CoreBundle\Entity\Entry;
7use Monolog\Logger; 8use Monolog\Logger;
8use Monolog\Handler\TestHandler; 9use Monolog\Handler\TestHandler;
9 10
@@ -66,6 +67,11 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
66 ->method('getRepository') 67 ->method('getRepository')
67 ->willReturn($entryRepo); 68 ->willReturn($entryRepo);
68 69
70 $this->contentProxy
71 ->expects($this->exactly(2))
72 ->method('updateEntry')
73 ->willReturn(new Entry($this->user));
74
69 $res = $wallabagV2Import->import(); 75 $res = $wallabagV2Import->import();
70 76
71 $this->assertTrue($res); 77 $this->assertTrue($res);
@@ -90,6 +96,11 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
90 ->method('getRepository') 96 ->method('getRepository')
91 ->willReturn($entryRepo); 97 ->willReturn($entryRepo);
92 98
99 $this->contentProxy
100 ->expects($this->exactly(2))
101 ->method('updateEntry')
102 ->willReturn(new Entry($this->user));
103
93 // check that every entry persisted are archived 104 // check that every entry persisted are archived
94 $this->em 105 $this->em
95 ->expects($this->any()) 106 ->expects($this->any())
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
index 37d2d0ae..618ce546 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
+++ b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
@@ -1,31 +1,34 @@
1[ 1[
2 { 2 {
3 "id": "23", 3 "id": "23",
4 "title": "Site d'information fran\u00e7ais d'actualit\u00e9s ind\u00e9pendant et participatif en ligne | Mediapart", 4 "title": "Site d'information français d'actualités indépendant et participatif en ligne | Mediapart",
5 "url": "https:\/\/www.mediapart.fr\/", 5 "url": "https://www.mediapart.fr/",
6 "is_archived": false, 6 "is_archived": false,
7 "is_starred": false, 7 "is_starred": false,
8 "content": "<div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia-0\">CAM\u00e9dia<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia\/article\/180116\/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles \u00e9ditions pour d\u00e9battre dans le club sur la la\u00efcit\u00e9 et sur la d\u00e9mocratie<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>CAM\u00e9dia apr\u00e8s un \u00e9change sur \u00ab\u00a0l'\u00e9thique du d\u00e9bat\u00a0\u00bb a lanc\u00e9 deux discussions , l'une sur le th\u00e8me de la la\u00efcit\u00e9, l'autre ( encore en cours) sur celui de la d\u00e9mocratie. Nous sommes heureux de pouvoir signaler la cr\u00e9ation de deux nouvelles \u00e9ditions participatives sur ces th\u00e8mes. Nous vous invitons \u00e0 les lire et \u00e0 participer \u00e0 leurs d\u00e9bats.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/lucile-longre\/blog\/170116\/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de r\u00eaver, \u00e9loge du merveilleux<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>Je parlerai ici des r\u00eaves comme moteur de vie, de ces r\u00eaves qui vous rattachent et vous font esp\u00e9rer \u00e0 ce qu\u2019il y a de plus humain dans l\u2019homme, m\u00eame au milieu de la plus noire des d\u00e9tresses.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/barbara-romagnan\/blog\/180116\/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>En ce d\u00e9but d\u2019ann\u00e9e, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-thibaudat\/blog\/170116\/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L\u2019Allier, d\u00e9partement de destruction massive du tissu culturel<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au c\u0153ur des r\u00e9gions. Leurs subventions sont souvent revues \u00e0 la baisse. Le d\u00e9partement de l\u2019Allier les a carr\u00e9ment supprim\u00e9es. Pour favoriser \u00ab l\u2019\u00e9v\u00e9nementiel \u00bb.<\/p>\n<\/div><div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\">Les invit\u00e9s de Mediapart<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\/article\/180116\/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La d\u00e9mocratie d\u00e9j\u00e0 attaqu\u00e9e par la coop\u00e9ration r\u00e9glementaire transatlantique<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG bas\u00e9e \u00e0 Bruxelles qui enqu\u00eate sur le pouvoir des lobbies des grandes entreprises sur la politique de l\u2019Union europ\u00e9enne. Ils r\u00e9v\u00e8lent que depuis 25 ans le projet de \u00ab coop\u00e9ration r\u00e9glementaire \u00bb men\u00e9 par l\u2019Union europ\u00e9enne et les \u00c9tats-Unis a \u00e9t\u00e9 domin\u00e9 par les grandes entreprises. ET que le TTIP cherche \u00e0 ent\u00e9riner ce projet.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jacqueline-derens\/blog\/180116\/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une ann\u00e9e test pour Jacob Zuma et son gouvernement<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les turbulences de l\u2019an pass\u00e9 ont toutes les chances de continuer \u00e0 troubler le climat politique et social de l\u2019Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la n\u00e9cessit\u00e9 de ces changements, est-il l\u2019homme de la situation ? Son gouvernement r\u00e9pondra-t-il aux attentes des citoyens sud-africains ?<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/marie-cosnay\/blog\/140116\/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>J\u2019ai une fringale d\u2019aventure, d\u2019aventures \u00e0 venir. J\u2019ai la fringale de la fringale des aventures et soudain, rupture. Je n\u2019y arrive plus, tout est bloqu\u00e9, tout emp\u00each\u00e9. Faut dire que depuis un an environ, tout est devenu plus compliqu\u00e9. Ecrire va de moins en moins de soi.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-veran\/blog\/170116\/redoublement-le-changement-bas-bruit\">Redoublement : le changement \u00e0 bas bruit ?<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>S\u2019il est une caract\u00e9ristique de la forme scolaire fran\u00e7aise bien \u00e9tablie dans la culture des personnels, des \u00e9l\u00e8ves et des parents, c\u2019est bien le redoublement, cens\u00e9 sanctionner des r\u00e9sultats insuffisants pour envisager le passage dans la classe sup\u00e9rieure. Or, en ce domaine, l\u2019\u00e9volution est nette.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\/blog\/160116\/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans<\/a><\/h3>\n<p>16 janv. 2016 | Par <a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal<\/a><\/p>\n<p>Les restes d\u2019un mammouth retrouv\u00e9s en Arctique sib\u00e9rien, dat\u00e9s de 45 000 ans, portent les traces de blessures inflig\u00e9es par des chasseurs humains. Les scientifiques pensaient jusqu\u2019ici que notre esp\u00e8ce ne s\u2019\u00e9tait pas aventur\u00e9e dans cette r\u00e9gion glaciale il y a plus de 30 000 ou 35 0000 ans. En r\u00e9alit\u00e9, des hommes ont r\u00e9ussi \u00e0 survivre en Arctique au moins 10 000 ans plus t\u00f4t que l\u2019on croyait.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/alain-zolty\/blog\/140116\/de-la-democratie-du-citoyen-et-de-lethique\">De la d\u00e9mocratie, du citoyen et de l'\u00e9thique<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>Trois ouvrages sont parus au Seuil, qui font \u00e9tat de la n\u00e9cessit\u00e9 d\u2019int\u00e9grer le citoyen dans la gouvernance de la nation. Non pas \u00e0 titre consultatif mais dot\u00e9 d\u2019un pouvoir d\u00e9lib\u00e9ratif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.<\/p>\n<\/div>", 8 "content": "<div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/camedia-0\">CAMédia</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/camedia/article/180116/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles éditions pour débattre dans le club sur la laïcité et sur la démocratie</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>CAMédia après un échange sur « l'éthique du débat » a lancé deux discussions , l'une sur le thème de la laïcité, l'autre ( encore en cours) sur celui de la démocratie. Nous sommes heureux de pouvoir signaler la création de deux nouvelles éditions participatives sur ces thèmes. Nous vous invitons à les lire et à participer à leurs débats.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/lucile-longre/blog/170116/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de rêver, éloge du merveilleux</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>Je parlerai ici des rêves comme moteur de vie, de ces rêves qui vous rattachent et vous font espérer à ce qu’il y a de plus humain dans l’homme, même au milieu de la plus noire des détresses.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/barbara-romagnan/blog/180116/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>En ce début d’année, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-thibaudat/blog/170116/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L’Allier, département de destruction massive du tissu culturel</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au cœur des régions. Leurs subventions sont souvent revues à la baisse. Le département de l’Allier les a carrément supprimées. Pour favoriser « l’événementiel ».</p>\n</div><div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart\">Les invités de Mediapart</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart/article/180116/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La démocratie déjà attaquée par la coopération réglementaire transatlantique</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG basée à Bruxelles qui enquête sur le pouvoir des lobbies des grandes entreprises sur la politique de l’Union européenne. Ils révèlent que depuis 25 ans le projet de « coopération réglementaire » mené par l’Union européenne et les États-Unis a été dominé par les grandes entreprises. ET que le TTIP cherche à entériner ce projet.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jacqueline-derens/blog/180116/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une année test pour Jacob Zuma et son gouvernement</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les turbulences de l’an passé ont toutes les chances de continuer à troubler le climat politique et social de l’Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la nécessité de ces changements, est-il l’homme de la situation ? Son gouvernement répondra-t-il aux attentes des citoyens sud-africains ?</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/marie-cosnay/blog/140116/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>J’ai une fringale d’aventure, d’aventures à venir. J’ai la fringale de la fringale des aventures et soudain, rupture. Je n’y arrive plus, tout est bloqué, tout empêché. Faut dire que depuis un an environ, tout est devenu plus compliqué. Ecrire va de moins en moins de soi.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-veran/blog/170116/redoublement-le-changement-bas-bruit\">Redoublement : le changement à bas bruit ?</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>S’il est une caractéristique de la forme scolaire française bien établie dans la culture des personnels, des élèves et des parents, c’est bien le redoublement, censé sanctionner des résultats insuffisants pour envisager le passage dans la classe supérieure. Or, en ce domaine, l’évolution est nette.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/michel-de-pracontal/blog/160116/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans</a></h3>\n<p>16 janv. 2016 | Par <a href=\"https://blogs.mediapart.fr/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal</a></p>\n<p>Les restes d’un mammouth retrouvés en Arctique sibérien, datés de 45 000 ans, portent les traces de blessures infligées par des chasseurs humains. Les scientifiques pensaient jusqu’ici que notre espèce ne s’était pas aventurée dans cette région glaciale il y a plus de 30 000 ou 35 0000 ans. En réalité, des hommes ont réussi à survivre en Arctique au moins 10 000 ans plus tôt que l’on croyait.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/alain-zolty/blog/140116/de-la-democratie-du-citoyen-et-de-lethique\">De la démocratie, du citoyen et de l'éthique</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>Trois ouvrages sont parus au Seuil, qui font état de la nécessité d’intégrer le citoyen dans la gouvernance de la nation. Non pas à titre consultatif mais doté d’un pouvoir délibératif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.</p>\n</div>",
9 "mimetype": "text\/html", 9 "mimetype": "text/html",
10 "language": "fr", 10 "language": "fr",
11 "reading_time": 3, 11 "reading_time": 3,
12 "domain_name": "www.mediapart.fr", 12 "domain_name": "www.mediapart.fr",
13 "preview_picture": "https:\/\/www.mediapart.fr\/images\/social\/800\/mediapart.png", 13 "preview_picture": "https://www.mediapart.fr/images/social/800/mediapart.png",
14 "tags": [] 14 "tags": [
15 } 15 "mediapart",
16 , 16 "blog"
17 ]
18 },
17 { 19 {
18 "id": 22, 20 "id": 22,
19 "title": "R\u00e9fugi\u00e9s: l'UE va cr\u00e9er 100\u00a0000\u00a0places d'accueil dans les Balkans", 21 "title": "Réfugiés: l'UE va créer 100 000 places d'accueil dans les Balkans",
20 "url": "http:\/\/www.liberation.fr\/planete\/2015\/10\/26\/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867", 22 "url": "http://www.liberation.fr/planete/2015/10/26/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867",
21 "is_archived": false, 23 "is_archived": false,
22 "is_starred": false, 24 "is_starred": false,
23 "content": "<p>Pour un sommet sur les r\u00e9fugi\u00e9s qui devait se concentrer sur des <em>\u00abmesures op\u00e9rationnelles imm\u00e9diates\u00bb<\/em> dans les Balkans, la r\u00e9union, dimanche \u00e0 Bruxelles, de 11\u00a0chefs d\u2019Etat et de gouvernement, dont 8 Europ\u00e9ens, a \u00e9t\u00e9 agit\u00e9e. D\u00e8s leur arriv\u00e9e, Viktor\u00a0Orb\u00e1n (Hongrie) et\u00a0Al\u00e9xis Ts\u00edpras (Gr\u00e8ce) se sont jet\u00e9 des anath\u00e8mes. Le Premier ministre grec a d\u00e9nonc\u00e9 l\u2019attitude <em>\u00abnot in my backyard\u00bb<\/em> (pas de \u00e7a chez moi) de certains Etats europ\u00e9ens, alors que son pays est montr\u00e9 du doigt par d\u2019autres dirigeants, dont\u00a0Orb\u00e1n\u00a0: ils reprochent \u00e0 la Gr\u00e8ce de ne pas suffisamment contr\u00f4ler ses fronti\u00e8res avec la Turquie et ne pas montrer assez de z\u00e8le dans l\u2019enregistrement des demandeurs d\u2019asile.<\/p>\n<p>Le sommet, convoqu\u00e9 par la Commission europ\u00e9enne, sur suggestion de l\u2019Allemagne, aura au moins permis \u00e0 ces 11\u00a0Etats \u2013\u00a0Autriche, Bulgarie, Croatie, Allemagne, Gr\u00e8ce, Hongrie, Roumanie, Slov\u00e9nie c\u00f4t\u00e9 europ\u00e9en, et 3 pays \u00abnon UE\u00bb, Albanie, Mac\u00e9doine et Serbie\u00a0\u2013 de discuter ensemble.<\/p>\n<h3>400\u00a0policiers europ\u00e9ens en Slov\u00e9nie<\/h3>\n<p>L\u2019objectif, rappel\u00e9 par Angela Merkel, \u00e9tait de trouver une <em>\u00abr\u00e9ponse coordonn\u00e9e\u00bb<\/em> \u00e0 la crise des r\u00e9fugi\u00e9s. Quelques mesures ont \u00e9t\u00e9 annonc\u00e9es\u00a0: 100\u00a0000\u00a0places d\u2019accueil seront cr\u00e9\u00e9es, dont 50\u00a0000 en Gr\u00e8ce, et le reste le long de la route des Balkans.\u00a0400\u00a0officiers de police de pays europ\u00e9ens partiront en Slov\u00e9nie, actuellement submerg\u00e9e, pour aider au contr\u00f4le des fronti\u00e8res. Frontex, l\u2019agence europ\u00e9enne de surveillance des fronti\u00e8res, s\u2019impliquera aux fronti\u00e8res gr\u00e9co-mac\u00e9donienne et gr\u00e9co-albanaise pour des contr\u00f4les et identifications.<\/p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqu\u00e9 par des fermetures de fronti\u00e8res bloquant les r\u00e9fugi\u00e9s dans des zones tampon. Ces obstacles ont \u00e9t\u00e9 partiellement lev\u00e9s ces derniers jours, les autorit\u00e9s tentant d\u2019organiser un \u00abcorridor\u00bb informel vers l\u2019Allemagne, qui pourtant durcit sa politique d\u2019accueil et souhaite d\u00e9sormais ralentir le flux. Mais la situation des r\u00e9fugi\u00e9s est catastrophique. L\u2019ONG Human Rights Watch craint que des r\u00e9fugi\u00e9s ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqu\u00e9s pr\u00e8s des postes-fronti\u00e8res, se retrouvent dans des conditions humanitaires intenables.<\/p>\n<p>Depuis mi-septembre, 250\u00a0000\u00a0personnes ont travers\u00e9 les Balkans. En une semaine, la Slov\u00e9nie a vu 60\u00a0000\u00a0r\u00e9fugi\u00e9s fouler le sol de son territoire. Dimanche, 15\u00a0000\u00a0personnes ont transit\u00e9 en Slov\u00e9nie.<\/p>\n<h3>Des zones tampon<\/h3>\n<p>L\u2019enjeu principal du sommet, aux yeux de nombreux Etats de l\u2019Union europ\u00e9enne, \u00e9tait aussi que les pays des Balkans <em>\u00abprennent leur part\u00bb<\/em> face \u00e0 la crise\u00a0: qu\u2019ils accueillent et enregistrent davantage de r\u00e9fugi\u00e9s. Ces Etats craignent que l\u2019Autriche ou l\u2019Allemagne ne ferment leurs fronti\u00e8res et fassent de leurs pays des <em>\u00abzones tampon\u00bb<\/em>, comme s\u2019en inqui\u00e9tait Boyko Borissov, Premier ministre bulgare.<\/p>\n<p><em>\u00ab\u00a0Aujourd\u2019hui, plusieurs Etats du nord de l\u2019Europe veulent que l\u2019on enregistre les migrants puis que l\u2019on d\u00e9termine leur \u00e9ligibilit\u00e9 au statut de r\u00e9fugi\u00e9,<\/em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficult\u00e9, c\u2019est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays interm\u00e9diaires, donc ceux des Balkans, est qu\u2019on enregistre ces personnes sur leur territoire et qu\u2019ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas d\u00e9sireux d\u2019accueillir ces r\u00e9fugi\u00e9s et ces derniers veulent avancer.\u00bb<\/em><\/p>\n<p>Le sommet a \u00e9labor\u00e9 quelques principes. L\u2019id\u00e9e g\u00e9n\u00e9rale est de rendre effective la \u00ablogique de hotspot\u00bb\u00a0: un enregistrement des demandeurs d\u2019asile \u00e0 leur point d\u2019entr\u00e9e dans l\u2019Union europ\u00e9enne, suivi de l\u2019expulsion de ceux qui ne correspondraient pas aux crit\u00e8res de la Convention de Gen\u00e8ve, et la r\u00e9partition des autres, via le m\u00e9canisme de relocalisation.<\/p>\n<p>Dans ce cadre, l\u2019enregistrement des demandeurs d\u2019asile est un \u00e9l\u00e9ment cl\u00e9. <em>\u00abPas d\u2019enregistrement, pas de droit\u00bb<\/em>, a pr\u00e9venu le pr\u00e9sident de la Commission europ\u00e9enne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu \u00e0 rappeler que les migrants qui refusent de demander l\u2019asile \u00e0 la fronti\u00e8re peuvent se voir refuser l\u2019entr\u00e9e dans un pays.<\/p>\n<p>Et les Etats <em>\u00abd\u00e9courageront les mouvements de r\u00e9fugi\u00e9s\u00bb<\/em> de fronti\u00e8re en fronti\u00e8re. La politique consistant \u00e0 laisser passer les migrants vers un autre pays est officiellement jug\u00e9e <em>\u00abinacceptable\u00bb<\/em>.<\/p>\n<h3>Se jeter dans la gueule du loup<\/h3>\n<p>Voil\u00e0 pour la th\u00e9orie. En pratique, la relocalisation ne devrait concerner que 160\u00a0000\u00a0r\u00e9fugi\u00e9s en deux\u00a0ans, alors que pr\u00e8s de 700\u00a0000\u00a0personnes sont arriv\u00e9es en Europe depuis le d\u00e9but de l\u2019ann\u00e9e. De plus, les Etats ne jouent pas le jeu. La semaine pass\u00e9e, seules 854\u00a0places de relocalisation avaient \u00e9t\u00e9 propos\u00e9es.<\/p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s\u2019impliqueront pas outre mesure dans les solutions propos\u00e9es, craignant de devoir \u00abgarder\u00bb les r\u00e9fugi\u00e9s alors que l\u2019Union europ\u00e9enne tarde \u00e0 mettre en \u0153uvre leur r\u00e9partition.<\/p>\n<p>Quant aux r\u00e9fugi\u00e9s, ils pr\u00e9f\u00e8rent traverser les fronti\u00e8res par eux-m\u00eames, plut\u00f4t que de se jeter dans ces \u00abhotspots\u00bb, consid\u00e9r\u00e9s comme la gueule du loup.<\/p>\n<a itemprop=\"name\" href=\"http:\/\/www.liberation.fr\/auteur\/15743-cedric-vallet\">C\u00e9dric Vallet<\/a>", 25 "content": "<p>Pour un sommet sur les réfugiés qui devait se concentrer sur des <em>«mesures opérationnelles immédiates»</em> dans les Balkans, la réunion, dimanche à Bruxelles, de 11 chefs d’Etat et de gouvernement, dont 8 Européens, a été agitée. Dès leur arrivée, Viktor Orbán (Hongrie) et Aléxis Tsípras (Grèce) se sont jeté des anathèmes. Le Premier ministre grec a dénoncé l’attitude <em>«not in my backyard»</em> (pas de ça chez moi) de certains Etats européens, alors que son pays est montré du doigt par d’autres dirigeants, dont Orbán : ils reprochent à la Grèce de ne pas suffisamment contrôler ses frontières avec la Turquie et ne pas montrer assez de zèle dans l’enregistrement des demandeurs d’asile.</p>\n<p>Le sommet, convoqué par la Commission européenne, sur suggestion de l’Allemagne, aura au moins permis à ces 11 Etats – Autriche, Bulgarie, Croatie, Allemagne, Grèce, Hongrie, Roumanie, Slovénie côté européen, et 3 pays «non UE», Albanie, Macédoine et Serbie – de discuter ensemble.</p>\n<h3>400 policiers européens en Slovénie</h3>\n<p>L’objectif, rappelé par Angela Merkel, était de trouver une <em>«réponse coordonnée»</em> à la crise des réfugiés. Quelques mesures ont été annoncées : 100 000 places d’accueil seront créées, dont 50 000 en Grèce, et le reste le long de la route des Balkans. 400 officiers de police de pays européens partiront en Slovénie, actuellement submergée, pour aider au contrôle des frontières. Frontex, l’agence européenne de surveillance des frontières, s’impliquera aux frontières gréco-macédonienne et gréco-albanaise pour des contrôles et identifications.</p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqué par des fermetures de frontières bloquant les réfugiés dans des zones tampon. Ces obstacles ont été partiellement levés ces derniers jours, les autorités tentant d’organiser un «corridor» informel vers l’Allemagne, qui pourtant durcit sa politique d’accueil et souhaite désormais ralentir le flux. Mais la situation des réfugiés est catastrophique. L’ONG Human Rights Watch craint que des réfugiés ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqués près des postes-frontières, se retrouvent dans des conditions humanitaires intenables.</p>\n<p>Depuis mi-septembre, 250 000 personnes ont traversé les Balkans. En une semaine, la Slovénie a vu 60 000 réfugiés fouler le sol de son territoire. Dimanche, 15 000 personnes ont transité en Slovénie.</p>\n<h3>Des zones tampon</h3>\n<p>L’enjeu principal du sommet, aux yeux de nombreux Etats de l’Union européenne, était aussi que les pays des Balkans <em>«prennent leur part»</em> face à la crise : qu’ils accueillent et enregistrent davantage de réfugiés. Ces Etats craignent que l’Autriche ou l’Allemagne ne ferment leurs frontières et fassent de leurs pays des <em>«zones tampon»</em>, comme s’en inquiétait Boyko Borissov, Premier ministre bulgare.</p>\n<p><em>« Aujourd’hui, plusieurs Etats du nord de l’Europe veulent que l’on enregistre les migrants puis que l’on détermine leur éligibilité au statut de réfugié,</em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficulté, c’est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays intermédiaires, donc ceux des Balkans, est qu’on enregistre ces personnes sur leur territoire et qu’ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas désireux d’accueillir ces réfugiés et ces derniers veulent avancer.»</em></p>\n<p>Le sommet a élaboré quelques principes. L’idée générale est de rendre effective la «logique de hotspot» : un enregistrement des demandeurs d’asile à leur point d’entrée dans l’Union européenne, suivi de l’expulsion de ceux qui ne correspondraient pas aux critères de la Convention de Genève, et la répartition des autres, via le mécanisme de relocalisation.</p>\n<p>Dans ce cadre, l’enregistrement des demandeurs d’asile est un élément clé. <em>«Pas d’enregistrement, pas de droit»</em>, a prévenu le président de la Commission européenne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu à rappeler que les migrants qui refusent de demander l’asile à la frontière peuvent se voir refuser l’entrée dans un pays.</p>\n<p>Et les Etats <em>«décourageront les mouvements de réfugiés»</em> de frontière en frontière. La politique consistant à laisser passer les migrants vers un autre pays est officiellement jugée <em>«inacceptable»</em>.</p>\n<h3>Se jeter dans la gueule du loup</h3>\n<p>Voilà pour la théorie. En pratique, la relocalisation ne devrait concerner que 160 000 réfugiés en deux ans, alors que près de 700 000 personnes sont arrivées en Europe depuis le début de l’année. De plus, les Etats ne jouent pas le jeu. La semaine passée, seules 854 places de relocalisation avaient été proposées.</p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s’impliqueront pas outre mesure dans les solutions proposées, craignant de devoir «garder» les réfugiés alors que l’Union européenne tarde à mettre en œuvre leur répartition.</p>\n<p>Quant aux réfugiés, ils préfèrent traverser les frontières par eux-mêmes, plutôt que de se jeter dans ces «hotspots», considérés comme la gueule du loup.</p>\n<a itemprop=\"name\" href=\"http://www.liberation.fr/auteur/15743-cedric-vallet\">Cédric Vallet</a>",
26 "mimetype": "",
27 "language": "",
24 "reading_time": 4, 28 "reading_time": 4,
25 "domain_name": "www.liberation.fr", 29 "domain_name": "www.liberation.fr",
26 "tags": [] 30 "tags": []
27 } 31 },
28 ,
29 { 32 {
30 "id": "21", 33 "id": "21",
31 "title": "No title found", 34 "title": "No title found",
@@ -33,6 +36,8 @@
33 "is_archived": false, 36 "is_archived": false,
34 "is_starred": true, 37 "is_starred": true,
35 "content": "Oh, what a shame, no content", 38 "content": "Oh, what a shame, no content",
39 "mimetype": "",
40 "language": "",
36 "reading_time": 4, 41 "reading_time": 4,
37 "domain_name": "news.nationalgeographic.com", 42 "domain_name": "news.nationalgeographic.com",
38 "tags": [] 43 "tags": []