Compare commits

...

167 Commits

Author SHA1 Message Date
00ef542e49 Closes #33. 2018-11-03 18:48:50 +01:00
a78c6e6b33 Sync with settings. 2018-11-03 18:47:43 +01:00
363eaf9bf9 Preferences for the background tasks. 2018-11-03 18:14:22 +01:00
fec6683701 Merge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2018-11-03 11:30:13 +01:00
1549edb647 ... 2018-11-03 11:29:53 +01:00
3de48ba162 Some more background tasks. 2018-11-03 11:29:03 +01:00
a2a3d6f1a7 New Crowdin translations (#232)
* New translations strings.xml (Spanish)

* New translations strings.xml (Galician)

* New translations strings.xml (French)
2018-11-02 10:34:04 +01:00
ccab2c7648 Initial work on background task. 2018-11-01 21:51:31 +01:00
880dd1db5c New Crowdin translations (#231)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Galician)
2018-11-01 21:27:59 +01:00
ed18fea356 Closes #38. 2018-11-01 21:11:54 +01:00
9816b20bf6 Only do api calls on network available. 2018-11-01 21:10:00 +01:00
0bb2195bff Network status on articles loading. 2018-11-01 20:42:49 +01:00
ab2d0c4036 Closes #230. 2018-10-31 20:14:20 +01:00
99fc417109 Fixed #230. 2018-10-29 19:53:41 +01:00
dc304ef8c1 Updated gradle. 2018-10-20 09:29:09 +02:00
c5511880bc Just trying to fix fragment issues. 2018-10-19 05:27:16 +02:00
5fe76d735e Remiving items from the cache on swipe. 2018-10-17 20:19:35 +02:00
3064b3b835 Closes #228 by removing the list action bar. Action buttons are exclusively on the card view from now on. 2018-10-17 19:46:30 +02:00
70dc8af3ce New Crowdin translations (#227)
* New translations strings.xml (Spanish)

* New translations strings.xml (Galician)
2018-10-16 08:33:34 +02:00
53c8c241da Order By id desc for items. 2018-10-14 18:56:07 +02:00
bdc4f5680b Merge branch 'crowdin_translation' 2018-10-14 16:58:15 +02:00
ed290573b2 Merge branch 'master' into crowdin_translation 2018-10-14 16:57:45 +02:00
1616a97a8a New translations strings.xml (French) 2018-10-14 16:32:43 +02:00
d090183007 New translations strings.xml (French) 2018-10-14 16:31:09 +02:00
de337fd260 Moving to version 1.7 with caching. 2018-10-14 15:59:02 +02:00
12dc206323 Build with optional publish. 2018-10-14 15:57:22 +02:00
d47c508dee New translations strings.xml (Galician) 2018-10-14 15:42:10 +02:00
ed75f55437 New translations strings.xml (Arabic) 2018-10-14 15:42:09 +02:00
5ad3ad4a57 New translations strings.xml (Chinese Simplified) 2018-10-14 15:42:07 +02:00
aeac1bd1d4 New translations strings.xml (Chinese Traditional) 2018-10-14 15:42:06 +02:00
4d18085072 New translations strings.xml (Czech) 2018-10-14 15:42:04 +02:00
0c9f8214ca New translations strings.xml (Danish) 2018-10-14 15:42:03 +02:00
a7ce7ce02e New translations strings.xml (Dutch) 2018-10-14 15:42:01 +02:00
820986c7f0 New translations strings.xml (Finnish) 2018-10-14 15:42:00 +02:00
8079cae745 New translations strings.xml (French) 2018-10-14 15:41:59 +02:00
6f067bd258 New translations strings.xml (German) 2018-10-14 15:41:58 +02:00
b6ade0f212 New translations strings.xml (Greek) 2018-10-14 15:41:56 +02:00
27dadc1be3 New translations strings.xml (Hebrew) 2018-10-14 15:41:55 +02:00
95e4162b4c New translations strings.xml (Hungarian) 2018-10-14 15:41:54 +02:00
f75557585e New translations strings.xml (Indonesian) 2018-10-14 15:41:52 +02:00
1b4c26919b New translations strings.xml (Afrikaans) 2018-10-14 15:41:51 +02:00
ad085bf129 New translations strings.xml (Italian) 2018-10-14 15:41:50 +02:00
8fcd551105 New translations strings.xml (Korean) 2018-10-14 15:41:48 +02:00
a0954700e2 New translations strings.xml (Norwegian) 2018-10-14 15:41:47 +02:00
9705560442 New translations strings.xml (Polish) 2018-10-14 15:41:45 +02:00
1f47a13ce5 New translations strings.xml (Portuguese) 2018-10-14 15:41:44 +02:00
6f0ff2c975 New translations strings.xml (Portuguese, Brazilian) 2018-10-14 15:41:43 +02:00
76e5477986 New translations strings.xml (Romanian) 2018-10-14 15:41:41 +02:00
7f308d5be3 New translations strings.xml (Russian) 2018-10-14 15:41:40 +02:00
54a43c83e8 New translations strings.xml (Serbian (Cyrillic)) 2018-10-14 15:41:38 +02:00
8fe7266c84 New translations strings.xml (Spanish) 2018-10-14 15:41:37 +02:00
d7a46b27b7 New translations strings.xml (Swedish) 2018-10-14 15:41:36 +02:00
2257d09fdd New translations strings.xml (Turkish) 2018-10-14 15:41:34 +02:00
047c5481c4 New translations strings.xml (Ukrainian) 2018-10-14 15:41:33 +02:00
8a6719f934 New translations strings.xml (Vietnamese) 2018-10-14 15:41:32 +02:00
51a692f3be New translations strings.xml (Japanese) 2018-10-14 15:41:30 +02:00
b333f93171 New translations strings.xml (Catalan) 2018-10-14 15:41:29 +02:00
89d34a1a71 Closes #1. May need some fine tuning. 2018-10-14 15:38:06 +02:00
8788e920ce More resources cleaning. 2018-10-14 11:25:14 +02:00
d306fb53d3 Migration with new table and schemas. 2018-10-14 11:17:24 +02:00
374537b5c7 Preparing for room migrations. Some cleaning. 2018-10-14 11:07:10 +02:00
598149d4cd Publish version. 2018-10-13 22:13:56 +02:00
50bcf18096 New translations strings.xml (Galician) 2018-10-13 22:11:24 +02:00
a089ced03f New translations strings.xml (Arabic) 2018-10-13 22:11:23 +02:00
1f18dddf8b New translations strings.xml (Chinese Simplified) 2018-10-13 22:11:21 +02:00
f5934e240e New translations strings.xml (Chinese Traditional) 2018-10-13 22:11:20 +02:00
6b8da2eacf New translations strings.xml (Czech) 2018-10-13 22:11:19 +02:00
f4757a67b7 New translations strings.xml (Danish) 2018-10-13 22:11:17 +02:00
6edeb9d840 New translations strings.xml (Dutch) 2018-10-13 22:11:16 +02:00
43ce0fd7bc New translations strings.xml (Finnish) 2018-10-13 22:11:15 +02:00
5599f5a8fc New translations strings.xml (French) 2018-10-13 22:11:13 +02:00
6fd45ceb4f New translations strings.xml (German) 2018-10-13 22:11:12 +02:00
05ad8aac29 New translations strings.xml (Greek) 2018-10-13 22:11:11 +02:00
fa4f2476b7 New translations strings.xml (Hebrew) 2018-10-13 22:11:10 +02:00
00818a94e9 New translations strings.xml (Hungarian) 2018-10-13 22:11:08 +02:00
5d5250e44a New translations strings.xml (Indonesian) 2018-10-13 22:11:07 +02:00
3052b33132 New translations strings.xml (Afrikaans) 2018-10-13 22:11:06 +02:00
50de6f8b5b New translations strings.xml (Italian) 2018-10-13 22:11:04 +02:00
f88a2f415f New translations strings.xml (Norwegian) 2018-10-13 22:11:02 +02:00
96f9813e01 New translations strings.xml (Polish) 2018-10-13 22:11:01 +02:00
fee739cb17 New translations strings.xml (Portuguese) 2018-10-13 22:11:00 +02:00
b1814c63b9 New translations strings.xml (Portuguese, Brazilian) 2018-10-13 22:10:59 +02:00
c1d45678f8 New translations strings.xml (Romanian) 2018-10-13 22:10:58 +02:00
3d34e59a94 New translations strings.xml (Russian) 2018-10-13 22:10:56 +02:00
f1133bea8b New translations strings.xml (Spanish) 2018-10-13 22:10:54 +02:00
ec64c88ff1 New translations strings.xml (Swedish) 2018-10-13 22:10:53 +02:00
be66dbba6c New translations strings.xml (Turkish) 2018-10-13 22:10:52 +02:00
8926cdbbf5 New translations strings.xml (Vietnamese) 2018-10-13 22:10:50 +02:00
a956870dec New translations strings.xml (Japanese) 2018-10-13 22:10:49 +02:00
8ed7951c9b New translations strings.xml (Catalan) 2018-10-13 22:10:48 +02:00
5569a47674 Some cleaning and preparing for items storage in room. 2018-10-13 22:02:13 +02:00
0dc6981913 Removed some unused resources. 2018-10-13 21:14:08 +02:00
4984f2f7ad Removed the intro. It was causing issues. 2018-10-13 20:49:26 +02:00
3b6891c84a App was a little slow with livedata. 2018-10-13 10:24:58 +02:00
4901e7174c Still trying to fix the build issue. 2018-10-13 04:52:55 +02:00
8d70e68fe2 Trying to fix build issue. 2018-10-12 22:50:43 +02:00
d3e1527b70 AS changes gradle version to one that does not exist. 2018-10-12 22:29:33 +02:00
0c201301f2 Replaced reservoir by room. 2018-10-12 22:04:47 +02:00
6090590f24 Imports cleaning. Libraries update. 2018-10-12 21:01:39 +02:00
06b88c783d Auto migration to android x. 2018-10-12 20:36:18 +02:00
bb75ebf635 Merge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2018-10-07 22:30:30 +02:00
7d7d0014be Fixes #83. The issue wasn't selfoss related at all... 2018-10-07 22:30:07 +02:00
b3f8d44794 New Crowdin translations (#224)
* New translations strings.xml (Korean)

* New translations strings.xml (Korean)

* New translations strings.xml (Korean)
2018-10-03 14:35:03 +02:00
29d1e38340 Fixes #223. Fixes internal reader issue on 4.2.2 2018-09-30 09:37:22 +02:00
2be872e61e Fixed version update. 2018-09-25 20:56:25 +02:00
377c5518f7 Minimal versions updates. 2018-09-25 20:47:38 +02:00
21be7357b5 Revert "Updated to androidx."
This reverts commit d47ba2c820.
2018-09-25 20:27:27 +02:00
d47ba2c820 Updated to androidx. 2018-09-25 20:08:51 +02:00
a64b14614a New Crowdin translations (#222)
* New translations strings.xml (Italian)

* New translations strings.xml (Italian)

* New translations strings.xml (Italian)
2018-09-24 08:06:00 +02:00
6a88192e77 Fixes #221 2018-09-21 21:39:37 +02:00
aa7c630818 erge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2018-09-15 16:26:22 +02:00
7fb54f14c7 Fixed bug 2018-09-15 16:24:29 +02:00
3d709c02b7 New Crowdin translations (#219)
* New translations strings.xml (French)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Galician)
2018-09-12 13:16:07 +02:00
339d384561 Changelog. 2018-09-10 20:29:22 +02:00
50338d51af New Crowdin translations (#218)
* New translations strings.xml (French)

* New translations strings.xml (French)
2018-09-10 15:17:16 +02:00
92dbabf899 New Crowdin translations (#217)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Galician)
2018-09-09 20:59:34 +02:00
0043021390 Merge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2018-09-09 20:40:13 +02:00
70ba9b20da Items marked as read on open. Closes #208. 2018-09-09 20:39:27 +02:00
7fda0a04a1 Fixes #215. 2018-09-09 19:45:49 +02:00
3db3157dc9 Trying to fix a strange issue with the loading when hiding items.. 2018-09-09 19:44:01 +02:00
2089fe60ca New Crowdin translations (#214)
* New translations strings.xml (Galician)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)
2018-08-06 15:49:50 +02:00
9606d36670 Hiding hidden tags from the "normal" tags section. 2018-08-03 09:49:49 +02:00
869cf64c54 New Crowdin translations (#213)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Galician)
2018-08-02 22:33:58 +02:00
f57ec1f6c0 Add hidden tags option (#212)
* Add filter for hidden tags. (#207)

This commit adds the option to configure hidden tags. Articles tagged
with these hidden tags won't appear in the list of articles by default.
To see these articles the user must explicitly filter by those tags.

* Closes #211. Handling hidden tags in the lateral panel.

* Changelog.
2018-08-02 22:04:15 +02:00
361eea9a06 New Crowdin translations (#209)
* New translations strings.xml (Galician)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)
2018-08-01 20:34:39 +02:00
838b4056ac Add store logos, put badges on the same line (#210)
* Add store logos, put badges on the same line

* fix link

* Changed Jenkins url.
2018-08-01 20:32:21 +02:00
0c0a98510b New translations strings.xml (Galician) (#206) 2018-07-17 19:21:42 +02:00
be642ed06f New Crowdin translations (#205)
* New translations strings.xml (Galician)

* New translations strings.xml (Galician)

* New translations strings.xml (Galician)
2018-07-17 17:47:45 +02:00
fd77f38e95 New Crowdin translations (#204)
* New translations strings.xml (Spanish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Galician)

* New translations strings.xml (Galician)
2018-07-17 17:12:01 +02:00
c9baab7267 New Crowdin translations (#203)
* New translations strings.xml (Spanish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Spanish)
2018-07-17 11:01:54 +02:00
86985cfd5b Update README.md 2018-07-16 11:24:56 +02:00
1327a4e069 Merge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2018-07-07 13:52:53 +02:00
c46acbc579 Dependencies update to solve fdroid issues. 2018-07-07 13:50:32 +02:00
4c6a403fae New Crowdin translations (#202)
* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)
2018-06-15 13:45:01 +02:00
78920022bd Update 2018-06-04 19:22:40 +02:00
7b16c41e82 Added the alpha steps. 2018-06-04 19:22:05 +02:00
3389f8bd09 New Crowdin translations (#200)
* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)
2018-06-03 17:20:36 +02:00
8dc25c527d Trying to fix issues with Glide, fragment, and destroyed activity. 2018-05-31 22:41:23 +02:00
46d6bd57c1 Changelog. 2018-05-31 12:46:45 +02:00
db014fe13d Fixed issue on pre lolipop devices. 2018-05-31 12:42:06 +02:00
6c293f4cac Changing the tag handling. 2018-05-26 10:51:11 +02:00
91e5d3736f Cleaning build script. 2018-05-25 22:47:36 +02:00
e11dee220f Adde dHTTP version check for fdroid. 2018-05-25 22:22:32 +02:00
fcebf916d2 New translations strings.xml (French) (#199) 2018-05-25 20:28:15 +02:00
73cc1a7297 Remove any email from the reports, as there seems to be no way to secure the data. 2018-05-25 20:20:47 +02:00
798f112498 Added the ability to force push and force tag creation. 2018-05-24 22:36:20 +02:00
38b5e7dc65 New (new, new, new, new) way for handling versions. Will work with jenkins and fdroid. 2018-05-24 22:32:34 +02:00
2799a48f2b Fixed build issue. 2018-05-24 21:43:27 +02:00
ad5edae6cd Fixed jenkins build issue. 2018-05-23 20:56:30 +02:00
9cb02f0272 Changelog. 2018-05-23 20:44:47 +02:00
6d24fd9336 Removed every config string added at build time. 2018-05-23 20:39:50 +02:00
a3a7b78c96 Removed direct call to mercury api. 2018-05-23 20:00:46 +02:00
e995286068 New Crowdin translations (#196)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (French)

* New translations strings.xml (French)
2018-05-22 21:20:27 +02:00
65fb6d9b7e Fixes #59. 2018-05-22 21:14:10 +02:00
eb02d1efad Settings for silent debug. 2018-05-22 20:21:31 +02:00
f8d3e1eefb New Crowdin translations (#195)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Vietnamese)
2018-05-22 13:21:03 +02:00
218b8fa843 Replace with ACRA bug reporter. 2018-05-21 21:39:23 +02:00
9f94af6239 Removed firebase and crashlytics 2018-05-20 10:19:46 +02:00
d3584ac40e New Crowdin translations (#194)
* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Vietnamese)
2018-05-14 22:36:36 +02:00
90bdb289d0 Fixed build and version issue. 2018-05-14 22:36:12 +02:00
78a08750a2 CHANGELOG. 2018-05-14 22:07:50 +02:00
baba851e97 Strings cleaning and versions updates. 2018-05-14 22:02:57 +02:00
2a03783623 Trying to fix some swipe and reload items issues. 2018-05-10 12:57:57 +02:00
9f2a4438b1 Trying to debug and fix a swipe to hide issue. 2018-05-08 10:23:12 +02:00
5ee5287ffa changelog. 2018-05-07 11:28:24 +02:00
29547c2c94 Changed the email subject. 2018-05-07 11:27:16 +02:00
4846c870fa Fixed dark theme issue. 2018-05-07 10:16:02 +02:00
134 changed files with 7048 additions and 6745 deletions

View File

@ -47,15 +47,8 @@ You can directly import this project into IntellIJ/Android Studio.
You'll have to: You'll have to:
- Configure fabric and add your `apiKey` and `apiSecret` in the `fabric.properties` file.
- Create a firebase project and add the `google-services.json` to the `app/` folder.
- Define some parameters either in `~/.gradle/gradle.properties` or as gradle parameters (see the examples) - Define some parameters either in `~/.gradle/gradle.properties` or as gradle parameters (see the examples)
- mercuryApiKey: A [Mercury](https://mercury.postlight.com/web-parser/) web parser api key for the internal browser
- feedbackEmail: An email to receive users feedback.
- sourceUrl: an url to the source code, used in the settings. **It can be empty.**
- trackerUrl: an url to the tracker, used in the settings. **It can be empty.**
- githubToken: a github token used to report issues from within the app. [Details here](https://github.com/heinrichreimer/android-issue-reporter#how-to-create-a-bot-key). **It can be empty.**
- appLoginUrl, appLoginUsername and appLoginPassword: url, username and password of a selfoss instance. **These are only used for tests. They can be empty if you don't test API calls.** - appLoginUrl, appLoginUsername and appLoginPassword: url, username and password of a selfoss instance. **These are only used for tests. They can be empty if you don't test API calls.**
### Examples: ### Examples:
@ -65,15 +58,10 @@ You'll have to:
appLoginUrl="URL" # It can be empty. appLoginUrl="URL" # It can be empty.
appLoginUsername="LOGIN" # It can be empty. appLoginUsername="LOGIN" # It can be empty.
appLoginPassword="PASS" # It can be empty. appLoginPassword="PASS" # It can be empty.
mercuryApiKey="LONGAPIKEY"
feedbackEmail="EMAIL"
sourceUrl="URLSOURCE" # It can be empty.
trackerUrl="URLTRACKER" # It can be empty.
githubToken="GITHUBTOKEN" # It can be empty or use https://github.com/heinrichreimer/android-issue-reporter#how-to-create-a-bot-key to generate one
``` ```
#### As gradle parameters #### As gradle parameters
``` ```
./gradlew .... -P appLoginUrl="URL" -P appLoginUsername="LOGIN" -P appLoginPassword="PASS" -P mercuryApiKey="LONGAPIKEY" -P feedbackEmail="EMAIL" -P sourceUrl="URLSOURCE" -P trackerUrl="URLTRACKER" -P githubToken="GITHUBTOKEN" ./gradlew .... -P appLoginUrl="URL" -P appLoginUsername="LOGIN" -P appLoginPassword="PASS"
``` ```

View File

@ -1,3 +1,33 @@
**1.7.x**
- Closes #33. Background sync with settings.
- Closing #1. Initial article caching.
- Closing #228 by removing the list action bar. Action buttons are exclusively on the card view from now on.
- Closing #38. Only doing api calls on network available.
**1.6.x**
- Handling hidden tags.
- Fixed pre-lolipop issue with automatic theme changes.
- Removed all Build config things.
- Removed firebase and fabric.
- Added Acra for optional crash reporting and error logging.
- Dynamic themes !
- Strings cleaning.
- Versions updates.
- Fixes #215, #208.
**1.5.7.x** **1.5.7.x**
- Added confirmation to the mark as read and update menues. - Added confirmation to the mark as read and update menues.

View File

@ -1,19 +1,20 @@
# ReaderForSelfoss # ReaderForSelfoss
[![Slack Channel](https://img.shields.io/badge/chat-slack-green.svg)](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ) [![Slack Channel](https://img.shields.io/badge/chat-slack-green.svg)](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ) [![Build Status](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/badge/icon)](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/) [![Code Triagers Badge](https://www.codetriage.com/aminecmi/readerforselfoss/badges/users.svg)](https://www.codetriage.com/aminecmi/readerforselfoss) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/readerforselfoss/localized.svg)](https://crowdin.com/project/readerforselfoss)
[![Build Status](http://jenkins.amine-bou.fr/job/ReaderForSelfoss/badge/icon)](http://jenkins.amine-bou.fr/job/ReaderForSelfoss/)
[![Code Triagers Badge](https://www.codetriage.com/aminecmi/readerforselfoss/badges/users.svg)](https://www.codetriage.com/aminecmi/readerforselfoss)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/readerforselfoss/localized.svg)](https://crowdin.com/project/readerforselfoss)
This is the repo of [Reader For Selfoss](https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss&hl=en).
It's an RSS Reader for Android, that **only** works with [Selfoss](https://selfoss.aditu.de/) It's an RSS Reader for Android, that **only** works with [Selfoss](https://selfoss.aditu.de/)
The last APK built from source is available [here](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/lastSuccessfulBuild/artifact/SignApksBuilder-out/selfoss-key/selfoss/app-githubConfig-release-unsigned.apk/app-githubConfig-release.apk). <a href='https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="100"/></a> <a href="https://f-droid.org/packages/apps.amine.bou.readerforselfoss"><img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="100"></a>
Also, the last APK built from source is available [here](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/lastSuccessfulBuild/artifact/SignApksBuilder-out/selfoss-key/selfoss/app-githubConfig-release-unsigned.apk/app-githubConfig-release.apk).
## Join the alpha channel
**Keep in mind, it could be instable, but you'll have the new updates faster**
- First, join the google [group](https://groups.google.com/d/forum/reader-for-selfoss-alpha-testing).
- Then, join the [alpha channel](https://play.google.com/apps/testing/apps.amine.bou.readerforselfoss) of the app.
- You'll be able to update the app for the current alpha version.
## Want to help ? ## Want to help ?

View File

@ -1,11 +1,4 @@
buildscript { buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
} }
ext { ext {
@ -22,40 +15,34 @@ def gitVersion() {
} }
def versionCodeFromGit() { def versionCodeFromGit() {
def dayInYear = ext.configuration.buildDate.format("D").padLeft(3, '0') println "version code " + gitVersion()
def versionCode = gitVersion() + (ext.configuration.buildDate.format("yyMM") + dayInYear + ext.todaysBuilds).toInteger() return gitVersion().toInteger()
println "version code " + versionCode
return versionCode.toInteger()
} }
def versionNameFromGit() { def versionNameFromGit() {
def dayInYear = ext.configuration.buildDate.format("D").padLeft(3, '0') println "version name " + gitVersion()
def versionName = gitVersion() + ext.configuration.buildDate.format('yyMM') + dayInYear + ext.todaysBuilds return gitVersion()
println "version name " + versionName
return versionName
} }
apply plugin: 'com.android.application' apply plugin: 'kotlin-kapt'
apply plugin: 'io.fabric' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android-extensions'
repositories {
maven {
url 'https://maven.fabric.io/public'
}
}
android { android {
compileSdkVersion 27 compileOptions {
buildToolsVersion '27.0.3' sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig { defaultConfig {
applicationId "apps.amine.bou.readerforselfoss" applicationId "apps.amine.bou.readerforselfoss"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 27 targetSdkVersion 28
versionCode versionCodeFromGit() versionCode versionCodeFromGit()
versionName versionNameFromGit() versionName versionNameFromGit()
@ -68,14 +55,14 @@ android {
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
// tests // tests
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "String", "MERCURY_KEY", mercuryApiKey javaCompileOptions {
buildConfigField "String", "FEEDBACK_EMAIL", feedbackEmail annotationProcessorOptions {
buildConfigField "String", "SOURCE_URL", sourceUrl arguments = ["room.schemaLocation":
buildConfigField "String", "TRACKER_URL", trackerUrl "$projectDir/schemas".toString()]
buildConfigField "String", "TRANSLATION_URL", translationUrl }
buildConfigField "String", "GITHUB_TOKEN", githubToken }
} }
buildTypes { buildTypes {
release { release {
@ -88,6 +75,7 @@ android {
buildConfigField "String", "LOGIN_URL", appLoginUrl buildConfigField "String", "LOGIN_URL", appLoginUrl
buildConfigField "String", "LOGIN_USERNAME", appLoginUsername buildConfigField "String", "LOGIN_USERNAME", appLoginUsername
buildConfigField "String", "LOGIN_PASSWORD", appLoginPassword buildConfigField "String", "LOGIN_PASSWORD", appLoginPassword
applicationIdSuffix ".dev"
} }
} }
flavorDimensions "build" flavorDimensions "build"
@ -95,56 +83,40 @@ android {
githubConfig { githubConfig {
versionNameSuffix '-github' versionNameSuffix '-github'
dimension "build" dimension "build"
buildConfigField "boolean", "GITHUB_VERSION", "true"
} }
storeConfig { storeConfig {
// As jenkins publishes to alpha first, this is the default suffix now. // As jenkins publishes to alpha first, this is the default suffix now.
versionNameSuffix '-store' versionNameSuffix '-store'
dimension "build" dimension "build"
buildConfigField "boolean", "GITHUB_VERSION", "false"
} }
} }
} }
dependencies { dependencies {
// Testing // Testing
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-beta02'
androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'androidx.test:runner:1.1.0-beta02'
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.1' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0-beta02'
// Espresso-intents for validation and stubbing of Intents // Espresso-intents for validation and stubbing of Intents
androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.1' androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0-beta02'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// Android Support // Android Support
implementation 'com.android.support:appcompat-v7:27.1.1' implementation "androidx.appcompat:appcompat:$android_version"
implementation 'com.android.support:design:27.1.1' implementation "com.google.android.material:material:$android_version"
implementation 'com.android.support:recyclerview-v7:27.1.1' implementation "androidx.recyclerview:recyclerview:$android_version"
implementation 'com.android.support:support-v4:27.1.1' implementation "androidx.legacy:legacy-support-v4:$android_version"
implementation 'com.android.support:support-vector-drawable:27.1.1' implementation "androidx.vectordrawable:vectordrawable:$android_version"
implementation 'com.android.support:customtabs:27.1.1' implementation "androidx.browser:browser:$android_version"
implementation 'com.android.support:cardview-v7:27.1.1' implementation "androidx.cardview:cardview:$android_version"
implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
// Firebase + crashlytics
implementation 'com.google.firebase:firebase-core:12.0.1'
implementation 'com.google.firebase:firebase-config:12.0.1'
implementation 'com.google.firebase:firebase-invites:12.0.1'
implementation('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
transitive = true
}
//multidex //multidex
implementation 'com.android.support:multidex:1.0.3' implementation 'androidx.multidex:multidex:2.0.0'
// Intro
implementation 'agency.tango.android:material-intro-screen:0.0.5'
// About // About
implementation('com.mikepenz:aboutlibraries:6.0.0@aar') { implementation('com.mikepenz:aboutlibraries:6.2.0@aar') {
transitive = true transitive = true
} }
@ -155,8 +127,8 @@ dependencies {
implementation 'com.burgstaller:okhttp-digest:1.12' implementation 'com.burgstaller:okhttp-digest:1.12'
// Material-ish things // Material-ish things
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.3' implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'
implementation 'com.github.jd-alexander:LikeButton:0.2.1' implementation 'com.github.jd-alexander:LikeButton:0.2.3'
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
// glide // glide
@ -164,46 +136,37 @@ dependencies {
implementation 'com.github.bumptech.glide:okhttp3-integration:4.1.1' implementation 'com.github.bumptech.glide:okhttp3-integration:4.1.1'
// Asking politely users to rate the app // Asking politely users to rate the app
implementation 'com.github.stkent:amplify:2.1.0' implementation 'com.github.stkent:amplify:2.2.0'
// Drawer // Drawer
implementation 'co.zsmb:materialdrawer-kt:1.2.1' implementation 'co.zsmb:materialdrawer-kt:2.0.1'
implementation 'com.anupcowkur:reservoir:3.1.0'
// Themes // Themes
implementation 'com.52inc:scoops:1.0.0' implementation 'com.52inc:scoops:1.0.0'
implementation'com.jrummyapps:colorpicker:2.1.7' implementation 'com.jaredrummler:colorpicker:1.0.2'
// Github issues reporter
implementation 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
implementation 'com.github.rubensousa:floatingtoolbar:1.5.1' implementation 'com.github.rubensousa:floatingtoolbar:1.5.1'
// Pager // Pager
implementation 'me.relex:circleindicator:1.2.2@aar' implementation 'me.relex:circleindicator:2.0.0@aar'
implementation 'androidx.core:core-ktx:0.3' implementation 'androidx.core:core-ktx:1.0.0'
// Crash
implementation 'ch.acra:acra-http:5.1.3'
implementation 'ch.acra:acra-dialog:5.1.3'
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "android.arch.work:work-runtime-ktx:$work_version"
} }
apply plugin: 'com.google.gms.google-services'
afterEvaluate { afterEvaluate {
initFabricPropertiesIfNeeded()
initAppLoginPropertiesIfNeeded() initAppLoginPropertiesIfNeeded()
initAppForSecretPropertiesIfNeeded()
}
def initFabricPropertiesIfNeeded() {
def propertiesFile = file('fabric.properties')
if (!propertiesFile.exists()) {
def commentMessage = "This is autogenerated fabric property from system environment to prevent key to be committed to source control."
ant.propertyfile(file: "fabric.properties", comment: commentMessage) {
entry(key: "apiSecret", value: crashlyticsdemoApisecret)
entry(key: "apiKey", value: crashlyticsdemoApikey)
}
}
} }
def initAppLoginPropertiesIfNeeded() { def initAppLoginPropertiesIfNeeded() {
@ -216,19 +179,4 @@ def initAppLoginPropertiesIfNeeded() {
entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword")) entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
} }
} }
} }
def initAppForSecretPropertiesIfNeeded() {
def propertiesFile = file(System.getProperty("user.home") + '/.gradle/gradle.properties')
if (!propertiesFile.exists()) {
def commentMessage = "This is autogenerated local property from system environment to prevent key to be committed to source control."
ant.propertyfile(file: System.getProperty("user.home") + "/.gradle/gradle.properties", comment: commentMessage) {
entry(key: "mercuryApiKey", value: System.getProperty("mercuryApiKey"))
entry(key: "feedbackEmail", value: System.getProperty("feedbackEmail"))
entry(key: "sourceUrl", value: System.getProperty("sourceUrl"))
entry(key: "trackerUrl", value: System.getProperty("trackerUrl"))
entry(key: "translationUrl", value: System.getProperty("translationUrl"))
entry(key: "githubToken", value: System.getProperty("githubToken"))
}
}
}

View File

@ -30,22 +30,6 @@
<fields>; <fields>;
} }
##Retrofit
#-keep class com.google.gson.** { *; }
#-keep class com.google.inject.** { *; }
#-keep class org.apache.http.** { *; }
#-keep class org.apache.james.mime4j.** { *; }
#-keep class javax.inject.** { *; }
#-keep class retrofit.** { *; }
#-keepclassmembernames interface * {
# @retrofit.http.* <methods>;
#}
#-keep class retrofit.** { *; }
#-keep class apps.amine.bou.readerforselfoss.api.selfoss.model.** { *; }
#-keepclassmembernames interface * {
# @retrofit.http.* <methods>;
#}
-dontwarn okio.** -dontwarn okio.**
-dontwarn retrofit2.Platform$Java8 -dontwarn retrofit2.Platform$Java8
-keep class retrofit.** { *; } -keep class retrofit.** { *; }
@ -75,4 +59,7 @@
-dontwarn javax.annotation.** -dontwarn javax.annotation.**
-keep class android.support.v7.widget.SearchView { *; } -keep class android.support.v7.widget.SearchView { *; }
# maybe remove later ?
-keep class * extends androidx.fragment.app.Fragment

View File

@ -0,0 +1,96 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "08ca537d7ac9d4dd216e8e395d70801a",
"entities": [
{
"tableName": "tags",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tag` TEXT NOT NULL, `color` TEXT NOT NULL, `unread` INTEGER NOT NULL, PRIMARY KEY(`tag`))",
"fields": [
{
"fieldPath": "tag",
"columnName": "tag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"tag"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "sources",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `title` TEXT NOT NULL, `tags` TEXT NOT NULL, `spout` TEXT NOT NULL, `error` TEXT NOT NULL, `icon` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "tags",
"columnName": "tags",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "spout",
"columnName": "spout",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"08ca537d7ac9d4dd216e8e395d70801a\")"
]
}
}

View File

@ -0,0 +1,176 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "6fa6944b04100d68eab61039876a8804",
"entities": [
{
"tableName": "tags",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tag` TEXT NOT NULL, `color` TEXT NOT NULL, `unread` INTEGER NOT NULL, PRIMARY KEY(`tag`))",
"fields": [
{
"fieldPath": "tag",
"columnName": "tag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"tag"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "sources",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `title` TEXT NOT NULL, `tags` TEXT NOT NULL, `spout` TEXT NOT NULL, `error` TEXT NOT NULL, `icon` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "tags",
"columnName": "tags",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "spout",
"columnName": "spout",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "error",
"columnName": "error",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "items",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `datetime` TEXT NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `unread` INTEGER NOT NULL, `starred` INTEGER NOT NULL, `thumbnail` TEXT NOT NULL, `icon` TEXT NOT NULL, `link` TEXT NOT NULL, `sourcetitle` TEXT NOT NULL, `tags` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "datetime",
"columnName": "datetime",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "content",
"columnName": "content",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "starred",
"columnName": "starred",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "thumbnail",
"columnName": "thumbnail",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "link",
"columnName": "link",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "sourcetitle",
"columnName": "sourcetitle",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "tags",
"columnName": "tags",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"6fa6944b04100d68eab61039876a8804\")"
]
}
}

View File

@ -2,30 +2,29 @@ package apps.amine.bou.readerforselfoss
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.support.test.InstrumentationRegistry import androidx.test.InstrumentationRegistry
import android.support.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import android.support.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import android.support.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.action.ViewActions.closeSoftKeyboard
import android.support.test.espresso.action.ViewActions.pressBack import androidx.test.espresso.action.ViewActions.pressBack
import android.support.test.espresso.action.ViewActions.pressKey import androidx.test.espresso.action.ViewActions.pressKey
import android.support.test.espresso.action.ViewActions.typeText import androidx.test.espresso.action.ViewActions.typeText
import android.support.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.assertion.ViewAssertions.matches
import android.support.test.espresso.contrib.DrawerActions import androidx.test.espresso.contrib.DrawerActions
import android.support.test.espresso.intent.Intents import androidx.test.espresso.intent.Intents
import android.support.test.espresso.intent.Intents.intended import androidx.test.espresso.intent.Intents.intended
import android.support.test.espresso.intent.Intents.times import androidx.test.espresso.intent.Intents.times
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import android.support.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import android.support.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.isRoot
import android.support.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import android.support.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withId
import android.support.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withText
import android.support.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4 import androidx.test.runner.AndroidJUnit4
import android.view.KeyEvent import android.view.KeyEvent
import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.Config
import com.heinrichreimersoftware.androidissuereporter.IssueReporterLauncher
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
@ -92,25 +91,6 @@ class HomeActivityEspressoTest {
intended(hasComponent(LoginActivity::class.java.name), times(1)) intended(hasComponent(LoginActivity::class.java.name), times(1))
} }
@Test
fun drawerTesting() {
rule.launchActivity(Intent())
onView(withId(R.id.material_drawer_layout)).perform(DrawerActions.open())
onView(withText(R.string.drawer_report_bug)).perform(click())
intended(hasComponent(IssueReporterLauncher.Activity::class.java.name))
onView(isRoot()).perform(pressBack())
onView(isRoot()).perform(pressBack())
intended(hasComponent(HomeActivity::class.java.name))
onView(withId(R.id.material_drawer_layout)).perform(DrawerActions.open())
onView(withId(R.id.material_drawer_layout)).perform(DrawerActions.open())
onView(withText(R.string.drawer_action_clear)).perform(click())
}
// TODO: test articles opening and actions for cards and lists // TODO: test articles opening and actions for cards and lists
@After @After

View File

@ -1,91 +0,0 @@
package apps.amine.bou.readerforselfoss
import android.content.Context
import android.content.Intent
import android.support.test.InstrumentationRegistry.getInstrumentation
import android.support.test.espresso.Espresso.onView
import android.support.test.espresso.action.ViewActions.click
import android.support.test.espresso.assertion.ViewAssertions.matches
import android.support.test.espresso.intent.Intents
import android.support.test.espresso.intent.Intents.intended
import android.support.test.espresso.intent.Intents.times
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent
import android.support.test.espresso.matcher.ViewMatchers.isDisplayed
import android.support.test.espresso.matcher.ViewMatchers.withId
import android.support.test.espresso.matcher.ViewMatchers.withText
import android.support.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4
import apps.amine.bou.readerforselfoss.utils.Config
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.util.*
@RunWith(AndroidJUnit4::class)
class IntroActivityEspressoTest {
@Rule @JvmField
val rule = ActivityTestRule(IntroActivity::class.java, true, false)
@Before
fun clearData() {
val editor =
getInstrumentation().targetContext
.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
.edit()
editor.clear()
editor.commit()
Intents.init()
}
@Test
fun nextEachTimes() {
rule.launchActivity(Intent())
onView(withText(R.string.intro_hello_title)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
onView(withText(R.string.intro_needs_selfoss_message)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
onView(withText(R.string.intro_all_set_message)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
intended(hasComponent(IntroActivity::class.java.name), times(1))
intended(hasComponent(LoginActivity::class.java.name), times(1))
}
@Test
fun nextBackRandomTimes() {
val max = 5
val min = 1
val random = (Random().nextInt(max + 1 - min)) + min
rule.launchActivity(Intent())
onView(withText(R.string.intro_hello_title)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
repeat(random) { _ ->
onView(withText(R.string.intro_needs_selfoss_message)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
onView(withText(R.string.intro_all_set_message)).check(matches(isDisplayed()))
onView(withId(R.id.button_back)).perform(click())
}
onView(withId(R.id.button_next)).perform(click())
onView(withText(R.string.intro_all_set_message)).check(matches(isDisplayed()))
onView(withId(R.id.button_next)).perform(click())
intended(hasComponent(IntroActivity::class.java.name), times(1))
intended(hasComponent(LoginActivity::class.java.name), times(1))
}
@After
fun releaseIntents() {
Intents.release()
}
}

View File

@ -2,25 +2,25 @@ package apps.amine.bou.readerforselfoss
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.support.test.InstrumentationRegistry import androidx.test.InstrumentationRegistry
import android.support.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import android.support.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import android.support.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.action.ViewActions.closeSoftKeyboard
import android.support.test.espresso.action.ViewActions.pressBack import androidx.test.espresso.action.ViewActions.pressBack
import android.support.test.espresso.action.ViewActions.typeText import androidx.test.espresso.action.ViewActions.typeText
import android.support.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.assertion.ViewAssertions.matches
import android.support.test.espresso.intent.Intents import androidx.test.espresso.intent.Intents
import android.support.test.espresso.intent.Intents.intended import androidx.test.espresso.intent.Intents.intended
import android.support.test.espresso.intent.Intents.times import androidx.test.espresso.intent.Intents.times
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import android.support.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers
import android.support.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.isRoot
import android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import android.support.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withId
import android.support.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withText
import android.support.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4 import androidx.test.runner.AndroidJUnit4
import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.Config
import com.mikepenz.aboutlibraries.ui.LibsActivity import com.mikepenz.aboutlibraries.ui.LibsActivity
import org.junit.After import org.junit.After

View File

@ -3,13 +3,13 @@ package apps.amine.bou.readerforselfoss
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.test.InstrumentationRegistry.getInstrumentation import androidx.test.InstrumentationRegistry.getInstrumentation
import android.support.test.espresso.intent.Intents import androidx.test.espresso.intent.Intents
import android.support.test.espresso.intent.Intents.intended import androidx.test.espresso.intent.Intents.intended
import android.support.test.espresso.intent.Intents.times import androidx.test.espresso.intent.Intents.times
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import android.support.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4 import androidx.test.runner.AndroidJUnit4
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
@ -45,7 +45,6 @@ class MainActivityEspressoTest {
rule.launchActivity(intent) rule.launchActivity(intent)
intended(hasComponent(MainActivity::class.java.name)) intended(hasComponent(MainActivity::class.java.name))
intended(hasComponent(IntroActivity::class.java.name))
intended(hasComponent(LoginActivity::class.java.name), times(0)) intended(hasComponent(LoginActivity::class.java.name), times(0))
} }
@ -58,7 +57,6 @@ class MainActivityEspressoTest {
intended(hasComponent(MainActivity::class.java.name)) intended(hasComponent(MainActivity::class.java.name))
intended(hasComponent(LoginActivity::class.java.name)) intended(hasComponent(LoginActivity::class.java.name))
intended(hasComponent(IntroActivity::class.java.name), times(0))
} }
@After @After

View File

@ -1,7 +1,7 @@
package apps.amine.bou.readerforselfoss package apps.amine.bou.readerforselfoss
import android.support.design.widget.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import android.support.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers
import android.view.View import android.view.View
import org.hamcrest.Description import org.hamcrest.Description
import org.hamcrest.Matcher import org.hamcrest.Matcher

View File

@ -3,16 +3,8 @@
package="apps.amine.bou.readerforselfoss" package="apps.amine.bou.readerforselfoss"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<!-- Remove unwanted permissions from Crashlytics.. see https://www.reddit.com/r/androiddev/comments/86c02l/google_play_services_1200_released/dw4ehln/?context=0 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
<!-- For firebase only -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
android:name=".MyApp" android:name=".MyApp"
@ -30,10 +22,6 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".IntroActivity"
android:theme="@style/Theme.Intro">
</activity>
<activity <activity
android:name=".LoginActivity" android:name=".LoginActivity"
android:label="@string/title_activity_login"> android:label="@string/title_activity_login">
@ -83,7 +71,7 @@
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" /> android:value="true" />
<meta-data android:name="android.max_aspect" android:value="2.1" /> <meta-data android:name="android.max_aspect" android:value="2.1" />
</application> </application>

View File

@ -4,8 +4,8 @@ import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.constraint.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.view.View import android.view.View
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
@ -44,10 +44,11 @@ class AddSourceActivity : AppCompatActivity() {
setContentView(R.layout.activity_add_source) setContentView(R.layout.activity_add_source)
// TODO: input bubble cursor val scoop = Scoop.getInstance()
Scoop.getInstance() scoop.bind(this, Toppings.PRIMARY.value, toolbar)
.bind(this, Toppings.PRIMARY.value, toolbar) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
.bindStatusBar(this, Toppings.PRIMARY_DARK.value) scoop.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
}
val drawable = nameInput.background val drawable = nameInput.background
drawable.setColorFilter(appColors.colorAccent, PorterDuff.Mode.SRC_ATOP) drawable.setColorFilter(appColors.colorAccent, PorterDuff.Mode.SRC_ATOP)

View File

@ -1,70 +0,0 @@
package apps.amine.bou.readerforselfoss
import agency.tango.materialintroscreen.MaterialIntroActivity
import agency.tango.materialintroscreen.MessageButtonBehaviour
import agency.tango.materialintroscreen.SlideFragmentBuilder
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.preference.PreferenceManager
import android.support.v7.app.AppCompatDelegate
import android.view.View
class IntroActivity : MaterialIntroActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
addSlide(
SlideFragmentBuilder()
.backgroundColor(R.color.colorPrimary)
.buttonsColor(R.color.colorAccent)
.image(R.drawable.web_hi_res_512)
.title(getString(R.string.intro_hello_title))
.description(getString(R.string.intro_hello_message))
.build()
)
addSlide(
SlideFragmentBuilder()
.backgroundColor(R.color.colorAccent)
.buttonsColor(R.color.colorPrimary)
.image(R.drawable.ic_info_outline_white_48px)
.title(getString(R.string.intro_needs_selfoss_title))
.description(getString(R.string.intro_needs_selfoss_message))
.build(),
MessageButtonBehaviour(
View.OnClickListener {
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://selfoss.aditu.de")
)
startActivity(browserIntent)
}, getString(R.string.intro_needs_selfoss_link)
)
)
addSlide(
SlideFragmentBuilder()
.backgroundColor(R.color.colorPrimaryDark)
.buttonsColor(R.color.colorAccentDark)
.image(R.drawable.ic_thumb_up_white_48px)
.title(getString(R.string.intro_all_set_title))
.description(getString(R.string.intro_all_set_message))
.build()
)
}
override fun onFinish() {
super.onFinish()
val getPrefs = PreferenceManager.getDefaultSharedPreferences(baseContext)
val e = getPrefs.edit()
e.putBoolean("firstStart", false)
e.apply()
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
finish()
}
}

View File

@ -6,8 +6,8 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.text.TextUtils import android.text.TextUtils
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
@ -20,11 +20,12 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.Config
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
import com.crashlytics.android.Crashlytics import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException
import com.google.firebase.analytics.FirebaseAnalytics import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.Libs
import com.mikepenz.aboutlibraries.LibsBuilder import com.mikepenz.aboutlibraries.LibsBuilder
import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_login.*
import org.acra.ACRA
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
@ -38,7 +39,6 @@ class LoginActivity : AppCompatActivity() {
private lateinit var settings: SharedPreferences private lateinit var settings: SharedPreferences
private lateinit var editor: SharedPreferences.Editor private lateinit var editor: SharedPreferences.Editor
private lateinit var firebaseAnalytics: FirebaseAnalytics
private lateinit var userIdentifier: String private lateinit var userIdentifier: String
private var logErrors: Boolean = false private var logErrors: Boolean = false
private lateinit var appColors: AppColors private lateinit var appColors: AppColors
@ -65,8 +65,6 @@ class LoginActivity : AppCompatActivity() {
goToMain() goToMain()
} }
firebaseAnalytics = FirebaseAnalytics.getInstance(this)
handleActions() handleActions()
} }
@ -199,48 +197,50 @@ class LoginActivity : AppCompatActivity() {
isWithSelfSignedCert, isWithSelfSignedCert,
isWithSelfSignedCert isWithSelfSignedCert
) )
api.login().enqueue(object : Callback<SuccessResponse> {
private fun preferenceError(t: Throwable) {
editor.remove("url")
editor.remove("login")
editor.remove("httpUserName")
editor.remove("password")
editor.remove("httpPassword")
editor.apply()
urlView.error = getString(R.string.wrong_infos)
loginView.error = getString(R.string.wrong_infos)
passwordView.error = getString(R.string.wrong_infos)
httpLoginView.error = getString(R.string.wrong_infos)
httpPasswordView.error = getString(R.string.wrong_infos)
if (logErrors) {
Crashlytics.setUserIdentifier(userIdentifier)
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
Crashlytics.logException(t)
Toast.makeText(
this@LoginActivity,
t.message,
Toast.LENGTH_LONG
).show()
}
showProgress(false)
}
override fun onResponse( if (this@LoginActivity.isNetworkAccessible(this@LoginActivity.findViewById(R.id.loginForm))) {
call: Call<SuccessResponse>, api.login().enqueue(object : Callback<SuccessResponse> {
response: Response<SuccessResponse> private fun preferenceError(t: Throwable) {
) { editor.remove("url")
if (response.body() != null && response.body()!!.isSuccess) { editor.remove("login")
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle()) editor.remove("httpUserName")
goToMain() editor.remove("password")
} else { editor.remove("httpPassword")
preferenceError(Exception("No response body...")) editor.apply()
urlView.error = getString(R.string.wrong_infos)
loginView.error = getString(R.string.wrong_infos)
passwordView.error = getString(R.string.wrong_infos)
httpLoginView.error = getString(R.string.wrong_infos)
httpPasswordView.error = getString(R.string.wrong_infos)
if (logErrors) {
ACRA.getErrorReporter().maybeHandleSilentException(t, this@LoginActivity)
Toast.makeText(
this@LoginActivity,
t.message,
Toast.LENGTH_LONG
).show()
}
showProgress(false)
} }
}
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) { override fun onResponse(
preferenceError(t) call: Call<SuccessResponse>,
} response: Response<SuccessResponse>
}) ) {
if (response.body() != null && response.body()!!.isSuccess) {
goToMain()
} else {
preferenceError(Exception("No response body..."))
}
}
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
preferenceError(t)
}
})
} else {
showProgress(false)
}
} }
} }

View File

@ -3,7 +3,7 @@ package apps.amine.bou.readerforselfoss
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@ -11,17 +11,9 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
if (PreferenceManager.getDefaultSharedPreferences(baseContext).getBoolean( val intent = Intent(this, LoginActivity::class.java)
"firstStart",
true
)) {
val i = Intent(this@MainActivity, IntroActivity::class.java)
startActivity(i)
} else {
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
}
startActivity(intent)
finish() finish()
} }
} }

View File

@ -1,36 +1,55 @@
package apps.amine.bou.readerforselfoss package apps.amine.bou.readerforselfoss
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Build
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.multidex.MultiDexApplication import androidx.multidex.MultiDexApplication
import android.widget.ImageView import android.widget.ImageView
import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.Config
import com.anupcowkur.reservoir.Reservoir
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.crashlytics.android.Crashlytics
import com.ftinc.scoop.Scoop import com.ftinc.scoop.Scoop
import com.github.stkent.amplify.feedback.DefaultEmailFeedbackCollector import com.github.stkent.amplify.feedback.DefaultEmailFeedbackCollector
import com.github.stkent.amplify.feedback.GooglePlayStoreFeedbackCollector import com.github.stkent.amplify.feedback.GooglePlayStoreFeedbackCollector
import com.github.stkent.amplify.tracking.Amplify import com.github.stkent.amplify.tracking.Amplify
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
import com.mikepenz.materialdrawer.util.DrawerImageLoader import com.mikepenz.materialdrawer.util.DrawerImageLoader
import io.fabric.sdk.android.Fabric import org.acra.ACRA
import org.acra.ReportField
import org.acra.annotation.AcraCore
import org.acra.annotation.AcraDialog
import org.acra.annotation.AcraHttpSender
import org.acra.sender.HttpSender
import java.io.IOException import java.io.IOException
import java.util.UUID.randomUUID import java.util.UUID.randomUUID
@AcraHttpSender(uri = "http://amine-bou.fr:5984/acra-selfoss/_design/acra-storage/_update/report",
basicAuthLogin = "selfoss",
basicAuthPassword = "selfoss",
httpMethod = HttpSender.Method.PUT)
@AcraDialog(resText = R.string.crash_dialog_text,
resCommentPrompt = R.string.crash_dialog_comment,
resTheme = android.R.style.Theme_DeviceDefault_Dialog)
@AcraCore(reportContent = [ReportField.REPORT_ID, ReportField.INSTALLATION_ID,
ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME,
ReportField.BUILD, ReportField.ANDROID_VERSION, ReportField.BRAND, ReportField.PHONE_MODEL,
ReportField.AVAILABLE_MEM_SIZE, ReportField.TOTAL_MEM_SIZE,
ReportField.STACK_TRACE, ReportField.APPLICATION_LOG, ReportField.LOGCAT,
ReportField.INITIAL_CONFIGURATION, ReportField.CRASH_CONFIGURATION, ReportField.IS_SILENT,
ReportField.USER_APP_START_DATE, ReportField.USER_COMMENT, ReportField.USER_CRASH_DATE, ReportField.USER_EMAIL, ReportField.CUSTOM_DATA],
buildConfigClass = BuildConfig::class)
class MyApp : MultiDexApplication() { class MyApp : MultiDexApplication() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
Fabric.with(this, Crashlytics())
initAmplify() initAmplify()
initCache()
val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
if (prefs.getString("unique_id", "").isEmpty()) { if (prefs.getString("unique_id", "").isEmpty()) {
val editor = prefs.edit() val editor = prefs.edit()
@ -43,23 +62,35 @@ class MyApp : MultiDexApplication() {
initTheme() initTheme()
tryToHandleBug() tryToHandleBug()
handleNotificationChannels()
}
private fun handleNotificationChannels() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = getString(R.string.notification_channel_sync)
val importance = NotificationManager.IMPORTANCE_LOW
val mChannel = NotificationChannel(Config.syncChannelId, name, importance)
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
ACRA.init(this)
ACRA.getErrorReporter().putCustomData("unique_id", prefs.getString("unique_id", ""))
} }
private fun initAmplify() { private fun initAmplify() {
Amplify.initSharedInstance(this) Amplify.initSharedInstance(this)
.setPositiveFeedbackCollectors(GooglePlayStoreFeedbackCollector()) .setPositiveFeedbackCollectors(GooglePlayStoreFeedbackCollector())
.setCriticalFeedbackCollectors(DefaultEmailFeedbackCollector(BuildConfig.FEEDBACK_EMAIL)) .setCriticalFeedbackCollectors(DefaultEmailFeedbackCollector(Config.feedbackEmail))
.applyAllDefaultRules() .applyAllDefaultRules()
} }
private fun initCache() {
try {
Reservoir.init(this, 8192) //in bytes
} catch (e: IOException) {
//failure
}
}
private fun initDrawerImageLoader() { private fun initDrawerImageLoader() {
DrawerImageLoader.init(object : AbstractDrawerImageLoader() { DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
override fun set( override fun set(

View File

@ -1,33 +1,41 @@
package apps.amine.bou.readerforselfoss package apps.amine.bou.readerforselfoss
import android.content.Context import android.graphics.drawable.ColorDrawable
import android.content.res.Resources import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.v4.app.FragmentManager import androidx.fragment.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import android.support.v4.view.ViewPager import androidx.core.content.ContextCompat
import android.support.v7.app.AppCompatActivity import androidx.viewpager.widget.ViewPager
import androidx.appcompat.app.AppCompatActivity
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.room.Room
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.fragments.ArticleFragment import apps.amine.bou.readerforselfoss.fragments.ArticleFragment
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.themes.Toppings import apps.amine.bou.readerforselfoss.themes.Toppings
import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer
import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import apps.amine.bou.readerforselfoss.utils.persistence.toEntity
import apps.amine.bou.readerforselfoss.utils.succeeded import apps.amine.bou.readerforselfoss.utils.succeeded
import apps.amine.bou.readerforselfoss.utils.toggleStar import apps.amine.bou.readerforselfoss.utils.toggleStar
import com.crashlytics.android.Crashlytics
import com.ftinc.scoop.Scoop import com.ftinc.scoop.Scoop
import kotlinx.android.synthetic.main.activity_reader.* import kotlinx.android.synthetic.main.activity_reader.*
import me.relex.circleindicator.CircleIndicator import me.relex.circleindicator.CircleIndicator
import org.acra.ACRA
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
import kotlin.concurrent.thread
class ReaderActivity : AppCompatActivity() { class ReaderActivity : AppCompatActivity() {
@ -40,6 +48,8 @@ class ReaderActivity : AppCompatActivity() {
private lateinit var toolbarMenu: Menu private lateinit var toolbarMenu: Menu
private lateinit var db: AppDatabase
private fun showMenuItem(willAddToFavorite: Boolean) { private fun showMenuItem(willAddToFavorite: Boolean) {
toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite
toolbarMenu.findItem(R.id.unsave).isVisible = !willAddToFavorite toolbarMenu.findItem(R.id.unsave).isVisible = !willAddToFavorite
@ -54,115 +64,121 @@ class ReaderActivity : AppCompatActivity() {
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val appColors = AppColors(this@ReaderActivity)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_reader) setContentView(R.layout.activity_reader)
Scoop.getInstance() db = Room.databaseBuilder(
.bind(this, Toppings.PRIMARY.value, toolBar) applicationContext,
.bindStatusBar(this, Toppings.PRIMARY_DARK.value) AppDatabase::class.java, "selfoss-database"
).addMigrations(MIGRATION_1_2).build()
val scoop = Scoop.getInstance()
scoop.bind(this, Toppings.PRIMARY.value, toolBar)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
scoop.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
}
setSupportActionBar(toolBar) setSupportActionBar(toolBar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true)
val settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
debugReadingItems = sharedPref.getBoolean("read_debug", false) debugReadingItems = prefs.getBoolean("read_debug", false)
userIdentifier = sharedPref.getString("unique_id", "") userIdentifier = prefs.getString("unique_id", "")
markOnScroll = sharedPref.getBoolean("mark_on_scroll", false) markOnScroll = prefs.getBoolean("mark_on_scroll", false)
api = SelfossApi(
this,
this@ReaderActivity,
prefs.getBoolean("isSelfSignedCert", false),
prefs.getBoolean("should_log_everything", false)
)
if (allItems.isEmpty()) { if (allItems.isEmpty()) {
finish() finish()
} }
api = SelfossApi(
this,
this@ReaderActivity,
settings.getBoolean("isSelfSignedCert", false),
sharedPref.getBoolean("should_log_everything", false)
)
currentItem = intent.getIntExtra("currentItem", 0) currentItem = intent.getIntExtra("currentItem", 0)
pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager) readItem(allItems[currentItem])
pager.adapter =
ScreenSlidePagerAdapter(supportFragmentManager, AppColors(this@ReaderActivity))
pager.currentItem = currentItem pager.currentItem = currentItem
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
(pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged() notifyAdapter()
pager.setPageTransformer(true, DepthPageTransformer()) pager.setPageTransformer(true, DepthPageTransformer())
(indicator as CircleIndicator).setViewPager(pager) (indicator as CircleIndicator).setViewPager(pager)
pager.addOnPageChangeListener( pager.addOnPageChangeListener(
object : ViewPager.SimpleOnPageChangeListener() { object : ViewPager.SimpleOnPageChangeListener() {
var isLastItem = false
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
isLastItem = (position === (allItems.size - 1))
if (allItems[position].starred) { if (allItems[position].starred) {
canRemoveFromFavorite() canRemoveFromFavorite()
} else { } else {
canFavorite() canFavorite()
} }
} readItem(allItems[pager.currentItem])
override fun onPageScrollStateChanged(state: Int) {
if (markOnScroll && (state === ViewPager.SCROLL_STATE_DRAGGING || (state === ViewPager.SCROLL_STATE_IDLE && isLastItem))) {
api.markItem(allItems[pager.currentItem].id).enqueue(
object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
Crashlytics.setUserIdentifier(userIdentifier)
Crashlytics.log(
100,
"READ_DEBUG_SUCCESS",
message
)
Crashlytics.logException(Exception("Was success, but did it work ?"))
}
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
if (debugReadingItems) {
Crashlytics.setUserIdentifier(userIdentifier)
Crashlytics.log(
100,
"READ_DEBUG_ERROR",
t.message
)
Crashlytics.logException(t)
}
}
}
)
}
} }
} }
) )
} }
fun readItem(item: Item) {
if (this@ReaderActivity.isNetworkAccessible(this@ReaderActivity.findViewById(R.id.reader_activity_view)) && markOnScroll) {
thread {
db.itemsDao().delete(item.toEntity())
}
api.markItem(item.id).enqueue(
object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
ACRA.getErrorReporter()
.maybeHandleSilentException(Exception(message), this@ReaderActivity)
}
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
thread {
db.itemsDao().insertAllItems(item.toEntity())
}
if (debugReadingItems) {
ACRA.getErrorReporter()
.maybeHandleSilentException(t, this@ReaderActivity)
}
}
}
)
}
}
private fun notifyAdapter() {
(pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged()
}
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
if (markOnScroll) { if (markOnScroll) {
@ -175,8 +191,9 @@ class ReaderActivity : AppCompatActivity() {
oldInstanceState!!.clear() oldInstanceState!!.clear()
} }
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : private inner class ScreenSlidePagerAdapter(fm: FragmentManager, val appColors: AppColors) :
FragmentStatePagerAdapter(fm) { FragmentStatePagerAdapter(fm) {
override fun getCount(): Int { override fun getCount(): Int {
return allItems.size return allItems.size
} }
@ -184,6 +201,17 @@ class ReaderActivity : AppCompatActivity() {
override fun getItem(position: Int): ArticleFragment { override fun getItem(position: Int): ArticleFragment {
return ArticleFragment.newInstance(position, allItems) return ArticleFragment.newInstance(position, allItems)
} }
override fun startUpdate(container: ViewGroup) {
super.startUpdate(container)
container.background = ColorDrawable(
ContextCompat.getColor(
this@ReaderActivity,
appColors.colorBackground
)
)
}
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -207,50 +235,56 @@ class ReaderActivity : AppCompatActivity() {
return true return true
} }
R.id.save -> { R.id.save -> {
api.starrItem(allItems[pager.currentItem].id) if (this@ReaderActivity.isNetworkAccessible(null)) {
.enqueue(object : Callback<SuccessResponse> { api.starrItem(allItems[pager.currentItem].id)
override fun onResponse( .enqueue(object : Callback<SuccessResponse> {
call: Call<SuccessResponse>, override fun onResponse(
response: Response<SuccessResponse> call: Call<SuccessResponse>,
) { response: Response<SuccessResponse>
allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar() ) {
canRemoveFromFavorite() allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar()
} notifyAdapter()
canRemoveFromFavorite()
}
override fun onFailure( override fun onFailure(
call: Call<SuccessResponse>, call: Call<SuccessResponse>,
t: Throwable t: Throwable
) { ) {
Toast.makeText( Toast.makeText(
baseContext, baseContext,
R.string.cant_mark_favortie, R.string.cant_mark_favortie,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
}) })
}
} }
R.id.unsave -> { R.id.unsave -> {
api.unstarrItem(allItems[pager.currentItem].id) if (this@ReaderActivity.isNetworkAccessible(null)) {
.enqueue(object : Callback<SuccessResponse> { api.unstarrItem(allItems[pager.currentItem].id)
override fun onResponse( .enqueue(object : Callback<SuccessResponse> {
call: Call<SuccessResponse>, override fun onResponse(
response: Response<SuccessResponse> call: Call<SuccessResponse>,
) { response: Response<SuccessResponse>
allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar() ) {
canFavorite() allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar()
} notifyAdapter()
canFavorite()
}
override fun onFailure( override fun onFailure(
call: Call<SuccessResponse>, call: Call<SuccessResponse>,
t: Throwable t: Throwable
) { ) {
Toast.makeText( Toast.makeText(
baseContext, baseContext,
R.string.cant_unmark_favortie, R.string.cant_unmark_favortie,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
}) })
}
} }
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)

View File

@ -2,16 +2,18 @@ package apps.amine.bou.readerforselfoss
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import android.widget.Toast import android.widget.Toast
import apps.amine.bou.readerforselfoss.adapters.SourcesListAdapter import apps.amine.bou.readerforselfoss.adapters.SourcesListAdapter
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.Sources import apps.amine.bou.readerforselfoss.api.selfoss.Source
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.themes.Toppings import apps.amine.bou.readerforselfoss.themes.Toppings
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import com.ftinc.scoop.Scoop import com.ftinc.scoop.Scoop
import kotlinx.android.synthetic.main.activity_sources.* import kotlinx.android.synthetic.main.activity_sources.*
import retrofit2.Call import retrofit2.Call
@ -29,9 +31,11 @@ class SourcesActivity : AppCompatActivity() {
setContentView(R.layout.activity_sources) setContentView(R.layout.activity_sources)
Scoop.getInstance() val scoop = Scoop.getInstance()
.bind(this, Toppings.PRIMARY.value, toolbar) scoop.bind(this, Toppings.PRIMARY.value, toolbar)
.bindStatusBar(this, Toppings.PRIMARY_DARK.value) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
scoop.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
}
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
@ -58,39 +62,41 @@ class SourcesActivity : AppCompatActivity() {
prefs.getBoolean("isSelfSignedCert", false), prefs.getBoolean("isSelfSignedCert", false),
prefs.getBoolean("should_log_everything", false) prefs.getBoolean("should_log_everything", false)
) )
var items: ArrayList<Sources> = ArrayList() var items: ArrayList<Source> = ArrayList()
recyclerView.setHasFixedSize(true) recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = mLayoutManager recyclerView.layoutManager = mLayoutManager
api.sources.enqueue(object : Callback<List<Sources>> { if (this@SourcesActivity.isNetworkAccessible(this@SourcesActivity.findViewById(R.id.recyclerView))) {
override fun onResponse( api.sources.enqueue(object : Callback<List<Source>> {
call: Call<List<Sources>>, override fun onResponse(
response: Response<List<Sources>> call: Call<List<Source>>,
) { response: Response<List<Source>>
if (response.body() != null && response.body()!!.isNotEmpty()) { ) {
items = response.body() as ArrayList<Sources> if (response.body() != null && response.body()!!.isNotEmpty()) {
items = response.body() as ArrayList<Source>
}
val mAdapter = SourcesListAdapter(this@SourcesActivity, items, api)
recyclerView.adapter = mAdapter
mAdapter.notifyDataSetChanged()
if (items.isEmpty()) {
Toast.makeText(
this@SourcesActivity,
R.string.nothing_here,
Toast.LENGTH_SHORT
).show()
}
} }
val mAdapter = SourcesListAdapter(this@SourcesActivity, items, api)
recyclerView.adapter = mAdapter override fun onFailure(call: Call<List<Source>>, t: Throwable) {
mAdapter.notifyDataSetChanged()
if (items.isEmpty()) {
Toast.makeText( Toast.makeText(
this@SourcesActivity, this@SourcesActivity,
R.string.nothing_here, R.string.cant_get_sources,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
} })
}
override fun onFailure(call: Call<List<Sources>>, t: Throwable) {
Toast.makeText(
this@SourcesActivity,
R.string.cant_get_sources,
Toast.LENGTH_SHORT
).show()
}
})
fab.setOnClickListener { fab.setOnClickListener {
startActivity(Intent(this@SourcesActivity, AddSourceActivity::class.java)) startActivity(Intent(this@SourcesActivity, AddSourceActivity::class.java))

View File

@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.adapters
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.support.v7.widget.CardView import androidx.cardview.widget.CardView
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.text.Html import android.text.Html
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -14,11 +14,14 @@ import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.utils.LinkOnTouchListener
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask
import apps.amine.bou.readerforselfoss.utils.openItemUrl import apps.amine.bou.readerforselfoss.utils.openItemUrl
import apps.amine.bou.readerforselfoss.utils.shareLink import apps.amine.bou.readerforselfoss.utils.shareLink
@ -38,13 +41,15 @@ class ItemCardAdapter(
override val app: Activity, override val app: Activity,
override var items: ArrayList<Item>, override var items: ArrayList<Item>,
override val api: SelfossApi, override val api: SelfossApi,
override val db: AppDatabase,
private val helper: CustomTabActivityHelper, private val helper: CustomTabActivityHelper,
private val internalBrowser: Boolean, private val internalBrowser: Boolean,
private val articleViewer: Boolean, private val articleViewer: Boolean,
private val fullHeightCards: Boolean, private val fullHeightCards: Boolean,
override val appColors: AppColors, override val appColors: AppColors,
override val debugReadingItems: Boolean, override val debugReadingItems: Boolean,
override val userIdentifier: String override val userIdentifier: String,
override val updateItems: (ArrayList<Item>) -> Unit
) : ItemsAdapter<ItemCardAdapter.ViewHolder>() { ) : ItemsAdapter<ItemCardAdapter.ViewHolder>() {
private val c: Context = app.baseContext private val c: Context = app.baseContext
private val generator: ColorGenerator = ColorGenerator.MATERIAL private val generator: ColorGenerator = ColorGenerator.MATERIAL
@ -62,6 +67,7 @@ class ItemCardAdapter(
holder.mView.favButton.isLiked = itm.starred holder.mView.favButton.isLiked = itm.starred
holder.mView.title.text = Html.fromHtml(itm.title) holder.mView.title.text = Html.fromHtml(itm.title)
holder.mView.title.setOnTouchListener(LinkOnTouchListener())
holder.mView.title.setLinkTextColor(appColors.colorAccent) holder.mView.title.setLinkTextColor(appColors.colorAccent)
@ -88,7 +94,7 @@ class ItemCardAdapter(
TextDrawable TextDrawable
.builder() .builder()
.round() .round()
.build(itm.sourcetitle.toTextDrawableString(), color) .build(itm.sourcetitle.toTextDrawableString(c), color)
holder.mView.sourceImage.setImageDrawable(drawable) holder.mView.sourceImage.setImageDrawable(drawable)
} else { } else {
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.sourceImage) c.circularBitmapDrawable(itm.getIcon(c), holder.mView.sourceImage)
@ -112,49 +118,53 @@ class ItemCardAdapter(
mView.favButton.setOnLikeListener(object : OnLikeListener { mView.favButton.setOnLikeListener(object : OnLikeListener {
override fun liked(likeButton: LikeButton) { override fun liked(likeButton: LikeButton) {
val (id) = items[adapterPosition] if (c.isNetworkAccessible(null)) {
api.starrItem(id).enqueue(object : Callback<SuccessResponse> { val (id) = items[adapterPosition]
override fun onResponse( api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
call: Call<SuccessResponse>, override fun onResponse(
response: Response<SuccessResponse> call: Call<SuccessResponse>,
) { response: Response<SuccessResponse>
} ) {
}
override fun onFailure( override fun onFailure(
call: Call<SuccessResponse>, call: Call<SuccessResponse>,
t: Throwable t: Throwable
) { ) {
mView.favButton.isLiked = false mView.favButton.isLiked = false
Toast.makeText( Toast.makeText(
c, c,
R.string.cant_mark_favortie, R.string.cant_mark_favortie,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
}) })
}
} }
override fun unLiked(likeButton: LikeButton) { override fun unLiked(likeButton: LikeButton) {
val (id) = items[adapterPosition] if (c.isNetworkAccessible(null)) {
api.unstarrItem(id).enqueue(object : Callback<SuccessResponse> { val (id) = items[adapterPosition]
override fun onResponse( api.unstarrItem(id).enqueue(object : Callback<SuccessResponse> {
call: Call<SuccessResponse>, override fun onResponse(
response: Response<SuccessResponse> call: Call<SuccessResponse>,
) { response: Response<SuccessResponse>
} ) {
}
override fun onFailure( override fun onFailure(
call: Call<SuccessResponse>, call: Call<SuccessResponse>,
t: Throwable t: Throwable
) { ) {
mView.favButton.isLiked = true mView.favButton.isLiked = true
Toast.makeText( Toast.makeText(
c, c,
R.string.cant_unmark_favortie, R.string.cant_unmark_favortie,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
}) })
}
} }
}) })

View File

@ -2,19 +2,25 @@ package apps.amine.bou.readerforselfoss.adapters
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.support.constraint.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.text.Html import android.text.Html
import android.text.Spannable
import android.text.style.ClickableSpan
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.utils.LinkOnTouchListener
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
@ -39,17 +45,17 @@ class ItemListAdapter(
override val app: Activity, override val app: Activity,
override var items: ArrayList<Item>, override var items: ArrayList<Item>,
override val api: SelfossApi, override val api: SelfossApi,
override val db: AppDatabase,
private val helper: CustomTabActivityHelper, private val helper: CustomTabActivityHelper,
private val clickBehavior: Boolean,
private val internalBrowser: Boolean, private val internalBrowser: Boolean,
private val articleViewer: Boolean, private val articleViewer: Boolean,
override val debugReadingItems: Boolean, override val debugReadingItems: Boolean,
override val userIdentifier: String, override val userIdentifier: String,
override val appColors: AppColors override val appColors: AppColors,
override val updateItems: (ArrayList<Item>) -> Unit
) : ItemsAdapter<ItemListAdapter.ViewHolder>() { ) : ItemsAdapter<ItemListAdapter.ViewHolder>() {
private val generator: ColorGenerator = ColorGenerator.MATERIAL private val generator: ColorGenerator = ColorGenerator.MATERIAL
private val c: Context = app.baseContext private val c: Context = app.baseContext
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = LayoutInflater.from(c).inflate( val v = LayoutInflater.from(c).inflate(
@ -66,6 +72,8 @@ class ItemListAdapter(
holder.mView.title.text = Html.fromHtml(itm.title) holder.mView.title.text = Html.fromHtml(itm.title)
holder.mView.title.setOnTouchListener(LinkOnTouchListener())
holder.mView.title.setLinkTextColor(appColors.colorAccent) holder.mView.title.setLinkTextColor(appColors.colorAccent)
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText() holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
@ -96,7 +104,7 @@ class ItemListAdapter(
TextDrawable TextDrawable
.builder() .builder()
.round() .round()
.build(itm.sourcetitle.toTextDrawableString(), color) .build(itm.sourcetitle.toTextDrawableString(c), color)
holder.mView.itemImage.setImageDrawable(drawable) holder.mView.itemImage.setImageDrawable(drawable)
} else { } else {
@ -105,19 +113,6 @@ class ItemListAdapter(
} else { } else {
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage) c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
} }
// TODO: maybe handle this differently. It crashes when changing tab
try {
if (bars[position]) {
holder.mView.actionBar.visibility = View.VISIBLE
} else {
holder.mView.actionBar.visibility = View.GONE
}
} catch (e: IndexOutOfBoundsException) {
holder.mView.actionBar.visibility = View.GONE
}
holder.mView.favButton.isLiked = itm.starred
} }
override fun getItemCount(): Int = items.size override fun getItemCount(): Int = items.size
@ -125,114 +120,23 @@ class ItemListAdapter(
inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) { inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
init { init {
handleClickListeners()
handleCustomTabActions() handleCustomTabActions()
} }
private fun handleClickListeners() {
mView.favButton.setOnLikeListener(object : OnLikeListener {
override fun liked(likeButton: LikeButton) {
val (id) = items[adapterPosition]
api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
mView.favButton.isLiked = false
Toast.makeText(
c,
R.string.cant_mark_favortie,
Toast.LENGTH_SHORT
).show()
}
})
}
override fun unLiked(likeButton: LikeButton) {
val (id) = items[adapterPosition]
api.unstarrItem(id).enqueue(object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
mView.favButton.isLiked = true
Toast.makeText(
c,
R.string.cant_unmark_favortie,
Toast.LENGTH_SHORT
).show()
}
})
}
})
mView.shareBtn.setOnClickListener {
c.shareLink(items[adapterPosition].getLinkDecoded())
}
mView.browserBtn.setOnClickListener {
c.openInBrowserAsNewTask(items[adapterPosition])
}
}
private fun handleCustomTabActions() { private fun handleCustomTabActions() {
val customTabsIntent = c.buildCustomTabsIntent() val customTabsIntent = c.buildCustomTabsIntent()
helper.bindCustomTabsService(app) helper.bindCustomTabsService(app)
mView.setOnClickListener {
if (!clickBehavior) { c.openItemUrl(
mView.setOnClickListener { items,
c.openItemUrl( adapterPosition,
items, items[adapterPosition].getLinkDecoded(),
adapterPosition, customTabsIntent,
items[adapterPosition].getLinkDecoded(), internalBrowser,
customTabsIntent, articleViewer,
internalBrowser, app
articleViewer, )
app
)
}
mView.setOnLongClickListener {
actionBarShowHide()
true
}
} else {
mView.setOnClickListener { actionBarShowHide() }
mView.setOnLongClickListener {
c.openItemUrl(
items,
adapterPosition,
items[adapterPosition].getLinkDecoded(),
customTabsIntent,
internalBrowser,
articleViewer,
app
)
true
}
}
}
private fun actionBarShowHide() {
bars[adapterPosition] = true
if (mView.actionBar.visibility == View.GONE) {
mView.actionBar.visibility = View.VISIBLE
} else {
mView.actionBar.visibility = View.GONE
} }
} }
} }

View File

@ -2,32 +2,40 @@ package apps.amine.bou.readerforselfoss.adapters
import android.app.Activity import android.app.Activity
import android.graphics.Color import android.graphics.Color
import android.support.design.widget.Snackbar import com.google.android.material.snackbar.Snackbar
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import apps.amine.bou.readerforselfoss.utils.persistence.toEntity
import apps.amine.bou.readerforselfoss.utils.succeeded import apps.amine.bou.readerforselfoss.utils.succeeded
import com.crashlytics.android.Crashlytics import org.acra.ACRA
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
import kotlin.concurrent.thread
abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>() { abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>() {
abstract var items: ArrayList<Item> abstract var items: ArrayList<Item>
abstract val api: SelfossApi abstract val api: SelfossApi
abstract val db: AppDatabase
abstract val debugReadingItems: Boolean abstract val debugReadingItems: Boolean
abstract val userIdentifier: String abstract val userIdentifier: String
abstract val app: Activity abstract val app: Activity
abstract val appColors: AppColors abstract val appColors: AppColors
abstract val updateItems: (ArrayList<Item>) -> Unit
fun updateAllItems(newItems: ArrayList<Item>) { fun updateAllItems(newItems: ArrayList<Item>) {
items = newItems items = newItems
notifyDataSetChanged() notifyDataSetChanged()
updateItems(items)
} }
private fun doUnmark(i: Item, position: Int) { private fun doUnmark(i: Item, position: Int) {
@ -38,86 +46,110 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
Snackbar.LENGTH_LONG Snackbar.LENGTH_LONG
) )
.setAction(R.string.undo_string) { .setAction(R.string.undo_string) {
items.add(position, i) if (app.isNetworkAccessible(null)) {
notifyItemInserted(position) items.add(position, i)
thread {
api.unmarkItem(i.id).enqueue(object : Callback<SuccessResponse> { db.itemsDao().insertAllItems(i.toEntity())
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
} }
notifyItemInserted(position)
updateItems(items)
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) { api.unmarkItem(i.id).enqueue(object : Callback<SuccessResponse> {
items.remove(i) override fun onResponse(
notifyItemRemoved(position) call: Call<SuccessResponse>,
doUnmark(i, position) response: Response<SuccessResponse>
} ) {
}) }
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
items.remove(i)
thread {
db.itemsDao().delete(i.toEntity())
}
notifyItemRemoved(position)
updateItems(items)
doUnmark(i, position)
}
})
}
} }
val view = s.view val view = s.view
val tv: TextView = view.findViewById(android.support.design.R.id.snackbar_text) val tv: TextView = view.findViewById(com.google.android.material.R.id.snackbar_text)
tv.setTextColor(Color.WHITE) tv.setTextColor(Color.WHITE)
s.show() s.show()
} }
fun removeItemAtIndex(position: Int) { fun removeItemAtIndex(position: Int) {
if (app.isNetworkAccessible(null)) {
val i = items[position]
val i = items[position] items.remove(i)
notifyItemRemoved(position)
updateItems(items)
items.remove(i) // TODO: Handle network status.
notifyItemRemoved(position) // IF offline, delete from cached articles, and add to some table that will replay the calls on network activation.
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> { thread {
override fun onResponse( db.itemsDao().delete(i.toEntity())
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
Crashlytics.setUserIdentifier(userIdentifier)
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
Crashlytics.logException(Exception("Was success, but did it work ?"))
Toast.makeText(app.baseContext, message, Toast.LENGTH_LONG).show()
}
doUnmark(i, position)
} }
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) { api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
if (debugReadingItems) { override fun onResponse(
Crashlytics.setUserIdentifier(userIdentifier) call: Call<SuccessResponse>,
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message) response: Response<SuccessResponse>
Crashlytics.logException(t) ) {
Toast.makeText(app.baseContext, t.message, Toast.LENGTH_LONG).show() if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), app)
Toast.makeText(app.baseContext, message, Toast.LENGTH_LONG).show()
}
doUnmark(i, position)
} }
Toast.makeText(
app, override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
app.getString(R.string.cant_mark_read), if (debugReadingItems) {
Toast.LENGTH_SHORT ACRA.getErrorReporter().maybeHandleSilentException(t, app)
).show() Toast.makeText(app.baseContext, t.message, Toast.LENGTH_LONG).show()
items.add(i) }
notifyItemInserted(position) Toast.makeText(
} app,
}) app.getString(R.string.cant_mark_read),
Toast.LENGTH_SHORT
).show()
items.add(i)
notifyItemInserted(position)
updateItems(items)
thread {
db.itemsDao().insertAllItems(i.toEntity())
}
}
})
}
} }
fun addItemAtIndex(item: Item, position: Int) { fun addItemAtIndex(item: Item, position: Int) {
items.add(position, item) items.add(position, item)
notifyItemInserted(position) notifyItemInserted(position)
updateItems(items)
} }
fun addItemsAtEnd(newItems: List<Item>) { fun addItemsAtEnd(newItems: List<Item>) {
val oldSize = items.size val oldSize = items.size
items.addAll(newItems) items.addAll(newItems)
notifyItemRangeInserted(oldSize, newItems.size) notifyItemRangeInserted(oldSize, newItems.size)
updateItems(items)
} }
} }

View File

@ -2,17 +2,18 @@ package apps.amine.bou.readerforselfoss.adapters
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.support.constraint.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.Toast import android.widget.Toast
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.Sources import apps.amine.bou.readerforselfoss.api.selfoss.Source
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
import com.amulyakhare.textdrawable.TextDrawable import com.amulyakhare.textdrawable.TextDrawable
import com.amulyakhare.textdrawable.util.ColorGenerator import com.amulyakhare.textdrawable.util.ColorGenerator
@ -23,7 +24,7 @@ import retrofit2.Response
class SourcesListAdapter( class SourcesListAdapter(
private val app: Activity, private val app: Activity,
private val items: ArrayList<Sources>, private val items: ArrayList<Source>,
private val api: SelfossApi private val api: SelfossApi
) : RecyclerView.Adapter<SourcesListAdapter.ViewHolder>() { ) : RecyclerView.Adapter<SourcesListAdapter.ViewHolder>() {
private val c: Context = app.baseContext private val c: Context = app.baseContext
@ -48,7 +49,7 @@ class SourcesListAdapter(
TextDrawable TextDrawable
.builder() .builder()
.round() .round()
.build(itm.title.toTextDrawableString(), color) .build(itm.title.toTextDrawableString(c), color)
holder.mView.itemImage.setImageDrawable(drawable) holder.mView.itemImage.setImageDrawable(drawable)
} else { } else {
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage) c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
@ -70,33 +71,35 @@ class SourcesListAdapter(
val deleteBtn: Button = mView.findViewById(R.id.deleteBtn) val deleteBtn: Button = mView.findViewById(R.id.deleteBtn)
deleteBtn.setOnClickListener { deleteBtn.setOnClickListener {
val (id) = items[adapterPosition] if (c.isNetworkAccessible(null)) {
api.deleteSource(id).enqueue(object : Callback<SuccessResponse> { val (id) = items[adapterPosition]
override fun onResponse( api.deleteSource(id).enqueue(object : Callback<SuccessResponse> {
call: Call<SuccessResponse>, override fun onResponse(
response: Response<SuccessResponse> call: Call<SuccessResponse>,
) { response: Response<SuccessResponse>
if (response.body() != null && response.body()!!.isSuccess) { ) {
items.removeAt(adapterPosition) if (response.body() != null && response.body()!!.isSuccess) {
notifyItemRemoved(adapterPosition) items.removeAt(adapterPosition)
notifyItemRangeChanged(adapterPosition, itemCount) notifyItemRemoved(adapterPosition)
} else { notifyItemRangeChanged(adapterPosition, itemCount)
} else {
Toast.makeText(
app,
R.string.can_delete_source,
Toast.LENGTH_SHORT
).show()
}
}
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
Toast.makeText( Toast.makeText(
app, app,
R.string.can_delete_source, R.string.can_delete_source,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} }
} })
}
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
Toast.makeText(
app,
R.string.can_delete_source,
Toast.LENGTH_SHORT
).show()
}
})
} }
} }
} }

View File

@ -7,7 +7,7 @@ import retrofit2.Call
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
class MercuryApi(private val key: String, shouldLog: Boolean) { class MercuryApi(shouldLog: Boolean) {
private val service: MercuryService private val service: MercuryService
init { init {
@ -26,7 +26,7 @@ class MercuryApi(private val key: String, shouldLog: Boolean) {
val retrofit = val retrofit =
Retrofit Retrofit
.Builder() .Builder()
.baseUrl("https://mercury.postlight.com") .baseUrl("https://www.amine-bou.fr")
.client(client) .client(client)
.addConverterFactory(GsonConverterFactory.create(gson)) .addConverterFactory(GsonConverterFactory.create(gson))
.build() .build()
@ -34,6 +34,6 @@ class MercuryApi(private val key: String, shouldLog: Boolean) {
} }
fun parseUrl(url: String): Call<ParsedContent> { fun parseUrl(url: String): Call<ParsedContent> {
return service.parseUrl(url, this.key) return service.parseUrl(url)
} }
} }

View File

@ -6,6 +6,6 @@ import retrofit2.http.Header
import retrofit2.http.Query import retrofit2.http.Query
interface MercuryService { interface MercuryService {
@GET("parser") @GET("parser.php")
fun parseUrl(@Query("url") url: String, @Header("x-api-key") key: String): Call<ParsedContent> fun parseUrl(@Query("link") link: String): Call<ParsedContent>
} }

View File

@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap
class SelfossApi( class SelfossApi(
c: Context, c: Context,
callingActivity: Activity, callingActivity: Activity?,
isWithSelfSignedCert: Boolean, isWithSelfSignedCert: Boolean,
shouldLog: Boolean shouldLog: Boolean
) { ) {
@ -91,7 +91,9 @@ class SelfossApi(
.build() .build()
service = retrofit.create(SelfossService::class.java) service = retrofit.create(SelfossService::class.java)
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
Config.logoutAndRedirect(c, callingActivity, config.settings.edit(), baseUrlFail = true) if (callingActivity != null) {
Config.logoutAndRedirect(c, callingActivity, config.settings.edit(), baseUrlFail = true)
}
} }
} }
@ -125,6 +127,9 @@ class SelfossApi(
): Call<List<Item>> = ): Call<List<Item>> =
getItems("starred", tag, sourceId, search, itemsNumber, offset) getItems("starred", tag, sourceId, search, itemsNumber, offset)
fun allItems(): Call<List<Item>> =
service.allItems(userName, password)
private fun getItems( private fun getItems(
type: String, type: String,
tag: String?, tag: String?,
@ -159,7 +164,7 @@ class SelfossApi(
fun update(): Call<String> = fun update(): Call<String> =
service.update(userName, password) service.update(userName, password)
val sources: Call<List<Sources>> val sources: Call<List<Source>>
get() = service.sources(userName, password) get() = service.sources(userName, password)
fun deleteSource(id: String): Call<SuccessResponse> = fun deleteSource(id: String): Call<SuccessResponse> =

View File

@ -9,13 +9,13 @@ import apps.amine.bou.readerforselfoss.utils.Config
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
private fun constructUrl(config: Config?, path: String, file: String): String { private fun constructUrl(config: Config?, path: String, file: String?): String {
val baseUriBuilder = Uri.parse(config!!.baseUrl).buildUpon()
baseUriBuilder.appendPath(path).appendPath(file)
return if (file.isEmptyOrNullOrNullString()) { return if (file.isEmptyOrNullOrNullString()) {
"" ""
} else { } else {
val baseUriBuilder = Uri.parse(config!!.baseUrl).buildUpon()
baseUriBuilder.appendPath(path).appendPath(file)
baseUriBuilder.toString() baseUriBuilder.toString()
} }
} }
@ -42,7 +42,7 @@ data class Spout(
@SerializedName("description") val description: String @SerializedName("description") val description: String
) )
data class Sources( data class Source(
@SerializedName("id") val id: String, @SerializedName("id") val id: String,
@SerializedName("title") val title: String, @SerializedName("title") val title: String,
@SerializedName("tags") val tags: String, @SerializedName("tags") val tags: String,

View File

@ -27,6 +27,12 @@ internal interface SelfossService {
@Query("offset") offset: Int @Query("offset") offset: Int
): Call<List<Item>> ): Call<List<Item>>
@GET("items")
fun allItems(
@Query("username") username: String,
@Query("password") password: String
): Call<List<Item>>
@Headers("Content-Type: application/x-www-form-urlencoded") @Headers("Content-Type: application/x-www-form-urlencoded")
@POST("mark/{id}") @POST("mark/{id}")
fun markAsRead( fun markAsRead(
@ -95,7 +101,7 @@ internal interface SelfossService {
fun sources( fun sources(
@Query("username") username: String, @Query("username") username: String,
@Query("password") password: String @Query("password") password: String
): Call<List<Sources>> ): Call<List<Source>>
@DELETE("source/{id}") @DELETE("source/{id}")
fun deleteSource( fun deleteSource(

View File

@ -0,0 +1,83 @@
package apps.amine.bou.readerforselfoss.background
import android.app.NotificationManager
import android.content.Context
import android.os.Handler
import android.preference.PreferenceManager
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationCompat.PRIORITY_LOW
import androidx.room.Room
import androidx.work.Worker
import androidx.work.WorkerParameters
import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2
import apps.amine.bou.readerforselfoss.utils.Config
import apps.amine.bou.readerforselfoss.utils.persistence.toEntity
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.util.*
import kotlin.concurrent.schedule
import kotlin.concurrent.thread
class LoadingWorker(val context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
val notificationManager =
applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val notification = NotificationCompat.Builder(applicationContext, Config.syncChannelId)
.setContentTitle(context.getString(R.string.loading_notification_title))
.setContentText(context.getString(R.string.loading_notification_text))
.setOngoing(true)
.setPriority(PRIORITY_LOW)
.setChannelId(Config.syncChannelId)
.setSmallIcon(R.drawable.ic_cloud_download)
notificationManager.notify(1, notification.build())
val settings = this.context.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this.context)
val shouldLogEverything = sharedPref.getBoolean("should_log_everything", false)
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "selfoss-database"
).addMigrations(MIGRATION_1_2).build()
val api = SelfossApi(
this.context,
null,
settings.getBoolean("isSelfSignedCert", false),
shouldLogEverything
)
api.allItems().enqueue(object : Callback<List<Item>> {
override fun onFailure(call: Call<List<Item>>, t: Throwable) {
Timer("", false).schedule(4000) {
notificationManager.cancel(1)
}
}
override fun onResponse(
call: Call<List<Item>>,
response: Response<List<Item>>
) {
thread {
if (response.body() != null) {
val apiItems = (response.body() as ArrayList<Item>)
db.itemsDao().deleteAllItems()
db.itemsDao()
.insertAllItems(*(apiItems.map { it.toEntity() }).toTypedArray())
}
Timer("", false).schedule(4000) {
notificationManager.cancel(1)
}
}
}
})
return Result.SUCCESS
}
}

View File

@ -1,44 +1,45 @@
package apps.amine.bou.readerforselfoss.fragments package apps.amine.bou.readerforselfoss.fragments
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import android.support.design.widget.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import android.support.v4.app.Fragment import androidx.fragment.app.Fragment
import android.support.v4.content.ContextCompat import androidx.core.content.ContextCompat
import android.support.v4.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebSettings import android.webkit.WebSettings
import apps.amine.bou.readerforselfoss.BuildConfig
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.AppColors
import apps.amine.bou.readerforselfoss.utils.Config
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
import apps.amine.bou.readerforselfoss.utils.openItemUrl import apps.amine.bou.readerforselfoss.utils.openItemUrl
import apps.amine.bou.readerforselfoss.utils.shareLink import apps.amine.bou.readerforselfoss.utils.shareLink
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
import apps.amine.bou.readerforselfoss.utils.succeeded
import apps.amine.bou.readerforselfoss.utils.toPx import apps.amine.bou.readerforselfoss.utils.toPx
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.crashlytics.android.Crashlytics
import com.ftinc.scoop.Scoop
import com.github.rubensousa.floatingtoolbar.FloatingToolbar import com.github.rubensousa.floatingtoolbar.FloatingToolbar
import kotlinx.android.synthetic.main.fragment_article.view.* import kotlinx.android.synthetic.main.fragment_article.view.*
import org.acra.ACRA
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
@ -55,7 +56,6 @@ class ArticleFragment : Fragment() {
private lateinit var contentSource: String private lateinit var contentSource: String
private lateinit var contentImage: String private lateinit var contentImage: String
private lateinit var contentTitle: String private lateinit var contentTitle: String
private var showMalformedUrl: Boolean = false
private lateinit var editor: SharedPreferences.Editor private lateinit var editor: SharedPreferences.Editor
private lateinit var fab: FloatingActionButton private lateinit var fab: FloatingActionButton
private lateinit var appColors: AppColors private lateinit var appColors: AppColors
@ -85,14 +85,26 @@ class ArticleFragment : Fragment() {
rootView = inflater rootView = inflater
.inflate(R.layout.fragment_article, container, false) as ViewGroup .inflate(R.layout.fragment_article, container, false) as ViewGroup
val context: Context = activity!!
url = allItems[pageNumber.toInt()].getLinkDecoded() url = allItems[pageNumber.toInt()].getLinkDecoded()
contentText = allItems[pageNumber.toInt()].content contentText = allItems[pageNumber.toInt()].content
contentTitle = allItems[pageNumber.toInt()].title contentTitle = allItems[pageNumber.toInt()].title
contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!) contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!)
contentSource = allItems[pageNumber.toInt()].sourceAndDateText() contentSource = allItems[pageNumber.toInt()].sourceAndDateText()
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
editor = prefs.edit()
fontSize = prefs.getString("reader_font_size", "14").toInt()
val settings = activity!!.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
val debugReadingItems = prefs.getBoolean("read_debug", false)
val api = SelfossApi(
context!!,
activity!!,
settings.getBoolean("isSelfSignedCert", false),
prefs.getBoolean("should_log_everything", false)
)
fab = rootView.fab fab = rootView.fab
fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent) fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent)
@ -108,17 +120,12 @@ class ArticleFragment : Fragment() {
mCustomTabActivityHelper = CustomTabActivityHelper() mCustomTabActivityHelper = CustomTabActivityHelper()
mCustomTabActivityHelper.bindCustomTabsService(activity) mCustomTabActivityHelper.bindCustomTabsService(activity)
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
editor = prefs.edit()
fontSize = prefs.getString("reader_font_size", "14").toInt()
showMalformedUrl = prefs.getBoolean("show_error_malformed_url", true)
floatingToolbar.setClickListener( floatingToolbar.setClickListener(
object : FloatingToolbar.ItemClickListener { object : FloatingToolbar.ItemClickListener {
override fun onItemClick(item: MenuItem) { override fun onItemClick(item: MenuItem) {
when (item.itemId) { when (item.itemId) {
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs, context) R.id.more_action -> getContentFromMercury(customTabsIntent, prefs)
R.id.share_action -> activity!!.shareLink(url) R.id.share_action -> activity!!.shareLink(url)
R.id.open_action -> activity!!.openItemUrl( R.id.open_action -> activity!!.openItemUrl(
allItems, allItems,
@ -129,6 +136,37 @@ class ArticleFragment : Fragment() {
false, false,
activity!! activity!!
) )
R.id.unread_action -> if ((context != null && context!!.isNetworkAccessible(null)) || context == null) {
api.unmarkItem(allItems[pageNumber.toInt()].id).enqueue(
object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), activity!!)
}
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
if (debugReadingItems) {
ACRA.getErrorReporter().maybeHandleSilentException(t, activity!!)
}
}
}
)
}
else -> Unit else -> Unit
} }
} }
@ -141,16 +179,16 @@ class ArticleFragment : Fragment() {
rootView.source.text = contentSource rootView.source.text = contentSource
if (contentText.isEmptyOrNullOrNullString()) { if (contentText.isEmptyOrNullOrNullString()) {
getContentFromMercury(customTabsIntent, prefs, context) getContentFromMercury(customTabsIntent, prefs)
} else { } else {
rootView.titleView.text = contentTitle rootView.titleView.text = contentTitle
htmlToWebview(contentText, prefs, context) htmlToWebview(contentText, prefs)
if (!contentImage.isEmptyOrNullOrNullString()) { if (!contentImage.isEmptyOrNullOrNullString() && context != null) {
rootView.imageView.visibility = View.VISIBLE rootView.imageView.visibility = View.VISIBLE
Glide Glide
.with(context) .with(context!!)
.asBitmap() .asBitmap()
.load(contentImage) .load(contentImage)
.apply(RequestOptions.fitCenterTransform()) .apply(RequestOptions.fitCenterTransform())
@ -175,156 +213,143 @@ class ArticleFragment : Fragment() {
private fun getContentFromMercury( private fun getContentFromMercury(
customTabsIntent: CustomTabsIntent, customTabsIntent: CustomTabsIntent,
prefs: SharedPreferences, prefs: SharedPreferences
context: Context
) { ) {
rootView.progressBar.visibility = View.VISIBLE if ((context != null && context!!.isNetworkAccessible(null)) || context == null) {
val parser = MercuryApi( rootView.progressBar.visibility = View.VISIBLE
BuildConfig.MERCURY_KEY, val parser = MercuryApi(
prefs.getBoolean("should_log_everything", false) prefs.getBoolean("should_log_everything", false)
) )
parser.parseUrl(url).enqueue( parser.parseUrl(url).enqueue(
object : Callback<ParsedContent> { object : Callback<ParsedContent> {
override fun onResponse( override fun onResponse(
call: Call<ParsedContent>, call: Call<ParsedContent>,
response: Response<ParsedContent> response: Response<ParsedContent>
) { ) {
// TODO: clean all the following after finding the mercury content issue // TODO: clean all the following after finding the mercury content issue
try { try {
if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) { if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) {
try { try {
rootView.titleView.text = response.body()!!.title rootView.titleView.text = response.body()!!.title
url = response.body()!!.url
} catch (e: Exception) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"source titleView or url issues"
)
Crashlytics.logException(e)
}
try {
htmlToWebview(response.body()!!.content.orEmpty(), prefs, context)
} catch (e: Exception) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"Webview issue ${e.message}"
)
Crashlytics.logException(e)
}
try {
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty()) {
rootView.imageView.visibility = View.VISIBLE
try { try {
Glide // Note: Mercury may return relative urls... If it does the url val will not be changed.
.with(context) URL(response.body()!!.url)
.asBitmap() url = response.body()!!.url
.load(response.body()!!.lead_image_url) } catch (e: MalformedURLException) {
.apply(RequestOptions.fitCenterTransform()) ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!)
.into(rootView.imageView) }
} catch (e: Exception) { } catch (e: Exception) {
Crashlytics.setUserIdentifier( if (context != null) {
prefs.getString( ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
"unique_id",
""
)
)
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"Glide issue with image ${response.body()!!.lead_image_url}"
)
Crashlytics.logException(e)
} }
} else {
rootView.imageView.visibility = View.GONE
} }
} catch (e: Exception) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"Glide or image issue"
)
Crashlytics.logException(e)
}
try { try {
rootView.nestedScrollView.scrollTo(0, 0) htmlToWebview(response.body()!!.content.orEmpty(), prefs)
} catch (e: Exception) {
if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
}
}
rootView.progressBar.visibility = View.GONE try {
} catch (e: Exception) { if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty() && context != null) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", "")) rootView.imageView.visibility = View.VISIBLE
Crashlytics.log( try {
100, Glide
"MERCURY_CONTENT_EXCEPTION", .with(context!!)
"Scroll or visibility issues" .asBitmap()
) .load(response.body()!!.lead_image_url)
Crashlytics.logException(e) .apply(RequestOptions.fitCenterTransform())
.into(rootView.imageView)
} catch (e: Exception) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
}
} else {
rootView.imageView.visibility = View.GONE
}
} catch (e: Exception) {
if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
}
}
try {
rootView.nestedScrollView.scrollTo(0, 0)
rootView.progressBar.visibility = View.GONE
} catch (e: Exception) {
if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
}
}
} else {
try {
openInBrowserAfterFailing(customTabsIntent)
} catch (e: Exception) {
if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
}
}
} }
} else { } catch (e: Exception) {
try { if (context != null) {
openInBrowserAfterFailing(customTabsIntent) ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
} catch (e: Exception) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"Browser after failing issue"
)
Crashlytics.logException(e)
} }
} }
} catch (e: Exception) {
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
Crashlytics.log(
100,
"MERCURY_CONTENT_EXCEPTION",
"UNCAUGHT (?) Fatal Exception on mercury response"
)
Crashlytics.logException(e)
} }
}
override fun onFailure( override fun onFailure(
call: Call<ParsedContent>, call: Call<ParsedContent>,
t: Throwable t: Throwable
) = openInBrowserAfterFailing(customTabsIntent) ) = openInBrowserAfterFailing(customTabsIntent)
} }
) )
}
} }
private fun htmlToWebview(c: String, prefs: SharedPreferences, context: Context) { private fun htmlToWebview(c: String, prefs: SharedPreferences) {
val stringColor = String.format("#%06X", 0xFFFFFF and appColors.colorAccent) val stringColor = String.format("#%06X", 0xFFFFFF and appColors.colorAccent)
rootView.webcontent.visibility = View.VISIBLE rootView.webcontent.visibility = View.VISIBLE
val (textColor, backgroundColor) = if (appColors.isDarkTheme) { val (textColor, backgroundColor) = if (appColors.isDarkTheme) {
rootView.webcontent.setBackgroundColor( if (context != null) {
ContextCompat.getColor( rootView.webcontent.setBackgroundColor(
context, ContextCompat.getColor(
R.color.dark_webview context!!,
R.color.dark_webview
)
) )
) Pair(ContextCompat.getColor(context!!, R.color.dark_webview_text), ContextCompat.getColor(context!!, R.color.light_webview_text))
Pair(ContextCompat.getColor(context, R.color.dark_webview_text), ContextCompat.getColor(context, R.color.light_webview_text)) } else {
Pair(null, null)
}
} else { } else {
rootView.webcontent.setBackgroundColor( if (context != null) {
ContextCompat.getColor( rootView.webcontent.setBackgroundColor(
context, ContextCompat.getColor(
R.color.light_webview context!!,
R.color.light_webview
)
) )
) Pair(ContextCompat.getColor(context!!, R.color.light_webview_text), ContextCompat.getColor(context!!, R.color.dark_webview_text))
Pair(ContextCompat.getColor(context, R.color.light_webview_text), ContextCompat.getColor(context, R.color.dark_webview_text)) } else {
Pair(null, null)
}
} }
val stringTextColor = String.format("#%06X", 0xFFFFFF and textColor) val stringTextColor: String = if (textColor != null) {
val stringBackgroundColor = String.format("#%06X", 0xFFFFFF and backgroundColor) String.format("#%06X", 0xFFFFFF and textColor)
} else {
"#000000"
}
val stringBackgroundColor = if (backgroundColor != null) {
String.format("#%06X", 0xFFFFFF and backgroundColor)
} else {
"#FFFFFF"
}
rootView.webcontent.settings.useWideViewPort = true rootView.webcontent.settings.useWideViewPort = true
rootView.webcontent.settings.loadWithOverviewMode = true rootView.webcontent.settings.loadWithOverviewMode = true
@ -343,76 +368,46 @@ class ArticleFragment : Fragment() {
val itemUrl = URL(url) val itemUrl = URL(url)
baseUrl = itemUrl.protocol + "://" + itemUrl.host baseUrl = itemUrl.protocol + "://" + itemUrl.host
} catch (e: MalformedURLException) { } catch (e: MalformedURLException) {
if (showMalformedUrl) { ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!)
val alertDialog = AlertDialog.Builder(context).create()
alertDialog.setTitle("Error")
alertDialog.setMessage("You are encountering a bug that I can't solve. Can you please contact me to solve the issue, please ?")
alertDialog.setButton(
AlertDialog.BUTTON_POSITIVE,
"Send mail",
{ dialog, _ ->
// This won't be translated because it should only be temporary.
val to = BuildConfig.FEEDBACK_EMAIL
val subject= "[MalformedURLException]"
val body= "Please specify the source, item and spout you are using for the url below : \n ${e.message}"
val mailTo = "mailto:" + to + "?&subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body)
val emailIntent = Intent(Intent.ACTION_VIEW)
emailIntent.data = Uri.parse(mailTo)
startActivity(emailIntent)
dialog.dismiss()
}
)
alertDialog.setButton(
AlertDialog.BUTTON_NEUTRAL,
"Not now",
{ dialog, _ -> dialog.dismiss() }
)
alertDialog.setButton(
AlertDialog.BUTTON_NEGATIVE,
"Don't show anymore.",
{ dialog, _ ->
editor.putBoolean("show_error_malformed_url", false)
editor.apply()
dialog.dismiss()
}
)
alertDialog.show()
}
} }
rootView.webcontent.loadDataWithBaseURL( rootView.webcontent.loadDataWithBaseURL(
baseUrl, baseUrl,
"""<style> """<html>
|img { |<head>
| display: inline-block; | <style>
| height: auto; | img {
| width: 100%; | display: inline-block;
| max-width: 100%; | height: auto;
|} | width: 100%;
|a { | max-width: 100%;
| color: $stringColor !important; | }
|} | a {
|*:not(a) { | color: $stringColor !important;
| color: $stringTextColor; | }
|} | *:not(a) {
|* { | color: $stringTextColor;
| font-size: ${fontSize.toPx}px; | }
| text-align: justify; | * {
| word-break: break-word; | font-size: ${fontSize.toPx}px;
| overflow:hidden; | text-align: justify;
|} | word-break: break-word;
|a, pre, code { | overflow:hidden;
| text-align: left; | }
|} | a, pre, code {
|pre, code { | text-align: left;
| white-space: pre-wrap; | }
| width:100%; | pre, code {
| background-color: $stringBackgroundColor; | white-space: pre-wrap;
|}</style>$c""".trimMargin(), | width:100%;
"text/html; charset=utf-8", | background-color: $stringBackgroundColor;
| }
| </style>
|</head>
|<body>
| $c
|</body>""".trimMargin(),
"text/html",
"utf-8", "utf-8",
null null
) )

View File

@ -0,0 +1,36 @@
package apps.amine.bou.readerforselfoss.persistence.dao
import androidx.room.Delete
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity
import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity
@Dao
interface DrawerDataDao {
@Query("SELECT * FROM tags")
fun tags(): List<TagEntity>
@Query("SELECT * FROM sources")
fun sources(): List<SourceEntity>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllTags(vararg tags: TagEntity)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllSources(vararg sources: SourceEntity)
@Query("DELETE FROM tags")
fun deleteAllTags()
@Query("DELETE FROM sources")
fun deleteAllSources()
@Delete
fun deleteTag(tag: TagEntity)
@Delete
fun deleteSource(source: SourceEntity)
}

View File

@ -0,0 +1,29 @@
package apps.amine.bou.readerforselfoss.persistence.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import apps.amine.bou.readerforselfoss.persistence.entities.ItemEntity
import androidx.room.Update
@Dao
interface ItemsDao {
@Query("SELECT * FROM items order by id desc")
fun items(): List<ItemEntity>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAllItems(vararg items: ItemEntity)
@Query("DELETE FROM items")
fun deleteAllItems()
@Delete
fun delete(item: ItemEntity)
@Update
fun updateItem(item: ItemEntity)
}

View File

@ -0,0 +1,16 @@
package apps.amine.bou.readerforselfoss.persistence.database
import androidx.room.RoomDatabase
import androidx.room.Database
import apps.amine.bou.readerforselfoss.persistence.dao.DrawerDataDao
import apps.amine.bou.readerforselfoss.persistence.dao.ItemsDao
import apps.amine.bou.readerforselfoss.persistence.entities.ItemEntity
import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity
import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity
@Database(entities = [TagEntity::class, SourceEntity::class, ItemEntity::class], version = 2)
abstract class AppDatabase : RoomDatabase() {
abstract fun drawerDataDao(): DrawerDataDao
abstract fun itemsDao(): ItemsDao
}

View File

@ -0,0 +1,33 @@
package apps.amine.bou.readerforselfoss.persistence.entities
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "tags")
data class TagEntity(
@PrimaryKey
@ColumnInfo(name = "tag")
val tag: String,
@ColumnInfo(name = "color")
val color: String,
@ColumnInfo(name = "unread")
val unread: Int
)
@Entity(tableName = "sources")
data class SourceEntity(
@PrimaryKey
@ColumnInfo(name = "id")
val id: String,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "tags")
val tags: String,
@ColumnInfo(name = "spout")
val spout: String,
@ColumnInfo(name = "error")
val error: String,
@ColumnInfo(name = "icon")
val icon: String
)

View File

@ -0,0 +1,32 @@
package apps.amine.bou.readerforselfoss.persistence.entities
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "items")
data class ItemEntity(
@PrimaryKey
@ColumnInfo(name = "id")
val id: String,
@ColumnInfo(name = "datetime")
val datetime: String,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "content")
val content: String,
@ColumnInfo(name = "unread")
val unread: Boolean,
@ColumnInfo(name = "starred")
var starred: Boolean,
@ColumnInfo(name = "thumbnail")
val thumbnail: String,
@ColumnInfo(name = "icon")
val icon: String,
@ColumnInfo(name = "link")
val link: String,
@ColumnInfo(name = "sourcetitle")
val sourcetitle: String,
@ColumnInfo(name = "tags")
val tags: String
)

View File

@ -0,0 +1,10 @@
package apps.amine.bou.readerforselfoss.persistence.migrations
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.room.migration.Migration
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `items` (`id` TEXT NOT NULL, `datetime` TEXT NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `unread` INTEGER NOT NULL, `starred` INTEGER NOT NULL, `thumbnail` TEXT NOT NULL, `icon` TEXT NOT NULL, `link` TEXT NOT NULL, `sourcetitle` TEXT NOT NULL, `tags` TEXT NOT NULL, PRIMARY KEY(`id`))")
}
}

View File

@ -1,15 +1,16 @@
package apps.amine.bou.readerforselfoss.settings; package apps.amine.bou.readerforselfoss.settings;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import android.support.annotation.LayoutRes; import androidx.annotation.LayoutRes;
import android.support.annotation.NonNull; import androidx.annotation.NonNull;
import android.support.annotation.Nullable; import androidx.annotation.Nullable;
import android.support.design.widget.AppBarLayout; import com.google.android.material.appbar.AppBarLayout;
import android.support.v7.app.ActionBar; import androidx.appcompat.app.ActionBar;
import android.support.v7.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.View; import android.view.View;
@ -48,10 +49,11 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
AppBarLayout bar = (AppBarLayout) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false); AppBarLayout bar = (AppBarLayout) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
Toolbar toolbar = bar.findViewById(R.id.toolbar); Toolbar toolbar = bar.findViewById(R.id.toolbar);
// TODO: all switches Scoop scoop = Scoop.getInstance();
Scoop.getInstance() scoop.bind(this, Toppings.PRIMARY.getValue(), toolbar);
.bind(this, Toppings.PRIMARY.getValue(), toolbar) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
.bindStatusBar(this, Toppings.PRIMARY_DARK.getValue()); scoop.bindStatusBar(this, Toppings.PRIMARY_DARK.getValue());
}
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);

View File

@ -19,7 +19,7 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.preference.SwitchPreference; import android.preference.SwitchPreference;
import android.support.v7.app.ActionBar; import androidx.appcompat.app.ActionBar;
import android.text.Editable; import android.text.Editable;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.Spanned; import android.text.Spanned;
@ -29,11 +29,8 @@ import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
import com.ftinc.scoop.ui.ScoopSettingsActivity;
import java.util.List; import java.util.List;
import apps.amine.bou.readerforselfoss.BuildConfig;
import apps.amine.bou.readerforselfoss.R; import apps.amine.bou.readerforselfoss.R;
import apps.amine.bou.readerforselfoss.themes.AppColors; import apps.amine.bou.readerforselfoss.themes.AppColors;
import apps.amine.bou.readerforselfoss.utils.Config; import apps.amine.bou.readerforselfoss.utils.Config;
@ -138,6 +135,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
return PreferenceFragment.class.getName().equals(fragmentName) return PreferenceFragment.class.getName().equals(fragmentName)
|| GeneralPreferenceFragment.class.getName().equals(fragmentName) || GeneralPreferenceFragment.class.getName().equals(fragmentName)
|| ArticleViewerPreferenceFragment.class.getName().equals(fragmentName) || ArticleViewerPreferenceFragment.class.getName().equals(fragmentName)
|| OfflinePreferenceFragment.class.getName().equals(fragmentName)
|| DebugPreferenceFragment.class.getName().equals(fragmentName) || DebugPreferenceFragment.class.getName().equals(fragmentName)
|| LinksPreferenceFragment.class.getName().equals(fragmentName) || LinksPreferenceFragment.class.getName().equals(fragmentName)
|| ThemePreferenceFragment.class.getName().equals(fragmentName); || ThemePreferenceFragment.class.getName().equals(fragmentName);
@ -155,17 +153,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
addPreferencesFromResource(R.xml.pref_general); addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true); setHasOptionsMenu(true);
SwitchPreference cardViewActive = (SwitchPreference) findPreference("card_view_active");
final SwitchPreference tabOnTap = (SwitchPreference) findPreference("tab_on_tap");
tabOnTap.setEnabled(!cardViewActive.isChecked());
cardViewActive.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean isEnabled = (Boolean) newValue;
tabOnTap.setEnabled(!isEnabled);
return true;
}
});
EditTextPreference itemsNumber = (EditTextPreference) findPreference("prefer_api_items_number"); EditTextPreference itemsNumber = (EditTextPreference) findPreference("prefer_api_items_number");
itemsNumber.getEditText().setFilters(new InputFilter[]{ itemsNumber.getEditText().setFilters(new InputFilter[]{
new InputFilter() { new InputFilter() {
@ -183,6 +170,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
} }
} }
}); });
} }
@Override @Override
@ -308,7 +296,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
findPreference("trackerLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference("trackerLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
openUrl(Uri.parse(BuildConfig.TRACKER_URL)); openUrl(Uri.parse(Config.trackerUrl));
return true; return true;
} }
}); });
@ -316,7 +304,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
findPreference("sourceLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference("sourceLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
openUrl(Uri.parse(BuildConfig.SOURCE_URL)); openUrl(Uri.parse(Config.sourceUrl));
return false; return false;
} }
}); });
@ -324,7 +312,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
findPreference("translation").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference("translation").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
openUrl(Uri.parse(BuildConfig.TRANSLATION_URL)); openUrl(Uri.parse(Config.translationUrl));
return false; return false;
} }
}); });
@ -376,6 +364,27 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
} }
} }
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class OfflinePreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_offline);
setHasOptionsMenu(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
getActivity().finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId(); int id = item.getItemId();

View File

@ -3,8 +3,8 @@ package apps.amine.bou.readerforselfoss.themes
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.annotation.ColorInt import androidx.annotation.ColorInt
import android.support.v7.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import android.util.TypedValue import android.util.TypedValue
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import android.view.LayoutInflater import android.view.LayoutInflater
@ -17,6 +17,7 @@ class AppColors(a: Activity) {
@ColorInt val colorAccent: Int @ColorInt val colorAccent: Int
@ColorInt val colorAccentDark: Int @ColorInt val colorAccentDark: Int
@ColorInt val cardBackgroundColor: Int @ColorInt val cardBackgroundColor: Int
@ColorInt val colorBackground: Int
val isDarkTheme: Boolean val isDarkTheme: Boolean
init { init {
@ -48,10 +49,12 @@ class AppColors(a: Activity) {
false false
) )
if (isDarkTheme) { colorBackground = if (isDarkTheme) {
a.setTheme(R.style.NoBarDark) a.setTheme(R.style.NoBarDark)
R.color.darkBackground
} else { } else {
a.setTheme(R.style.NoBar) a.setTheme(R.style.NoBar)
android.R.color.background_light
} }
val wrapper = Context::class.java val wrapper = Context::class.java

View File

@ -1,6 +1,6 @@
package apps.amine.bou.readerforselfoss.transformers package apps.amine.bou.readerforselfoss.transformers
import android.support.v4.view.ViewPager import androidx.viewpager.widget.ViewPager
import android.view.View import android.view.View
class DepthPageTransformer : ViewPager.PageTransformer { class DepthPageTransformer : ViewPager.PageTransformer {

View File

@ -0,0 +1,12 @@
package apps.amine.bou.readerforselfoss.utils
import android.content.Context
import android.preference.PreferenceManager
import org.acra.ErrorReporter
fun ErrorReporter.maybeHandleSilentException(throwable: Throwable, ctx: Context) {
val sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx)
if (sharedPref.getBoolean("acra_should_log", false)) {
this.handleSilentException(throwable)
}
}

View File

@ -2,60 +2,11 @@ package apps.amine.bou.readerforselfoss.utils
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.support.v7.app.AlertDialog
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
fun String?.isEmptyOrNullOrNullString(): Boolean = fun String?.isEmptyOrNullOrNullString(): Boolean =
this == null || this == "null" || this.isEmpty() this == null || this == "null" || this.isEmpty()
fun Context.checkApkVersion(
settings: SharedPreferences,
editor: SharedPreferences.Editor,
mFirebaseRemoteConfig: FirebaseRemoteConfig
) = {
fun isThereAnUpdate() {
val APK_LINK = "github_apk"
val apkLink = mFirebaseRemoteConfig.getString(APK_LINK)
val storedLink = settings.getString(APK_LINK, "")
if (apkLink != storedLink && !apkLink.isEmpty()) {
val alertDialog = AlertDialog.Builder(this).create()
alertDialog.setTitle(getString(R.string.new_apk_available_title))
alertDialog.setMessage(getString(R.string.new_apk_available_message))
alertDialog.setButton(
AlertDialog.BUTTON_POSITIVE,
getString(R.string.new_apk_available_get)
) { _, _ ->
editor.putString(APK_LINK, apkLink)
editor.apply()
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(apkLink))
startActivity(browserIntent)
}
alertDialog.setButton(
AlertDialog.BUTTON_NEUTRAL, getString(R.string.new_apk_available_no),
{ dialog, _ ->
editor.putString(APK_LINK, apkLink)
editor.apply()
dialog.dismiss()
}
)
alertDialog.show()
}
}
mFirebaseRemoteConfig.fetch(43200)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
mFirebaseRemoteConfig.activateFetched()
}
isThereAnUpdate()
}
}
fun String.longHash(): Long { fun String.longHash(): Long {
var h = 98764321261L var h = 98764321261L
val l = this.length val l = this.length

View File

@ -28,6 +28,16 @@ class Config(c: Context) {
companion object { companion object {
const val settingsName = "paramsselfoss" const val settingsName = "paramsselfoss"
const val feedbackEmail = "aminecmi@gmail.com"
const val translationUrl = "https://crwd.in/readerforselfoss"
const val sourceUrl = "https://github.com/aminecmi/ReaderforSelfoss"
const val trackerUrl = "https://github.com/aminecmi/ReaderforSelfoss/issues"
const val syncChannelId = "sync-channel-id"
fun logoutAndRedirect( fun logoutAndRedirect(
c: Context, c: Context,
callingActivity: Activity, callingActivity: Activity,

View File

@ -1,24 +1,20 @@
package apps.amine.bou.readerforselfoss.utils package apps.amine.bou.readerforselfoss.utils
import android.content.Context
import android.text.format.DateUtils import android.text.format.DateUtils
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import com.crashlytics.android.Crashlytics import org.acra.ACRA
import java.text.ParseException import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
fun String.toTextDrawableString(): String { fun String.toTextDrawableString(c: Context): String {
val textDrawable = StringBuilder() val textDrawable = StringBuilder()
for (s in this.split(" ".toRegex()).filter { !it.isEmpty() }.toTypedArray()) { for (s in this.split(" ".toRegex()).filter { !it.isEmpty() }.toTypedArray()) {
try { try {
textDrawable.append(s[0]) textDrawable.append(s[0])
} catch (e: StringIndexOutOfBoundsException) { } catch (e: StringIndexOutOfBoundsException) {
Crashlytics.log( ACRA.getErrorReporter().maybeHandleSilentException(e, c)
100,
"TEXT_DRAWABLE_INDEX_OUT_OF_BOUND",
this + " produces ${e.message}"
)
Crashlytics.logException(e)
} }
} }
return textDrawable.toString() return textDrawable.toString()

View File

@ -6,8 +6,13 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import android.support.customtabs.CustomTabsIntent import android.text.Spannable
import android.text.style.ClickableSpan
import androidx.browser.customtabs.CustomTabsIntent
import android.util.Patterns import android.util.Patterns
import android.view.MotionEvent
import android.view.View
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.ReaderActivity import apps.amine.bou.readerforselfoss.ReaderActivity
@ -146,3 +151,40 @@ fun Context.openInBrowserAsNewTask(i: Item) {
intent.data = Uri.parse(i.getLinkDecoded().toStringUriWithHttp()) intent.data = Uri.parse(i.getLinkDecoded().toStringUriWithHttp())
startActivity(intent) startActivity(intent)
} }
class LinkOnTouchListener: View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
var ret = false
val widget: TextView = v as TextView
val text: CharSequence = widget.text
val stext = Spannable.Factory.getInstance().newSpannable(text)
val action = event!!.action
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
var x: Float = event.x
var y: Float = event.y
x -= widget.totalPaddingLeft
y -= widget.totalPaddingTop
x += widget.scrollX
y += widget.scrollY
val layout = widget.layout
val line = layout.getLineForVertical(y.toInt())
val off = layout.getOffsetForHorizontal(line, x)
val link = stext.getSpans(off, off, ClickableSpan::class.java)
if (link.isNotEmpty()) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget)
}
ret = true
}
}
return ret
}
}

View File

@ -1,54 +0,0 @@
package apps.amine.bou.readerforselfoss.utils
import android.content.Context
import android.support.design.widget.CoordinatorLayout
import android.support.design.widget.FloatingActionButton
import android.util.AttributeSet
import android.view.View
class ScrollAwareFABBehavior(
context: Context,
attrs: AttributeSet
) : CoordinatorLayout.Behavior<FloatingActionButton>() {
override fun onStartNestedScroll(
coordinatorLayout: CoordinatorLayout,
child: FloatingActionButton,
directTargetChild: View,
target: View,
nestedScrollAxes: Int
): Boolean {
return true
}
override fun onNestedScroll(
coordinatorLayout: CoordinatorLayout,
child: FloatingActionButton,
target: View,
dxConsumed: Int,
dyConsumed: Int,
dxUnconsumed: Int,
dyUnconsumed: Int
) {
super.onNestedScroll(
coordinatorLayout,
child,
target,
dxConsumed,
dyConsumed,
dxUnconsumed,
dyUnconsumed
)
if (dyConsumed > 0 && child.visibility == View.VISIBLE) {
child.hide(object : FloatingActionButton.OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton?) {
super.onHidden(fab)
fab!!.visibility = View.INVISIBLE
}
})
} else if (dyConsumed < 0 && child.visibility != View.VISIBLE) {
child.show()
}
}
}

View File

@ -4,10 +4,10 @@ package apps.amine.bou.readerforselfoss.utils.customtabs;
import android.app.Activity; import android.app.Activity;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.customtabs.CustomTabsClient; import androidx.browser.customtabs.CustomTabsClient;
import android.support.customtabs.CustomTabsIntent; import androidx.browser.customtabs.CustomTabsIntent;
import android.support.customtabs.CustomTabsServiceConnection; import androidx.browser.customtabs.CustomTabsServiceConnection;
import android.support.customtabs.CustomTabsSession; import androidx.browser.customtabs.CustomTabsSession;
import java.util.List; import java.util.List;

View File

@ -7,7 +7,7 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.support.customtabs.CustomTabsService; import androidx.browser.customtabs.CustomTabsService;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;

View File

@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.utils.customtabs;
import android.content.ComponentName; import android.content.ComponentName;
import android.support.customtabs.CustomTabsClient; import androidx.browser.customtabs.CustomTabsClient;
import android.support.customtabs.CustomTabsServiceConnection; import androidx.browser.customtabs.CustomTabsServiceConnection;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;

View File

@ -1,7 +1,7 @@
package apps.amine.bou.readerforselfoss.utils.customtabs; package apps.amine.bou.readerforselfoss.utils.customtabs;
import android.support.customtabs.CustomTabsClient; import androidx.browser.customtabs.CustomTabsClient;
public interface ServiceConnectionCallback { public interface ServiceConnectionCallback {

View File

@ -1,7 +1,7 @@
/* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomBaseViewHolder.java */ /* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomBaseViewHolder.java */
package apps.amine.bou.readerforselfoss.utils.drawer package apps.amine.bou.readerforselfoss.utils.drawer
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView

View File

@ -2,10 +2,10 @@
package apps.amine.bou.readerforselfoss.utils.drawer package apps.amine.bou.readerforselfoss.utils.drawer
import android.net.Uri import android.net.Uri
import android.support.annotation.ColorInt import androidx.annotation.ColorInt
import android.support.annotation.ColorRes import androidx.annotation.ColorRes
import android.support.annotation.StringRes import androidx.annotation.StringRes
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.mikepenz.materialdrawer.holder.ColorHolder import com.mikepenz.materialdrawer.holder.ColorHolder
import com.mikepenz.materialdrawer.holder.ImageHolder import com.mikepenz.materialdrawer.holder.ImageHolder

View File

@ -1,8 +1,8 @@
/* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomUrlPrimaryDrawerItem.java */ /* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomUrlPrimaryDrawerItem.java */
package apps.amine.bou.readerforselfoss.utils.drawer package apps.amine.bou.readerforselfoss.utils.drawer
import android.support.annotation.LayoutRes import androidx.annotation.LayoutRes
import android.support.annotation.StringRes import androidx.annotation.StringRes
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R

View File

@ -2,7 +2,7 @@ package apps.amine.bou.readerforselfoss.utils.glide
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
import android.widget.ImageView import android.widget.ImageView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions

View File

@ -0,0 +1,41 @@
package apps.amine.bou.readerforselfoss.utils.network
import android.content.Context
import android.graphics.Color
import android.net.ConnectivityManager
import android.net.NetworkInfo
import android.view.View
import android.widget.TextView
import apps.amine.bou.readerforselfoss.R
import com.google.android.material.snackbar.Snackbar
var snackBarShown = false
var view: View? = null
fun Context.isNetworkAccessible(v: View?): Boolean {
val cm = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
val networkIsAccessible = activeNetwork != null && activeNetwork.isConnectedOrConnecting
if (v != null && !networkIsAccessible && (!snackBarShown || v != view)) {
view = v
val s = Snackbar
.make(
v,
R.string.no_network_connectivity,
Snackbar.LENGTH_INDEFINITE
)
s.setAction(android.R.string.ok) {
snackBarShown = false
s.dismiss()
}
val view = s.view
val tv: TextView = view.findViewById(com.google.android.material.R.id.snackbar_text)
tv.setTextColor(Color.WHITE)
s.show()
snackBarShown = true
}
return networkIsAccessible
}

View File

@ -0,0 +1,72 @@
package apps.amine.bou.readerforselfoss.utils.persistence
import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.Source
import apps.amine.bou.readerforselfoss.api.selfoss.Tag
import apps.amine.bou.readerforselfoss.persistence.entities.ItemEntity
import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity
import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity
fun TagEntity.toView(): Tag =
Tag(
this.tag,
this.color,
this.unread
)
fun SourceEntity.toView(): Source =
Source(
this.id,
this.title,
this.tags,
this.spout,
this.error,
this.icon
)
fun Source.toEntity(): SourceEntity =
SourceEntity(
this.id,
this.title,
this.tags,
this.spout,
this.error,
this.icon.orEmpty()
)
fun Tag.toEntity(): TagEntity =
TagEntity(
this.tag,
this.color,
this.unread
)
fun ItemEntity.toView(): Item =
Item(
this.id,
this.datetime,
this.title,
this.content,
this.unread,
this.starred,
this.thumbnail,
this.icon,
this.link,
this.sourcetitle,
this.tags
)
fun Item.toEntity(): ItemEntity =
ItemEntity(
this.id,
this.datetime,
this.title,
this.content,
this.unread,
this.starred,
this.thumbnail,
this.icon,
this.link,
this.sourcetitle,
this.tags
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,4 +0,0 @@
<vector android:height="24dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
</vector>

View File

@ -1,4 +0,0 @@
<vector android:height="24dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-1.91l-0.01,-0.01L23,10z"/>
</vector>

View File

@ -10,22 +10,22 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ToolBarStyle" app:theme="@style/ToolBarStyle"
app:popupTheme="?attr/toolbarPopupTheme" /> app:popupTheme="?attr/toolbarPopupTheme" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:paddingBottom="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
@ -121,7 +121,7 @@
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
app:layout_constraintVertical_bias="0.0"/> app:layout_constraintVertical_bias="0.0"/>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<ProgressBar <ProgressBar
android:id="@+id/progress" android:id="@+id/progress"

View File

@ -30,13 +30,13 @@
app:prompt_view_background_color="?attr/colorAccent" app:prompt_view_background_color="?attr/colorAccent"
app:prompt_view_thanks_display_time_ms="2000"/> app:prompt_view_thanks_display_time_ms="2000"/>
<android.support.design.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordLayout" android:id="@+id/coordLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@id/promptView"> android:layout_below="@id/promptView">
<android.support.design.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/intern_coordLayout" android:id="@+id/intern_coordLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -46,18 +46,18 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolBar" android:id="@+id/toolBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ToolBarStyle" app:theme="@style/ToolBarStyle"
app:popupTheme="?attr/toolbarPopupTheme" /> app:popupTheme="?attr/toolbarPopupTheme" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<FrameLayout <FrameLayout
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
@ -66,7 +66,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -86,30 +86,30 @@
android:text="@string/nothing_here" android:text="@string/nothing_here"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Headline" android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:background="@color/transparent" android:background="@android:color/transparent"
android:visibility="gone" /> android:visibility="gone" />
<android.support.v7.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/transparent" android:background="@android:color/transparent"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingBottom="60dp" android:paddingBottom="60dp"
android:scrollbars="vertical" android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout> </LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</FrameLayout> </FrameLayout>
</LinearLayout> </LinearLayout>
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.ashokvarma.bottomnavigation.BottomNavigationBar <com.ashokvarma.bottomnavigation.BottomNavigationBar
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:id="@+id/bottomBar" android:id="@+id/bottomBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp"/> android:layout_height="60dp"/>
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
</RelativeLayout> </RelativeLayout>

View File

@ -6,18 +6,18 @@
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:orientation="vertical" android:orientation="vertical"
tools:context="apps.amine.bou.readerforselfoss.LoginActivity"> tools:context="apps.amine.bou.readerforselfoss.LoginActivity">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ToolBarStyle" app:theme="@style/ToolBarStyle"
app:popupTheme="?attr/toolbarPopupTheme" /> app:popupTheme="?attr/toolbarPopupTheme" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -45,7 +45,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/urlLayout" android:id="@+id/urlLayout"
@ -60,7 +60,7 @@
android:inputType="textUri" android:inputType="textUri"
android:maxLines="1" /> android:maxLines="1" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<Switch <Switch
android:text="@string/withLoginSwitch" android:text="@string/withLoginSwitch"
@ -69,7 +69,7 @@
android:id="@+id/withLogin" android:id="@+id/withLogin"
android:layout_weight="1"/> android:layout_weight="1"/>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginLayout" android:id="@+id/loginLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -83,9 +83,9 @@
android:inputType="text" android:inputType="text"
android:maxLines="1" /> android:maxLines="1" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/passwordLayout" android:id="@+id/passwordLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -99,7 +99,7 @@
android:inputType="textPassword" android:inputType="textPassword"
android:maxLines="1" /> android:maxLines="1" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<Switch <Switch
android:id="@+id/withHttpLogin" android:id="@+id/withHttpLogin"
@ -108,7 +108,7 @@
android:layout_weight="1" android:layout_weight="1"
android:text="@string/withHttpLoginSwitch" /> android:text="@string/withHttpLoginSwitch" />
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/httpLoginInput" android:id="@+id/httpLoginInput"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -120,9 +120,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/prompt_http_login" /> android:hint="@string/prompt_http_login" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/httpPasswordInput" android:id="@+id/httpPasswordInput"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -134,7 +134,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/prompt_http_password" android:hint="@string/prompt_http_password"
android:inputType="textPassword" /> android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<Switch <Switch
android:id="@+id/withSelfhostedCert" android:id="@+id/withSelfhostedCert"

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="apps.amine.bou.readerforselfoss.MainActivity"> tools:context="apps.amine.bou.readerforselfoss.MainActivity">
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:id="@+id/reader_activity_view"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout" android:id="@+id/appBarLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -12,16 +13,16 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolBar" android:id="@+id/toolBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:popupTheme="?attr/toolbarPopupTheme" app:popupTheme="?attr/toolbarPopupTheme"
app:theme="@style/ToolBarStyle" /> app:theme="@style/ToolBarStyle" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<android.support.v4.view.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/pager" android:id="@+id/pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
@ -41,4 +42,4 @@
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/pager" /> app:layout_constraintTop_toTopOf="@+id/pager" />
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,33 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="apps.amine.bou.readerforselfoss.SourcesActivity"> tools:context="apps.amine.bou.readerforselfoss.SourcesActivity">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ToolBarStyle" app:theme="@style/ToolBarStyle"
app:popupTheme="?attr/toolbarPopupTheme" /> app:popupTheme="?attr/toolbarPopupTheme" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<android.support.v7.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scrollbars="vertical" android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView> </androidx.recyclerview.widget.RecyclerView>
<android.support.design.widget.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab" android:id="@+id/fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -42,4 +42,4 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginRight="16dp" android:layout_marginRight="16dp"
app:layout_behavior="apps.amine.bou.readerforselfoss.utils.ScrollAwareFABBehavior" /> app:layout_behavior="apps.amine.bou.readerforselfoss.utils.ScrollAwareFABBehavior" />
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView <androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
@ -18,7 +18,7 @@
card_view:cardUseCompatPadding="true" card_view:cardUseCompatPadding="true"
card_view:layout_constraintBottom_toBottomOf="parent"> card_view:layout_constraintBottom_toBottomOf="parent">
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -34,7 +34,7 @@
app:srcCompat="@drawable/background_splash" app:srcCompat="@drawable/background_splash"
card_view:layout_constraintBottom_toTopOf="@+id/constraintLayout" /> card_view:layout_constraintBottom_toTopOf="@+id/constraintLayout" />
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/constraintLayout"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -143,7 +143,7 @@
</RelativeLayout> </RelativeLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</android.support.v7.widget.CardView> </androidx.cardview.widget.CardView>

View File

@ -1,4 +1,4 @@
<android.support.design.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -6,12 +6,12 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"> android:descendantFocusability="blocksDescendants">
<android.support.v4.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView" android:id="@+id/nestedScrollView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -70,9 +70,9 @@
app:layout_constraintTop_toBottomOf="@+id/source" app:layout_constraintTop_toBottomOf="@+id/source"
tools:visibility="visible" /> tools:visibility="visible" />
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</android.support.v4.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -89,7 +89,7 @@
android:layout_gravity="bottom" android:layout_gravity="bottom"
app:floatingMenu="@menu/reader_toolbar" /> app:floatingMenu="@menu/reader_toolbar" />
<android.support.design.widget.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab" android:id="@+id/fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -123,4 +123,4 @@
android:progressTint="?attr/colorAccent" /> android:progressTint="?attr/colorAccent" />
</FrameLayout> </FrameLayout>
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -11,7 +11,6 @@
android:id="@+id/itemImage" android:id="@+id/itemImage"
android:layout_width="88dp" android:layout_width="88dp"
android:layout_height="88dp" android:layout_height="88dp"
app:layout_constraintBottom_toBottomOf="@+id/actionBar"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -40,79 +39,16 @@
android:id="@+id/sourceTitleAndDate" android:id="@+id/sourceTitleAndDate"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:gravity="start" android:gravity="start"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@+id/actionBar"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/itemImage" app:layout_constraintStart_toEndOf="@+id/itemImage"
app:layout_constraintTop_toBottomOf="@+id/title" app:layout_constraintTop_toBottomOf="@+id/title"
tools:text="Google Actualité Il y a 5h" /> tools:text="Google Actualité Il y a 5h" />
<RelativeLayout </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/actionBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="#BBBBBB"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible">
<com.like.LikeButton
android:id="@+id/favButton"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:elevation="5dp"
android:padding="4dp"
app:icon_size="22dp"
app:icon_type="heart" />
<ImageButton
android:id="@+id/shareBtn"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/favButton"
android:layout_toStartOf="@+id/favButton"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:backgroundTint="?android:attr/textColorPrimary"
android:elevation="5dp"
android:padding="4dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_share_black_24dp" />
<ImageButton
android:id="@+id/browserBtn"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/shareBtn"
android:layout_toStartOf="@+id/shareBtn"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:backgroundTint="?android:attr/textColorPrimary"
android:elevation="5dp"
android:padding="4dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_open_in_browser_black_24dp" />
</RelativeLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:theme="@style/ToolBarStyle" app:theme="@style/ToolBarStyle"
app:popupTheme="?attr/toolbarPopupTheme" /> app:popupTheme="?attr/toolbarPopupTheme" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -52,4 +52,4 @@
android:layout_width="34dp" android:layout_width="34dp"
android:layout_height="34dp"/> android:layout_height="34dp"/>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -6,13 +6,13 @@
android:title="@string/menu_home_search" android:title="@string/menu_home_search"
android:icon="@drawable/ic_action_search" android:icon="@drawable/ic_action_search"
app:showAsAction="ifRoom|collapseActionView" app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView" /> app:actionViewClass="androidx.appcompat.widget.SearchView" />
<item android:id="@+id/readAll" <item android:id="@+id/readAll"
android:icon="@drawable/ic_done_all_white_24dp" android:icon="@drawable/ic_done_all_white_24dp"
android:title="@string/readAll" android:title="@string/readAll"
android:orderInCategory="1" android:orderInCategory="1"
app:showAsAction="ifRoom"/> app:showAsAction="always"/>
<item <item
android:id="@+id/refresh" android:id="@+id/refresh"
@ -20,11 +20,6 @@
android:orderInCategory="99" android:orderInCategory="99"
android:title="@string/menu_home_refresh" /> android:title="@string/menu_home_refresh" />
<item
android:id="@+id/action_share_the_app"
android:orderInCategory="102"
android:title="@string/menu_share_the_app" />
<item android:id="@+id/action_disconnect" <item android:id="@+id/action_disconnect"
android:title="@string/action_disconnect" android:title="@string/action_disconnect"
android:orderInCategory="104" android:orderInCategory="104"

View File

@ -2,6 +2,12 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/unread_action"
android:icon="@drawable/ic_fiber_new"
android:title="@string/unmark"
app:showAsAction="ifRoom" />
<item <item
android:id="@+id/more_action" android:id="@+id/more_action"
android:icon="@drawable/ic_chrome_reader_mode" android:icon="@drawable/ic_chrome_reader_mode"

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Lector per a Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Inicia la sessió"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Contrasenya"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"Contrasenya HTTP"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Vés-hi"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"La contrasenya és massa curta"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Camp necessari"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"URL"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Autenticació (si és necessària)"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"Autenticació HTTP (si és necessària)"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Pot ser que falti una \"/\" al final de l'url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Nom d'usuari"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"Nom d'usuari HTTP"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Comparteix"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Llegeix-ho tot"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Desconnecta't"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Configuració"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Etiqueta1, Etiqueta2, Etiqueta3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Enllaç"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Nom"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Afegeix una font"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Desa"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Torneu a comprovar la informació."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"No s'han llegit totes les publicacions"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"S'han llegit totes les publicacions"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"No es poden obtenir preferits"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"No es pot accedir als articles nous"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"No es poden llegir els articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"No hi ha res"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"Nou"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"Tot"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Preferits"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"Quant a"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Element llegit"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Desfés"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Inicieu la sessió per afegir fonts."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"No es pot obtenir la llista de fonts."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"No es pot crear la font."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"No es pot obtenir la llista de canals."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"El formulari no està complet"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Enllaços"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Detector de problemes"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Informa d'un error o pregunta sobre funcions noves"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"ADVERTÈNCIA"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Visualització de targeta"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"No es pot marcar l'article com a preferit"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"No es pot treure l'element de preferits"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Comparteix"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Us agrada l'aplicació?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Sí."</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"No gaire…"</string>
<string name="rating_prompt_no">"Not really …"</string> <string name="rating_prompt_feedback_title">"Ens podeu dir per què?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"D'acord."</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Ara no."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Perfecte! Ens podeu puntuar a la Botiga?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sí."</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Ara no."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Gràcies. La vostra opinió ens ajuda a millorar l'aplicació."</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Mostra el recompte d'articles no llegits amb un distintiu a la barra inferior."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Recompte d'articles no llegits"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Recompte d'articles llegits i preferits"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"Sembla que esteu utilitzant un URL no vàlid. Assegureu-vos que és correcte, i si el problema persisteix, poseu-vos en contacte amb mi (a través de l'enllaç de contacte que hi ha a la Botiga). Tingueu en compte que per utilitzar aquesta aplicació cal que també utilitzeu Selfoss. Si no, no podreu accedir a canals RSS."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Obre els enllaços dins de l'aplicació"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Els articles s'obriran dins de l'aplicació"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Els articles s'obriran amb el navegador predeterminat"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Obre el visualitzador d'articles"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"S'obrirà el visualitzador d'articles en lloc del navegador intern"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"S'obrirà el navegador intern en lloc del visualitzador d'articles"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Gestió d'enllaços"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Visualització"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"Els articles es mostraran com a targetes"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"Els articles es mostraran en forma de llista"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Actualitza l'accés remot"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"S'ha actualitzat el remot. Torneu a carregar la llista d'articles"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"L'actualització no ha funcionat. Torneu a provar-ho més tard o consulteu els registres de Selfoss."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"S'està actualitzant"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Alçada completa de les targetes</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">L\'alçada de les targetes s\'ajustarà al seu contingut</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">L\'alçada de les targetes serà fixa</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Codi font</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">No es pot marcar l\'article com a llegit</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">S\'ha produït un error en carregar les etiquetes</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">S\'ha produït un error en carregar les fonts</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filtres</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">Esborra</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Etiquetes</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Fonts</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">Edita</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No s\'ha carregat cap etiqueta</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No s\'ha carregat cap font</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">S\'està carregant…</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Cerca</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">No es pot suprimir la font</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">S\'ha produït un error en comunicar-se amb la instància de Selfoss. Si el problema persisteix, posa\'t en contacte amb mi.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Temes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Predeterminat</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Predeterminat/Fosc</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Depuració</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Registra els errors d\'inici de sessió</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Es registraran tots els errors que es produeixin a la pàgina d\'inici de sessió</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No es registrarà cap error que es produeixi a la pàgina d\'inici de sessió</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Depuració</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Utilitzeu un certificat autoallotjat?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Per raons de seguretat, els certificats autosignats no seran compatibles per defecte. En activar aquesta opció, sereu responsable de qualsevol problema de seguretat que es pugui produir.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">API de Selfoss</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Nombre d\'elements carregats</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Voleu llegir els articles que apareixen com a no llegits?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No es registraran quan es marquen elements com a llegits</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Les crides de l\'API es registraran en marcar un article com a llegit</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Identificador de depuració</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">S\'ha copiat l\'identificador al porta-retalls</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Mostra una capçalera amb la instància URL de Selfoss al panell lateral.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Capçalera de me</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Registra totes les crides de l\'API</string>
<string name="default_theme">Default</string> <string name="login_everything_on">Aquesta acció registrarà totes les crides de l\'API per als programadors.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No es registrarà cap crida de l\'API</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Carrega articles en desplaçar</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Traducció</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">L\'element URL no és vàlid. Estic intentant solucionar aquest problema perquè l\'aplicació no falli.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Informa d\'un error</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">El nombre d\'elements ha de ser enter.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Més informació</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Obre al navegador</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Comparteix</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Es marcaran els articles com a llegits en lliscar el dit d\'un article a l\'altre.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Afegeix als preferits</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Suprimeix dels preferits</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Mida de la lletra del lector darticles</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Visualitzador d\'articles</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">Aquesta acció actualitzarà la vostra instància de Selfoss.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">Aquesta acció marcarà els elements com a llegits.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Marca com a llegit en lliscar el dit</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">No es marcaran els articles com a llegits en lliscar el dit d\'un article a l\'altre.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">Aquesta aplicació no recull cap dada personal. S\'han suprimit totes les eines d\'anàlisi. A partir d\'ara, l\'enviament d\'informes és opcional, així com el registre de depuració d\'errors. Recordeu que la depuració i els informes d\'error són essencials per al desenvolupament de l\'aplicació (Ho podeu configurar tot a Configuració &gt; Depura).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">Aquesta aplicació no comparteix cap dada personal vostra.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Alguna cosa ha anat malament. Envieu l\'informe al desenvolupador.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">Podeu afegir informació útil en la secció de comentaris. No incloeu cap dada personal en el vostre comentari. També em podeu enviar un correu electrònic amb l\'identificador de depuració i us ho faré saber quan el problema s\'hagi resolt.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Envia informes d\'error automàtics</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">S\'enviaran informes d\'error automàticament</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Us preguntarem abans d\'enviar un informe d\'error.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Informes d\'error</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Registre de depuració (s\'enviarà automàticament)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Habilita el registre</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader für selfoss"</string> <string name="app_name">"Reader für selfoss"</string>
<string name="title_activity_login">"Anmelden"</string> <string name="title_activity_login">"Anmelden"</string>
<string name="prompt_password">"Passwort"</string> <string name="prompt_password">"Passwort"</string>
<string name="prompt_http_password">"HTTP Passwort"</string> <string name="prompt_http_password">"HTTP Passwort"</string>
<string name="action_sign_in">"Fortfahren"</string> <string name="action_sign_in">"Fortfahren"</string>
<string name="error_invalid_password">"Passwort ist nicht lang genug"</string> <string name="error_invalid_password">"Passwort ist nicht lang genug"</string>
<string name="error_field_required">"Pflichtfeld"</string> <string name="error_field_required">"Pflichtfeld"</string>
<string name="prompt_url">"URL"</string> <string name="prompt_url">"URL"</string>
<string name="withLoginSwitch">"Anmeldung erforderlich?"</string> <string name="withLoginSwitch">"Anmeldung erforderlich?"</string>
<string name="withHttpLoginSwitch">"HTTP Anmeldung erforderlich?"</string> <string name="withHttpLoginSwitch">"HTTP Anmeldung erforderlich?"</string>
<string name="login_url_problem">"Ups. Du musst eventuell ein \"/\" am Ende der URL anhängen."</string> <string name="login_url_problem">"Ups. Du musst eventuell ein \"/\" am Ende der URL anhängen."</string>
<string name="prompt_login">"Benutzername"</string> <string name="prompt_login">"Benutzername"</string>
<string name="prompt_http_login">"HTTP Benutzername"</string> <string name="prompt_http_login">"HTTP Benutzername"</string>
<string name="label_share">"Teilen"</string> <string name="label_share">"Teilen"</string>
<string name="readAll">"Alle gelesen"</string> <string name="readAll">"Alle gelesen"</string>
<string name="action_disconnect">"Verbindung trennen"</string> <string name="action_disconnect">"Verbindung trennen"</string>
<string name="title_activity_settings">"Einstellungen"</string> <string name="title_activity_settings">"Einstellungen"</string>
<string name="pref_header_general">"Allgemein"</string> <string name="pref_header_general">"Allgemein"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Neue Quelle hinzufügen"</string>
<string name="add_source">"Neue Quelle hinzufügen"</string> <string name="add_source_save">"Speichern"</string>
<string name="add_source_save">"Speichern"</string> <string name="wrong_infos">"Überprüfe deine Angaben noch einmal."</string>
<string name="wrong_infos">"Überprüfe deine Angaben noch einmal."</string> <string name="all_posts_not_read">"Nicht alle Beiträge wurden gelesen"</string>
<string name="all_posts_not_read">"Nicht alle Beiträge wurden gelesen"</string> <string name="all_posts_read">"Alle Beiträge wurden gelesen"</string>
<string name="all_posts_read">"Alle Beiträge wurden gelesen"</string> <string name="cant_get_favs">"Favoriten können nicht abgerufen werden"</string>
<string name="cant_get_favs">"Favoriten können nicht abgerufen werden"</string> <string name="cant_get_new_elements">"Neue Artikel können nicht abgerufen werden"</string>
<string name="cant_get_new_elements">"Neue Artikel können nicht abgerufen werden"</string> <string name="cant_get_read">"Gelese Artikel können nicht abgerufen werden"</string>
<string name="cant_get_read">"Gelese Artikel können nicht abgerufen werden"</string> <string name="nothing_here">"Keine Einträge vorhanden"</string>
<string name="nothing_here">"Keine Einträge vorhanden"</string> <string name="tab_new">"Neu"</string>
<string name="tab_new">"Neu"</string> <string name="tab_read">"Alle"</string>
<string name="tab_read">"Alle"</string> <string name="tab_favs">"Favoriten"</string>
<string name="tab_favs">"Favoriten"</string> <string name="action_about">"Über"</string>
<string name="action_about">"Über"</string> <string name="marked_as_read">"Artikel gelesen"</string>
<string name="marked_as_read">"Artikel gelesen"</string> <string name="undo_string">"Rückgängig"</string>
<string name="undo_string">"Rückgängig"</string> <string name="addStringNoUrl">"Melde dich an um Quellen hinzuzufügen."</string>
<string name="addStringNoUrl">"Melde dich an um Quellen hinzuzufügen."</string> <string name="cant_get_sources">"Quellen können nicht abgerufen werden."</string>
<string name="cant_get_sources">"Quellen können nicht abgerufen werden."</string> <string name="cant_create_source">"Quelle kann nicht gespeichert werden."</string>
<string name="cant_create_source">"Quelle kann nicht gespeichert werden."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"Das Formular ist nicht vollständig"</string>
<string name="form_not_complete">"Das Formular ist nicht vollständig"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Melde einen Bug oder rege ein neues Feature an"</string>
<string name="issue_tracker_summary">"Melde einen Bug oder rege ein neues Feature an"</string> <string name="warning_wrong_url">"WARNUNG"</string>
<string name="warning_wrong_url">"WARNUNG"</string> <string name="pref_switch_card_view_title">"Kachelansicht"</string>
<string name="pref_switch_card_view_title">"Kachelansicht"</string> <string name="cant_mark_favortie">"Artikel kann nicht als Favorit markiert werden"</string>
<string name="cant_mark_favortie">"Artikel kann nicht als Favorit markiert werden"</string> <string name="cant_unmark_favortie">"Eintrag kann nicht aus Favoriten entfernt werden"</string>
<string name="cant_unmark_favortie">"Eintrag kann nicht aus Favoriten entfernt werden"</string> <string name="share">"Teilen"</string>
<string name="share">"Teilen"</string> <string name="rating_prompt_title">"Gefällt Dir die App?"</string>
<string name="rating_prompt_title">"Gefällt Dir die App?"</string> <string name="rating_prompt_yes">"Ja!"</string>
<string name="rating_prompt_yes">"Ja!"</string> <string name="rating_prompt_no">"Nicht wirklich…"</string>
<string name="rating_prompt_no">"Nicht wirklich…"</string> <string name="rating_prompt_feedback_title">"Magst du uns sagen warum?"</string>
<string name="rating_prompt_feedback_title">"Magst du uns sagen warum?"</string> <string name="rating_prompt_feedback_yes">"OK!"</string>
<string name="rating_prompt_feedback_yes">"OK!"</string> <string name="rating_prompt_feedback_no">"Nicht jetzt."</string>
<string name="rating_prompt_feedback_no">"Nicht jetzt."</string> <string name="rating_prompt_rating_title">"Wunderbar! Magst du uns im Play Store bewerten?"</string>
<string name="rating_prompt_rating_title">"Wunderbar! Magst du uns im Play Store bewerten?"</string> <string name="rating_prompt_rating_yes">"Sicher!"</string>
<string name="rating_prompt_rating_yes">"Sicher!"</string> <string name="rating_prompt_rating_no">"Nicht jetzt."</string>
<string name="rating_prompt_rating_no">"Nicht jetzt."</string> <string name="rating_prompt_thanks">"Vielen Dank, dein Feedback hilft die App zu verbessern!"</string>
<string name="rating_prompt_thanks">"Vielen Dank, dein Feedback hilft die App zu verbessern!"</string> <string name="switch_unread_count">"Zeige die Zahl ungelesener Artikel in der unteren Leiste."</string>
<string name="switch_unread_count">"Zeige die Zahl ungelesener Artikel in der unteren Leiste."</string> <string name="switch_unread_count_title">"Zeige Anzahl ungelesener Artikel"</string>
<string name="switch_unread_count_title">"Zeige Anzahl ungelesener Artikel"</string> <string name="display_all_counts_title">"Zeige Anzahl der Favoriten und gelesenen Artikel"</string>
<string name="display_all_counts_title">"Zeige Anzahl der Favoriten und gelesenen Artikel"</string> <string name="text_wrong_url">"Sie scheinen eine ungültige URL verwenden. Stellen Sie sicher, dass die URL richtig ist. Sollte das Problem weiterhin bestehen kontaktieren Sie mich (über den Playstore-Kontakt-Link). Bitte beachten Sie, dass Sie Selfoss benötigen um RSS-Feeds zu lesen."</string>
<string name="menu_share_the_app">"Freunde einladen"</string> <string name="pref_general_internal_browser_title">"Öffne Links innerhalb der App"</string>
<string name="invitation_title">"Probiere diese App für deine Selfoss RSS-Feeds!"</string> <string name="pref_general_internal_browser_on">"Artikel werden innerhalb der App geöffnet"</string>
<string name="invitation_message">"Ich benutze diese App für meine Selfoss RSS-Feeds. Vielleicht magst du sie auch!"</string> <string name="pref_general_internal_browser_off">"Artikel werden mit deinem Standard-Browser geöffnet"</string>
<string name="invitation_cta">"Probier die App"</string> <string name="prefer_article_viewer_title">"Verwenden Sie den Artikel-viewer"</string>
<string name="text_wrong_url">"Sie scheinen eine ungültige URL verwenden. Stellen Sie sicher, dass die URL richtig ist. Sollte das Problem weiterhin bestehen kontaktieren Sie mich (über den Playstore-Kontakt-Link). Bitte beachten Sie, dass Sie Selfoss benötigen um RSS-Feeds zu lesen."</string> <string name="prefer_article_viewer_on">"Artikel-Viewer wird anstelle des internen Browser verwendet"</string>
<string name="pref_general_internal_browser_title">"Öffne Links innerhalb der App"</string> <string name="prefer_article_viewer_off">"Der internen Browser wird anstelle des Artikel-Viewer verwendet"</string>
<string name="pref_general_internal_browser_on">"Artikel werden innerhalb der App geöffnet"</string> <string name="pref_general_category_links">"Umgang mit Links"</string>
<string name="pref_general_internal_browser_off">"Artikel werden mit deinem Standard-Browser geöffnet"</string> <string name="pref_general_category_displaying">"Ansicht"</string>
<string name="prefer_article_viewer_title">"Verwenden Sie den Artikel-viewer"</string> <string name="pref_switch_card_view_on">"Artikel werden als Kacheln angezeigt"</string>
<string name="prefer_article_viewer_on">"Artikel-Viewer wird anstelle des internen Browser verwendet"</string> <string name="pref_switch_card_view_off">"Artikel werden als Liste angezeigt"</string>
<string name="prefer_article_viewer_off">"Der internen Browser wird anstelle des Artikel-Viewer verwendet"</string> <string name="menu_home_refresh">"Remote-Aktualisierung"</string>
<string name="pref_general_category_links">"Umgang mit Links"</string> <string name="refresh_success_response">"Selfoss wird aktualisiert, du kannst jetzt die Artikel laden"</string>
<string name="pref_general_category_displaying">"Ansicht"</string> <string name="refresh_failer_message">"Das Update hat nicht funktioniert, versuche es erneut oder überprüfe die Protokolle von Selfoss."</string>
<string name="pref_general_category_actions">"Aktionen"</string> <string name="refresh_in_progress">"Aktualisierung läuft"</string>
<string name="pref_switch_card_view_on">"Artikel werden als Kacheln angezeigt"</string> <string name="card_height_title">Maximale Kartenhöhe</string>
<string name="pref_switch_card_view_off">"Artikel werden als Liste angezeigt"</string> <string name="card_height_on">Kartenhöhe passt sich Inhalt an</string>
<string name="pref_switch_actions_tap_on">"Zeigt die Aktionsleiste unter dem Artikel"</string> <string name="card_height_off">Kartenhöhe ist fix</string>
<string name="pref_switch_actions_tap_off">"Bei der Auswahl eines Artikels wird dieser im ausgewählten Browser geöffnet"</string> <string name="source_code">Quellcode</string>
<string name="menu_home_refresh">"Remote-Aktualisierung"</string> <string name="cant_mark_read">Artikel kann nicht als gelesen markiert werden</string>
<string name="refresh_success_response">"Selfoss wird aktualisiert, du kannst jetzt die Artikel laden"</string> <string name="drawer_error_loading_tags">Fehler beim Laden der Tags…</string>
<string name="refresh_failer_message">"Das Update hat nicht funktioniert, versuche es erneut oder überprüfe die Protokolle von Selfoss."</string> <string name="drawer_error_loading_sources">Fehler beim Laden der Quellen…</string>
<string name="refresh_in_progress">"Aktualisierung läuft"</string> <string name="drawer_item_filters">Filter</string>
<string name="new_apk_available_title">"Eine neue Version ist verfügbar."</string> <string name="drawer_action_clear">leeren</string>
<string name="new_apk_available_message">"Eine neue APK steht im offiziellen Repository zur Verfügung."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Jetzt herunterladen"</string> <string name="drawer_item_sources">Quellen</string>
<string name="new_apk_available_no">"Version ignorieren"</string> <string name="drawer_action_edit">bearbeiten</string>
<string name="intro_hello_title">"Hallo!"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Danke fürs Herunterladen der App!"</string> <string name="no_sources_loaded">Keine Quellen geladen</string>
<string name="intro_needs_selfoss_title">"Bevor du beginnst…"</string> <string name="drawer_loading">Lade…</string>
<string name="intro_needs_selfoss_message">"Die App kann nicht ohne Selfoss-Instanz benutzt werden."</string> <string name="menu_home_search">Suche</string>
<string name="intro_needs_selfoss_link">"Was ist Selfoss?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"Fertig!"</string> <string name="base_url_error">Beim Versuch deine Selfoss-Instanz zu erreichen ist ein Fehler aufgetreten. Solltet dieser Fehler bestehen bleiben, trete bitte mit mir in Kontakt.</string>
<string name="intro_all_set_message">"Sie können die App jetzt verwenden. Vergiss nicht deine App unter \"Einstellungen\" zu konfigurieren. Dort findest du auch einige nützliche Links."</string> <string name="pref_header_theme">Designs</string>
<string name="card_height_title">Maximale Kartenhöhe</string> <string name="default_theme">Standard</string>
<string name="card_height_on">Kartenhöhe passt sich Inhalt an</string> <string name="default_dark_theme">Standard (Dunkel)</string>
<string name="card_height_off">Kartenhöhe ist fix</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Quellcode</string> <string name="login_debug_title">Aktivieren, um Login-Fehler zu protokollieren</string>
<string name="cant_mark_read">Artikel kann nicht als gelesen markiert werden</string> <string name="login_debug_on">Fehler auf der Login-Seite werden protokolliert</string>
<string name="drawer_error_loading_tags">Fehler beim Laden der Tags…</string> <string name="login_debug_off">Fehler auf der Login-Seite werden nicht protokolliert</string>
<string name="drawer_error_loading_sources">Fehler beim Laden der Quellen…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filter</string> <string name="self_hosted_cert_switch">Verwenden Sie einen selbst gehostetes Zertifikat?</string>
<string name="drawer_action_clear">leeren</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">selfoss API</string>
<string name="drawer_item_sources">Quellen</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">bearbeiten</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">Keine Quellen geladen</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Lade…</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Suche</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">Beim Versuch deine Selfoss-Instanz zu erreichen ist ein Fehler aufgetreten. Solltet dieser Fehler bestehen bleiben, trete bitte mit mir in Kontakt.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Designs</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Standard</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Türkis/Orange/Hell</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Hell</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Türkis/Orange/Hell</string> <string name="translation">Übersetzung</string>
<string name="blue_amber_theme">Blau/Amber/Hell</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Hell</string> <string name="drawer_report_bug">Melde einen Fehler</string>
<string name="red_teal_theme">Rot/Türkis/Hell</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Türkis/Orange/Dunkel</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dunkel</string> <string name="reader_action_open">Im Browser öffnen</string>
<string name="default_dark_theme">Standard (Dunkel)</string> <string name="reader_action_share">Teilen</string>
<string name="grey_orange_dark_theme">Grau/Orange/Dunkel</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blau/Gelb/Dunkel</string> <string name="add_to_favs_reader">Zu Favoriten hinzufügen</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dunkel</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Rot/Türkis/Dunkel</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Aktivieren, um Login-Fehler zu protokollieren</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Fehler auf der Login-Seite werden protokolliert</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">Fehler auf der Login-Seite werden nicht protokolliert</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Verwenden Sie einen selbst gehostetes Zertifikat?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">selfoss API</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Übersetzung</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Melde einen Fehler</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Im Browser öffnen</string>
<string name="reader_action_share">Teilen</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Zu Favoriten hinzufügen</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Lector para Selfoss"</string> <string name="app_name">"Lector para Selfoss"</string>
<string name="title_activity_login">"Iniciar sesión"</string> <string name="title_activity_login">"Iniciar sesión"</string>
<string name="prompt_password">"Contraseña"</string> <string name="prompt_password">"Contraseña"</string>
<string name="prompt_http_password">"Contraseña HTTP"</string> <string name="prompt_http_password">"Contraseña HTTP"</string>
<string name="action_sign_in">"Empezar"</string> <string name="action_sign_in">"Empezar"</string>
<string name="error_invalid_password">"La contraseña no es suficientemente larga"</string> <string name="error_invalid_password">"La contraseña no es suficientemente larga"</string>
<string name="error_field_required">"Campo requerido"</string> <string name="error_field_required">"Campo requerido"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Inicio de sesión requerido ?"</string> <string name="withLoginSwitch">"Inicio de sesión requerido ?"</string>
<string name="withHttpLoginSwitch">"Inicio de sesión HTTP requerido ?"</string> <string name="withHttpLoginSwitch">"Inicio de sesión HTTP requerido ?"</string>
<string name="login_url_problem">"Oops. Puede que necesite añadir un \"/\" al final de la url."</string> <string name="login_url_problem">"Oops. Puede que necesite añadir un \"/\" al final de la url."</string>
<string name="prompt_login">"Nombre de usuario"</string> <string name="prompt_login">"Nombre de usuario"</string>
<string name="prompt_http_login">"Nombre de usuario HTTP"</string> <string name="prompt_http_login">"Nombre de usuario HTTP"</string>
<string name="label_share">"Compartir"</string> <string name="label_share">"Compartir"</string>
<string name="readAll">"Leer todo"</string> <string name="readAll">"Leer todo"</string>
<string name="action_disconnect">"Desconectar"</string> <string name="action_disconnect">"Desconectar"</string>
<string name="title_activity_settings">"Configuración"</string> <string name="title_activity_settings">"Configuración"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Acción tocar en los artículos"</string> <string name="add_source_hint_tags">"Etiqueta1, Etiqueta2, Etiqueta3"</string>
<string name="add_source_hint_tags">"Etiqueta1, Etiqueta2, Etiqueta3"</string> <string name="add_source_hint_url">"Enlace"</string>
<string name="add_source_hint_url">"Enlace"</string> <string name="add_source_hint_name">"Nombre"</string>
<string name="add_source_hint_name">"Nombre"</string> <string name="add_source">"Añadir una fuente"</string>
<string name="add_source">"Añadir una fuente"</string> <string name="add_source_save">"Guardar"</string>
<string name="add_source_save">"Guardar"</string> <string name="wrong_infos">"Revise sus datos de nuevo."</string>
<string name="wrong_infos">"Revise sus datos de nuevo."</string> <string name="all_posts_not_read">"No todas las publicaciones fueron leídas"</string>
<string name="all_posts_not_read">"No todas las publicaciones fueron leídas"</string> <string name="all_posts_read">"Todas las publicaciones fueron leídas"</string>
<string name="all_posts_read">"Todas las publicaciones fueron leídas"</string> <string name="cant_get_favs">"No se pueden obtener favoritos"</string>
<string name="cant_get_favs">"No se pueden obtener favoritos"</string> <string name="cant_get_new_elements">"No puede recibir nuevos artículos"</string>
<string name="cant_get_new_elements">"No puede recibir nuevos artículos"</string> <string name="cant_get_read">"No puede recibir artículos leídos"</string>
<string name="cant_get_read">"No puede recibir artículos leídos"</string> <string name="nothing_here">"Nada aquí"</string>
<string name="nothing_here">"Nada aquí"</string> <string name="tab_new">"Nuevo"</string>
<string name="tab_new">"Nuevo"</string> <string name="tab_read">"Todo"</string>
<string name="tab_read">"Todo"</string> <string name="tab_favs">"Favoritos"</string>
<string name="tab_favs">"Favoritos"</string> <string name="action_about">"Acerca de"</string>
<string name="action_about">"Acerca de"</string> <string name="marked_as_read">"Artículo leído"</string>
<string name="marked_as_read">"Artículo leído"</string> <string name="undo_string">"Deshacer"</string>
<string name="undo_string">"Deshacer"</string> <string name="addStringNoUrl">"Iniciar sesión para añadir fuentes."</string>
<string name="addStringNoUrl">"Iniciar sesión para añadir fuentes."</string> <string name="cant_get_sources">"No se puede obtener la lista de fuentes."</string>
<string name="cant_get_sources">"No se puede obtener la lista de fuentes."</string> <string name="cant_create_source">"No se puede crear la fuente."</string>
<string name="cant_create_source">"No se puede crear la fuente."</string> <string name="cant_get_spouts">"No se puede obtener la lista de fuentes."</string>
<string name="cant_get_spouts">"No se puede obtener la lista de fuentes."</string> <string name="form_not_complete">"El formulario no está completo"</string>
<string name="form_not_complete">"El formulario no está completo"</string> <string name="pref_header_links">"Enlaces"</string>
<string name="pref_header_links">"Enlaces"</string> <string name="issue_tracker_link">"Rastreador de Incidencias"</string>
<string name="issue_tracker_link">"Rastreador de Incidencias"</string> <string name="issue_tracker_summary">"Reportar un error o solicitar una nueva función"</string>
<string name="issue_tracker_summary">"Reportar un error o solicitar una nueva función"</string> <string name="warning_wrong_url">"ADVERTENCIA"</string>
<string name="warning_wrong_url">"ADVERTENCIA"</string> <string name="pref_switch_card_view_title">"Vista de la tarjeta"</string>
<string name="pref_switch_card_view_title">"Vista de la tarjeta"</string> <string name="cant_mark_favortie">"No puede marcar el artículo como favorito"</string>
<string name="cant_mark_favortie">"No puede marcar el artículo como favorito"</string> <string name="cant_unmark_favortie">"No se puede quitar el artículo de favoritos"</string>
<string name="cant_unmark_favortie">"No se puede quitar el artículo de favoritos"</string> <string name="share">"Compartir"</string>
<string name="share">"Compartir"</string> <string name="rating_prompt_title">"¿Disfrutando la aplicación?"</string>
<string name="rating_prompt_title">"¿Disfrutando la aplicación?"</string> <string name="rating_prompt_yes">"¡Sí!"</string>
<string name="rating_prompt_yes">"¡Sí!"</string> <string name="rating_prompt_no">"La verdad es que no…"</string>
<string name="rating_prompt_no">"La verdad es que no…"</string> <string name="rating_prompt_feedback_title">"¿Puede decirnos por qué?"</string>
<string name="rating_prompt_feedback_title">"¿Puede decirnos por qué?"</string> <string name="rating_prompt_feedback_yes">"¡Vale!"</string>
<string name="rating_prompt_feedback_yes">"¡Vale!"</string> <string name="rating_prompt_feedback_no">"Ahora no."</string>
<string name="rating_prompt_feedback_no">"Ahora no."</string> <string name="rating_prompt_rating_title">"¡Excelente! ¿Puede valorarnos en la tienda?"</string>
<string name="rating_prompt_rating_title">Excelente! ¿Puede valorarnos en la tienda?"</string> <string name="rating_prompt_rating_yes">Claro!"</string>
<string name="rating_prompt_rating_yes">"¡Claro!"</string> <string name="rating_prompt_rating_no">"No en este momento."</string>
<string name="rating_prompt_rating_no">"No en este momento."</string> <string name="rating_prompt_thanks">"¡Gracias, sus comentarios ayudan a mejorar la aplicación!"</string>
<string name="rating_prompt_thanks">"¡Gracias, sus comentarios ayudan a mejorar la aplicación!"</string> <string name="switch_unread_count">"Mostrar el recuento no leído como una insignia de la barra inferior."</string>
<string name="switch_unread_count">"Mostrar el recuento no leído como una insignia de la barra inferior."</string> <string name="switch_unread_count_title">"Mostrar recuento no leído"</string>
<string name="switch_unread_count_title">"Mostrar recuento no leído"</string> <string name="display_all_counts_title">"Mostrar recuento de favoritos y leídos"</string>
<string name="display_all_counts_title">"Mostrar recuento de favoritos y leídos"</string> <string name="text_wrong_url">"Parece estar tratando de utilizar una dirección URL inválida. Asegúrese de que sea correcta y si el problema persiste, póngase en contacto conmigo (mediante el enlace de contacto de la tienda). Tenga en cuenta que la aplicación necesita utilizar Selfoss. No se puede acceder al contenido RSS sin él."</string>
<string name="menu_share_the_app">"Invitar amigos"</string> <string name="pref_general_internal_browser_title">"Abrir enlaces dentro de la aplicación"</string>
<string name="invitation_title">"¡Prueba esta aplicación para tu contenido RSS de Selfoss!"</string> <string name="pref_general_internal_browser_on">"Los artículos se abrirán dentro de la aplicación"</string>
<string name="invitation_message">"Yo uso esta aplicación para mi contenido RSS de Selfoss. ¡Te puede gusta también!"</string> <string name="pref_general_internal_browser_off">"Los artículos se abrirán con tu navegador predeterminado"</string>
<string name="invitation_cta">"Probar la aplicación"</string> <string name="prefer_article_viewer_title">"Utilizar el visor de artículo"</string>
<string name="text_wrong_url">"Parece estar tratando de utilizar una dirección URL inválida. Asegúrese de que sea correcta y si el problema persiste, póngase en contacto conmigo (mediante el enlace de contacto de la tienda). Tenga en cuenta que la aplicación necesita utilizar Selfoss. No se puede acceder al contenido RSS sin él."</string> <string name="prefer_article_viewer_on">"Se usará el visor de artículos en lugar del navegador interno"</string>
<string name="pref_general_internal_browser_title">"Abrir enlaces dentro de la aplicación"</string> <string name="prefer_article_viewer_off">"Se utilizará el navegador interno en lugar del visor de artículo"</string>
<string name="pref_general_internal_browser_on">"Los artículos se abrirán dentro de la aplicación"</string> <string name="pref_general_category_links">"Control de enlaces"</string>
<string name="pref_general_internal_browser_off">"Los artículos se abrirán con tu navegador predeterminado"</string> <string name="pref_general_category_displaying">"Mostrando"</string>
<string name="prefer_article_viewer_title">"Utilizar el visor de artículo"</string> <string name="pref_switch_card_view_on">"Los artículos se mostrarán como tarjetas"</string>
<string name="prefer_article_viewer_on">"Se usará el visor de artículos en lugar del navegador interno"</string> <string name="pref_switch_card_view_off">"Los artículos se mostrarán como una lista"</string>
<string name="prefer_article_viewer_off">"Se utilizará el navegador interno en lugar del visor de artículo"</string> <string name="menu_home_refresh">"Actualizar remoto"</string>
<string name="pref_general_category_links">"Control de enlaces"</string> <string name="refresh_success_response">"Se actualizó el remoto, ahora puede recargar la lista de artículos"</string>
<string name="pref_general_category_displaying">"Mostrando"</string> <string name="refresh_failer_message">"La actualización no funcionó, inténtalo más tarde o compruebe los registros de selfoss."</string>
<string name="pref_general_category_actions">"Acciones"</string> <string name="refresh_in_progress">"Actualización en progreso"</string>
<string name="pref_switch_card_view_on">"Los artículos se mostrarán como tarjetas"</string> <string name="card_height_title">Tarjetas de altura completas</string>
<string name="pref_switch_card_view_off">"Los artículos se mostrarán como una lista"</string> <string name="card_height_on">Altura de tarjetas se ajustará a su contenido</string>
<string name="pref_switch_actions_tap_on">"Muestra la barra de acción debajo del artículo"</string> <string name="card_height_off">Se fijará la altura de la tarjeta</string>
<string name="pref_switch_actions_tap_off">"Al seleccionar un artículo se abrirá en el navegador seleccionado"</string> <string name="source_code">Código fuente</string>
<string name="menu_home_refresh">"Actualizar remoto"</string> <string name="cant_mark_read">No puede marcar el artículo como leído</string>
<string name="refresh_success_response">"Se actualizó el remoto, ahora puede recargar la lista de artículos"</string> <string name="drawer_error_loading_tags">Error al cargar etiquetas…</string>
<string name="refresh_failer_message">"La actualización no funcionó, inténtalo más tarde o compruebe los registros de selfoss."</string> <string name="drawer_error_loading_sources">Error al cargar fuentes…</string>
<string name="refresh_in_progress">"Actualización en progreso"</string> <string name="drawer_item_filters">Filtros</string>
<string name="new_apk_available_title">"Una nueva versión está disponible."</string> <string name="drawer_action_clear">limpiar</string>
<string name="new_apk_available_message">"Un APK nuevo está disponible para descarga en el repositorio oficial."</string> <string name="drawer_item_tags">Etiquetas</string>
<string name="new_apk_available_get">"Descargar ahora"</string> <string name="drawer_item_sources">Fuentes</string>
<string name="new_apk_available_no">"Ignorar versión"</string> <string name="drawer_action_edit">editar</string>
<string name="intro_hello_title">"¡Hola!"</string> <string name="no_tags_loaded">No hay etiquetas cargadas</string>
<string name="intro_hello_message">"¡Gracias por descargar la aplicación!"</string> <string name="no_sources_loaded">No hay fuentes cargadas</string>
<string name="intro_needs_selfoss_title">"Antes de empezar…"</string> <string name="drawer_loading">Cargando…</string>
<string name="intro_needs_selfoss_message">"No se puede utilizar la aplicación sin una instancia de Selfoss."</string> <string name="menu_home_search">Buscar</string>
<string name="intro_needs_selfoss_link">"¿Qué es Selfoss?"</string> <string name="can_delete_source">No se puede eliminar la fuente…</string>
<string name="intro_all_set_title">"¡Todo listo!"</string> <string name="base_url_error">Hubo un problema al intentar comunicarse con su instancia de Selfoss. Si el problema persiste, póngase en contacto conmigo.</string>
<string name="intro_all_set_message">"Estás listo para utilizar la aplicación. No olvides ir a la página de configuración para configurar su aplicación, y donde usted encontrará algunos enlaces útiles."</string> <string name="pref_header_theme">Temas</string>
<string name="card_height_title">Tarjetas de altura completas</string> <string name="default_theme">Predeterminado</string>
<string name="card_height_on">Altura de tarjetas se ajustará a su contenido</string> <string name="default_dark_theme">Predeterminado/Oscuro</string>
<string name="card_height_off">Se fijará la altura de la tarjeta</string> <string name="pref_header_debug">Depurar</string>
<string name="source_code">Código fuente</string> <string name="login_debug_title">Activar para registrar errores de inicio de sesión</string>
<string name="cant_mark_read">No puede marcar el artículo como leído</string> <string name="login_debug_on">Cualquier error en la página de inicio de sesión se registrará</string>
<string name="drawer_error_loading_tags">Error al cargar etiquetas…</string> <string name="login_debug_off">No hay registro en la página de inicio de sesión</string>
<string name="drawer_error_loading_sources">Error al cargar fuentes…</string> <string name="login_menu_debug">Depurar</string>
<string name="drawer_item_filters">Filtros</string> <string name="self_hosted_cert_switch">Utilizando un certificado alojado propiamente ?</string>
<string name="drawer_action_clear">limpiar</string> <string name="self_signed_cert_warning">Por razones de seguridad, los certificados propios no son compatibles por defecto. Activando esto, no seré responsable de cualquier problema de seguridad que encuentre.</string>
<string name="drawer_item_tags">Etiquetas</string> <string name="pref_selfoss_category">Api de Selfoss</string>
<string name="drawer_item_sources">Fuentes</string> <string name="pref_api_items_number_title">Número de artículos cargados</string>
<string name="drawer_action_edit">editar</string> <string name="pref_hidden_tags">Etiquetas ocultas</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">No se pudieron guardar en caché los datos de su cajón</string> <string name="read_debug_title">¿Leer los artículos que aparecen como no leídos?</string>
<string name="no_tags_loaded">No hay etiquetas cargadas</string> <string name="read_debug_off">Sin registro al marcar un elemento como leído</string>
<string name="no_sources_loaded">No hay fuentes cargadas</string> <string name="read_debug_on">Llamadas a la Api se registrarán al marcar un artículo como leído</string>
<string name="drawer_loading">Cargando…</string> <string name="summary_debug_identifier">Identificador de depuración</string>
<string name="menu_home_search">Buscar</string> <string name="unique_id_to_clipboard">Identificador copiado a su portapapeles</string>
<string name="can_delete_source">No se puede eliminar la fuente…</string> <string name="display_header_drawer_summary">Mostrar una cabecera con la url de instancia de selfoss en el cajón lateral.</string>
<string name="base_url_error">Hubo un problema al intentar comunicarse con su instancia de Selfoss. Si el problema persiste, póngase en contacto conmigo.</string> <string name="display_header_drawer_title">Cabecera de cuenta</string>
<string name="pref_header_theme">Temas</string> <string name="login_everything_title">Registrando todas las llamadas a la api</string>
<string name="default_theme">Predeterminado</string> <string name="login_everything_on">Esto registrará cada llamada a la api para propósito de depuración.</string>
<string name="teal_orange_theme">Turquesa/Naranja/Claro</string> <string name="login_everything_off">Ninguna llamada de api se registrará</string>
<string name="cyan_pink_theme">Cian/Rosa/Claro</string> <string name="pref_general_infinite_loading_title">Cargar más artículos en desplazamiento</string>
<string name="grey_orange_theme">Gris/Naranja/Claro</string> <string name="translation">Traducción</string>
<string name="blue_amber_theme">Azul/Ámbar/Claro</string> <string name="cant_open_invalid_url">La url del elemento no es válida. Estoy buscando resolver este problema para que la aplicación no colapse.</string>
<string name="indigo_pink_theme">Índigo/Rosa/Claro</string> <string name="drawer_report_bug">Reportar un error</string>
<string name="red_teal_theme">Rojo/Turquesa/Claro</string> <string name="items_number_should_be_number">El número de artículos debe ser un número entero.</string>
<string name="teal_orange_dark_theme">Turquesa/Naranja/Oscuro</string> <string name="reader_action_more">Leer más</string>
<string name="cyan_pink_dark_theme">Cian/Rosa/Oscuro</string> <string name="reader_action_open">Abrir en el navegador</string>
<string name="default_dark_theme">Predeterminado/Oscuro</string> <string name="reader_action_share">Compartir</string>
<string name="grey_orange_dark_theme">Gris/Naranja/Oscuro</string> <string name="pref_switch_actions_pager_scroll_on">Marcar artículos como leidos al desplazarse entre ellos.</string>
<string name="blue_amber_dark_theme">Azul/Ámbar/Oscuro</string> <string name="add_to_favs_reader">Añadir a Favoritos</string>
<string name="indigo_pink_dark_theme">Índigo/Rosa/Oscuro</string> <string name="remove_to_favs_reader">Eliminar de favoritos</string>
<string name="red_teal_dark_theme">Rojo/Turquesa/Oscuro</string> <string name="pref_content_reader_font_size">Tamaño de la fuente del lector</string>
<string name="pref_header_debug">Depurar</string> <string name="pref_header_viewer">Visor de artículos</string>
<string name="login_debug_title">Activar para registrar errores de inicio de sesión</string> <string name="refresh_dialog_message">Esto actualizará su instancia de Selfoss.</string>
<string name="login_debug_on">Cualquier error en la página de inicio de sesión se registrará</string> <string name="markall_dialog_message">Esto marcará todos los artículos como leídos.</string>
<string name="login_debug_off">No hay registro en la página de inicio de sesión</string> <string name="pref_switch_actions_pager_scroll">Marcar artículos como leídos al deslizar con el dedo hacia los lados</string>
<string name="login_menu_debug">Depurar</string> <string name="pref_switch_actions_pager_scroll_off">No marcar artículos como leídos al deslizar con el dedo hacia los lados.</string>
<string name="self_hosted_cert_switch">Utilizando un certificado alojado propiamente ?</string> <string name="gdpr_dialog_message">La aplicación no recopila ningún dato personal. Todas las herramientas de analítica fueron eliminadas. El envío de informes de errores es opcional, así como los registros de depuración. Ten en cuenta que tanto los registros como los informes de errores son esenciales para el desarrollo de la aplicación (Puedes configurar todo en \"Configuración &gt; Depurar\").</string>
<string name="self_signed_cert_warning">Por razones de seguridad, los certificados propios no son compatibles por defecto. Activando esto, no seré responsable de cualquier problema de seguridad que encuentre.</string> <string name="gdpr_dialog_title">La aplicación no comparte ningún dato personal sobre usted.</string>
<string name="pref_selfoss_category">Api de Selfoss</string> <string name="crash_dialog_text">Algo salió mal. Envié el informe al desarrollador.</string>
<string name="pref_api_items_number_title">Número de artículos cargados</string> <string name="crash_dialog_comment">Puede agregar cualquier información útil en el siguiente comentario. No incluya ningún dato personal en el comentario. Podría enviarme un correo electrónico con el id de depuración para ser notificado cuando el problema se resuelva.</string>
<string name="read_debug_title">¿Leer los artículos que aparecen como no leídos?</string> <string name="pref_acra_alwaysaccept">Enviar automáticamente informe de fallos</string>
<string name="read_debug_off">Sin registro al marcar un elemento como leído</string> <string name="pref_acra_alwaysaccept_enabled">Se enviaran automáticamente los informes de fallos</string>
<string name="read_debug_on">Llamadas a la Api se registrarán al marcar un artículo como leído</string> <string name="pref_acra_alwaysaccept_disabled">Le preguntará al enviar informes de fallos.</string>
<string name="summary_debug_identifier">Identificador de depuración</string> <string name="pref_debug_crash_reports">Informe de fallos</string>
<string name="unique_id_to_clipboard">Identificador copiado a su portapapeles</string> <string name="pref_debug_debug_logs">Registro de depuración (éstos se enviarán sin diálogo)</string>
<string name="display_header_drawer_summary">Mostrar una cabecera con la url de instancia de selfoss en el cajón lateral.</string> <string name="acra_login">Habilitar el registro</string>
<string name="display_header_drawer_title">Cabecera de cuenta</string> <string name="drawer_item_hidden_tags">Etiquetas ocultas</string>
<string name="login_everything_title">Registrando todas las llamadas a la api</string> <string name="unmark">Marcar artículo como no leído</string>
<string name="login_everything_on">Esto registrará cada llamada a la api para propósito de depuración.</string> <string name="pref_header_offline">Sin conexión y caché</string>
<string name="login_everything_off">Ninguna llamada de api se registrará</string> <string name="pref_switch_items_caching_off">Los artículos no se guardarán en la memoria del dispositivo y la aplicación no se podrá utilizar sin conexión.</string>
<string name="pref_general_infinite_loading_title">Cargar más artículos en desplazamiento</string> <string name="pref_switch_items_caching_on">Los artículos se guardarán en la memoria del dispositivo y se utilizarán para el uso sin conexión.</string>
<string name="translation">Traducción</string> <string name="pref_switch_items_caching">Guardar elementos para uso sin conexión</string>
<string name="cant_open_invalid_url">La url del elemento no es válida. Estoy buscando resolver este problema para que la aplicación no colapse.</string> <string name="no_network_connectivity">Sin conexión!</string>
<string name="drawer_report_bug">Reportar un error</string>
<string name="items_number_should_be_number">El número de artículos debe ser un número entero.</string>
<string name="reader_action_more">Leer más</string>
<string name="reader_action_open">Abrir en el navegador</string>
<string name="reader_action_share">Compartir</string>
<string name="pref_switch_actions_pager_scroll_on">Marcar artículos como leidos al desplazarse entre ellos.</string>
<string name="add_to_favs_reader">Añadir a Favoritos</string>
<string name="remove_to_favs_reader">Eliminar de favoritos</string>
<string name="pref_content_reader_font_size">Tamaño de la fuente</string>
<string name="pref_header_viewer">Visor de artículos</string>
<string name="refresh_dialog_message">Esto actualizará su instancia de Selfoss.</string>
<string name="markall_dialog_message">Esto marcará todos los artículos como leídos.</string>
<string name="pref_switch_actions_pager_scroll">Marcar como leído al arrastrar</string>
<string name="pref_switch_actions_pager_scroll_off">No marca artículos como leídos al arrastrar.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Login"</string> <string name="title_activity_login">"Login"</string>
<string name="prompt_password">"Mot de passe"</string> <string name="prompt_password">"Mot de passe"</string>
<string name="prompt_http_password">"Mot de passe HTTP"</string> <string name="prompt_http_password">"Mot de passe HTTP"</string>
<string name="action_sign_in">"Valider"</string> <string name="action_sign_in">"Valider"</string>
<string name="error_invalid_password">"Mot de passe trop court"</string> <string name="error_invalid_password">"Mot de passe trop court"</string>
<string name="error_field_required">"Champ requis"</string> <string name="error_field_required">"Champ requis"</string>
<string name="prompt_url">"Url Selfoss"</string> <string name="prompt_url">"Url Selfoss"</string>
<string name="withLoginSwitch">"Avec login ?"</string> <string name="withLoginSwitch">"Avec login ?"</string>
<string name="withHttpLoginSwitch">"Avec login HTTP ?"</string> <string name="withHttpLoginSwitch">"Avec login HTTP ?"</string>
<string name="login_url_problem">"Petit souci. Il manque peut être un / à la fin ?"</string> <string name="login_url_problem">"Petit souci. Il manque peut être un / à la fin ?"</string>
<string name="prompt_login">"Utilisateur"</string> <string name="prompt_login">"Utilisateur"</string>
<string name="prompt_http_login">"Utilisateur HTTP"</string> <string name="prompt_http_login">"Utilisateur HTTP"</string>
<string name="label_share">"Partager"</string> <string name="label_share">"Partager"</string>
<string name="readAll">"Tout lire"</string> <string name="readAll">"Tout lire"</string>
<string name="action_disconnect">"Déconnecter"</string> <string name="action_disconnect">"Déconnecter"</string>
<string name="title_activity_settings">"Paramètres"</string> <string name="title_activity_settings">"Paramètres"</string>
<string name="pref_header_general">"Général"</string> <string name="pref_header_general">"Général"</string>
<string name="pref_switch_actions_tap_title">"Action du clic sur un article"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Lien"</string>
<string name="add_source_hint_url">"Lien"</string> <string name="add_source_hint_name">"Nom"</string>
<string name="add_source_hint_name">"Nom"</string> <string name="add_source">"Ajouter une source"</string>
<string name="add_source">"Ajouter une source"</string> <string name="add_source_save">"Enregistrer"</string>
<string name="add_source_save">"Enregistrer"</string> <string name="wrong_infos">"Vérifiez vos informations."</string>
<string name="wrong_infos">"Vérifiez vos informations."</string> <string name="all_posts_not_read">"Tous les posts n'ont pas été lus"</string>
<string name="all_posts_not_read">"Tous les posts n'ont pas été lus"</string> <string name="all_posts_read">"Tous les posts sont lus"</string>
<string name="all_posts_read">"Tous les posts sont lus"</string> <string name="cant_get_favs">"Impossible de récupérer les éléments favoris."</string>
<string name="cant_get_favs">"Impossible de récupérer les éléments favoris."</string> <string name="cant_get_new_elements">"Impossible de récupérer les nouveaux éléments."</string>
<string name="cant_get_new_elements">"Impossible de récupérer les nouveaux éléments."</string> <string name="cant_get_read">"Impossible de récupérer les éléments lus."</string>
<string name="cant_get_read">"Impossible de récupérer les éléments lus."</string> <string name="nothing_here">"Il n'y a rien ici !"</string>
<string name="nothing_here">"Il n'y a rien ici !"</string> <string name="tab_new">"Non lus"</string>
<string name="tab_new">"Non lus"</string> <string name="tab_read">"Tous"</string>
<string name="tab_read">"Tous"</string> <string name="tab_favs">"Favoris"</string>
<string name="tab_favs">"Favoris"</string> <string name="action_about">"À propos"</string>
<string name="action_about">"À propos"</string> <string name="marked_as_read">"Marqué comme lu"</string>
<string name="marked_as_read">"Marqué comme lu"</string> <string name="undo_string">"Annuler"</string>
<string name="undo_string">"Annuler"</string> <string name="addStringNoUrl">"Identifiez-vous pour ajouter une source."</string>
<string name="addStringNoUrl">"Identifiez-vous pour ajouter une source."</string> <string name="cant_get_sources">"Impossible de récupérer la liste des sources"</string>
<string name="cant_get_sources">"Impossible de récupérer la liste des sources"</string> <string name="cant_create_source">"Impossible de créer la source."</string>
<string name="cant_create_source">"Impossible de cer la source."</string> <string name="cant_get_spouts">"Impossible de récupérer vos Spouts pour rajouter des sources"</string>
<string name="cant_get_spouts">"Impossible de récupérer vos Spouts pour rajouter des sources"</string> <string name="form_not_complete">"Il manque des données. Terminez le formulaire."</string>
<string name="form_not_complete">"Il manque des données. Terminez le formulaire."</string> <string name="pref_header_links">"Liens utiles"</string>
<string name="pref_header_links">"Liens utiles"</string> <string name="issue_tracker_link">"Suivi des problèmes"</string>
<string name="issue_tracker_link">"Suivi des problèmes"</string> <string name="issue_tracker_summary">"Pour signaler un bug ou demander une nouvelle fonctionnalité"</string>
<string name="issue_tracker_summary">"Pour signaler un bug ou demander une nouvelle fonctionnalité"</string> <string name="warning_wrong_url">"ATTENTION"</string>
<string name="warning_wrong_url">"ATTENTION"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Impossible de marquer l'élément comme favoris"</string>
<string name="cant_mark_favortie">"Impossible de marquer l'élément comme favoris"</string> <string name="cant_unmark_favortie">"Impossible de retirer l'élément des favoris"</string>
<string name="cant_unmark_favortie">"Impossible de retirer l'élément des favoris"</string> <string name="share">"Partager"</string>
<string name="share">"Partager"</string> <string name="rating_prompt_title">"Vous aimez l'application ?"</string>
<string name="rating_prompt_title">"Vous aimez l'application ?"</string> <string name="rating_prompt_yes">"Oui."</string>
<string name="rating_prompt_yes">"Oui."</string> <string name="rating_prompt_no">"Pas vraiment …"</string>
<string name="rating_prompt_no">"Pas vraiment …"</string> <string name="rating_prompt_feedback_title">"Pouvez-vous nous dire pourquoi ?"</string>
<string name="rating_prompt_feedback_title">"Pouvez-vous nous dire pourquoi ?"</string> <string name="rating_prompt_feedback_yes">"Oui !"</string>
<string name="rating_prompt_feedback_yes">"Oui !"</string> <string name="rating_prompt_feedback_no">"Pas maintenant."</string>
<string name="rating_prompt_feedback_no">"Pas maintenant."</string> <string name="rating_prompt_rating_title">"Super ! Pouvez-vous nous noter sur le store ?"</string>
<string name="rating_prompt_rating_title">"Super ! Pouvez-vous nous noter sur le store ?"</string> <string name="rating_prompt_rating_yes">"D'accord !"</string>
<string name="rating_prompt_rating_yes">"D'accord !"</string> <string name="rating_prompt_rating_no">"Peut-être plus tard."</string>
<string name="rating_prompt_rating_no">"Peut-être plus tard."</string> <string name="rating_prompt_thanks">"Merci, cela nous aide à améliorer l'application !"</string>
<string name="rating_prompt_thanks">"Merci, cela nous aide à améliorer l'application !"</string> <string name="switch_unread_count">"Afficher le nombre d'articles non lus sur la barre en bas de l'écran"</string>
<string name="switch_unread_count">"Afficher le nombre d'articles non lus sur la barre en bas de l'écran"</string> <string name="switch_unread_count_title">"Afficher le nombre de non lus"</string>
<string name="switch_unread_count_title">"Afficher le nombre de non lus"</string> <string name="display_all_counts_title">"Afficher le nombre de favoris et d'articles lus"</string>
<string name="display_all_counts_title">"Afficher le nombre de favoris et d'articles lus"</string> <string name="text_wrong_url">"Vous semblez essayer de vous connecter avec une URL invalide. Assurez-vous que c'est la bonne, et si le problème persiste, contactez-moi via le lien du play store. Notez aussi que l'application ne peut fonctionner sans l'application web Selfoss. Vous ne pouvez pas utiliser l'application pour accéder directement aux flux RSS."</string>
<string name="menu_share_the_app">"Inviter des amis"</string> <string name="pref_general_internal_browser_title">"Ouvrir les liens dans l'application"</string>
<string name="invitation_title">"Essaye cette application pour les flux RSS Selfoss !"</string> <string name="pref_general_internal_browser_on">"Les articles s'ouvriront dans l'application"</string>
<string name="invitation_message">"J'utilise cette applications pour mon flux RSS Selfoss. Tu aimeras peut être !"</string> <string name="pref_general_internal_browser_off">"Les articles s'ouvriront dans votre naviguateur par défaut"</string>
<string name="invitation_cta">"Essayer maintenant"</string> <string name="prefer_article_viewer_title">"Utiliser le visionneur d'articles"</string>
<string name="text_wrong_url">"Vous semblez essayer de vous connecter avec une URL invalide. Assurez-vous que c'est la bonne, et si le problème persiste, contactez-moi via le lien du play store. Notez aussi que l'application ne peut fonctionner sans l'application web Selfoss. Vous ne pouvez pas utiliser l'application pour accéder directement aux flux RSS."</string> <string name="prefer_article_viewer_on">"Utiliser le naviguateur interne"</string>
<string name="pref_general_internal_browser_title">"Ouvrir les liens dans l'application"</string> <string name="prefer_article_viewer_off">"Utiliser le naviguateur interne au lieu du visionneur d'articles"</string>
<string name="pref_general_internal_browser_on">"Les articles s'ouvriront dans l'application"</string> <string name="pref_general_category_links">"Gestion des liens"</string>
<string name="pref_general_internal_browser_off">"Les articles s'ouvriront dans votre naviguateur par défaut"</string> <string name="pref_general_category_displaying">"Affichage"</string>
<string name="prefer_article_viewer_title">"Utiliser le visionneur d'articles"</string> <string name="pref_switch_card_view_on">"Les articles seront affichés en forme de carte"</string>
<string name="prefer_article_viewer_on">"Utiliser le naviguateur interne"</string> <string name="pref_switch_card_view_off">"Les articles seront affichés en liste"</string>
<string name="prefer_article_viewer_off">"Utiliser le naviguateur interne au lieu du visionneur d'articles"</string> <string name="menu_home_refresh">"Mettre à jour"</string>
<string name="pref_general_category_links">"Gestion des liens"</string> <string name="refresh_success_response">"Mise à jour effectuée."</string>
<string name="pref_general_category_displaying">"Affichage"</string> <string name="refresh_failer_message">"La mise à jour n'a pas fonctionné. Vérifiez vos logs selfoss."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Mise à jour en cours"</string>
<string name="pref_switch_card_view_on">"Les articles seront affichés en forme de carte"</string> <string name="card_height_title">Taille dynamique des cartes</string>
<string name="pref_switch_card_view_off">"Les articles seront affichés en liste"</string> <string name="card_height_on">La taille de la carte s\'adaptera au contenu</string>
<string name="pref_switch_actions_tap_on">"Afficher la barre d'action sous l'article"</string> <string name="card_height_off">La taille de la carte sera fixe</string>
<string name="pref_switch_actions_tap_off">"Le clic sur un article l'ouvrira dans le navigateur sélectionné"</string> <string name="source_code">Code source</string>
<string name="menu_home_refresh">"Mettre à jour"</string> <string name="cant_mark_read">Impossible de marquer l\'article comme lu</string>
<string name="refresh_success_response">"Mise à jour effectuée."</string> <string name="drawer_error_loading_tags">Erreur lors du chargement des tags…</string>
<string name="refresh_failer_message">"La mise à jour n'a pas fonctionné. Vérifiez vos logs selfoss."</string> <string name="drawer_error_loading_sources">Erreur lors du chargement des sources…</string>
<string name="refresh_in_progress">"Mise à jour en cours"</string> <string name="drawer_item_filters">Filtres</string>
<string name="new_apk_available_title">"Nouvelle version disponible"</string> <string name="drawer_action_clear">raz</string>
<string name="new_apk_available_message">"Une nouvelle version officielle de l'application est disponible."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Télécharger maintenant"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignorer cette version"</string> <string name="drawer_action_edit">éditer</string>
<string name="intro_hello_title">"Hey !"</string> <string name="no_tags_loaded">Pas de tags chargés</string>
<string name="intro_hello_message">"Merci d'avoir installé mon application !"</string> <string name="no_sources_loaded">Pas de sources chargés</string>
<string name="intro_needs_selfoss_title">"Avant de commencer…"</string> <string name="drawer_loading">Chargement …</string>
<string name="intro_needs_selfoss_message">"Cette application ne peut fonctionner sans une instance de Selfoss"</string> <string name="menu_home_search">Rechercher</string>
<string name="intro_needs_selfoss_link">"Où trouver Selfoss ?"</string> <string name="can_delete_source">Impossible de supprimer la source…</string>
<string name="intro_all_set_title">"Tout semble bon !"</string> <string name="base_url_error">Il y a eu un souci lors de la communication avec votre instance Selfoss. Si le problèmes persiste, contactez-moi pour trouver une solution.</string>
<string name="intro_all_set_message">"Vous êtes prêt à utiliser l'application. N'oubliez pas de consulter l'écran de configuration pour paramétrer l'application à votre goût, et trouver toutes sortes de liens utiles."</string> <string name="pref_header_theme">Thèmes</string>
<string name="card_height_title">Taille dynamique des cartes</string> <string name="default_theme">Par défaut</string>
<string name="card_height_on">La taille de la carte s\'adaptera au contenu</string> <string name="default_dark_theme">Par défaut/Foncé</string>
<string name="card_height_off">La taille de la carte sera fixe</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Code source</string> <string name="login_debug_title">Activez pour loguer toutes les erreurs de connexion</string>
<string name="cant_mark_read">Impossible de marquer l\'article comme lu</string> <string name="login_debug_on">Toutes les erreurs de connexion vont être loguées</string>
<string name="drawer_error_loading_tags">Erreur lors du chargement des tags…</string> <string name="login_debug_off">Aucune erreur de connexion ne sera loguée</string>
<string name="drawer_error_loading_sources">Erreur lors du chargement des sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filtres</string> <string name="self_hosted_cert_switch">Certificat auto-signé ?</string>
<string name="drawer_action_clear">raz</string> <string name="self_signed_cert_warning">Pour des raisons de sécurité, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Api Selfoss</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Nombre d\'articles chargés</string>
<string name="drawer_action_edit">éditer</string> <string name="pref_hidden_tags">Tags Cachés</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Impossible de mettre en cache les filtres pour le drawer</string> <string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
<string name="no_tags_loaded">Pas de tags chargés</string> <string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
<string name="no_sources_loaded">Pas de sources chargés</string> <string name="read_debug_on">Les appels API vont être logués lorsqu\'un article est marqué comme lu</string>
<string name="drawer_loading">Chargement …</string> <string name="summary_debug_identifier">Identifiant de debug</string>
<string name="menu_home_search">Rechercher</string> <string name="unique_id_to_clipboard">Texte copié</string>
<string name="can_delete_source">Impossible de supprimer la source…</string> <string name="display_header_drawer_summary">Afficher une entête avec l\'url de votre instance de Selfoss en haut du drawer lateral.</string>
<string name="base_url_error">Il y a eu un souci lors de la communication avec votre instance Selfoss. Si le problèmes persiste, contactez-moi pour trouver une solution.</string> <string name="display_header_drawer_title">Entête de compte</string>
<string name="pref_header_theme">Thèmes</string> <string name="login_everything_title">Log de tous les appels à l\'API</string>
<string name="default_theme">Par défaut</string> <string name="login_everything_on">Tous les appels à l\'API vont êtres logués</string>
<string name="teal_orange_theme">Sarcelle/Orange/Clair</string> <string name="login_everything_off">Aucun appel à l\'API ne sera logué</string>
<string name="cyan_pink_theme">Cyan/Rose/Clair</string> <string name="pref_general_infinite_loading_title">Charger plus d\'articles au scroll</string>
<string name="grey_orange_theme">Gris/Orange/Clair</string> <string name="translation">Traduction</string>
<string name="blue_amber_theme">Bleu/Ambre/Clair</string> <string name="cant_open_invalid_url">Lurl de lélément nest pas valide. En attendant la résolution du problème, le lien ne s\'ouvrira pas.</string>
<string name="indigo_pink_theme">Indigo/Rose/Clair</string> <string name="drawer_report_bug">Signaler un bug</string>
<string name="red_teal_theme">Rouge/Sarcelle/Clair</string> <string name="items_number_should_be_number">Le nombre d\'articles doit être un entier.</string>
<string name="teal_orange_dark_theme">Sarcelle/Orange/Foncé</string> <string name="reader_action_more">Lire plus</string>
<string name="cyan_pink_dark_theme">Cyan/Rose/Foncé</string> <string name="reader_action_open">Ouvrir</string>
<string name="default_dark_theme">Par défaut/Foncé</string> <string name="reader_action_share">Partager</string>
<string name="grey_orange_dark_theme">Gris/Orange/Foncé</string> <string name="pref_switch_actions_pager_scroll_on">Marquer les articles comme lus à la navigation dans le lecteur d\'article.</string>
<string name="blue_amber_dark_theme">Bleu/Ambre/Foncé</string> <string name="add_to_favs_reader">Ajouter aux favoris</string>
<string name="indigo_pink_dark_theme">Indigo/Rose/Foncé</string> <string name="remove_to_favs_reader">Supprimer des favoris</string>
<string name="red_teal_dark_theme">Rouge/Sarcelle/Foncé</string> <string name="pref_content_reader_font_size">Taille du texte du contenu du lecteur d\'articles</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Lecteur d\'articles</string>
<string name="login_debug_title">Activez pour loguer toutes les erreurs de connexion</string> <string name="refresh_dialog_message">En validant, votre instance Selfoss sera mise à jour.</string>
<string name="login_debug_on">Toutes les erreurs de connexion vont être loguées</string> <string name="markall_dialog_message">Marquer tous les éléments comme lus ?</string>
<string name="login_debug_off">Aucune erreur de connexion ne sera loguée</string> <string name="pref_switch_actions_pager_scroll">Marquer comme lu à la navigation.</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Ne pas marquer les articles comme lus à la navigation.</string>
<string name="self_hosted_cert_switch">Certificat auto-signé ?</string> <string name="gdpr_dialog_message">L\'application ne collecte aucune donnée personnelle. Tous les outils d\'analytics ont été supprimés. Les rapports d\'erreurs sont maintenant optionnels, ainsi que les logs. N\'oubliez pas que les rapports d\'erreurs sont essentiels pour la résolution des bugs (vous pouvez configurer tout cela dans Paramètres &gt; Debug).</string>
<string name="self_signed_cert_warning">Pour des raisons de sécurité, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string> <string name="gdpr_dialog_title">L\'application ne partage aucune de vos données.</string>
<string name="pref_selfoss_category">Api Selfoss</string> <string name="crash_dialog_text">Quelque chose s\'est mal passé, S\'il vous plaît, envoyez le rapport au développeur.</string>
<string name="pref_api_items_number_title">Nombre d\'articles chargés</string> <string name="crash_dialog_comment">Vous pouvez ajouter tous les détails utiles dans le champ de commentaire plus bas. N\'ajoutez aucune information personnelle. Vous pouvez m\'envoyer un email avec votre identifiant de debug, et je vous informerai à la correction du problème.</string>
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string> <string name="pref_acra_alwaysaccept">Envoyer automatiquement les rapports d\'erreur</string>
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string> <string name="pref_acra_alwaysaccept_enabled">Enverra automatiquement les rapports d\'erreur</string>
<string name="read_debug_on">Les appels API vont être logués lorsqu\'un article est marqué comme lu</string> <string name="pref_acra_alwaysaccept_disabled">Demandera une confirmation à chaque incident.</string>
<string name="summary_debug_identifier">Identifiant de debug</string> <string name="pref_debug_crash_reports">Rapport d\'erreur</string>
<string name="unique_id_to_clipboard">Texte copié</string> <string name="pref_debug_debug_logs">Log de debug (seront envoyés automatiquement)</string>
<string name="display_header_drawer_summary">Afficher une entête avec l\'url de votre instance de Selfoss en haut du drawer lateral.</string> <string name="acra_login">Activer les logs</string>
<string name="display_header_drawer_title">Entête de compte</string> <string name="drawer_item_hidden_tags">Tags Cachés</string>
<string name="login_everything_title">Log de tous les appels à l\'API</string> <string name="unmark">Marquer l\'article comme non lu</string>
<string name="login_everything_on">Tous les appels à l\'API vont êtres logués</string> <string name="pref_header_offline">Hors ligne et cache</string>
<string name="login_everything_off">Aucun appel à l\'API ne sera logué</string> <string name="pref_switch_items_caching_off">Les articles ne seront pas enregistrés et l\'application ne sera pas utilisable hors ligne.</string>
<string name="pref_general_infinite_loading_title">Charger plus d\'articles au scroll</string> <string name="pref_switch_items_caching_on">Les articles seront enregistrés et l\'application sera utilisable hors ligne.</string>
<string name="translation">Traduction</string> <string name="pref_switch_items_caching">Sauvegarder les articles pour une utilisation hors ligne</string>
<string name="cant_open_invalid_url">Lurl de lélément nest pas valide. En attendant la résolution du problème, le lien ne s\'ouvrira pas.</string> <string name="no_network_connectivity">Hors connexion !</string>
<string name="drawer_report_bug">Signaler un bug</string>
<string name="items_number_should_be_number">Le nombre d\'articles doit être un entier.</string>
<string name="reader_action_more">Lire plus</string>
<string name="reader_action_open">Ouvrir</string>
<string name="reader_action_share">Partager</string>
<string name="pref_switch_actions_pager_scroll_on">Marquer les articles comme lus à la navigation dans le lecteur d\'article.</string>
<string name="add_to_favs_reader">Ajouter aux favoris</string>
<string name="remove_to_favs_reader">Supprimer des favoris</string>
<string name="pref_content_reader_font_size">Taille du texte du contenu du lecteur d\'articles</string>
<string name="pref_header_viewer">Lecteur d\'articles</string>
<string name="refresh_dialog_message">En validant, votre instance Selfoss sera mise à jour.</string>
<string name="markall_dialog_message">Marquer tous les éléments comme lus ?</string>
<string name="pref_switch_actions_pager_scroll">Marquer comme lu à la navigation.</string>
<string name="pref_switch_actions_pager_scroll_off">Ne pas marquer les articles comme lus à la navigation.</string>
</resources> </resources>

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Lector para Selfoss"</string>
<string name="title_activity_login">"Acceder"</string>
<string name="prompt_password">"Contrasinal"</string>
<string name="prompt_http_password">"Contrasinal HTTP"</string>
<string name="action_sign_in">"Ir"</string>
<string name="error_invalid_password">"O contrasinal non é suficientemente longo"</string>
<string name="error_field_required">"Campo requirido"</string>
<string name="prompt_url">"URL"</string>
<string name="withLoginSwitch">"É preciso iniciar sesión?"</string>
<string name="withHttpLoginSwitch">"É preciso iniciar sesión HTTP?"</string>
<string name="login_url_problem">"Ups! Pode que precises engadir un \"/\" o final da URL."</string>
<string name="prompt_login">"Nome de usuario"</string>
<string name="prompt_http_login">"Nome de usuario HTTP"</string>
<string name="label_share">"Compartir"</string>
<string name="readAll">"Ler todos"</string>
<string name="action_disconnect">"Desconectar"</string>
<string name="title_activity_settings">"Axustes"</string>
<string name="pref_header_general">"Xeral"</string>
<string name="add_source_hint_tags">"Etiqueta1, Etiqueta2, Etiqueta3"</string>
<string name="add_source_hint_url">"Ligazón"</string>
<string name="add_source_hint_name">"Nome"</string>
<string name="add_source">"Engadir unha fonte"</string>
<string name="add_source_save">"Gardar"</string>
<string name="wrong_infos">"Comprobar os teus detalles de novo."</string>
<string name="all_posts_not_read">"Non se leron todas as publicacións"</string>
<string name="all_posts_read">"Leronse todas as publicacións"</string>
<string name="cant_get_favs">"Non se poden obter os favoritos"</string>
<string name="cant_get_new_elements">"Non se poden recibir os novos artigos"</string>
<string name="cant_get_read">"Non se poden recibir os artigos lidos"</string>
<string name="nothing_here">"Non hai nada aquí"</string>
<string name="tab_new">"Novo"</string>
<string name="tab_read">"Todos"</string>
<string name="tab_favs">"Favoritos"</string>
<string name="action_about">"Acerca de"</string>
<string name="marked_as_read">"Elemento lido"</string>
<string name="undo_string">"Desfacer"</string>
<string name="addStringNoUrl">"Accede pra engadir fontes."</string>
<string name="cant_get_sources">"Non se pode obter a lista de fontes."</string>
<string name="cant_create_source">"Non se pode crear unha fonte."</string>
<string name="cant_get_spouts">"Non se pode obter a lista de fontes."</string>
<string name="form_not_complete">"O formulario non está completo"</string>
<string name="pref_header_links">"Ligazóns"</string>
<string name="issue_tracker_link">"Rastrexador de Incidencias"</string>
<string name="issue_tracker_summary">"Informar dun erro ou pedir unha nova característica"</string>
<string name="warning_wrong_url">"AVISO"</string>
<string name="pref_switch_card_view_title">"Vista de tarxeta"</string>
<string name="cant_mark_favortie">"Non se pode marcar o artigo como favorito"</string>
<string name="cant_unmark_favortie">"Non se pode eliminar o elemento dos favoritos"</string>
<string name="share">"Compartir"</string>
<string name="rating_prompt_title">"Estás gozando coa aplicación?"</string>
<string name="rating_prompt_yes">"Si !"</string>
<string name="rating_prompt_no">"Non moito …"</string>
<string name="rating_prompt_feedback_title">"Podes dicirnos por qué?"</string>
<string name="rating_prompt_feedback_yes">"Dacordo!"</string>
<string name="rating_prompt_feedback_no">"Agora non."</string>
<string name="rating_prompt_rating_title">"Xenial! Podes puntuarnos na tenda?"</string>
<string name="rating_prompt_rating_yes">"Claro!"</string>
<string name="rating_prompt_rating_no">"Agora mesmo non."</string>
<string name="rating_prompt_thanks">"Grazas, a túa opinión axudanos a mellorar a aplicación!"</string>
<string name="switch_unread_count">"Mostrar o reconto de artigos non lidos cunha insignia na barra inferior."</string>
<string name="switch_unread_count_title">"Mostrar reconto de artigos non lidos"</string>
<string name="display_all_counts_title">"Mostrar reconto de artigos lidos e favoritos"</string>
<string name="text_wrong_url">"Semella que intentas usar unha URL non válida. Asegúrate de que é correcta, e se o problema persiste, ponte en contacto conmigo (a través da ligazón de contacto na tenda). Por favor ten en conta que a aplicación precisa que uses Selfoss. Non podes acceder a canles RSS se non o tes."</string>
<string name="pref_general_internal_browser_title">"Abrir ligazóns dentro da aplicación"</string>
<string name="pref_general_internal_browser_on">"Os artigos abriranse dentro da aplicación"</string>
<string name="pref_general_internal_browser_off">"Os artigos abriranse co teu navegador prederminado"</string>
<string name="prefer_article_viewer_title">"Usar o visor de artigos"</string>
<string name="prefer_article_viewer_on">"Usarase o visor de artigos en lugar do navegador interno"</string>
<string name="prefer_article_viewer_off">"Usarase o navegador interno en lugar do visor de artigos"</string>
<string name="pref_general_category_links">"Xestión de ligazóns"</string>
<string name="pref_general_category_displaying">"Visualización"</string>
<string name="pref_switch_card_view_on">"Os artigos amosaranse coma tarxetas"</string>
<string name="pref_switch_card_view_off">"Os artigos amosaranse coma unha lista"</string>
<string name="menu_home_refresh">"Actualizar o remoto"</string>
<string name="refresh_success_response">"O remoto foi actualizado, xa podes refrescar a lista de artigos"</string>
<string name="refresh_failer_message">"A actualización non funcionou, proba de novo máis tarde ou comproba os teus rexistros de Selfoss."</string>
<string name="refresh_in_progress">"Actualizazación en progreso"</string>
<string name="card_height_title">Tarxetas de altura completa</string>
<string name="card_height_on">A altura das tarxetas axustarase ao seu contido</string>
<string name="card_height_off">A altura das tarxetas será fixa</string>
<string name="source_code">Código fonte</string>
<string name="cant_mark_read">Non se pode marcar o artigo como lido</string>
<string name="drawer_error_loading_tags">Produciuse un erro ao cargar as etiquetas…</string>
<string name="drawer_error_loading_sources">Produciuse un erro ao cargar as fontes…</string>
<string name="drawer_item_filters">Filtros</string>
<string name="drawer_action_clear">limpar</string>
<string name="drawer_item_tags">Etiquetas</string>
<string name="drawer_item_sources">Fontes</string>
<string name="drawer_action_edit">editar</string>
<string name="no_tags_loaded">Non se cargou ningunha etiqueta</string>
<string name="no_sources_loaded">Non se cargou ningunha fonte</string>
<string name="drawer_loading">Cargando…</string>
<string name="menu_home_search">Procurar</string>
<string name="can_delete_source">Non se puido eliminar a fonte…</string>
<string name="base_url_error">Houno unha incidencia ao tratar de comunicarse coa túa instancia de Selfoss. Se o problema persiste, prégolle que se poña en contacto conmigo.</string>
<string name="pref_header_theme">Temas</string>
<string name="default_theme">Predeterminado</string>
<string name="default_dark_theme">Predeterminado/Escuro</string>
<string name="pref_header_debug">Depuración</string>
<string name="login_debug_title">Activar pra rexistrar os erros de acceso</string>
<string name="login_debug_on">Rexistrarse todos os erros na páxina de acceso</string>
<string name="login_debug_off">Non se rexistrará ningún erro na páxina de acceso</string>
<string name="login_menu_debug">Depuración</string>
<string name="self_hosted_cert_switch">Utilizas un certificado autoaloxado?</string>
<string name="self_signed_cert_warning">Por razóns de seguridade, por defecto non se permiten os certificados autoasinados. Activando isto, non serei responsable de calquera problema de seguridade que atopes.</string>
<string name="pref_selfoss_category">API de Selfoss</string>
<string name="pref_api_items_number_title">Número de elementos cargados</string>
<string name="pref_hidden_tags">Etiquetas ocultas</string>
<string name="read_debug_title">Ler os artigos que aparecen coma non lidos?</string>
<string name="read_debug_off">Non rexistrar cando se marca un elemento coma lido</string>
<string name="read_debug_on">As chamadas á API serán rexistradas cando se marque un artigo coma lido</string>
<string name="summary_debug_identifier">Identificador de depuración</string>
<string name="unique_id_to_clipboard">Copiouse o identificador ao portapapeis</string>
<string name="display_header_drawer_summary">Amosar unha cabeceira coa URL da instancia de Selfoss no panel lateral.</string>
<string name="display_header_drawer_title">Cabeceira da conta</string>
<string name="login_everything_title">Rexistrando todas as chamadas á API</string>
<string name="login_everything_on">Isto rexistrará todas as chamadas á API con fins de depuración.</string>
<string name="login_everything_off">Non se rexistrará ningunha chamada á API</string>
<string name="pref_general_infinite_loading_title">Cargar máis artigos ao desprazarse</string>
<string name="translation">Traducción</string>
<string name="cant_open_invalid_url">A URL do elemento non é válida. Estou tratando de solucionar isto pra que a aplicación non falle.</string>
<string name="drawer_report_bug">Informar dun erro</string>
<string name="items_number_should_be_number">O número de elementos debería ser un enteiro.</string>
<string name="reader_action_more">Ler máis</string>
<string name="reader_action_open">Abrir no navegador</string>
<string name="reader_action_share">Compartir</string>
<string name="pref_switch_actions_pager_scroll_on">Marcar artigos como lidos cando se desliza o dedo dun a outro.</string>
<string name="add_to_favs_reader">Engadir a favoritos</string>
<string name="remove_to_favs_reader">Eliminar dos favoritos</string>
<string name="pref_content_reader_font_size">Tamaño da fonte do lector</string>
<string name="pref_header_viewer">Visor de artigos</string>
<string name="refresh_dialog_message">Isto actualizará a súa instancia de Selfoss.</string>
<string name="markall_dialog_message">Isto marcara todos os elementos como lidos.</string>
<string name="pref_switch_actions_pager_scroll">Marcar artigos como lidos ao deslizar co dedo cara os lados</string>
<string name="pref_switch_actions_pager_scroll_off">Non marcar artigos como lidos ao deslizar co dedo cara os lados.</string>
<string name="gdpr_dialog_message">A aplicación non recolle ningún dato persoal. Todas as ferramentas de analítica foron eliminadas. O envío de informes de erros agora é opcional, así coma os rexistros de depuración. Ten en conta que tanto os rexistros coma os informes de erros son esenciais prao desenvolvemento da aplicación (Podes configurar todo en \"Axustes &gt; Depurar\").</string>
<string name="gdpr_dialog_title">A aplicación non comparte ningún dato persoal seu.</string>
<string name="crash_dialog_text">Algo foi mal. Pregámoslle que envíe o informe de erro ao desarrollador.</string>
<string name="crash_dialog_comment">Podes engadir calquera información útil nos comentarios. Non inclúas datos persoais. Podes enviarme un correo coa Id de depuración pra que me poña en contacto contigo cando a incidencia se resolva.</string>
<string name="pref_acra_alwaysaccept">Enviar automáticamente informes de erros</string>
<string name="pref_acra_alwaysaccept_enabled">Enviaranse automáticamente os informes de erros</string>
<string name="pref_acra_alwaysaccept_disabled">Preguntarase cada vez pra enviar os informes de erros.</string>
<string name="pref_debug_crash_reports">Informes de erros</string>
<string name="pref_debug_debug_logs">Rexistro de depuración (Estes enviaranse automáticamente)</string>
<string name="acra_login">Habilitar o rexistro</string>
<string name="drawer_item_hidden_tags">Etiquetas ocultas</string>
<string name="unmark">Marcar artículo como non lido</string>
<string name="pref_header_offline">Sen conexión e caché</string>
<string name="pref_switch_items_caching_off">Os artigos non se gardaran na memoria do dispositivo e non se poderá utilizar a aplicación sen conexión.</string>
<string name="pref_switch_items_caching_on">Os artigos gardaranse na memoria do dispositivo e estarán dispoñibles sen conexión.</string>
<string name="pref_switch_items_caching">Gardar elementos para uso sen conexión</string>
<string name="no_network_connectivity">Non conectado!</string>
</resources>

View File

@ -1,170 +1,156 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com--> <!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">"Reader for Selfoss"</string> <string name="app_name">"Reader for Selfoss"</string>
<string name="title_activity_login">"Log in"</string> <string name="title_activity_login">"Log in"</string>
<string name="prompt_password">"Password"</string> <string name="prompt_password">"Password"</string>
<string name="prompt_http_password">"HTTP Password"</string> <string name="prompt_http_password">"HTTP Password"</string>
<string name="action_sign_in">"Go"</string> <string name="action_sign_in">"Go"</string>
<string name="error_invalid_password">"Password not long enough"</string> <string name="error_invalid_password">"Password not long enough"</string>
<string name="error_field_required">"Field required"</string> <string name="error_field_required">"Field required"</string>
<string name="prompt_url">"Url"</string> <string name="prompt_url">"Url"</string>
<string name="withLoginSwitch">"Login required ?"</string> <string name="withLoginSwitch">"Login required ?"</string>
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string> <string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
<string name="prompt_login">"Username"</string> <string name="prompt_login">"Username"</string>
<string name="prompt_http_login">"HTTP Username"</string> <string name="prompt_http_login">"HTTP Username"</string>
<string name="label_share">"Share"</string> <string name="label_share">"Share"</string>
<string name="readAll">"Read all"</string> <string name="readAll">"Read all"</string>
<string name="action_disconnect">"Disconnect"</string> <string name="action_disconnect">"Disconnect"</string>
<string name="title_activity_settings">"Settings"</string> <string name="title_activity_settings">"Settings"</string>
<string name="pref_header_general">"General"</string> <string name="pref_header_general">"General"</string>
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> <string name="add_source_hint_url">"Link"</string>
<string name="add_source_hint_url">"Link"</string> <string name="add_source_hint_name">"Name"</string>
<string name="add_source_hint_name">"Name"</string> <string name="add_source">"Add a source"</string>
<string name="add_source">"Add a source"</string> <string name="add_source_save">"Save"</string>
<string name="add_source_save">"Save"</string> <string name="wrong_infos">"Check your details again."</string>
<string name="wrong_infos">"Check your details again."</string> <string name="all_posts_not_read">"All posts weren't read"</string>
<string name="all_posts_not_read">"All posts weren't read"</string> <string name="all_posts_read">"All posts were read"</string>
<string name="all_posts_read">"All posts were read"</string> <string name="cant_get_favs">"Can't get favorites"</string>
<string name="cant_get_favs">"Can't get favorites"</string> <string name="cant_get_new_elements">"Can't get new articles"</string>
<string name="cant_get_new_elements">"Can't get new articles"</string> <string name="cant_get_read">"Can't get read articles"</string>
<string name="cant_get_read">"Can't get read articles"</string> <string name="nothing_here">"Nothing here"</string>
<string name="nothing_here">"Nothing here"</string> <string name="tab_new">"New"</string>
<string name="tab_new">"New"</string> <string name="tab_read">"All"</string>
<string name="tab_read">"All"</string> <string name="tab_favs">"Favorites"</string>
<string name="tab_favs">"Favorites"</string> <string name="action_about">"About"</string>
<string name="action_about">"About"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_read">"Item read"</string> <string name="undo_string">"Undo"</string>
<string name="undo_string">"Undo"</string> <string name="addStringNoUrl">"Log in to add sources."</string>
<string name="addStringNoUrl">"Log in to add sources."</string> <string name="cant_get_sources">"Can't get sources list."</string>
<string name="cant_get_sources">"Can't get sources list."</string> <string name="cant_create_source">"Can't create source."</string>
<string name="cant_create_source">"Can't create source."</string> <string name="cant_get_spouts">"Can't get spouts list."</string>
<string name="cant_get_spouts">"Can't get spouts list."</string> <string name="form_not_complete">"The form is not complete"</string>
<string name="form_not_complete">"The form is not complete"</string> <string name="pref_header_links">"Links"</string>
<string name="pref_header_links">"Links"</string> <string name="issue_tracker_link">"Issue Tracker"</string>
<string name="issue_tracker_link">"Issue Tracker"</string> <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> <string name="warning_wrong_url">"WARNING"</string>
<string name="warning_wrong_url">"WARNING"</string> <string name="pref_switch_card_view_title">"Card View"</string>
<string name="pref_switch_card_view_title">"Card View"</string> <string name="cant_mark_favortie">"Can't mark article as favorite"</string>
<string name="cant_mark_favortie">"Can't mark article as favorite"</string> <string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string> <string name="share">"Share"</string>
<string name="share">"Share"</string> <string name="rating_prompt_title">"Enjoying the app ?"</string>
<string name="rating_prompt_title">"Enjoying the app ?"</string> <string name="rating_prompt_yes">"Yes !"</string>
<string name="rating_prompt_yes">"Yes !"</string> <string name="rating_prompt_no">"Not really …"</string>
<string name="rating_prompt_no">"Not really "</string> <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> <string name="rating_prompt_feedback_yes">"OK !"</string>
<string name="rating_prompt_feedback_yes">"OK !"</string> <string name="rating_prompt_feedback_no">"Not now."</string>
<string name="rating_prompt_feedback_no">"Not now."</string> <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> <string name="rating_prompt_rating_yes">"Sure !"</string>
<string name="rating_prompt_rating_yes">"Sure !"</string> <string name="rating_prompt_rating_no">"Not right now."</string>
<string name="rating_prompt_rating_no">"Not right now."</string> <string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string> <string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string> <string name="switch_unread_count_title">"Display unread count"</string>
<string name="switch_unread_count_title">"Display unread count"</string> <string name="display_all_counts_title">"Display count for favorite and read"</string>
<string name="display_all_counts_title">"Display count for favorite and read"</string> <string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
<string name="menu_share_the_app">"Invite friends"</string> <string name="pref_general_internal_browser_title">"Open links inside the app"</string>
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string> <string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string> <string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
<string name="invitation_cta">"Try the app"</string> <string name="prefer_article_viewer_title">"Use the article viewer"</string>
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string> <string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
<string name="pref_general_internal_browser_title">"Open links inside the app"</string> <string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string> <string name="pref_general_category_links">"Link handling"</string>
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string> <string name="pref_general_category_displaying">"Displaying"</string>
<string name="prefer_article_viewer_title">"Use the article viewer"</string> <string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string> <string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string> <string name="menu_home_refresh">"Update remote"</string>
<string name="pref_general_category_links">"Link handling"</string> <string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
<string name="pref_general_category_displaying">"Displaying"</string> <string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
<string name="pref_general_category_actions">"Actions"</string> <string name="refresh_in_progress">"Refresh in progress"</string>
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string> <string name="card_height_title">Full height cards</string>
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string> <string name="card_height_on">Cards height will adjust to its content</string>
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string> <string name="card_height_off">Card height will be fixed</string>
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string> <string name="source_code">Source code</string>
<string name="menu_home_refresh">"Update remote"</string> <string name="cant_mark_read">Can\'t mark article as read</string>
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string> <string name="drawer_error_loading_tags">Error loading tags…</string>
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string> <string name="drawer_error_loading_sources">Error loading sources…</string>
<string name="refresh_in_progress">"Refresh in progress"</string> <string name="drawer_item_filters">Filters</string>
<string name="new_apk_available_title">"A new APK is available."</string> <string name="drawer_action_clear">clear</string>
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string> <string name="drawer_item_tags">Tags</string>
<string name="new_apk_available_get">"Download now"</string> <string name="drawer_item_sources">Sources</string>
<string name="new_apk_available_no">"Ignore version"</string> <string name="drawer_action_edit">edit</string>
<string name="intro_hello_title">"Hi there !"</string> <string name="no_tags_loaded">No tags loaded</string>
<string name="intro_hello_message">"Thanks for downloading the app !"</string> <string name="no_sources_loaded">No sources loaded</string>
<string name="intro_needs_selfoss_title">"Before you start…"</string> <string name="drawer_loading">Loading …</string>
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> <string name="menu_home_search">Search</string>
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> <string name="can_delete_source">Can\'t delete the source…</string>
<string name="intro_all_set_title">"All set !"</string> <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> <string name="pref_header_theme">Themes</string>
<string name="card_height_title">Full height cards</string> <string name="default_theme">Default</string>
<string name="card_height_on">Cards height will adjust to its content</string> <string name="default_dark_theme">Default/Dark</string>
<string name="card_height_off">Card height will be fixed</string> <string name="pref_header_debug">Debug</string>
<string name="source_code">Source code</string> <string name="login_debug_title">Activate to log login errors</string>
<string name="cant_mark_read">Can\'t mark article as read</string> <string name="login_debug_on">Any error on the login page will be logged</string>
<string name="drawer_error_loading_tags">Error loading tags…</string> <string name="login_debug_off">No log on the login page</string>
<string name="drawer_error_loading_sources">Error loading sources…</string> <string name="login_menu_debug">Debug</string>
<string name="drawer_item_filters">Filters</string> <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
<string name="drawer_action_clear">clear</string> <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
<string name="drawer_item_tags">Tags</string> <string name="pref_selfoss_category">Selfoss Api</string>
<string name="drawer_item_sources">Sources</string> <string name="pref_api_items_number_title">Loaded items number</string>
<string name="drawer_action_edit">edit</string> <string name="pref_hidden_tags">Hidden Tags</string>
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> <string name="read_debug_title">Read articles appearing as unread ?</string>
<string name="no_tags_loaded">No tags loaded</string> <string name="read_debug_off">No log when marking an item as read</string>
<string name="no_sources_loaded">No sources loaded</string> <string name="read_debug_on">Api calls will be logged when marking an article as read</string>
<string name="drawer_loading">Loading …</string> <string name="summary_debug_identifier">Debug identifier</string>
<string name="menu_home_search">Search</string> <string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
<string name="can_delete_source">Can\'t delete the source…</string> <string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> <string name="display_header_drawer_title">Account header</string>
<string name="pref_header_theme">Themes</string> <string name="login_everything_title">Logging every api calls</string>
<string name="default_theme">Default</string> <string name="login_everything_on">This will log every api call for debug purpose.</string>
<string name="teal_orange_theme">Teal/Orange/Light</string> <string name="login_everything_off">No api call will be logged</string>
<string name="cyan_pink_theme">Cyan/Pink/Light</string> <string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
<string name="grey_orange_theme">Grey/Orange/Light</string> <string name="translation">Translation</string>
<string name="blue_amber_theme">Blue/Amber/Light</string> <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
<string name="indigo_pink_theme">Indigo/Pink/Light</string> <string name="drawer_report_bug">Report a bug</string>
<string name="red_teal_theme">Red/Teal/Light</string> <string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string> <string name="reader_action_more">Read more</string>
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string> <string name="reader_action_open">Open in browser</string>
<string name="default_dark_theme">Default/Dark</string> <string name="reader_action_share">Share</string>
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string> <string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string> <string name="add_to_favs_reader">Add to favorites</string>
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string> <string name="remove_to_favs_reader">Remove from favorites</string>
<string name="red_teal_dark_theme">Red/Teal/Dark</string> <string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_debug">Debug</string> <string name="pref_header_viewer">Article viewer</string>
<string name="login_debug_title">Activate to log login errors</string> <string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="login_debug_on">Any error on the login page will be logged</string> <string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="login_debug_off">No log on the login page</string> <string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="login_menu_debug">Debug</string> <string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> <string name="gdpr_dialog_message">The app does not collect any personal data. Every analytics tools were removed. Crash reports sending is now optional, as is the debug logging. Keep in mind that debugging and crash reports are essential for the app development (You can configure everything in Settings &gt; Debug).</string>
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> <string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
<string name="pref_selfoss_category">Selfoss Api</string> <string name="crash_dialog_text">Something went wrong. Please send the report to the developer.</string>
<string name="pref_api_items_number_title">Loaded items number</string> <string name="crash_dialog_comment">You can add any helpful details in the comment bellow. Don\'t include any personal data in your comment. You could send me and email with your debug id, and I\'ll keep you posted when the issue is resolved.</string>
<string name="read_debug_title">Read articles appearing as unread ?</string> <string name="pref_acra_alwaysaccept">Automatically send crash reports</string>
<string name="read_debug_off">No log when marking an item as read</string> <string name="pref_acra_alwaysaccept_enabled">Will send crash reports automatically</string>
<string name="read_debug_on">Api calls will be logged when marking an article as read</string> <string name="pref_acra_alwaysaccept_disabled">Will ask everytime when sending crash reports.</string>
<string name="summary_debug_identifier">Debug identifier</string> <string name="pref_debug_crash_reports">Crash reports</string>
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string> <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string>
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string> <string name="acra_login">Enable logging</string>
<string name="display_header_drawer_title">Account header</string> <string name="drawer_item_hidden_tags">Hidden Tags</string>
<string name="login_everything_title">Logging every api calls</string> <string name="unmark">Mark item as unread</string>
<string name="login_everything_on">This will log every api call for debug purpose.</string> <string name="pref_header_offline">Offline and cache</string>
<string name="login_everything_off">No api call will be logged</string> <string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string> <string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
<string name="translation">Translation</string> <string name="pref_switch_items_caching">Save items for offline use</string>
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> <string name="no_network_connectivity">Not connected !</string>
<string name="drawer_report_bug">Report a bug</string>
<string name="items_number_should_be_number">The items number should be an integer.</string>
<string name="reader_action_more">Read more</string>
<string name="reader_action_open">Open in browser</string>
<string name="reader_action_share">Share</string>
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
<string name="add_to_favs_reader">Add to favorites</string>
<string name="remove_to_favs_reader">Remove from favorites</string>
<string name="pref_content_reader_font_size">Article reader content font size</string>
<string name="pref_header_viewer">Article viewer</string>
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
<string name="markall_dialog_message">This will mark all the items as read.</string>
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
</resources> </resources>

Some files were not shown because too many files have changed in this diff Show More