Compare commits

...

1266 Commits

Author SHA1 Message Date
Athou
2d90ccf856 release 7.3.1 2026-08-17 22:32:32 +02:00
Athou
7f77cf0268 prevent Host header injection attacks 2026-08-17 22:27:46 +02:00
Jérémie Panzer
f3c390e0e0 Merge pull request #2267 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
Update dependency com.diffplug.spotless:spotless-maven-plugin to v3.10.0
2026-08-17 08:49:07 +02:00
Jérémie Panzer
1fdc471197 Merge pull request #2266 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
Update dependency com.puppycrawl.tools:checkstyle to v13.11.0
2026-08-17 07:45:37 +02:00
renovate[bot]
ecf5d9e50e Update dependency com.diffplug.spotless:spotless-maven-plugin to v3.10.0 2026-08-17 05:44:41 +00:00
renovate[bot]
97a49e8faa Lock file maintenance 2026-08-17 00:41:26 +00:00
renovate[bot]
f5a020cdc2 Update dependency com.puppycrawl.tools:checkstyle to v13.11.0 2026-08-17 00:40:24 +00:00
renovate[bot]
1f0507ee65 Update dependency @testing-library/user-event to v14.6.4 2026-08-15 01:00:48 +00:00
renovate[bot]
393c90f334 Update react-querybuilder to v8.22.5 2026-08-14 23:10:07 +00:00
renovate[bot]
03ecc2f49b Update dependency @biomejs/biome to v2.5.8 2026-08-14 09:15:31 +00:00
renovate[bot]
17743adce6 Update quarkus.version to v3.38.2 2026-08-13 17:05:44 +00:00
renovate[bot]
126dde103a Update dependency @testing-library/jest-dom to v7.0.1 2026-08-13 00:07:02 +00:00
renovate[bot]
14a25581b4 Update react-querybuilder to v8.22.4 2026-08-11 06:18:20 +00:00
Athou
c7c95efb3a release 7.3.0 2026-08-11 08:17:05 +02:00
Athou
4c1293d357 change the default value of blockLocalAddresses 2026-08-11 08:07:56 +02:00
Athou
76a92ea44c more SSRF protection regarding IPv6 2026-08-11 07:46:02 +02:00
Jérémie Panzer
ba454322db Merge pull request #2263 from Athou/renovate/org.apache.commons-commons-collections4-4.x
fix(deps): update dependency org.apache.commons:commons-collections4 to v4.6.0
2026-08-10 16:55:55 +02:00
renovate[bot]
a3b9f471e1 fix(deps): update dependency org.apache.commons:commons-collections4 to v4.6.0 2026-08-10 13:47:04 +00:00
Athou
d58ddc888e fix flaky tests 2026-08-10 09:45:00 +02:00
Athou
fe9837c45c fix typo 2026-08-10 09:30:31 +02:00
Athou
332d126bd7 reduce log verbosity during tests 2026-08-10 09:08:15 +02:00
Athou
0c66bf2695 speed up tests 2026-08-10 09:05:11 +02:00
Athou
4d6d07c98b remove warning 2026-08-10 09:02:07 +02:00
renovate[bot]
8f7d4bfa10 chore(deps): lock file maintenance 2026-08-10 05:05:39 +00:00
renovate[bot]
7b3f39001f fix(deps): update react-querybuilder to v8.22.3 2026-08-10 03:27:17 +00:00
Jérémie Panzer
b9630809a0 Merge pull request #2262 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.10.0
2026-08-10 05:26:27 +02:00
renovate[bot]
ce3244da5e chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.10.0 2026-08-09 21:51:02 +00:00
renovate[bot]
4067297d2a chore(deps): update dependency vite to v8.2.1 2026-08-09 17:40:42 +00:00
renovate[bot]
03c11fa181 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.4 2026-08-09 09:42:31 +00:00
renovate[bot]
3676e78eb9 fix(deps): update react-querybuilder to v8.22.2 2026-08-08 16:44:38 +00:00
Athou
1e08c4486f fix google reader api icon url 2026-08-08 16:06:47 +02:00
Athou
fd8bb60daa google reader api support 2026-08-08 10:22:58 +02:00
renovate[bot]
557d56ffc5 fix(deps): update react-querybuilder to v8.22.1 2026-08-08 04:30:28 +08:00
renovate[bot]
30f76a2349 chore(deps): update dependency @biomejs/biome to v2.5.7 2026-08-07 15:07:29 +00:00
renovate[bot]
cf0fa5e22e chore(deps): update dependency @testing-library/user-event to v14.6.3 2026-08-07 04:00:58 +00:00
Jérémie Panzer
f16becbd82 Merge pull request #2259 from Athou/renovate/graalvm-setup-graalvm-1.6.x
chore(deps): update graalvm/setup-graalvm action to v1.6.4
2026-08-07 06:00:37 +02:00
Jérémie Panzer
4855450ddc Merge pull request #2260 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.22.0
2026-08-07 06:00:33 +02:00
Jérémie Panzer
0733aedce5 Merge pull request #2257 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2026-08-07 06:00:25 +02:00
renovate[bot]
399ad14d9b chore(deps): lock file maintenance 2026-08-07 02:59:35 +00:00
renovate[bot]
7881ea3c5c fix(deps): update react-querybuilder to v8.22.0 2026-08-07 02:58:54 +00:00
renovate[bot]
7e9de622da chore(deps): update graalvm/setup-graalvm action to v1.6.4 2026-08-07 02:58:46 +00:00
Athou
c6655078f2 fix build 2026-08-07 04:58:06 +02:00
Athou
b86cef9499 package-lock refresh 2026-08-06 21:47:31 +02:00
Athou
5375ab6e97 profile menu now works again on mobile when action buttons are at the bottom of the screen 2026-08-06 21:46:47 +02:00
renovate[bot]
75920a6473 fix(deps): update mantine monorepo to v9.5.1 2026-08-05 08:38:05 +00:00
renovate[bot]
f474e76866 chore(deps): update debian:13.6 docker digest to 34cd9e9 2026-08-05 04:50:23 +00:00
renovate[bot]
d0ae27c4ce fix(deps): update quarkus.version to v3.38.1 2026-08-04 17:07:29 +00:00
renovate[bot]
ab191dded6 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.4.0-jre docker digest to 02888a2 2026-08-04 10:32:11 +00:00
renovate[bot]
950b571a9f chore(deps): update ibm-semeru-runtimes docker tag to open-jdk-25.0.4.0-jre 2026-08-04 04:59:45 +00:00
Jérémie Panzer
7a153ca69a Merge pull request #2258 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.19.0
2026-08-03 19:08:30 +02:00
renovate[bot]
effd8946de chore(deps): update node.js to v24.19.0 2026-08-03 16:42:20 +00:00
Athou
ae3ad3745c move global System.setProperty calls in CommaFeedApplication 2026-08-03 09:15:23 +02:00
Athou
2e1e5257b4 release 7.2.1 2026-08-03 09:06:32 +02:00
Athou
bc6e767953 prevent XXS in third party apps
CommaFeed React client already strips malicious "javascript:" urls but we might as well not store those in the database
2026-08-03 08:47:01 +02:00
Jérémie Panzer
b9eceaae73 Merge pull request #2255 from Athou/renovate/vite-8.x
chore(deps): update dependency vite to v8.2.0
2026-08-03 08:46:22 +02:00
renovate[bot]
8ad9ba7d74 chore(deps): update react monorepo 2026-08-03 01:41:07 +00:00
renovate[bot]
10bb4b7936 chore(deps): update dependency vite to v8.2.0 2026-08-02 12:46:43 +00:00
renovate[bot]
ab3127cef9 chore(deps): update dependency @vitejs/plugin-react to v6.0.5 2026-08-02 12:46:33 +00:00
Athou
5d64e2f21e correctly handle root favicons for non-default ports 2026-08-02 07:26:44 +02:00
renovate[bot]
e404c9ce3b chore(deps): update dependency npm to v12.0.2 2026-08-01 22:16:06 +00:00
Jérémie Panzer
0c5a71650c Merge pull request #2254 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to v1.19.0
2026-08-02 00:15:20 +02:00
renovate[bot]
8ce9eb8537 fix(deps): update dependency axios to v1.19.0 2026-08-01 20:46:05 +00:00
renovate[bot]
1ce0e4af97 chore(deps): update dependency jsdom to v30.0.1 2026-08-01 10:11:03 +00:00
Jérémie Panzer
44ad42a8a5 Merge pull request #2252 from Athou/renovate/patch-react-router-monorepo
fix(deps): update dependency react-router-dom to v7.18.2
2026-08-01 12:09:31 +02:00
Jérémie Panzer
f213726c40 Merge pull request #2251 from Athou/renovate/react-draggable-4.7.x
fix(deps): update dependency react-draggable to v4.7.1
2026-08-01 12:09:08 +02:00
renovate[bot]
972d424846 fix(deps): update dependency react-router-dom to v7.18.2 2026-08-01 09:19:12 +00:00
renovate[bot]
6049263137 fix(deps): update dependency react-draggable to v4.7.1 2026-08-01 09:19:02 +00:00
Athou
ae2dc7f066 update google java format and let renovate know about it 2026-08-01 11:17:50 +02:00
Athou
503d129f22 increase timeout even more because tests are still flaky 2026-08-01 11:13:41 +02:00
renovate[bot]
543ec3bbb1 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.3 2026-07-31 17:48:01 +00:00
renovate[bot]
bed45127c4 chore(deps): update dependency @biomejs/biome to v2.5.6 2026-07-31 15:42:20 +00:00
Jérémie Panzer
71f10b0a62 Merge pull request #2250 from Athou/renovate/patch-react-querybuilder
fix(deps): update react-querybuilder to v8.21.2
2026-07-31 07:42:57 +02:00
renovate[bot]
cb235289c4 fix(deps): update react-querybuilder to v8.21.2 2026-07-31 03:05:02 +00:00
renovate[bot]
0b07c65320 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.8 2026-07-30 23:29:02 +00:00
Jérémie Panzer
868f65d7c9 Merge pull request #2249 from Athou/renovate/jsdom-30.x
chore(deps): update dependency jsdom to v30
2026-07-30 11:02:50 +02:00
Jérémie Panzer
07715383f4 Merge pull request #2248 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to v9.5.0
2026-07-30 11:02:48 +02:00
renovate[bot]
29d10debdb chore(deps): update dependency jsdom to v30 2026-07-30 08:36:37 +00:00
renovate[bot]
cd640da960 fix(deps): update mantine monorepo to v9.5.0 2026-07-30 08:36:26 +00:00
Jérémie Panzer
56ecb4a2f4 Merge pull request #2247 from Athou/renovate/org.jsoup-jsoup-1.x
fix(deps): update dependency org.jsoup:jsoup to v1.23.1
2026-07-30 07:23:53 +02:00
renovate[bot]
00161fd549 fix(deps): update dependency org.jsoup:jsoup to v1.23.1 2026-07-30 04:54:33 +00:00
renovate[bot]
a602ce17cd fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.6 2026-07-29 23:04:12 +00:00
renovate[bot]
672588d08b chore(deps): update node.js to v24.18.1 2026-07-29 21:06:29 +00:00
renovate[bot]
5fa2579275 chore(deps): update dependency com.github.eirslett:frontend-maven-plugin to v2.0.2 2026-07-29 20:12:39 +00:00
Jérémie Panzer
09bc317797 Merge pull request #2246 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.5.0
2026-07-29 22:12:10 +02:00
renovate[bot]
440c1ada50 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.5.0 2026-07-29 18:38:26 +00:00
Athou
911a5ca099 reorder imports using google java format 2026-07-29 20:36:03 +02:00
Jérémie Panzer
65017f6b76 Merge pull request #2244 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.38.0
2026-07-29 20:33:12 +02:00
Athou
64fb5ef3a2 fix warning 2026-07-29 18:24:14 +02:00
Jérémie Panzer
dda389a50f Merge pull request #2245 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.21.0
2026-07-29 17:15:10 +02:00
renovate[bot]
419ad4fb6a fix(deps): update react-querybuilder to v8.21.0 2026-07-29 14:10:05 +00:00
Jérémie Panzer
ebae46f06b Merge pull request #2243 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4.6.0
2026-07-29 16:09:58 +02:00
renovate[bot]
ac25accb31 fix(deps): update quarkus.version to v3.38.0 2026-07-29 14:09:50 +00:00
Jérémie Panzer
3c7eb90e50 Merge pull request #2242 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.9.0
2026-07-29 16:09:03 +02:00
renovate[bot]
4b3973f3fa chore(deps): update docker/login-action action to v4.6.0 2026-07-29 12:34:35 +00:00
renovate[bot]
6ddbe40c3c chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.9.0 2026-07-29 12:34:30 +00:00
Jérémie Panzer
d5164750e4 Merge pull request #2241 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.6.0
2026-07-27 17:40:01 +02:00
renovate[bot]
822fbd8add fix(deps): update linguijs monorepo to v6.6.0 2026-07-27 14:46:27 +00:00
Jérémie Panzer
3a341d0707 Merge pull request #2240 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.9.0
2026-07-27 07:42:59 +02:00
renovate[bot]
23884fcbda chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.9.0 2026-07-27 05:15:46 +00:00
renovate[bot]
3b16674f98 chore(deps): lock file maintenance 2026-07-27 00:51:21 +00:00
renovate[bot]
d5eb3e1bb1 chore(deps): update dependency vite-plugin-checker to v0.14.5 2026-07-25 13:00:37 +00:00
renovate[bot]
8d47b38fd4 chore(deps): update dependency @vitejs/plugin-react to v6.0.4 2026-07-25 05:45:24 +00:00
renovate[bot]
04fb3282fa fix(deps): update react monorepo to v19.2.8 2026-07-25 00:34:50 +00:00
renovate[bot]
bcce130b82 chore(deps): update docker/login-action action to v4.5.1 2026-07-24 20:05:24 +00:00
renovate[bot]
e5d336f6ba fix(deps): update mantine monorepo to v9.4.2 2026-07-24 11:08:55 +00:00
renovate[bot]
2d741f6e1e chore(deps): update dependency @biomejs/biome to v2.5.5 2026-07-24 10:03:13 +00:00
Jérémie Panzer
2968dff118 Merge pull request #2237 from Athou/renovate/major-testing-library-monorepo
chore(deps): update dependency @testing-library/jest-dom to v7
2026-07-23 22:25:02 +02:00
renovate[bot]
0c244ec154 chore(deps): update dependency @testing-library/jest-dom to v7 2026-07-23 19:50:05 +00:00
Jérémie Panzer
34cd337992 Merge pull request #2235 from Athou/renovate/monaco-editor-0.x
fix(deps): update dependency monaco-editor to v0.56.0
2026-07-23 21:49:33 +02:00
Jérémie Panzer
1703cb7b93 Merge pull request #2236 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4.5.0
2026-07-23 21:00:06 +02:00
Athou
dc89faa4a1 adapt to new paths 2026-07-23 20:58:07 +02:00
renovate[bot]
3eccfe8ccc chore(deps): update docker/login-action action to v4.5.0 2026-07-23 17:29:45 +00:00
renovate[bot]
6e34f6831c fix(deps): update dependency monaco-editor to v0.56.0 2026-07-23 14:01:52 +00:00
renovate[bot]
b7ebcd6a23 fix(deps): update quarkus.version to v3.37.4 2026-07-23 10:00:31 +00:00
Jérémie Panzer
8b7efe056d Merge pull request #2234 from Athou/renovate/fontsource-monorepo
fix(deps): update dependency @fontsource/open-sans to v5.3.0
2026-07-22 08:33:33 +02:00
renovate[bot]
87cb392516 fix(deps): update dependency @fontsource/open-sans to v5.3.0 2026-07-22 05:25:49 +00:00
Jérémie Panzer
aa11cb48f2 Merge pull request #2233 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v7.5
2026-07-21 23:31:17 +02:00
renovate[bot]
36a29a393c fix(deps): update querydsl.version to v7.5 2026-07-21 21:08:45 +00:00
renovate[bot]
99f1b45866 chore(deps): update actions/checkout action to v7.0.1 2026-07-21 02:00:56 +00:00
renovate[bot]
9e8d529af3 chore(deps): lock file maintenance 2026-07-20 03:58:17 +00:00
renovate[bot]
bb80641b40 chore(deps): update dependency vite to v8.1.5 2026-07-19 10:03:19 +00:00
renovate[bot]
a2ed16c6fd chore(deps): update dependency @biomejs/biome to v2.5.4 2026-07-18 04:35:49 +00:00
renovate[bot]
4f10f57837 fix(deps): update quarkus.version to v3.37.3 2026-07-15 21:27:37 +00:00
Jérémie Panzer
28f40cd6fe Merge pull request #2230 from Athou/renovate/graalvm-setup-graalvm-1.6.x
chore(deps): update graalvm/setup-graalvm action to v1.6.3
2026-07-14 22:21:04 +02:00
renovate[bot]
89a84a0c83 chore(deps): update graalvm/setup-graalvm action to v1.6.3 2026-07-14 10:01:24 +00:00
Jérémie Panzer
ebcda50a34 Merge pull request #2229 from Athou/renovate/actions-setup-node-7.x
chore(deps): update actions/setup-node action to v7
2026-07-14 09:09:34 +02:00
renovate[bot]
8640e62b77 chore(deps): update actions/setup-node action to v7 2026-07-14 06:21:50 +00:00
Jérémie Panzer
d0418eea89 Merge pull request #2227 from Athou/renovate/actions-setup-node-6.x
chore(deps): update actions/setup-node action to v6.5.0
2026-07-14 08:20:45 +02:00
Jérémie Panzer
41ba067daf Merge pull request #2228 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.6
2026-07-14 08:19:52 +02:00
renovate[bot]
53346997b6 chore(deps): update debian docker tag to v13.6 2026-07-14 05:14:26 +00:00
renovate[bot]
87a632761e chore(deps): update actions/setup-node action to v6.5.0 2026-07-14 05:14:22 +00:00
renovate[bot]
998ebc43a3 chore(deps): update dependency npm to v12.0.1 2026-07-13 19:32:59 +00:00
renovate[bot]
945e312c41 chore(deps): update dependency vite to v8.1.4 2026-07-12 07:51:07 +00:00
Jérémie Panzer
963a562100 Merge pull request #2224 from Athou/renovate/typescript-7.x
chore(deps): update dependency typescript to v7
2026-07-12 09:49:47 +02:00
Athou
4be961b68b temporary disable checker plugin until TypeScript 7 exposes a stable api 2026-07-12 08:59:24 +02:00
Jérémie Panzer
02a9140c13 Merge pull request #2226 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.8.0
2026-07-12 08:52:40 +02:00
renovate[bot]
5ea60ce6d6 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.8.0 2026-07-12 06:03:35 +00:00
Jérémie Panzer
e9e7be0fc6 Merge pull request #2225 from Athou/renovate/npm-12.x
chore(deps): update dependency npm to v12
2026-07-12 04:39:00 +02:00
renovate[bot]
60c30f2683 chore(deps): update dependency npm to v12 2026-07-11 23:25:34 +00:00
renovate[bot]
a17e69d37d chore(deps): update dependency typescript to v7 2026-07-11 17:37:46 +00:00
renovate[bot]
157f75d33e chore(deps): update dependency @biomejs/biome to v2.5.3 2026-07-11 10:52:37 +00:00
Athou
30a14c73ff specify that docker/podman can be used if graalvm is not found 2026-07-11 09:09:27 +02:00
Athou
27cece3afb release 7.2.0 2026-07-10 10:47:30 +02:00
Jérémie Panzer
8124ecb51f Merge pull request #2222 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.5.0
2026-07-10 08:19:14 +02:00
renovate[bot]
e67c4c8670 fix(deps): update linguijs monorepo to v6.5.0 2026-07-09 16:48:53 +00:00
renovate[bot]
fcc6798d63 fix(deps): update dependency style-to-object to v2.0.2 2026-07-09 16:48:41 +00:00
renovate[bot]
d313ebfc69 chore(deps): update dependency vitest to v4.1.10 2026-07-09 08:48:42 +00:00
renovate[bot]
6edb8f00f6 fix(deps): update quarkus.version to v3.37.2 2026-07-08 20:59:14 +00:00
renovate[bot]
98a261d457 fix(deps): update dependency style-to-object to v2.0.1 2026-07-07 21:44:59 +00:00
renovate[bot]
e97a69f475 chore(deps): update graalvm/setup-graalvm action to v1.6.2 2026-07-07 18:59:06 +00:00
Jérémie Panzer
e9dc284b26 Merge pull request #2221 from Athou/renovate/graalvm-setup-graalvm-1.6.x
chore(deps): update graalvm/setup-graalvm action to v1.6.1
2026-07-07 09:24:17 +02:00
renovate[bot]
856c52c64b chore(deps): update graalvm/setup-graalvm action to v1.6.1 2026-07-06 23:03:42 +00:00
renovate[bot]
386a4a32ef chore(deps): lock file maintenance 2026-07-06 01:33:25 +00:00
renovate[bot]
dbdb40ff01 chore(deps): update dependency vite to v8.1.3 (#2220)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-05 12:54:36 +00:00
Athou
1bd9b71215 use google java formatter to avoid downloading eclipse during build 2026-07-05 11:14:17 +02:00
Athou
f4dc279ec9 lombok is required at runtime for sneakyThrow 2026-07-05 09:02:57 +02:00
Athou
ca8438623d prevent access to ULA and CGNAT addresses 2026-07-05 08:48:02 +02:00
Jérémie Panzer
b81aac71f5 Merge pull request #2218 from Athou/renovate/biomejs-biome-2.5.x
chore(deps): update dependency @biomejs/biome to v2.5.2
2026-07-05 08:07:39 +02:00
Jérémie Panzer
a4e0d28fa2 Merge pull request #2219 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.4.0
2026-07-05 08:07:05 +02:00
renovate[bot]
56d4e4bbb1 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.4.0 2026-07-04 20:37:01 +00:00
renovate[bot]
af1d10529b chore(deps): update dependency @biomejs/biome to v2.5.2 2026-07-04 16:40:46 +00:00
Athou
a5f84a3f6d search now also works for starred entries (#2217) 2026-07-04 17:57:08 +02:00
renovate[bot]
69dfbc81cc chore(deps): update dependency vite to v8.1.2 2026-07-04 01:29:31 +00:00
Jérémie Panzer
34408ccdb0 Merge pull request #2215 from Athou/renovate/react-icons-5.x
fix(deps): update dependency react-icons to v5.7.0
2026-07-04 03:28:52 +02:00
renovate[bot]
b0522a6e5d fix(deps): update dependency react-icons to v5.7.0 2026-07-03 20:43:38 +00:00
renovate[bot]
2a559a07c0 chore(deps): update dependency org.apache.maven.plugins:maven-help-plugin to v3.5.2 2026-07-03 20:43:16 +00:00
Athou
bdf2a6a915 the Pocket service has been discontinued 2026-07-03 22:40:38 +02:00
Jérémie Panzer
e814f75872 Merge pull request #2216 from Athou/renovate/graalvm-setup-graalvm-1.x
chore(deps): update graalvm/setup-graalvm action to v1.6.0
2026-07-03 20:16:57 +02:00
renovate[bot]
c0e0791854 chore(deps): update graalvm/setup-graalvm action to v1.6.0 2026-07-03 16:40:35 +00:00
renovate[bot]
17dbdb66bf chore(deps): update dependency vite to v8.1.1 2026-07-03 15:25:47 +00:00
Jérémie Panzer
6e3e9add36 Merge pull request #2214 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4.4.0
2026-07-03 17:24:52 +02:00
renovate[bot]
5b25011853 chore(deps): update docker/login-action action to v4.4.0 2026-07-03 14:46:14 +00:00
Jérémie Panzer
804b24b2d6 Merge pull request #2213 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.18.0
2026-07-03 07:19:00 +02:00
renovate[bot]
de98b0f7c2 fix(deps): update dependency react-router-dom to v7.18.1 2026-07-02 23:52:17 +00:00
renovate[bot]
709de70fa9 chore(deps): update dependency npm to v11.18.0 2026-07-02 18:37:34 +00:00
renovate[bot]
1b7bc11f9d chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.3.0-jre docker digest to 43ec947 2026-07-02 14:59:22 +00:00
Jérémie Panzer
bbcaacf3dd Merge pull request #2212 from Athou/renovate/docker-setup-buildx-action-4.x
chore(deps): update docker/setup-buildx-action action to v4.2.0
2026-07-02 16:58:33 +02:00
renovate[bot]
e816b1262c chore(deps): update docker/setup-buildx-action action to v4.2.0 2026-07-02 11:32:24 +00:00
Jérémie Panzer
fc019333dc Merge pull request #2211 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4.3.0
2026-07-02 13:31:37 +02:00
renovate[bot]
56b0ddbc34 chore(deps): update docker/login-action action to v4.3.0 2026-07-02 09:08:11 +00:00
renovate[bot]
bb74d27d52 fix(deps): update quarkus.version to v3.37.1 2026-07-02 05:24:05 +00:00
Jérémie Panzer
7b1d19ca71 Merge pull request #2210 from Athou/renovate/docker-setup-qemu-action-4.x
chore(deps): update docker/setup-qemu-action action to v4.2.0
2026-07-02 07:23:33 +02:00
Jérémie Panzer
af961678bd Merge pull request #2209 from Athou/renovate/docker-build-push-action-7.x
chore(deps): update docker/build-push-action action to v7.3.0
2026-07-02 07:23:24 +02:00
Jérémie Panzer
1579242644 Merge pull request #2208 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.3.0
2026-07-02 07:23:18 +02:00
renovate[bot]
2a45f5c596 chore(deps): update docker/setup-qemu-action action to v4.2.0 2026-07-02 01:00:10 +00:00
renovate[bot]
c4560c49b0 chore(deps): update docker/build-push-action action to v7.3.0 2026-07-02 01:00:05 +00:00
Athou
2b7f75d9ef fix tests 2026-07-02 02:56:08 +02:00
renovate[bot]
5f68bcbd46 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.3.0 2026-07-01 23:54:29 +00:00
renovate[bot]
c93c072259 fix(deps): update mantine monorepo to v9.4.1 2026-07-01 23:54:20 +00:00
Jérémie Panzer
516344a993 Merge pull request #2206 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.8.0
2026-06-30 08:15:35 +02:00
renovate[bot]
4d42fe5a0b chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.8.0 2026-06-30 05:11:59 +00:00
renovate[bot]
47bf132fff fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.2 2026-06-29 23:55:24 +00:00
renovate[bot]
04a9d48505 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.7 2026-06-29 19:44:00 +00:00
renovate[bot]
3716ddcf15 chore(deps): lock file maintenance 2026-06-29 03:37:40 +00:00
Jérémie Panzer
6c3ab40cb6 Merge pull request #2205 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.7.0
2026-06-29 05:35:54 +02:00
renovate[bot]
b7270974e5 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.7.0 2026-06-28 18:05:25 +00:00
renovate[bot]
9bfc53e77a fix(deps): update react-querybuilder to v8.20.2 2026-06-28 18:05:20 +00:00
renovate[bot]
f34fac8d17 chore(deps): update dependency @vitejs/plugin-react to v6.0.3 2026-06-26 13:36:32 +00:00
Jérémie Panzer
555c11649e Merge pull request #2204 from Athou/renovate/vite-8.x
chore(deps): update dependency vite to v8.1.0
2026-06-26 15:35:39 +02:00
Jérémie Panzer
c308c5d606 Merge pull request #2182 from Athou/renovate/biomejs-biome-2.x
chore(deps): update dependency @biomejs/biome to v2.5.1
2026-06-26 15:35:34 +02:00
Athou
54e9615994 add svg titles 2026-06-26 14:10:54 +02:00
renovate[bot]
b0b3b323fd chore(deps): update dependency vite to v8.1.0 2026-06-26 12:01:42 +00:00
renovate[bot]
f740a0b8ba chore(deps): update dependency @biomejs/biome to v2.5.1 2026-06-26 12:01:31 +00:00
renovate[bot]
e154675e72 fix(deps): update dependency axios to v1.18.1 2026-06-25 18:30:55 +00:00
Jérémie Panzer
2b3d3261de Merge pull request #2203 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to v9.4.0
2026-06-25 20:30:14 +02:00
renovate[bot]
fab525ca56 fix(deps): update mantine monorepo to v9.4.0 2026-06-25 17:09:08 +00:00
Jérémie Panzer
1c273d1c1a Merge pull request #2201 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.37.0
2026-06-24 19:04:03 +02:00
renovate[bot]
90d684367c fix(deps): update quarkus.version to v3.37.0 2026-06-24 15:22:44 +00:00
renovate[bot]
1ffc544ab0 chore(deps): update debian:13.5 docker digest to d07d1b5 2026-06-24 07:28:54 +00:00
Jérémie Panzer
cde0cceee1 Merge pull request #2200 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.18.0
2026-06-24 09:28:15 +02:00
renovate[bot]
1604fbc55c chore(deps): update node.js to v24.18.0 2026-06-24 00:45:25 +00:00
Jérémie Panzer
6f586e8866 Merge pull request #2199 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.2.0
2026-06-23 09:14:52 +02:00
renovate[bot]
c53455ad61 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.2.0 2026-06-22 22:13:00 +00:00
renovate[bot]
77b3c609f3 chore(deps): lock file maintenance 2026-06-22 05:10:43 +00:00
Jérémie Panzer
3b84598d99 Merge pull request #2197 from Athou/renovate/react-draggable-4.x
fix(deps): update dependency react-draggable to v4.7.0
2026-06-22 07:09:06 +02:00
renovate[bot]
6f536c0981 fix(deps): update dependency react-draggable to v4.7.0 2026-06-21 21:36:40 +00:00
renovate[bot]
1f881ea252 fix(deps): update react-querybuilder to v8.20.1 2026-06-21 21:36:29 +00:00
Jérémie Panzer
b14df1b3cb Merge pull request #2196 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.20.0
2026-06-21 15:23:57 +02:00
renovate[bot]
e13763baa3 fix(deps): update react-querybuilder to v8.20.0 2026-06-21 09:52:35 +00:00
Jérémie Panzer
502ef67a71 Merge pull request #2192 from Athou/renovate/vite-plugin-checker-0.14.x
chore(deps): update dependency vite-plugin-checker to v0.14.4
2026-06-20 21:21:29 +02:00
renovate[bot]
05cab626df chore(deps): update dependency vite-plugin-checker to v0.14.4 2026-06-20 17:53:07 +00:00
renovate[bot]
c7d54af7ad fix(deps): update mantine monorepo to v9.3.2 2026-06-19 22:03:44 +00:00
Jérémie Panzer
ad195fcd80 Merge pull request #2194 from Athou/renovate/react-router-monorepo
fix(deps): update react-router monorepo to v7.18.0
2026-06-20 00:02:36 +02:00
renovate[bot]
b87c68d598 fix(deps): update react-router monorepo to v7.18.0 2026-06-19 19:03:39 +00:00
Jérémie Panzer
33af37ed2e Merge pull request #2191 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.4.0
2026-06-19 12:16:44 +02:00
renovate[bot]
c4113fc92b fix(deps): update linguijs monorepo to v6.4.0 2026-06-19 09:49:58 +00:00
renovate[bot]
ed40025d26 fix(deps): update quarkus.version to v3.36.3 2026-06-19 03:23:19 +00:00
Jérémie Panzer
752008a551 Merge pull request #2190 from Athou/renovate/actions-checkout-7.x
chore(deps): update actions/checkout action to v7
2026-06-19 05:22:13 +02:00
renovate[bot]
a8bf970dca chore(deps): update actions/checkout action to v7 2026-06-18 20:43:45 +00:00
renovate[bot]
5b94bcdfdd chore(deps): update vitest monorepo to v4.1.9 2026-06-18 09:31:04 +00:00
Jérémie Panzer
a66a0e9485 Merge pull request #2187 from Athou/renovate/graalvm-setup-graalvm-1.5.x
chore(deps): update graalvm/setup-graalvm action to v1.5.6
2026-06-18 11:26:32 +02:00
renovate[bot]
80755e15b8 chore(deps): update graalvm/setup-graalvm action to v1.5.6 2026-06-18 06:49:13 +00:00
Jérémie Panzer
8cede0c6e0 Merge pull request #2188 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to v1.18.0
2026-06-18 08:45:44 +02:00
Jérémie Panzer
9556f0f7d2 Merge pull request #2189 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.17.0
2026-06-18 08:45:36 +02:00
renovate[bot]
1b80f3060c chore(deps): update node.js to v24.17.0 2026-06-18 05:41:34 +00:00
renovate[bot]
00811f0be3 fix(deps): update dependency axios to v1.18.0 2026-06-17 22:02:57 +00:00
Jérémie Panzer
0fdfc2c59c Merge pull request #2186 from Athou/renovate/style-to-object-2.x
fix(deps): update dependency style-to-object to v2
2026-06-17 17:46:31 +02:00
renovate[bot]
8d25562a76 fix(deps): update dependency style-to-object to v2 2026-06-17 14:14:50 +00:00
Jérémie Panzer
1d0d9d4be6 Merge pull request #2185 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.7.0
2026-06-16 11:46:39 +02:00
renovate[bot]
9ed4559625 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.7.0 2026-06-16 09:09:09 +00:00
renovate[bot]
2a53e8f15d chore(deps): update graalvm/setup-graalvm action to v1.5.5 2026-06-16 03:56:30 +00:00
Jérémie Panzer
15fbd18f31 Merge pull request #2184 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v7.4.0
2026-06-16 05:55:32 +02:00
renovate[bot]
2c248a7ca1 fix(deps): update querydsl.version to v7.4.0 2026-06-15 21:52:53 +00:00
Jérémie Panzer
94d8fdb4ab Merge pull request #2183 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.1.0
2026-06-15 23:45:05 +02:00
renovate[bot]
3596439ed4 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7.1.0 2026-06-15 20:48:14 +00:00
Jérémie Panzer
bc732a52ce Merge pull request #2179 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.17.0
2026-06-15 13:21:46 +02:00
renovate[bot]
ef096899a2 chore(deps): update dependency npm to v11.17.0 2026-06-15 09:48:49 +00:00
Jérémie Panzer
bf4bcf740e Merge pull request #2180 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.6.0
2026-06-15 11:39:11 +02:00
renovate[bot]
679281ac26 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.6.0 2026-06-15 06:12:58 +00:00
renovate[bot]
bde3d1408b fix(deps): update react-querybuilder to v8.19.1 2026-06-14 05:09:50 +00:00
Jérémie Panzer
3621a96d3f Merge pull request #2178 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.3.0
2026-06-13 19:01:49 +02:00
renovate[bot]
6583ad114f fix(deps): update linguijs monorepo to v6.3.0 2026-06-13 15:48:28 +00:00
renovate[bot]
f4e42165bf fix(deps): update dependency dev.cel:cel to v0.13.1 2026-06-13 12:21:08 +00:00
Athou
00d7be735a static random fields should not be used with graalvm as they are seeded at compile time and thus not random anymore 2026-06-13 12:03:50 +02:00
Athou
1388fba8e4 apply xml cleaning to opml files 2026-06-13 11:32:57 +02:00
Athou
c43644861f use a secure algorithm to generate image urls so that only server-side generated urls can be used 2026-06-13 11:21:16 +02:00
renovate[bot]
831ca599b8 chore(deps): update dependency com.github.eirslett:frontend-maven-plugin to v2.0.1 2026-06-12 16:36:09 +00:00
Athou
43fbd03292 remove husky and lint-staged 2026-06-12 10:12:47 +02:00
Athou
1efd04f6c5 fix wrapping of long titles 2026-06-12 10:10:02 +02:00
Jérémie Panzer
e89ccfd74b Merge pull request #2177 from Athou/renovate/patch-protobuf-monorepo
fix(deps): update protobuf monorepo to v4.35.1
2026-06-12 09:53:06 +02:00
renovate[bot]
622486160c fix(deps): update protobuf monorepo to v4.35.1 2026-06-12 05:26:54 +00:00
renovate[bot]
6d172cae9e fix(deps): update quarkus.version to v3.36.2 2026-06-12 04:36:06 +00:00
renovate[bot]
91b60fb147 fix(deps): update mantine monorepo to v9.3.1 2026-06-12 01:54:16 +00:00
renovate[bot]
3f9b7f48d5 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.5 2026-06-11 19:27:17 +00:00
renovate[bot]
3599fdec65 chore(deps): update debian:13.5 docker digest to fe7312b 2026-06-11 16:02:59 +00:00
Jérémie Panzer
00e86974b3 Merge pull request #2176 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.19.0
2026-06-11 05:37:46 +02:00
renovate[bot]
2aa897eb80 fix(deps): update react-querybuilder to v8.19.0 2026-06-11 03:11:56 +00:00
renovate[bot]
ce9706b860 chore(deps): update react monorepo to v19.2.17 2026-06-08 22:49:26 +00:00
Jérémie Panzer
e140dfe556 Merge pull request #2174 from Athou/renovate/react-router-monorepo
fix(deps): update react-router monorepo to v7.17.0
2026-06-08 08:01:57 +02:00
renovate[bot]
4a1b845ac2 chore(deps): lock file maintenance 2026-06-08 01:47:00 +00:00
renovate[bot]
573f8af57e fix(deps): update react-router monorepo to v7.17.0 2026-06-07 17:15:57 +00:00
Jérémie Panzer
33445c93e8 Merge pull request #2173 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-7.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7
2026-06-07 08:44:16 +02:00
Athou
f7fcb659f7 fix build 2026-06-07 07:34:00 +02:00
renovate[bot]
b0aa723c2f chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v7 2026-06-06 17:58:01 +00:00
Jérémie Panzer
48dca41738 Merge pull request #2172 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to v1.17.0
2026-06-06 15:55:32 +02:00
renovate[bot]
873d6f487f fix(deps): update dependency axios to v1.17.0 2026-06-06 09:44:37 +00:00
Jérémie Panzer
c8d73b129e Merge pull request #2156 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v7.3.0
2026-06-06 06:27:00 +02:00
renovate[bot]
c63e9e1cd2 fix(deps): update querydsl.version to v7.3.0 2026-06-05 21:47:04 +00:00
Jérémie Panzer
def2ad84bb Merge pull request #2171 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to v9.3.0
2026-06-05 15:24:57 +02:00
renovate[bot]
52510e9817 fix(deps): update mantine monorepo to v9.3.0 2026-06-05 10:33:10 +00:00
renovate[bot]
69a95488ce fix(deps): update react monorepo 2026-06-04 22:50:59 +00:00
Jérémie Panzer
636841f647 Merge pull request #2170 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.2.0
2026-06-04 18:13:54 +02:00
renovate[bot]
1ea521236c fix(deps): update linguijs monorepo to v6.2.0 2026-06-04 13:37:49 +00:00
renovate[bot]
6966efeda5 chore(deps): update dependency vite to v8.0.16 2026-06-04 10:09:32 +00:00
Jérémie Panzer
66ad0c3548 Merge pull request #2169 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.18.0
2026-06-04 12:00:32 +02:00
renovate[bot]
e061ccbf79 chore(deps): update vitest monorepo to v4.1.8 2026-06-04 09:08:43 +00:00
renovate[bot]
30cc6a111d chore(deps): update dependency vite to v8.0.15 2026-06-04 04:46:24 +00:00
renovate[bot]
8416ce5124 fix(deps): update react-querybuilder to v8.18.0 2026-06-04 01:33:04 +00:00
renovate[bot]
0cacfe391b fix(deps): update quarkus.version to v3.36.1 (#2168)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-03 18:16:42 +00:00
renovate[bot]
c0eaab48cd chore(deps): update graalvm/setup-graalvm action to v1.5.4 2026-06-03 15:05:10 +00:00
renovate[bot]
c696bc3545 chore(deps): update dependency lint-staged to v17.0.7 2026-06-03 14:05:03 +00:00
renovate[bot]
72505954a9 chore(deps): update dependency lint-staged to v17.0.6 2026-06-02 18:11:51 +00:00
renovate[bot]
49159dba5c chore(deps): update actions/checkout action to v6.0.3 2026-06-02 17:34:01 +00:00
renovate[bot]
41e2d89abc chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.3.0-jre docker digest to 9ff5b13 2026-06-02 16:48:04 +00:00
Jérémie Panzer
6e7de97d93 Merge pull request #2167 from Athou/renovate/react-draggable-4.x
fix(deps): update dependency react-draggable to v4.6.0
2026-06-02 05:57:46 +02:00
renovate[bot]
2f20e6b498 fix(deps): update dependency react-draggable to v4.6.0 2026-06-01 20:10:53 +00:00
Jérémie Panzer
ecf9158fd7 Merge pull request #2166 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to v7.16.0
2026-06-01 07:19:20 +02:00
renovate[bot]
dc7e7321f3 fix(deps): update dependency react-router-dom to v7.16.0 2026-05-31 21:24:56 +00:00
Jérémie Panzer
0f087ad2a0 Merge pull request #2165 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.17.0
2026-05-31 08:06:48 +02:00
renovate[bot]
ff19a6e9eb fix(deps): update react-querybuilder to v8.17.0 2026-05-31 04:53:55 +00:00
renovate[bot]
8cec0c0779 fix(deps): update mantine monorepo to v9.2.2 2026-05-30 21:42:00 +00:00
Jérémie Panzer
314384f8e7 Merge pull request #2164 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.16.0
2026-05-30 23:40:36 +02:00
Jérémie Panzer
6c75ad95ad Merge pull request #2163 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.5.0
2026-05-30 23:40:02 +02:00
renovate[bot]
76e3b3caff chore(deps): update dependency npm to v11.16.0 2026-05-30 20:56:38 +00:00
renovate[bot]
c8f71480c9 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.5.0 2026-05-30 20:56:33 +00:00
renovate[bot]
9172a0cf9c chore(deps): update dependency @biomejs/biome to v2.4.16 2026-05-30 18:07:43 +00:00
renovate[bot]
eb476c6023 fix(deps): update react-querybuilder to v8.16.2 2026-05-30 00:38:03 +00:00
Jérémie Panzer
da4f3bd38e Merge pull request #2162 from Athou/renovate/vite-plugin-checker-0.x
chore(deps): update dependency vite-plugin-checker to v0.14.1
2026-05-29 19:13:53 +02:00
renovate[bot]
c65d628a36 chore(deps): update dependency vite-plugin-checker to v0.14.1 2026-05-29 15:43:11 +00:00
renovate[bot]
589b8c3afc fix(deps): update dependency dayjs to v1.11.21 2026-05-29 05:49:39 +00:00
Jérémie Panzer
2684051da0 Merge pull request #2161 from Athou/renovate/org.apache.maven.plugins-maven-surefire-plugin-3.5.x
chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.6
2026-05-28 13:07:25 +02:00
renovate[bot]
200db68d05 chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.6 2026-05-28 02:37:33 +00:00
renovate[bot]
f6d8d32a01 chore(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.6 2026-05-27 22:55:28 +00:00
Jérémie Panzer
72d5af5bb0 Merge pull request #2160 from Athou/renovate/docker-setup-qemu-action-4.x
chore(deps): update docker/setup-qemu-action action to v4.1.0
2026-05-27 21:58:58 +02:00
Jérémie Panzer
aabbc54cbb Merge pull request #2159 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.6.0
2026-05-27 21:58:50 +02:00
renovate[bot]
09b523bf56 chore(deps): update docker/setup-qemu-action action to v4.1.0 2026-05-27 19:09:41 +00:00
renovate[bot]
5dc7f522bf chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.6.0 2026-05-27 16:16:17 +00:00
Jérémie Panzer
fd58a42824 Merge pull request #2158 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.36.0
2026-05-27 12:58:43 +02:00
Jérémie Panzer
0a6d1c85ed Merge pull request #2157 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-6.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v6.1.0
2026-05-27 12:58:40 +02:00
renovate[bot]
13f84a260c fix(deps): update quarkus.version to v3.36.0 2026-05-27 09:38:52 +00:00
renovate[bot]
4132ad9a97 chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v6.1.0 2026-05-27 09:38:46 +00:00
Athou
1faba92ecc remove unused relationships 2026-05-27 07:28:19 +02:00
renovate[bot]
b93fc86663 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.39 2026-05-26 00:28:53 +00:00
renovate[bot]
7123036e8d chore(deps): lock file maintenance 2026-05-25 02:01:46 +00:00
Jérémie Panzer
cce4ea4dc6 Merge pull request #2155 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to v6.1.0
2026-05-25 01:49:13 +02:00
renovate[bot]
b8f7df1555 fix(deps): update linguijs monorepo to v6.1.0 2026-05-24 13:45:25 +00:00
renovate[bot]
ba8cc0477c chore(deps): update dependency vite to v8.0.14 2026-05-24 09:26:55 +00:00
Jérémie Panzer
010026bc88 Merge pull request #2154 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.15.0
2026-05-24 07:07:15 +02:00
renovate[bot]
a1ba34caf2 chore(deps): update dependency npm to v11.15.0 2026-05-23 20:45:10 +00:00
renovate[bot]
1214380bee chore(deps): update dependency vitest to v4.1.7 2026-05-23 12:43:21 +00:00
Athou
03eb09c68c limit the number of favicon retries 2026-05-23 11:17:59 +02:00
renovate[bot]
055d503862 chore(deps): update dependency @types/react to v19.2.15 2026-05-22 23:03:14 +00:00
Athou
5755ff762b Trie is thread-safe, no need to recreate one every time 2026-05-22 20:29:48 +02:00
Jérémie Panzer
88e24787e8 Merge pull request #2153 from Athou/renovate/docker-setup-buildx-action-4.x
chore(deps): update docker/setup-buildx-action action to v4.1.0
2026-05-22 20:25:02 +02:00
renovate[bot]
ed32d07ac4 chore(deps): update docker/setup-buildx-action action to v4.1.0 2026-05-22 18:04:22 +00:00
Jérémie Panzer
3a917fcebe Merge pull request #2152 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4.2.0
2026-05-22 15:41:58 +02:00
renovate[bot]
3535068ca8 chore(deps): update docker/login-action action to v4.2.0 2026-05-22 13:03:48 +00:00
Jérémie Panzer
4c39d4b96b Merge pull request #2150 from Athou/renovate/docker-build-push-action-7.x
chore(deps): update docker/build-push-action action to v7.2.0
2026-05-21 21:27:31 +02:00
renovate[bot]
8e864c6793 chore(deps): update docker/build-push-action action to v7.2.0 2026-05-21 18:41:32 +00:00
Jérémie Panzer
aeffecced3 Merge pull request #2151 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.16.0
2026-05-21 19:54:18 +02:00
renovate[bot]
4be42dc1e2 chore(deps): update node.js to v24.16.0 2026-05-21 17:03:21 +00:00
Jérémie Panzer
bdf6c62c29 Merge pull request #2149 from Athou/renovate/org.mock-server-mockserver-junit-jupiter-6.x
chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v6
2026-05-21 07:37:36 +02:00
Athou
a4592e5199 fix tests 2026-05-21 04:48:43 +02:00
renovate[bot]
a5268f082d chore(deps): update dependency org.mock-server:mockserver-junit-jupiter to v6 2026-05-20 19:50:45 +00:00
Jérémie Panzer
b556e72922 Merge pull request #2148 from Athou/renovate/patch-quarkus.version
fix(deps): update quarkus.version to v3.35.4
2026-05-20 21:50:23 +02:00
renovate[bot]
3602d2533a fix(deps): update quarkus.version to v3.35.4 2026-05-20 15:46:05 +00:00
Jérémie Panzer
681f2c766a Merge pull request #2147 from Athou/renovate/mindsers-changelog-reader-action-2.x
chore(deps): update mindsers/changelog-reader-action action to v2.4.0
2026-05-20 14:11:52 +02:00
renovate[bot]
6e0a136cd1 chore(deps): update mindsers/changelog-reader-action action to v2.4.0 2026-05-20 10:37:59 +00:00
Jérémie Panzer
9e9945a1cc Merge pull request #2146 from Athou/renovate/debian-13.5
chore(deps): update debian:13.5 docker digest to 4ae6766
2026-05-20 08:46:39 +02:00
renovate[bot]
3368cead8b chore(deps): update debian:13.5 docker digest to 4ae6766 2026-05-20 04:16:03 +00:00
Jérémie Panzer
a7b5126b4a Merge pull request #2145 from Athou/renovate/protobuf-monorepo
fix(deps): update dependency com.google.protobuf:protobuf-java to v4.35.0
2026-05-20 06:15:49 +02:00
Jérémie Panzer
a9ef1a03dc Merge pull request #2144 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.5
2026-05-20 06:15:22 +02:00
Jérémie Panzer
bc0ec8dbfa Merge pull request #2143 from Athou/renovate/mindsers-changelog-reader-action-2.x
chore(deps): update mindsers/changelog-reader-action action to v2.3.0
2026-05-20 06:15:02 +02:00
renovate[bot]
7bef009922 fix(deps): update dependency com.google.protobuf:protobuf-java to v4.35.0 2026-05-20 01:03:49 +00:00
renovate[bot]
9a467bc27b chore(deps): update debian docker tag to v13.5 2026-05-20 01:03:45 +00:00
renovate[bot]
e3934c9403 chore(deps): update mindsers/changelog-reader-action action to v2.3.0 2026-05-19 22:42:24 +00:00
renovate[bot]
af337aa4d0 chore(deps): update dependency lint-staged to v17.0.5 2026-05-19 13:45:40 +00:00
Jérémie Panzer
313d3a01ec Merge pull request #2141 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to v2.12.0
2026-05-19 07:20:37 +02:00
Jérémie Panzer
feb9876cf5 Merge pull request #2142 from Athou/renovate/react-redux-9.x
fix(deps): update dependency react-redux to v9.3.0
2026-05-19 07:20:32 +02:00
renovate[bot]
9c3a5cb820 fix(deps): update dependency react-redux to v9.3.0 2026-05-18 19:12:38 +00:00
renovate[bot]
e219f781bf fix(deps): update dependency @reduxjs/toolkit to v2.12.0 2026-05-18 19:12:29 +00:00
renovate[bot]
21ecd6ae05 chore(deps): lock file maintenance 2026-05-18 00:37:57 +00:00
renovate[bot]
2449902c3d chore(deps): update dependency @vitejs/plugin-react to v6.0.2 2026-05-17 20:56:33 +00:00
renovate[bot]
c1a55037ba chore(deps): update dependency maven to v3.9.16 2026-05-17 19:48:01 +00:00
Jérémie Panzer
646a8122c0 Merge pull request #2140 from Athou/renovate/patch-react-router-monorepo
fix(deps): update dependency react-router-dom to v7.15.1
2026-05-17 21:47:37 +02:00
renovate[bot]
edc4e6c508 fix(deps): update dependency react-router-dom to v7.15.1 2026-05-17 18:40:58 +00:00
renovate[bot]
5ddeb7b156 fix(deps): update mantine monorepo to v9.2.1 2026-05-17 17:25:02 +00:00
renovate[bot]
306624e55f chore(deps): update dependency vite to v8.0.13 2026-05-17 12:41:35 +00:00
renovate[bot]
6a9ca65cbc fix(deps): update react-querybuilder to v8.16.1 2026-05-16 21:39:23 +00:00
renovate[bot]
7db0026a0c fix(deps): update dependency axios to v1.16.1 2026-05-16 16:37:50 +00:00
Jérémie Panzer
7358705248 Merge pull request #2137 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to v9.2.0
2026-05-16 07:58:01 +02:00
Jérémie Panzer
0b9ee2eec9 Merge pull request #2139 from Athou/renovate/dev.cel-cel-0.x
fix(deps): update dependency dev.cel:cel to v0.13.0
2026-05-16 07:57:48 +02:00
renovate[bot]
42eaf7fc39 fix(deps): update dependency dev.cel:cel to v0.13.0 2026-05-16 01:25:48 +00:00
renovate[bot]
6783cac9b4 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.5.1 2026-05-16 01:25:45 +00:00
renovate[bot]
628106ce88 fix(deps): update dependency tss-react to v4.9.21 2026-05-15 16:29:21 +00:00
Jérémie Panzer
1ce69b31a7 Merge pull request #2136 from Athou/renovate/yaml-2.x
chore(deps): update dependency yaml to v2.9.0
2026-05-15 08:01:15 +02:00
Jérémie Panzer
912ac11842 Merge pull request #2138 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.5.0
2026-05-15 07:57:38 +02:00
renovate[bot]
5f2fad560c chore(deps): update dependency yaml to v2.9.0 2026-05-14 21:28:25 +00:00
renovate[bot]
b300f364a7 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.5.0 2026-05-14 21:28:13 +00:00
renovate[bot]
049ec41d13 fix(deps): update mantine monorepo to v9.2.0 2026-05-14 16:49:16 +00:00
renovate[bot]
f0d17bc84e chore(deps): update dependency vitest to v4.1.6 2026-05-14 16:49:07 +00:00
renovate[bot]
cc442d7409 chore(deps): update dependency vite to v8.0.12 2026-05-14 08:51:10 +00:00
renovate[bot]
80bac26f21 fix(deps): update quarkus.version to v3.35.3 2026-05-13 17:00:07 +00:00
renovate[bot]
015c39e6f4 chore(deps): update dependency lint-staged to v17.0.4 2026-05-12 21:11:12 +00:00
renovate[bot]
e0ec3a4ebd chore(deps): update dependency @biomejs/biome to v2.4.15 2026-05-12 17:27:19 +00:00
renovate[bot]
a022de5cc3 chore(deps): update dependency npm to v11.14.1 2026-05-11 20:50:59 +00:00
renovate[bot]
a7b5e1e18c chore(deps): update dependency lint-staged to v17.0.3 2026-05-11 17:57:10 +00:00
renovate[bot]
b8695df1c8 fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.5 2026-05-11 11:10:01 +00:00
renovate[bot]
5e4382d1d2 chore(deps): lock file maintenance 2026-05-11 01:26:50 +00:00
Athou
ce983f4906 fix flaky test 2026-05-10 21:19:35 +02:00
Athou
4a8be29616 add support for declared icons in feeds (#2048) 2026-05-10 21:05:33 +02:00
renovate[bot]
1622eb642a chore(deps): update dependency vite to v8.0.11 2026-05-10 10:37:18 +00:00
Jérémie Panzer
422d992484 Merge pull request #2135 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.14.0
2026-05-10 12:36:28 +02:00
renovate[bot]
1065af1233 chore(deps): update dependency npm to v11.14.0 2026-05-09 20:56:38 +00:00
renovate[bot]
dde39d83be fix(deps): update react monorepo to v19.2.6 2026-05-09 16:44:07 +00:00
Jérémie Panzer
94fe7617bf Merge pull request #2134 from Athou/renovate/lint-staged-17.x
chore(deps): update dependency lint-staged to v17
2026-05-09 17:08:52 +02:00
Jérémie Panzer
e781d85b7c Merge pull request #2133 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to v7.15.0
2026-05-09 17:08:35 +02:00
renovate[bot]
c30c9ca380 chore(deps): update dependency lint-staged to v17 2026-05-09 13:42:20 +00:00
renovate[bot]
c395916af9 chore(deps): update debian:13.4 docker digest to e2d08da 2026-05-09 04:41:33 +00:00
renovate[bot]
1a4037e360 fix(deps): update dependency react-router-dom to v7.15.0 2026-05-08 16:51:27 +00:00
Athou
f207bfaddd format empty records and anonymous types as a single line 2026-05-08 17:56:26 +02:00
Jérémie Panzer
3dd298c0c8 Merge pull request #2132 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.16.0 (minor)
2026-05-08 08:29:30 +02:00
renovate[bot]
8e2e4da7c3 fix(deps): update react-querybuilder to v8.16.0 2026-05-08 05:58:29 +00:00
renovate[bot]
418e3c109c chore(deps): update graalvm/setup-graalvm action to v1.5.3 2026-05-06 18:39:48 +00:00
Jérémie Panzer
cfda63a609 Merge pull request #2131 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to v1.16.0
2026-05-06 07:22:28 +02:00
renovate[bot]
ba68276bfb fix(deps): update dependency axios to v1.16.0 2026-05-05 19:30:57 +00:00
renovate[bot]
97c700024a chore(deps): update dependency yaml to v2.8.4 2026-05-05 10:10:38 +00:00
renovate[bot]
d4f67d726c chore(deps): update dependency @biomejs/biome to v2.4.14 2026-05-04 20:37:34 +00:00
Jérémie Panzer
ea87fa3e5a Merge pull request #2130 from Athou/renovate/io.quarkiverse.playwright-quarkus-playwright-2.3.x
chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.4
2026-05-04 22:36:37 +02:00
renovate[bot]
d12d247b3e chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.4 2026-05-04 20:07:06 +00:00
renovate[bot]
c4a23915bd fix(deps): update quarkus.version to v3.35.2 2026-05-04 19:06:39 +00:00
Athou
8645c57d13 simplify settings thunks 2026-05-04 08:03:57 +02:00
Jérémie Panzer
b170e0bc17 Merge pull request #2129 from Athou/renovate/patch-linguijs-monorepo
fix(deps): update linguijs monorepo to v6.0.1 (patch)
2026-05-04 08:03:53 +02:00
renovate[bot]
4199f514f9 fix(deps): update linguijs monorepo to v6.0.1 2026-05-04 05:28:51 +00:00
renovate[bot]
c96efb3bb4 chore(deps): lock file maintenance 2026-05-04 00:57:15 +00:00
renovate[bot]
d5571e0196 chore(deps): update dependency jsdom to v29.1.1 2026-05-03 09:41:32 +00:00
Athou
9f7f87b4ae move handlers in Layout because they actually only apply to the reader pages 2026-05-02 15:04:33 +02:00
renovate[bot]
4b03fce85d chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.4.2 2026-05-02 06:12:23 +00:00
renovate[bot]
4b28d1c635 chore(deps): update ibm-semeru-runtimes docker tag to open-jdk-25.0.3.0-jre 2026-05-01 11:59:50 +00:00
Jérémie Panzer
a5e803177f Merge pull request #2128 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.35.1 (minor)
2026-05-01 13:59:25 +02:00
renovate[bot]
9462f284a4 fix(deps): update quarkus.version to v3.35.1 2026-05-01 11:33:13 +00:00
renovate[bot]
4b0f6bd61b fix(deps): update mantine monorepo to v9.1.1 2026-04-30 21:05:02 +00:00
Jérémie Panzer
d6c85214ef Merge pull request #2127 from Athou/renovate/jsdom-29.x
chore(deps): update dependency jsdom to v29.1.0
2026-04-30 07:18:31 +02:00
renovate[bot]
de770cf801 chore(deps): update dependency jsdom to v29.1.0 2026-04-30 04:39:54 +00:00
renovate[bot]
dae0f740c2 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.4.1 2026-04-27 17:36:06 +00:00
Athou
9452c3e74c remove warning 2026-04-27 18:01:02 +02:00
Athou
f826f1d543 create comparator only once 2026-04-27 18:01:02 +02:00
Athou
fd13c80e5a allow reuse of TLS connections 2026-04-27 17:52:40 +02:00
Athou
75871348d5 compile pattern once 2026-04-27 17:46:50 +02:00
renovate[bot]
0140e88595 chore(deps): lock file maintenance 2026-04-27 00:53:02 +00:00
renovate[bot]
e620b1254b chore(deps): update dependency @biomejs/biome to v2.4.13 2026-04-26 17:49:57 +00:00
Jérémie Panzer
77cfcf6c58 Merge pull request #2123 from Athou/renovate/major-linguijs-monorepo
fix(deps): update linguijs monorepo to v6 (major)
2026-04-26 16:07:22 +02:00
Athou
04e9df3d0a the format and the formatOptions fields have been removed 2026-04-26 15:43:42 +02:00
renovate[bot]
a953134089 chore(deps): update dependency vite to v8.0.10 2026-04-26 06:27:27 +00:00
Jérémie Panzer
88b9c0d783 Merge pull request #2125 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.13.0
2026-04-26 08:26:50 +02:00
renovate[bot]
ff7e0ba95b chore(deps): update dependency npm to v11.13.0 2026-04-25 20:53:09 +00:00
renovate[bot]
53dfbcaf00 fix(deps): update linguijs monorepo to v6 2026-04-25 13:00:15 +00:00
renovate[bot]
d8fca22c00 fix(deps): update dependency react-router-dom to v7.14.2 (#2122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-25 05:15:30 +00:00
renovate[bot]
4fb5963bd9 fix(deps): update dependency axios to v1.15.2 2026-04-24 19:10:13 +00:00
Jérémie Panzer
862d81f446 Merge pull request #2121 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to v9.1.0 (minor)
2026-04-24 21:09:22 +02:00
renovate[bot]
8ae7943b94 fix(deps): update mantine monorepo to v9.1.0 2026-04-24 17:36:15 +00:00
renovate[bot]
46e947d779 chore(deps): update dependency vitest to v4.1.5 2026-04-24 14:58:06 +00:00
renovate[bot]
7780d6020f chore(deps): update dependency vite to v8.0.9 2026-04-23 07:05:57 +00:00
renovate[bot]
e5803b46f2 fix(deps): update quarkus.version to v3.34.6 2026-04-22 22:04:58 +00:00
renovate[bot]
d776090298 fix(deps): update dependency axios to v1.15.1 2026-04-22 18:11:13 +00:00
renovate[bot]
f2f3111d49 chore(deps): update debian:13.4 docker digest to 35b8ff7 2026-04-22 06:50:35 +00:00
renovate[bot]
dff1b957cd fix(deps): update dependency org.projectlombok:lombok to v1.18.46 2026-04-22 01:21:16 +00:00
Athou
b1ec50c3cb increase timeout to prevent flaky tests 2026-04-20 11:06:03 +02:00
renovate[bot]
85aa188287 chore(deps): lock file maintenance 2026-04-20 08:11:06 +00:00
renovate[bot]
e7d6526da9 fix(deps): update dependency org.jsoup:jsoup to v1.22.2 2026-04-20 07:28:37 +00:00
Jérémie Panzer
d67c6fcc00 Merge pull request #2119 from Athou/renovate/actions-setup-node-6.x
chore(deps): update actions/setup-node action to v6.4.0
2026-04-20 09:25:22 +02:00
renovate[bot]
d9bf084300 chore(deps): update actions/setup-node action to v6.4.0 2026-04-20 06:58:42 +00:00
Athou
da3977b0e2 fix error message not correctly returned 2026-04-20 08:39:24 +02:00
renovate[bot]
7df930bccc chore(deps): update dependency typescript to v6.0.3 2026-04-20 00:42:50 +00:00
renovate[bot]
11f73a1a53 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6.1 2026-04-19 12:22:35 +00:00
Jérémie Panzer
2bbcd55e48 Merge pull request #2118 from Athou/renovate/react-querybuilder
fix(deps): update react-querybuilder to v8.15.0 (minor)
2026-04-19 14:21:37 +02:00
renovate[bot]
43890b8d5c fix(deps): update react-querybuilder to v8.15.0 2026-04-19 11:54:36 +00:00
Athou
b6b8e3741b group react-querybuilder and @react-querybuilder/mantine together 2026-04-19 13:53:45 +02:00
Jérémie Panzer
c39f00c336 Merge pull request #2114 from Athou/renovate/vite-plugin-checker-0.x
chore(deps): update dependency vite-plugin-checker to v0.13.0
2026-04-19 08:04:06 +02:00
renovate[bot]
e48eaacfef chore(deps): update dependency vite-plugin-checker to v0.13.0 2026-04-18 13:49:45 +00:00
renovate[bot]
6d97691388 chore(deps): update dependency @biomejs/biome to v2.4.12 2026-04-17 21:33:53 +00:00
renovate[bot]
d64cc996bc chore(deps): update dependency maven to v3.9.15 2026-04-17 14:05:43 +00:00
renovate[bot]
617d66c9b9 fix(deps): update quarkus.version to v3.34.5 2026-04-17 05:06:55 +00:00
Jérémie Panzer
0fc50d2105 Merge pull request #2113 from Athou/renovate/rolldown-plugin-babel-0.2.x
fix(deps): update dependency @rolldown/plugin-babel to v0.2.3
2026-04-17 07:06:29 +02:00
renovate[bot]
2bb9f28569 fix(deps): update dependency @rolldown/plugin-babel to v0.2.3 2026-04-17 01:09:52 +00:00
renovate[bot]
c1580b8359 fix(deps): update dependency react-router-dom to v7.14.1 2026-04-16 21:56:46 +00:00
Jérémie Panzer
dde235825d Merge pull request #2111 from Athou/renovate/patch-mantine-monorepo
fix(deps): update mantine monorepo to v9.0.2 (patch)
2026-04-16 19:07:20 +02:00
renovate[bot]
eac13b4025 fix(deps): update mantine monorepo to v9.0.2 2026-04-16 15:40:07 +00:00
Athou
59cc9c2706 add explicit dependency 2026-04-16 17:38:54 +02:00
Athou
40e20a0d33 use exact versions 2026-04-16 16:25:54 +02:00
Jérémie Panzer
a42679acaa Merge pull request #2112 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.15.0
2026-04-16 13:28:55 +02:00
renovate[bot]
fd2e8fcdb8 chore(deps): update node.js to v24.15.0 2026-04-16 10:57:14 +00:00
Athou
ebd5a15152 cache npm dependencies during CI build 2026-04-15 09:22:04 +02:00
Athou
6cdd110304 release 7.1.0 2026-04-15 07:45:15 +02:00
Jérémie Panzer
3181cda2e0 Merge pull request #2110 from Athou/renovate/actions-upload-pages-artifact-5.x
chore(deps): update actions/upload-pages-artifact action to v5
2026-04-14 09:21:31 +02:00
renovate[bot]
2659c7fc02 chore(deps): update actions/upload-pages-artifact action to v5 2026-04-14 06:47:52 +00:00
renovate[bot]
5747ae3429 fix(deps): update dependency axios to ^1.15.0 2026-04-13 05:02:56 +00:00
renovate[bot]
8d60be0e3f chore(deps): lock file maintenance 2026-04-13 01:02:19 +00:00
renovate[bot]
7e3f801a5a chore(deps): update dependency @biomejs/biome to v2.4.11 2026-04-12 16:59:32 +00:00
renovate[bot]
687ef53c65 chore(deps): update dependency vitest to ^4.1.4 2026-04-12 08:58:19 +00:00
renovate[bot]
a1fe9e727e chore(deps): update dependency vite to ^8.0.8 2026-04-12 04:30:28 +00:00
renovate[bot]
6d625c88d3 fix(deps): update react monorepo to ^19.2.5 2026-04-11 20:26:25 +00:00
renovate[bot]
c314e2de6b chore(deps): update dependency vitest to ^4.1.3 2026-04-11 01:40:15 +00:00
renovate[bot]
bd08b95390 chore(deps): update actions/upload-artifact digest to 043fb46 2026-04-10 21:11:12 +00:00
renovate[bot]
aed0cca7e1 chore(deps): update dependency vite to ^8.0.7 2026-04-10 16:53:01 +00:00
renovate[bot]
7d7761fb8d chore(deps): update docker/build-push-action digest to bcafcac 2026-04-10 13:24:27 +00:00
Athou
6d2fb5acc2 refactor 2026-04-10 15:17:27 +02:00
Athou
ec35d846cf Merge branch 'perf/batch-guid-check-on-feed-refresh' of https://github.com/ingokegel/commafeed into ingokegel-perf/batch-guid-check-on-feed-refresh 2026-04-10 14:22:32 +02:00
Ingo Kegel
1d23907652 Use batched IN clause for GUID existence check during feed refresh
Instead of fetching all existing GUID hashes for a feed from the database only check the GUIDs present in the current feed XML using a SQL IN clause. GUIDs are partitioned into batches of 1000.

Also adds an integration test verifying that refreshing an up-to-date feed does not create duplicate entries.
2026-04-10 10:13:37 +02:00
renovate[bot]
efc6c10ace fix(deps): update quarkus.version to v3.34.3 2026-04-08 19:39:10 +00:00
renovate[bot]
47a8ad5244 chore(deps): update debian:13.4 docker digest to 3352c2e 2026-04-07 06:43:23 +00:00
Athou
5d879c4619 update all dependencies 2026-04-07 08:42:07 +02:00
Jérémie Panzer
6e0dd3d064 Merge pull request #2094 from Athou/renovate/typescript-6.x
chore(deps): update dependency typescript to v6
2026-04-07 03:23:40 +02:00
Athou
4657a403d0 adapt to typescript 6.0 api 2026-04-07 02:42:44 +02:00
Jérémie Panzer
bf09a07fe2 Merge pull request #2108 from Athou/renovate/org.passay-passay-2.x
fix(deps): update dependency org.passay:passay to v2
2026-04-07 02:28:34 +02:00
Jérémie Panzer
927802ca88 Merge pull request #2096 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.4.0
2026-04-07 02:13:55 +02:00
Athou
3d5bc9ef0e adapt to passay 2.0 api 2026-04-07 02:11:37 +02:00
Jérémie Panzer
706ad7e44d Merge pull request #2107 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.14.0
2026-04-07 02:06:30 +02:00
Jérémie Panzer
88206f521b Merge pull request #2102 from Athou/renovate/io.github.git-commit-id-git-commit-id-maven-plugin-10.x
chore(deps): update dependency io.github.git-commit-id:git-commit-id-maven-plugin to v10
2026-04-06 20:27:07 +02:00
renovate[bot]
af786b4c11 fix(deps): update dependency org.passay:passay to v2 2026-04-06 18:26:35 +00:00
renovate[bot]
d4c749c997 fix(deps): update dependency react-router-dom to ^7.14.0 2026-04-06 18:26:28 +00:00
Jérémie Panzer
b5aa25cd0b Merge pull request #2093 from Athou/renovate/actions-deploy-pages-5.x
chore(deps): update actions/deploy-pages action to v5
2026-04-06 20:25:27 +02:00
Jérémie Panzer
ae49fb6dad Merge pull request #2092 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.34.2 (minor)
2026-04-06 20:25:17 +02:00
Jérémie Panzer
3e24d17951 Merge pull request #2090 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.12.1
2026-04-06 20:25:06 +02:00
renovate[bot]
22030e6907 chore(deps): update dependency io.github.git-commit-id:git-commit-id-maven-plugin to v10 2026-04-03 13:24:55 +00:00
renovate[bot]
39fdcb9af3 chore(deps): update dependency @biomejs/biome to v2.4.10 2026-04-02 20:55:13 +00:00
renovate[bot]
866998f98b chore(deps): update docker/login-action digest to 4907a6d 2026-04-02 18:53:38 +00:00
renovate[bot]
0fa71f76e8 fix(deps): update quarkus.version to v3.34.2 2026-04-02 13:57:27 +00:00
renovate[bot]
317f655128 chore(deps): update graalvm/setup-graalvm digest to 60c2672 2026-04-02 09:27:39 +00:00
renovate[bot]
a871426f31 chore(deps): update dependency typescript to v6 2026-04-01 17:58:10 +00:00
renovate[bot]
2caf9ff38a chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.4.0 2026-04-01 17:57:52 +00:00
renovate[bot]
1de3a57d50 chore(deps): update graalvm/setup-graalvm digest to 2149f39 2026-03-31 14:12:33 +00:00
renovate[bot]
bed1355d63 fix(deps): update linguijs monorepo to ^5.9.4 (#2101)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 05:49:21 +00:00
renovate[bot]
189f9b4f26 fix(deps): update dependency axios to ^1.14.0 2026-03-30 20:50:54 +00:00
renovate[bot]
931b5a22e6 chore(deps): lock file maintenance 2026-03-30 05:50:15 +00:00
renovate[bot]
4c9e0a8b74 fix(deps): update dependency @react-querybuilder/mantine to ^8.14.3 (#2098)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-30 05:48:48 +00:00
renovate[bot]
589472314b chore(deps): update dependency npm to v11.12.1 2026-03-29 21:36:53 +00:00
renovate[bot]
f11657fdee fix(deps): update dependency react-querybuilder to ^8.14.3 2026-03-29 21:36:40 +00:00
renovate[bot]
e4ec081357 chore(deps): update dependency vitest to ^4.1.2 2026-03-29 16:49:20 +00:00
renovate[bot]
9e55527a2b chore(deps): update dependency vite to ^8.0.3 2026-03-29 09:18:01 +00:00
renovate[bot]
cca70ffcec chore(deps): update dependency @biomejs/biome to v2.4.9 2026-03-28 12:57:11 +00:00
renovate[bot]
2a6a717ef2 fix(deps): update dependency react-querybuilder to ^8.14.2 (#2095)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-28 04:57:16 +00:00
renovate[bot]
11043554c2 fix(deps): update dependency @react-querybuilder/mantine to ^8.14.2 2026-03-27 21:36:47 +00:00
renovate[bot]
cdbef468d7 fix(deps): update dependency react-router-dom to ^7.13.2 2026-03-27 01:19:23 +00:00
renovate[bot]
4705b75580 chore(deps): update dependency vitest to ^4.1.1 2026-03-26 21:24:23 +00:00
renovate[bot]
245ccf889e chore(deps): update dependency vite to ^8.0.2 2026-03-26 18:20:14 +00:00
renovate[bot]
2ad0a3d622 chore(deps): update actions/deploy-pages action to v5 2026-03-25 20:26:46 +00:00
renovate[bot]
e775f774b5 chore(deps): update node.js to v24.14.1 2026-03-25 01:42:38 +00:00
renovate[bot]
ad2aec44e5 chore(deps): update dependency yaml to ^2.8.3 2026-03-24 12:58:01 +00:00
renovate[bot]
11d3effc28 chore(deps): update dependency jsdom to ^29.0.1 2026-03-23 04:57:54 +00:00
renovate[bot]
2ef12e2868 fix(deps): update mantine monorepo to ^8.3.18 (#2084)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-23 04:57:27 +00:00
renovate[bot]
ed8c5ce1ea chore(deps): lock file maintenance 2026-03-23 00:39:56 +00:00
renovate[bot]
33e507efe5 chore(deps): update dependency vite to ^8.0.1 2026-03-22 13:45:17 +00:00
renovate[bot]
c425f5cf6a chore(deps): update dependency @biomejs/biome to v2.4.8 2026-03-21 16:56:21 +00:00
renovate[bot]
fc76d7e609 fix(deps): update dependency @rolldown/plugin-babel to ^0.2.2 2026-03-21 08:51:10 +00:00
renovate[bot]
1b24bf33ed fix(deps): update dependency com.google.protobuf:protobuf-java to v4.34.1 2026-03-20 18:02:04 +00:00
Ingo Kegel
16036897cb Merge branch 'Athou:master' into perf/batch-guid-check-on-feed-refresh 2026-03-19 19:25:09 +01:00
renovate[bot]
58ff378735 fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.4 2026-03-19 13:44:43 +00:00
Jérémie Panzer
1cee04a233 Merge pull request #2088 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.4.0
2026-03-19 00:03:44 +01:00
renovate[bot]
ac11a0efb8 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.4.0 2026-03-18 21:29:01 +00:00
renovate[bot]
f2ea1e3f7a fix(deps): update dependency io.quarkus.platform:quarkus-bom to v3.32.4 2026-03-18 18:07:29 +00:00
Ingo Kegel
76dbbdfbf9 batch guid existence check on feed refresh
Instead of querying the database once per entry to check if it already
exists, fetch all existing guids for a feed in a single query upfront
and filter new entries in memory before the per-entry loop.

The per-entry findExisting call inside addEntry is kept as a safety net
for concurrent inserts, but is now only reached for new entries.

Profiling in real usage showed a ~50% reduction in guidHash queries,
with the check falling from the most expensive query to sixth in the ranking.
2026-03-18 18:56:40 +01:00
Jérémie Panzer
153970c146 Merge pull request #2087 from Athou/renovate/jsdom-29.x
chore(deps): update dependency jsdom to v29
2026-03-18 13:46:24 +01:00
renovate[bot]
c21287e642 chore(deps): update dependency jsdom to v29 2026-03-18 12:13:28 +00:00
Athou
284942a82e add feature-request to the list of exempted labels 2026-03-18 13:00:44 +01:00
Jérémie Panzer
e796916e73 Merge pull request #2085 from Athou/renovate/com.ibm.icu-icu4j-78.x
fix(deps): update dependency com.ibm.icu:icu4j to v78.3
2026-03-18 12:42:41 +01:00
renovate[bot]
004db1762c fix(deps): update dependency com.ibm.icu:icu4j to v78.3 2026-03-17 22:35:16 +00:00
renovate[bot]
8e05ba8820 chore(deps): update dependency lint-staged to ^16.4.0 (#2083)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-17 20:33:50 +00:00
renovate[bot]
f4f386b5e5 chore(deps): update dependency lint-staged to ^16.3.4 2026-03-17 09:01:31 +00:00
Jérémie Panzer
ecbf8bec23 Merge pull request #2082 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.4
2026-03-17 07:29:17 +01:00
renovate[bot]
5d8c09ccda chore(deps): update debian docker tag to v13.4 2026-03-17 00:35:37 +00:00
renovate[bot]
47c5c3d8a0 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.3 2026-03-16 21:27:52 +00:00
renovate[bot]
3ddce16d5b chore(deps): update graalvm/setup-graalvm digest to 03e8abf 2026-03-16 18:35:24 +00:00
renovate[bot]
acefdc44d9 chore(deps): lock file maintenance 2026-03-16 01:07:15 +00:00
renovate[bot]
d05c5b9d7f chore(deps): update dependency npm to v11.11.1 2026-03-15 04:53:39 +00:00
renovate[bot]
5d1237d1f4 chore(deps): update ncipollo/release-action digest to 339a818 2026-03-15 01:34:06 +00:00
Athou
6bac8631ac output mantine as its own chunk because it is quite large 2026-03-14 20:20:51 +01:00
Athou
2c803327ad upgrade to vite 8 2026-03-13 22:35:20 +01:00
renovate[bot]
451ae5bc51 chore(deps): update dependency lint-staged to ^16.3.3 2026-03-13 05:46:24 +00:00
renovate[bot]
f41ce8c878 chore(deps): update graalvm/setup-graalvm digest to 6e327d2 2026-03-12 19:12:27 +00:00
renovate[bot]
177c54c813 chore(deps): update dependency maven to v3.9.14 2026-03-12 14:46:09 +00:00
Jérémie Panzer
3765e32fd4 Merge pull request #2079 from Athou/renovate/protobuf-monorepo
fix(deps): update dependency com.google.protobuf:protobuf-java to v4.34.0
2026-03-12 08:19:25 +01:00
renovate[bot]
aab7a16d18 fix(deps): update dependency com.google.protobuf:protobuf-java to v4.34.0 2026-03-12 06:26:40 +00:00
Athou
f2463af63c cel update 2026-03-12 07:25:36 +01:00
renovate[bot]
212c2c3b56 fix(deps): update quarkus.version to v3.32.3 2026-03-11 22:48:05 +00:00
renovate[bot]
3ab00b0cdd chore(deps): update actions/download-artifact digest to 3e5f45b 2026-03-11 17:53:34 +00:00
renovate[bot]
fad85e9299 fix(deps): update dependency org.projectlombok:lombok to v1.18.44 2026-03-11 02:48:12 +00:00
renovate[bot]
3cd5e203e2 fix(deps): update mantine monorepo to ^8.3.16 (#2076)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-09 08:40:30 +00:00
Jérémie Panzer
7b081fa870 Merge pull request #2077 from Athou/renovate/biomejs-biome-2.4.x
chore(deps): update dependency @biomejs/biome to v2.4.6
2026-03-09 09:08:37 +01:00
renovate[bot]
5ce22051d4 chore(deps): update dependency @biomejs/biome to v2.4.6 2026-03-09 07:19:20 +00:00
Jérémie Panzer
1e59489fa5 Merge pull request #2078 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2026-03-09 08:18:42 +01:00
renovate[bot]
1e691b1255 chore(deps): lock file maintenance 2026-03-09 01:10:36 +00:00
Jérémie Panzer
61e1bef63f Merge pull request #2074 from Athou/renovate/maven-3.9.x
chore(deps): update dependency maven to v3.9.13
2026-03-07 03:45:01 +01:00
renovate[bot]
46dbb78fbf chore(deps): update dependency maven to v3.9.13 2026-03-07 01:16:46 +00:00
renovate[bot]
99890707b3 chore(deps): update dependency lint-staged to ^16.3.2 2026-03-06 21:20:05 +00:00
Jérémie Panzer
f54c841fdc Merge pull request #2073 from Athou/renovate/react-icons-5.x
fix(deps): update dependency react-icons to ^5.6.0
2026-03-06 17:37:19 +01:00
renovate[bot]
e2a6009ee9 fix(deps): update dependency react-icons to ^5.6.0 2026-03-06 10:39:30 +00:00
Jérémie Panzer
a34dd15040 Merge pull request #2072 from Athou/renovate/docker-build-push-action-7.x
chore(deps): update docker/build-push-action action to v7
2026-03-06 07:20:22 +01:00
renovate[bot]
24c934003d chore(deps): update docker/build-push-action action to v7 2026-03-05 21:51:18 +00:00
renovate[bot]
5300e1a245 chore(deps): update dependency @biomejs/biome to v2.4.5 2026-03-05 18:43:33 +00:00
Jérémie Panzer
90381c670b Merge pull request #2071 from Athou/renovate/org.apache.maven.plugins-maven-resources-plugin-3.x
chore(deps): update dependency org.apache.maven.plugins:maven-resources-plugin to v3.5.0
2026-03-05 14:08:00 +01:00
renovate[bot]
23edea93db chore(deps): update dependency org.apache.maven.plugins:maven-resources-plugin to v3.5.0 2026-03-05 12:25:30 +00:00
Jérémie Panzer
a51712e363 Merge pull request #2070 from Athou/renovate/docker-setup-buildx-action-4.x
chore(deps): update docker/setup-buildx-action action to v4
2026-03-05 13:25:03 +01:00
renovate[bot]
4310e979e1 chore(deps): update docker/setup-buildx-action action to v4 2026-03-05 09:47:18 +00:00
renovate[bot]
f690b76d87 fix(deps): update quarkus.version to v3.32.2 2026-03-05 01:25:51 +00:00
Jérémie Panzer
ac29594b67 Merge pull request #2069 from Athou/renovate/docker-setup-qemu-action-4.x
chore(deps): update docker/setup-qemu-action action to v4
2026-03-04 15:29:50 +01:00
renovate[bot]
93f535bb87 chore(deps): update docker/setup-qemu-action action to v4 2026-03-04 13:38:20 +00:00
Jérémie Panzer
076eb3cf42 Merge pull request #2068 from Athou/renovate/docker-login-action-4.x
chore(deps): update docker/login-action action to v4
2026-03-04 14:35:47 +01:00
Athou
7b2e0fffbd reduce timeout for tests to speed up shutdown 2026-03-04 14:19:56 +01:00
renovate[bot]
8eaab0dbc3 chore(deps): update docker/login-action action to v4 2026-03-04 12:59:09 +00:00
Athou
eaa5bc896e stop the application between tests to make sure that there are no active transactions when we truncate the tables 2026-03-04 13:58:06 +01:00
renovate[bot]
42d1db5fc3 chore(deps): update dependency lint-staged to ^16.3.1 2026-03-04 12:09:08 +00:00
Athou
78c017ddaf wait for tasks to complete when shutting down 2026-03-04 12:49:06 +01:00
renovate[bot]
231551d743 chore(deps): update dependency lint-staged to ^16.3.0 (#2067)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-03 21:56:21 +00:00
Jérémie Panzer
d0984eaba7 Merge pull request #2066 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.3.0
2026-03-03 06:05:51 +01:00
renovate[bot]
15854a72d1 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.3.0 2026-03-03 01:56:14 +00:00
renovate[bot]
7fd2bf0eda fix(deps): update dependency axios to ^1.13.6 2026-03-02 18:15:22 +00:00
renovate[bot]
6a10a2167e chore(deps): lock file maintenance 2026-03-02 01:25:14 +00:00
Jérémie Panzer
1ba99d255c Merge pull request #2063 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.11.0
2026-03-01 00:43:13 +01:00
renovate[bot]
ff1c2947b6 chore(deps): update dependency npm to v11.11.0 2026-02-28 23:17:20 +00:00
Jérémie Panzer
a690d2e0db Merge pull request #2062 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.3.0
2026-03-01 00:16:55 +01:00
renovate[bot]
a3df327396 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.3.0 2026-02-28 20:52:06 +00:00
Jérémie Panzer
ede0016d8e Merge pull request #2060 from Athou/renovate/major-github-artifact-actions
chore(deps): update github artifact actions (major)
2026-02-26 22:57:55 +01:00
renovate[bot]
c19b091795 chore(deps): update github artifact actions 2026-02-26 20:39:27 +00:00
renovate[bot]
9e62c8b9f3 fix(deps): update linguijs monorepo to ^5.9.2 2026-02-26 20:39:23 +00:00
renovate[bot]
9f30dc181c fix(deps): update dependency react-router-dom to ^7.13.1 2026-02-26 18:02:38 +00:00
Jérémie Panzer
37fe44f860 Merge pull request #2059 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.32.1 (minor)
2026-02-25 20:23:16 +01:00
renovate[bot]
68aaab8467 fix(deps): update quarkus.version to v3.32.1 2026-02-25 16:48:25 +00:00
renovate[bot]
b951ed1fcd chore(deps): update debian:13.3 docker digest to 3615a74 2026-02-24 21:53:17 +00:00
Jérémie Panzer
9bd9dc568a Merge pull request #2058 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.14.0
2026-02-24 21:18:33 +01:00
renovate[bot]
29e4356fee chore(deps): update node.js to v24.14.0 2026-02-24 17:22:57 +00:00
renovate[bot]
0ed31eaa99 chore(deps): update dependency @biomejs/biome to v2.4.4 2026-02-23 21:56:45 +00:00
Jérémie Panzer
1e9869b217 Merge pull request #2057 from Athou/renovate/npm-11.10.x
chore(deps): update dependency npm to v11.10.1
2026-02-23 07:21:35 +01:00
renovate[bot]
78cfc2c827 chore(deps): update dependency npm to v11.10.1 2026-02-23 05:33:44 +00:00
renovate[bot]
a6e5a0d125 chore(deps): lock file maintenance 2026-02-23 00:55:55 +00:00
renovate[bot]
ea13aecd27 chore(deps): update dependency @biomejs/biome to v2.4.3 2026-02-22 21:47:30 +00:00
Athou
d838e8f28f fix occasional flicker 2026-02-22 14:36:25 +01:00
Athou
c9a7b9e17c ensure the indicator is not shown above the app header 2026-02-22 11:47:13 +01:00
Athou
8fe2d0bc0e fix typo 2026-02-21 23:58:49 +01:00
Athou
71e2f1e1e6 kill biome on build to prevent unlink errors on Windows 2026-02-21 23:55:08 +01:00
Athou
1ce9d1b9b2 prevent title line wrapping 2026-02-21 23:39:38 +01:00
Athou
b3d6ae467f reduce code duplication 2026-02-21 23:24:03 +01:00
Athou
da8d720dc4 don't show a pointer on hover 2026-02-21 22:58:49 +01:00
Athou
824c38f8ce show unread count on mobile only 2026-02-21 22:52:32 +01:00
Athou
b0579a70d8 Merge branch 'master' of https://github.com/lpoirothattermann/commafeed into lpoirothattermann-master 2026-02-21 22:28:03 +01:00
Athou
f195eb6d0d release 7.0.0 2026-02-21 22:26:40 +01:00
Louis POIROT--HATTERMANN
f9fe2d0976 feat: add unread count badge next to title 2026-02-21 18:54:23 +01:00
renovate[bot]
2aeadc8f67 chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.5 2026-02-21 17:05:08 +00:00
renovate[bot]
ee3eaa1166 chore(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.5 2026-02-21 12:54:17 +00:00
Athou
5dce143756 rename thunk for consistency 2026-02-20 17:24:31 +01:00
Athou
33a0568895 delay task so that it doesn't run at the same time at OrphanedContentsCleanupTask 2026-02-20 15:55:09 +01:00
Athou
721d728906 prevent SSRF by blocking redirects from public websites to local addresses 2026-02-20 15:07:11 +01:00
Athou
c55cbaf373 add missing translations 2026-02-20 15:05:35 +01:00
Athou
3fd5cfdecd add a setting to mark entries of a feed as read after a number of days (#2041) 2026-02-20 13:24:40 +01:00
Jérémie Panzer
f87d3359c2 Merge pull request #2054 from canoine/patch-10
Update fr/messages.po
2026-02-20 10:12:49 +01:00
canoine
37f27849bd Update fr/messages.po
Not sure for the "Topic" translation...
2026-02-20 09:48:29 +01:00
Athou
6fe326f052 cleanup 2026-02-19 23:21:09 +01:00
Athou
de7e4e9c69 add a button for testing push notification settings 2026-02-19 22:50:34 +01:00
Athou
6861fe303b add a small description for push notifications 2026-02-19 18:01:52 +01:00
Athou
ba3214bf10 remove the possibility to receive notifications when subscribing because that sends a lot of notifications, one for each entry in the feed 2026-02-19 16:08:54 +01:00
Athou
bcce77495a bump dependencies 2026-02-19 14:49:18 +01:00
Athou
a165d2b27e Merge remote-tracking branch 'origin/renovate/patch-quarkus.version' 2026-02-18 21:02:48 +01:00
renovate[bot]
e63714cab0 chore(deps): update dependency @biomejs/biome to ^2.4.0 2026-02-18 21:02:32 +01:00
renovate[bot]
390c21dd91 fix(deps): update quarkus.version to v3.31.4 2026-02-18 19:55:53 +00:00
Jérémie Panzer
9defea9c8e Merge pull request #2052 from Athou/renovate/biomejs-biome-2.x
chore(deps): update dependency @biomejs/biome to v2.4.0
2026-02-18 20:54:35 +01:00
Athou
5906173de7 Merge branch 'lpoirothattermann-master' 2026-02-18 20:53:50 +01:00
Athou
a81de48cfb change the default value of blockLocalAddresses 2026-02-18 20:53:23 +01:00
Athou
2be61e8b1c refactor 2026-02-18 20:37:11 +01:00
renovate[bot]
4d7fc9f354 chore(deps): update dependency @biomejs/biome to v2.4.0 2026-02-18 17:35:31 +00:00
renovate[bot]
e11fd7b3a1 chore(deps): update dependency jsdom to ^28.1.0 2026-02-18 04:37:15 +00:00
renovate[bot]
cc0348b113 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.2_10-jre docker digest to b02e4cd 2026-02-18 01:48:45 +00:00
Athou
77bb948bf2 remove unnecessary divider 2026-02-17 20:34:24 +01:00
Athou
8e2adcbce4 fix wrong merge conflict resolve 2026-02-17 20:34:06 +01:00
Athou
bb141203a8 fix missing translations 2026-02-17 20:33:59 +01:00
Jérémie Panzer
579c22df65 Merge pull request #2049 from canoine/patch-9
Update fr/messages.po
2026-02-16 21:34:53 +01:00
canoine
694e8291de Update fr/messages.po
New filtering entries translated.
2026-02-16 18:26:03 +01:00
renovate[bot]
367259fd31 chore(deps): lock file maintenance 2026-02-16 02:10:12 +00:00
Louis POIROT--HATTERMANN
e54151d2eb feat: send notification for new entries with Gotify, ntfy or Pushover, configurable per feed. 2026-02-15 18:45:28 +01:00
Jérémie Panzer
ca2c687f26 Merge pull request #2044 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.10.0
2026-02-15 16:20:37 +01:00
Athou
d444a7080d migrate filtering expressions to safer CEL and add a query builder 2026-02-15 16:13:10 +01:00
renovate[bot]
08bfcded7f chore(deps): update dependency @biomejs/biome to v2.3.15 2026-02-15 12:35:42 +00:00
renovate[bot]
1c9e4f978b chore(deps): update dependency vite-tsconfig-paths to ^6.1.1 2026-02-15 01:06:08 +00:00
renovate[bot]
a5f1fba6ee chore(deps): update dependency npm to v11.10.0 2026-02-14 17:37:17 +00:00
renovate[bot]
88f1cf1913 chore(deps): update dependency @types/react to ^19.2.14 2026-02-14 13:35:26 +00:00
renovate[bot]
1fb69d2861 fix(deps): update linguijs monorepo to ^5.9.1 2026-02-14 10:09:00 +00:00
renovate[bot]
3aeff66522 chore(deps): update dependency @vitejs/plugin-react to ^5.1.4 2026-02-13 09:48:06 +00:00
renovate[bot]
114cbe0ec5 chore(deps): update docker/build-push-action digest to 10e90e3 2026-02-12 17:55:15 +00:00
renovate[bot]
bfe94222b7 fix(deps): update quarkus.version to v3.31.3 2026-02-11 21:00:14 +00:00
renovate[bot]
30061abc54 chore(deps): update docker/build-push-action digest to 601a80b 2026-02-11 18:48:17 +00:00
renovate[bot]
126e07489b fix(deps): update dependency axios to ^1.13.5 2026-02-11 13:48:03 +00:00
renovate[bot]
bd2577c089 chore(deps): update docker/build-push-action digest to ee4ca42 2026-02-11 13:15:00 +00:00
renovate[bot]
5039c61e98 chore(deps): update node.js to v24.13.1 2026-02-10 20:28:00 +00:00
renovate[bot]
5f34ab3d7e chore(deps): update dependency vite-tsconfig-paths to ^6.1.0 2026-02-10 17:49:55 +00:00
Athou
fee47427cf verify i18n extraction has been run before committing 2026-02-10 11:32:24 +01:00
renovate[bot]
15c8289a01 chore(deps): update ibm-semeru-runtimes docker tag to open-jdk-25.0.2_10-jre 2026-02-10 00:25:53 +00:00
Athou
141a863079 release 6.2.0 2026-02-09 19:32:22 +01:00
Athou
6fa8d4be34 keep starred entries (#1581) 2026-02-09 06:59:41 +01:00
renovate[bot]
984e8a44d5 chore(deps): lock file maintenance 2026-02-09 01:33:44 +00:00
renovate[bot]
bdb296bce2 chore(deps): update dependency @types/react to ^19.2.13 2026-02-08 14:02:01 +00:00
Jérémie Panzer
955a9084c3 Merge pull request #2042 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.9.0
2026-02-08 05:23:05 +01:00
renovate[bot]
70f486b0eb chore(deps): update dependency npm to v11.9.0 2026-02-07 21:45:56 +00:00
renovate[bot]
0bc383c6a8 chore(deps): update dependency @types/react to ^19.2.11 2026-02-07 13:12:20 +00:00
renovate[bot]
0bb2b36585 chore(deps): update dependency @biomejs/biome to v2.3.14 2026-02-06 16:48:35 +00:00
Jérémie Panzer
9e3a24753a Merge pull request #2040 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.2.0
2026-02-06 02:20:48 +01:00
renovate[bot]
f2c400799e chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.2.0 2026-02-05 21:38:36 +00:00
renovate[bot]
25a8c8a7e3 chore(deps): update dependency @vitejs/plugin-react to ^5.1.3 2026-02-05 10:32:18 +00:00
Jérémie Panzer
8f95d89fc6 Merge pull request #2039 from Athou/renovate/jsdom-28.x
chore(deps): update dependency jsdom to v28
2026-02-05 11:30:07 +01:00
renovate[bot]
39b0cdb9d5 chore(deps): update dependency jsdom to v28 2026-02-05 09:42:39 +00:00
renovate[bot]
42e06b848e fix(deps): update quarkus.version to v3.31.2 2026-02-04 17:56:35 +00:00
renovate[bot]
7c3a13b1c4 fix(deps): update mantine monorepo to ^8.3.14 2026-02-04 12:45:49 +00:00
Jérémie Panzer
151248fce2 Merge pull request #2038 from xmgz/master
Update gl messages.po
2026-02-04 07:13:01 +01:00
ghose
6e8d6fe063 Update gl messages.po
up to date gl translation
2026-02-04 04:09:30 +00:00
renovate[bot]
ca2da5e631 chore(deps): update actions/checkout digest to de0fac2 2026-02-03 16:36:24 +00:00
renovate[bot]
6cd3b70201 chore(deps): update debian:13.3 docker digest to 2c91e48 2026-02-03 14:08:51 +00:00
renovate[bot]
2dcfba75b5 chore(deps): update jaywcjlove/markdown-to-html-cli action to v5.0.4 2026-02-03 09:32:58 +00:00
Jérémie Panzer
44a51b03d3 Merge pull request #2037 from Athou/renovate/org.apache.maven.plugins-maven-compiler-plugin-3.x
chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.15.0
2026-02-02 06:14:39 +01:00
renovate[bot]
6ee9e9831e chore(deps): lock file maintenance 2026-02-02 01:56:05 +00:00
renovate[bot]
68c717cee8 chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.15.0 2026-02-01 21:36:26 +00:00
Jérémie Panzer
b15fc02c34 Merge pull request #2035 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.1.0
2026-02-01 07:38:58 +01:00
renovate[bot]
033ebfb497 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13.1.0 2026-01-31 20:23:47 +00:00
renovate[bot]
4cceaa7650 fix(deps): update dependency axios to ^1.13.4 2026-01-30 21:51:52 +00:00
renovate[bot]
5df47f1396 chore(deps): update dependency @types/react to ^19.2.10 2026-01-30 12:33:18 +00:00
renovate[bot]
903f35c01b fix(deps): update react monorepo to ^19.2.4 2026-01-29 20:53:17 +00:00
renovate[bot]
6a34f94277 chore(deps): update dependency @biomejs/biome to v2.3.13 2026-01-29 17:09:33 +00:00
Athou
dcc143eb7d upgrade to quarkus 3.31 2026-01-28 18:04:16 +01:00
renovate[bot]
fb47bf27e8 fix(deps): update dependency axios to ^1.13.3 2026-01-28 16:39:42 +00:00
renovate[bot]
dcf969ff2e chore(deps): update docker/login-action digest to c94ce9f 2026-01-28 13:35:35 +00:00
renovate[bot]
32c1318355 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.2.1 2026-01-27 22:36:42 +00:00
Jérémie Panzer
8ca6b89da4 Merge pull request #2033 from Athou/renovate/patch-react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.13.0
2026-01-27 07:21:39 +01:00
renovate[bot]
b46c3a15f3 fix(deps): update dependency react-router-dom to ^7.13.0 2026-01-27 04:49:15 +00:00
renovate[bot]
cbc5e014f7 chore(deps): update dependency vite-tsconfig-paths to ^6.0.5 (#2032)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-27 04:48:45 +00:00
renovate[bot]
8925b248e4 fix(deps): update linguijs monorepo to ^5.9.0 2026-01-26 22:16:14 +00:00
renovate[bot]
cc6aa2bbc5 chore(deps): update dependency @biomejs/biome to v2.3.12 2026-01-26 17:45:44 +00:00
Athou
1989aaf8b4 release 6.1.1 2026-01-26 15:47:39 +01:00
Athou
c90c91b748 fix old starred entries not loading if they were marked as read (#2031) 2026-01-26 15:45:50 +01:00
Athou
bca23db213 remvoe unused jacoco plugin 2026-01-26 13:39:50 +01:00
renovate[bot]
c9a92d2043 chore(deps): lock file maintenance 2026-01-26 05:00:06 +00:00
renovate[bot]
c48e06fa46 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.38 2026-01-26 02:10:23 +00:00
renovate[bot]
5529eced91 chore(deps): update dependency vitest to ^4.0.18 2026-01-25 20:53:59 +00:00
Athou
2a0d935471 release 6.1.0 2026-01-25 10:58:32 +01:00
Athou
6c68fda572 make "disable pull to refresh" false by default (#2030) 2026-01-25 10:49:11 +01:00
Jérémie Panzer
861c1fc3dc Merge pull request #2029 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.8.0
2026-01-25 05:04:32 +01:00
renovate[bot]
5971bb4255 chore(deps): update dependency npm to v11.8.0 2026-01-25 01:59:43 +00:00
renovate[bot]
76ba360631 chore(deps): update dependency @types/react to ^19.2.9 2026-01-23 19:59:17 +00:00
renovate[bot]
89d3ff3c90 fix(deps): update quarkus.version to v3.30.8 2026-01-23 12:23:43 +00:00
renovate[bot]
34024a913d fix(deps): update mantine monorepo to ^8.3.13 2026-01-23 10:50:58 +00:00
Athou
a858380121 cleanup 2026-01-23 08:34:10 +01:00
Jérémie Panzer
e1dc870005 Merge pull request #2028 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.2.0
2026-01-23 02:04:25 +01:00
renovate[bot]
2fc1cac869 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.2.0 2026-01-23 00:39:57 +00:00
renovate[bot]
f627ff4958 chore(deps): update dependency @testing-library/react to ^16.3.2 2026-01-22 13:07:35 +00:00
renovate[bot]
5ff8e51948 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.2 2026-01-21 22:06:21 +00:00
renovate[bot]
538f25c6bb fix(deps): update quarkus.version to v3.30.7 2026-01-21 15:56:51 +00:00
Jérémie Panzer
65100ba279 Merge pull request #2026 from WangLei1993/master
add Chinese translation for new entry
2026-01-20 20:55:40 +01:00
WangLei1993
79fd470bbf add Chinese translation for new entry 2026-01-21 01:32:16 +08:00
Jérémie Panzer
866d74665b Merge pull request #2025 from canoine/patch-8
Update fr/messages.po
2026-01-20 14:13:04 +01:00
canoine
29da74f038 Update fr/messages.po
New etries translated
2026-01-20 13:56:59 +01:00
Athou
3c8ac35a46 make password match rule reusable 2026-01-20 08:54:48 +01:00
Athou
afe957ba59 create a dedicated password reset page (#2023) 2026-01-19 20:55:26 +01:00
renovate[bot]
7e50e99351 fix(deps): update linguijs monorepo to ^5.8.0 2026-01-19 10:48:25 +00:00
renovate[bot]
62ce462cc8 chore(deps): lock file maintenance 2026-01-19 03:48:36 +00:00
Jérémie Panzer
108cb06f43 Merge pull request #2024 from Athou/renovate/org.codehaus.mojo-properties-maven-plugin-1.x
chore(deps): update dependency org.codehaus.mojo:properties-maven-plugin to v1.3.0
2026-01-19 04:47:18 +01:00
renovate[bot]
95a38675bc chore(deps): update dependency org.codehaus.mojo:properties-maven-plugin to v1.3.0 2026-01-19 00:35:24 +00:00
Athou
714681bc50 don't set "en" as the default language, use the preferred language of the browser (#2018) 2026-01-17 20:09:23 +01:00
Athou
0f8d91d997 close profile menu on scroll (#2019) 2026-01-16 15:53:40 +01:00
Jérémie Panzer
562297a82f Merge pull request #2022 from WangLei1993/master
add Chinese translation for new entry
2026-01-16 15:40:53 +01:00
WangLei1993
b108bf06e5 add Chinese translation for new entry 2026-01-16 22:21:00 +08:00
renovate[bot]
3c819066fd chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.1_8-jre docker digest to e12d5f2 2026-01-16 02:15:00 +00:00
Athou
5f30cb7e2e reuse validation rule 2026-01-16 01:08:25 +01:00
Athou
5a95b95801 validate password in the frontend too (#2017) 2026-01-15 21:36:00 +01:00
renovate[bot]
eb573fdc8b chore(deps): update dependency vitest to ^4.0.17 2026-01-15 14:58:31 +00:00
Jérémie Panzer
238ea54e98 Merge pull request #2020 from canoine/patch-7
Update fr/messages.po
2026-01-15 08:56:05 +01:00
canoine
e4dfc47fb8 Update fr/messages.po
Translation of the new entries.
2026-01-15 07:28:50 +01:00
Jérémie Panzer
a1491c779a Merge pull request #2015 from WangLei1993/master
add Chinese translation for new entry
2026-01-14 20:08:02 +01:00
WangLei1993
dabd7552be add Chinese translation for new entry 2026-01-15 01:06:19 +08:00
Jérémie Panzer
0a4c56af1f Merge pull request #2014 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.13.0
2026-01-13 19:44:55 +01:00
renovate[bot]
c3dae5b92c chore(deps): update node.js to v24.13.0 2026-01-13 14:11:32 +00:00
renovate[bot]
2c3105b526 chore(deps): update debian:13.3 docker digest to 5cf544f 2026-01-13 14:11:28 +00:00
renovate[bot]
20f5081ac8 chore(deps): update dependency @types/react to ^19.2.8 2026-01-13 10:49:24 +00:00
Jérémie Panzer
3091eb9d14 Merge pull request #2013 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.3
2026-01-13 06:52:42 +01:00
renovate[bot]
5bdda42239 chore(deps): update debian docker tag to v13.3 2026-01-13 04:51:00 +00:00
renovate[bot]
7eda8b7662 chore(deps): update dependency vite-tsconfig-paths to ^6.0.4 2026-01-13 02:08:08 +00:00
renovate[bot]
fc94ce5d2b fix(deps): update mantine monorepo to ^8.3.12 2026-01-12 14:23:32 +00:00
renovate[bot]
e5d7161ab7 chore(deps): lock file maintenance 2026-01-12 01:10:34 +00:00
Jérémie Panzer
f725cb7fa4 Merge pull request #2012 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.12.0
2026-01-10 21:35:47 +01:00
renovate[bot]
830e689fe8 fix(deps): update dependency react-router-dom to ^7.12.0 2026-01-10 20:02:47 +00:00
Athou
2832e8c638 release 6.0.0 2026-01-10 21:01:59 +01:00
Athou
d711cbab49 requiring an email address for users is now configurable (#1914) 2026-01-10 18:11:35 +01:00
Athou
2e8fd737af remove complex password requirements (#1916) 2026-01-10 17:53:48 +01:00
Athou
a080ede15b add a setup landing page instead of creating a default admin account 2026-01-10 17:30:22 +01:00
renovate[bot]
ab3d41508f chore(deps): update dependency vite to ^7.3.1 2026-01-10 08:41:14 +00:00
Jérémie Panzer
1ab4a5e925 Merge pull request #2010 from Athou/renovate/com.ibm.icu-icu4j-78.x
fix(deps): update dependency com.ibm.icu:icu4j to v78.2
2026-01-09 05:03:28 +01:00
renovate[bot]
543ce08be6 fix(deps): update dependency com.ibm.icu:icu4j to v78.2 2026-01-08 21:59:38 +00:00
renovate[bot]
21829056ba fix(deps): update mantine monorepo to ^8.3.11 2026-01-08 05:55:36 +00:00
renovate[bot]
1af59c87d0 fix(deps): update quarkus.version to v3.30.6 2026-01-07 18:36:59 +00:00
Athou
799e6c082c cleanup 2026-01-06 22:53:37 +01:00
renovate[bot]
09635cf0fd chore(deps): update dependency @biomejs/biome to v2.3.11 2026-01-06 18:14:17 +00:00
renovate[bot]
1dfbd30471 chore(deps): update graalvm/setup-graalvm digest to 54b4f5a 2026-01-05 20:54:23 +00:00
renovate[bot]
48e0a77d1f chore(deps): lock file maintenance 2026-01-05 08:03:28 +00:00
Jérémie Panzer
7ae8594c00 Merge pull request #2009 from Athou/renovate/com.puppycrawl.tools-checkstyle-13.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13
2026-01-05 09:02:06 +01:00
Athou
19663b0f38 Java 25+ is now required 2026-01-05 07:25:26 +01:00
renovate[bot]
4bcb9adb83 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v13 2026-01-05 01:41:55 +00:00
Athou
f7505298d7 postgresql 18+ changed the docker mount point (#2008) 2026-01-03 10:26:59 +01:00
Athou
df722ffa8b fix typo (#2007) 2026-01-02 22:00:36 +01:00
renovate[bot]
2a852fe08d fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.3 2026-01-02 09:36:08 +00:00
Jérémie Panzer
540f796200 Merge pull request #2006 from Athou/renovate/org.jsoup-jsoup-1.x
fix(deps): update dependency org.jsoup:jsoup to v1.22.1
2026-01-01 08:42:47 +01:00
renovate[bot]
b726ac84fe fix(deps): update dependency org.jsoup:jsoup to v1.22.1 2026-01-01 07:02:22 +00:00
renovate[bot]
61ac2bb6a3 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.3.1 2025-12-31 16:00:34 +00:00
Athou
5d702b3992 release 5.12.1 2025-12-31 08:51:22 +01:00
Athou
3bf4a004d4 ReadKit sends the md5 hash of the password in uppercase (#1602) 2025-12-30 20:22:41 +01:00
renovate[bot]
7ac5876d2d chore(deps): update debian:13.2 docker digest to c71b05e 2025-12-30 08:26:00 +00:00
renovate[bot]
0f18c612af chore(deps): update dependency jsdom to ^27.4.0 2025-12-29 14:33:16 +00:00
renovate[bot]
03f4a3c478 chore(deps): lock file maintenance 2025-12-29 01:32:07 +00:00
Jérémie Panzer
7069343cf4 Merge pull request #2005 from xmgz/master
Update po.gl
2025-12-27 17:13:41 +01:00
ghose
7fae79f2c5 Update po.gl
new strings and minor fixes
2025-12-27 15:48:49 +00:00
Jérémie Panzer
66b714ed39 Merge pull request #2004 from aniol/patch-4
Update messages.po
2025-12-25 09:35:36 +01:00
Aniol
d371ebe354 Update messages.po 2025-12-25 09:14:10 +01:00
renovate[bot]
9093d0d5e5 fix(deps): update quarkus.version to v3.30.5 2025-12-24 14:26:55 +00:00
Athou
1139df0637 use existing constants 2025-12-24 07:02:01 +01:00
Athou
c1810de316 use a brotli decoder that uses java and not native code 2025-12-23 17:01:19 +01:00
Athou
863ced57f8 specify explicitly what encoders we support, don't rely on httpclient5 autodetection 2025-12-23 16:21:10 +01:00
Athou
2147aeb4ae some client seems to send an empty since_id param 2025-12-23 11:16:07 +01:00
Athou
a810b4fc9a add a test for brotli decompression 2025-12-23 08:53:18 +01:00
Athou
abcbb61b4c make quarkus add brotli4j to the native image 2025-12-23 08:07:46 +01:00
Athou
83332223ef httpclient now uses brotli4j 2025-12-23 08:04:53 +01:00
renovate[bot]
fd8d981ea0 chore(deps): lock file maintenance 2025-12-22 00:50:14 +00:00
renovate[bot]
03e3ade09d chore(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.3 2025-12-21 22:07:09 +00:00
renovate[bot]
68305f2e00 chore(deps): update dependency vite-tsconfig-paths to ^6.0.3 2025-12-21 14:30:18 +00:00
Jérémie Panzer
b7d6b06242 Merge pull request #2003 from canoine/patch-6
Update fr/messages.po
2025-12-21 09:08:02 +01:00
canoine
9098050c5a Update fr/messages.po
New entries translated
2025-12-21 07:24:01 +01:00
Jérémie Panzer
0147ec0a6a Merge pull request #2000 from Athou/renovate/org.apache.httpcomponents.client5-httpclient5-5.x
fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6
2025-12-20 22:26:40 +01:00
Jérémie Panzer
c6b71605d0 Merge pull request #2002 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.11.0
2025-12-20 22:05:01 +01:00
Jérémie Panzer
64009c82e9 Merge pull request #2001 from WangLei1993/master
add Chinese translation for new entry
2025-12-20 22:03:51 +01:00
renovate[bot]
5b24cb370f fix(deps): update dependency react-router-dom to ^7.11.0 2025-12-20 18:08:18 +00:00
renovate[bot]
2d261cd97b chore(deps): update dependency @biomejs/biome to ^2.3.10 2025-12-20 18:08:10 +00:00
WangLei1993
9455d91b3d add Chinese translation for new entry 2025-12-20 21:32:08 +08:00
renovate[bot]
cb645c56b4 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.6 2025-12-20 12:47:34 +00:00
renovate[bot]
1a6b91dee5 chore(deps): update dependency vite-tsconfig-paths to ^6.0.2 2025-12-20 07:40:42 +00:00
Jérémie Panzer
8d2edad488 Merge pull request #1999 from Athou/renovate/com.github.eirslett-frontend-maven-plugin-2.x
chore(deps): update dependency com.github.eirslett:frontend-maven-plugin to v2
2025-12-20 08:39:50 +01:00
renovate[bot]
522e26b1fa chore(deps): update dependency com.github.eirslett:frontend-maven-plugin to v2 2025-12-19 22:06:14 +00:00
renovate[bot]
259b22c255 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.5.2 2025-12-19 22:06:11 +00:00
renovate[bot]
b61cf82b46 chore(deps): update dependency vitest to ^4.0.16 2025-12-19 15:47:32 +00:00
renovate[bot]
4f06f7424c chore(deps): update docker/setup-buildx-action digest to 8d2750c 2025-12-19 14:33:40 +00:00
Athou
d2d65437f8 add a description to indicate that scrolling issues can occur with this setting (closes #1998) 2025-12-19 07:47:22 +01:00
renovate[bot]
3ae0f7558e chore(deps): update dependency @biomejs/biome to v2.3.9 2025-12-18 18:38:22 +00:00
renovate[bot]
604801686d chore(deps): update dependency @testing-library/react to ^16.3.1 2025-12-18 14:01:55 +00:00
Jérémie Panzer
554d4190ff Merge pull request #1997 from Athou/renovate/vite-7.x
chore(deps): update dependency vite to ^7.3.0
2025-12-18 11:25:17 +01:00
renovate[bot]
1d71390349 chore(deps): update dependency vite to ^7.3.0 2025-12-18 10:03:19 +00:00
Jérémie Panzer
fe24c6d682 Merge pull request #1996 from Athou/renovate/vite-tsconfig-paths-6.x
chore(deps): update dependency vite-tsconfig-paths to v6
2025-12-18 06:56:19 +01:00
renovate[bot]
4359d91a23 chore(deps): update dependency vite-tsconfig-paths to v6 2025-12-18 02:55:58 +00:00
renovate[bot]
ae42eac7fd fix(deps): update dependency @reduxjs/toolkit to ^2.11.2 2025-12-18 02:55:48 +00:00
renovate[bot]
37a8888a32 fix(deps): update quarkus.version to v3.30.4 2025-12-17 17:47:52 +00:00
renovate[bot]
2d7e065d39 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.1 2025-12-17 14:02:45 +00:00
renovate[bot]
35cf640691 chore(deps): update dependency maven to v3.9.12 2025-12-17 00:14:05 +00:00
renovate[bot]
b308fbe0ad fix(deps): update linguijs monorepo to ^5.7.0 2025-12-15 18:05:24 +00:00
renovate[bot]
d5e2b51b6d chore(deps): lock file maintenance 2025-12-15 00:45:30 +00:00
renovate[bot]
9b7844542d fix(deps): update react monorepo to ^19.2.3 2025-12-15 00:10:13 +00:00
Jérémie Panzer
9f6fac0d58 Merge pull request #1994 from Athou/renovate/com.puppycrawl.tools-checkstyle-12.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.3.0
2025-12-13 23:15:06 +01:00
renovate[bot]
f6011dc3f2 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.3.0 2025-12-13 18:11:46 +00:00
Jérémie Panzer
fdb7fa21f6 Merge pull request #1993 from Athou/renovate/major-github-artifact-actions
chore(deps): update github artifact actions (major)
2025-12-13 00:00:15 +01:00
Jérémie Panzer
29bbe41e51 Merge pull request #1992 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.7.0
2025-12-12 23:47:40 +01:00
renovate[bot]
004ada8204 chore(deps): update github artifact actions 2025-12-12 22:26:38 +00:00
renovate[bot]
9a2894944c chore(deps): update dependency npm to v11.7.0 2025-12-12 22:26:33 +00:00
Athou
dfcff5029b add a section in the readme about the public instance 2025-12-12 14:23:24 +01:00
renovate[bot]
853fc600dd fix(deps): update mantine monorepo to ^8.3.10 2025-12-12 10:13:22 +00:00
Jérémie Panzer
a546b21755 Merge pull request #1991 from Athou/renovate/vite-plugin-checker-0.x
chore(deps): update dependency vite-plugin-checker to ^0.12.0
2025-12-11 22:12:22 +01:00
renovate[bot]
e40c4e3779 chore(deps): update dependency vite-plugin-checker to ^0.12.0 2025-12-11 18:31:01 +00:00
Jérémie Panzer
60cbf6cff3 Merge pull request #1990 from Athou/renovate/jsdom-27.x
chore(deps): update dependency jsdom to ^27.3.0
2025-12-11 19:29:50 +01:00
renovate[bot]
6d3f4b98d7 chore(deps): update dependency jsdom to ^27.3.0 2025-12-11 13:54:40 +00:00
renovate[bot]
4812a2b401 chore(deps): update dependency @vitejs/plugin-react to ^5.1.2 2025-12-11 13:54:34 +00:00
renovate[bot]
5f99376d58 fix(deps): update dependency @reduxjs/toolkit to ^2.11.1 2025-12-11 06:44:06 +00:00
renovate[bot]
3e76c142c3 chore(deps): update dependency vite to ^7.2.7 2025-12-11 03:42:05 +00:00
renovate[bot]
28f23a73af fix(deps): update quarkus.version to v3.30.3 2025-12-10 21:09:55 +00:00
Jérémie Panzer
68b94fed8e Merge pull request #1988 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.12.0
2025-12-10 22:09:07 +01:00
renovate[bot]
657b02727c chore(deps): update node.js to v24.12.0 2025-12-10 19:34:28 +00:00
Jérémie Panzer
7d7a10073c Merge pull request #1986 from WangLei1993/master
add Chinese translation for new entry
2025-12-10 14:00:35 +01:00
WangLei1993
9d5f0c791c add Chinese translation for new entry 2025-12-10 18:03:29 +08:00
renovate[bot]
212493e4ff chore(deps): update debian:13.2 docker digest to 0d01188 2025-12-09 06:31:22 +00:00
renovate[bot]
9fc8e9c6d7 fix(deps): update dependency tss-react to ^4.9.20 2025-12-08 21:07:55 +00:00
Jérémie Panzer
f69ddb71a0 Merge pull request #1985 from Athou/renovate/io.quarkiverse.playwright-quarkus-playwright-2.x
chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.0
2025-12-08 22:07:18 +01:00
renovate[bot]
290beec0c5 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.0 2025-12-08 19:23:38 +00:00
renovate[bot]
dcb2f6f8cd chore(deps): lock file maintenance (#1984)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 12:57:56 +00:00
renovate[bot]
d200845906 fix(deps): update dependency react-router-dom to ^7.10.1 2025-12-07 17:56:45 +00:00
renovate[bot]
a52e02695d fix(deps): update react monorepo to ^19.2.1 2025-12-06 17:05:09 +00:00
renovate[bot]
febd7c3063 fix(deps): update dependency react-router-dom to ^7.10.0 2025-12-05 20:52:10 +00:00
renovate[bot]
d5ae0b99f0 chore(deps): update dependency vitest to ^4.0.15 2025-12-05 16:42:10 +00:00
Athou
8b10c608fc add data-feed-id to articles (#1983) 2025-12-05 08:07:02 +01:00
renovate[bot]
0d49b91cc6 chore(deps): update dependency vite to ^7.2.6 2025-12-04 06:10:37 +00:00
renovate[bot]
2af4b83e09 fix(deps): update quarkus.version to v3.30.2 2025-12-03 18:20:55 +00:00
Jérémie Panzer
cde3ca3d9e Merge pull request #1982 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2025-12-03 19:18:23 +01:00
renovate[bot]
429798190a chore(deps): lock file maintenance 2025-12-03 17:52:25 +00:00
renovate[bot]
583db4c70f chore(deps): update dependency yaml to ^2.8.2 2025-12-03 09:41:05 +00:00
renovate[bot]
3ec35eec91 chore(deps): update actions/checkout digest to 8e8c483 2025-12-02 18:57:36 +00:00
Jérémie Panzer
65bfbfc7fd Merge pull request #1980 from Athou/renovate/graalvm-setup-graalvm-digest
chore(deps): update graalvm/setup-graalvm digest to 790e289
2025-12-02 15:27:11 +01:00
renovate[bot]
1b93701df2 chore(deps): update graalvm/setup-graalvm digest to 790e289 2025-12-02 13:45:00 +00:00
Athou
d6debc55f5 remove unused sonar config 2025-12-02 14:44:18 +01:00
renovate[bot]
87fd9ae686 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.1_8-jre docker digest to d88c854 2025-12-02 02:57:02 +00:00
renovate[bot]
3225a3b337 fix(deps): update linguijs monorepo to ^5.6.1 2025-12-01 13:02:27 +00:00
Jérémie Panzer
4eb98a6c31 Merge pull request #1979 from Athou/renovate/com.puppycrawl.tools-checkstyle-12.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.2.0
2025-12-01 07:50:28 +01:00
renovate[bot]
38a6e2fc98 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.2.0 2025-11-30 16:34:53 +00:00
renovate[bot]
c171cf1487 chore(deps): update dependency @biomejs/biome to ^2.3.8 2025-11-30 13:00:00 +00:00
Jérémie Panzer
b64a0f1d55 Merge pull request #1978 from mortenfyhn/svg-favicon
Add SVG favicon option
2025-11-29 16:19:17 +01:00
Morten Fyhn Amundsen
3ab124b2db Add SVG favicon option
The existing 16x16 pixel favicon looks a bit pixelated. This adds an SVG favicon option based on the existing SVG logo file but cropped tighter similar to the existing favicon. That makes it nice and crisp.
2025-11-29 15:08:54 +01:00
Jérémie Panzer
d710f3995f Merge pull request #1977 from Athou/renovate/org.apache.maven.plugins-maven-resources-plugin-3.x
chore(deps): update dependency org.apache.maven.plugins:maven-resources-plugin to v3.4.0
2025-11-29 06:07:29 +01:00
Jérémie Panzer
f53c209082 Merge pull request #1976 from Athou/renovate/org.apache.maven.plugins-maven-assembly-plugin-3.x
chore(deps): update dependency org.apache.maven.plugins:maven-assembly-plugin to v3.8.0
2025-11-29 06:07:07 +01:00
renovate[bot]
9997be3462 chore(deps): update dependency org.apache.maven.plugins:maven-resources-plugin to v3.4.0 2025-11-29 01:14:50 +00:00
renovate[bot]
c3b06e375c chore(deps): update dependency org.apache.maven.plugins:maven-assembly-plugin to v3.8.0 2025-11-29 01:14:46 +00:00
renovate[bot]
1476c5a932 chore(deps): update dependency vitest to ^4.0.14 2025-11-28 18:05:45 +00:00
renovate[bot]
8e1c9b9703 chore(deps): update dependency @biomejs/biome to v2.3.8 2025-11-27 13:47:14 +00:00
renovate[bot]
27c89f7cc7 chore(deps): update dependency @types/react to ^19.2.7 2025-11-27 10:58:30 +00:00
Jérémie Panzer
9210198766 Merge pull request #1973 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.11.0
2025-11-27 05:46:41 +01:00
renovate[bot]
ce6fa0bf8f fix(deps): update dependency @reduxjs/toolkit to ^2.11.0 2025-11-27 04:07:51 +00:00
Jérémie Panzer
cd6629b424 Merge pull request #1972 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.30.1 (minor)
2025-11-26 17:38:55 +01:00
renovate[bot]
f25a62ad71 fix(deps): update quarkus.version to v3.30.1 2025-11-26 16:02:56 +00:00
renovate[bot]
cec3c872b6 chore(deps): update graalvm/setup-graalvm digest to dec5790 2025-11-26 12:38:46 +00:00
Athou
e666e71281 remove unused rollup-plugin-visualizer 2025-11-26 08:53:10 +01:00
renovate[bot]
3d0c303d41 chore(deps): update dependency npm to v11.6.4 2025-11-25 21:52:24 +00:00
renovate[bot]
d70a97cf77 fix(deps): update mantine monorepo to ^8.3.9 2025-11-25 13:35:39 +00:00
renovate[bot]
c67c433258 chore(deps): update dependency vitest to ^4.0.13 2025-11-24 17:46:02 +00:00
renovate[bot]
0da6bd5ab6 chore(deps): update dependency @biomejs/biome to ^2.3.7 2025-11-24 09:47:58 +00:00
Jérémie Panzer
e5cdb1580e Merge pull request #1970 from Athou/renovate/monaco-editor-0.x
fix(deps): update dependency monaco-editor to ^0.55.1
2025-11-24 04:54:35 +01:00
renovate[bot]
2c10292073 fix(deps): update dependency monaco-editor to ^0.55.1 2025-11-23 20:50:57 +00:00
Athou
30036a456e Merge branch 'dcelasun-chore/jdk-25' 2025-11-23 21:36:56 +01:00
Athou
6349ae9e2b fix for java.lang.NoClassDefFoundError: Could not initialize class org.jboss.threads.JDKSpecific$ThreadAccess 2025-11-23 17:53:00 +01:00
Athou
8d746669c3 Merge branch 'chore/jdk-25' of https://github.com/dcelasun/commafeed into dcelasun-chore/jdk-25 2025-11-23 17:46:35 +01:00
renovate[bot]
0081abc9a7 chore(deps): update dependency vitest to ^4.0.12 2025-11-23 13:01:25 +00:00
renovate[bot]
a2f9ac05fe chore(deps): update dependency vite to ^7.2.4 2025-11-23 08:44:04 +00:00
renovate[bot]
6c1f24bad7 chore(deps): update dependency @biomejs/biome to v2.3.7 2025-11-21 08:53:14 +00:00
Jérémie Panzer
77cd01e91f Merge pull request #1969 from Athou/renovate/actions-checkout-6.x
chore(deps): update actions/checkout action to v6
2025-11-21 08:03:07 +01:00
renovate[bot]
5487aac81d fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.2 2025-11-20 21:47:01 +00:00
renovate[bot]
8a6257dc63 chore(deps): update actions/checkout action to v6 2025-11-20 18:06:19 +00:00
Athou
8146c69ebf release 5.12.0 2025-11-20 06:58:55 +01:00
renovate[bot]
78ece1abf2 chore(deps): update dependency npm to v11.6.3 2025-11-20 01:58:00 +00:00
renovate[bot]
baab35c4c5 fix(deps): update quarkus.version to v3.29.4 2025-11-19 21:01:43 +00:00
Athou
357f9d46f9 enable the disablePullToRefresh setting by default to mimic what was done before the setting was added 2025-11-19 15:10:29 +01:00
Jérémie Panzer
4eb26302a7 Merge pull request #1967 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.1.0
2025-11-19 09:06:06 +01:00
renovate[bot]
a2071d9527 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.1.0 2025-11-19 01:30:34 +00:00
Jérémie Panzer
65c32c52ff Merge pull request #1966 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.2
2025-11-18 08:08:02 +01:00
renovate[bot]
fa4353f47d chore(deps): update debian docker tag to v13.2 2025-11-18 06:13:55 +00:00
renovate[bot]
46fea1a3e5 chore(deps): update dependency vitest to ^4.0.10 2025-11-18 04:25:51 +00:00
renovate[bot]
497cf111d1 chore(deps): update dependency @types/react to ^19.2.6 2025-11-18 03:19:16 +00:00
renovate[bot]
b1f2fd26e3 chore(deps): update actions/checkout digest to 93cb6ef 2025-11-17 22:43:16 +00:00
renovate[bot]
ae60d4a60f chore(deps): update dependency @biomejs/biome to v2.3.6 2025-11-17 11:13:56 +00:00
Athou
ae78e4691d make "disable pull to refresh" a setting (#1168) 2025-11-17 09:02:52 +01:00
Athou
9c058cf6d6 disable xml entity expansion limits enabled in JDK24+ (#1961) 2025-11-17 06:43:55 +01:00
renovate[bot]
1ac9af23c5 chore(deps): lock file maintenance 2025-11-17 02:41:41 +00:00
renovate[bot]
f783bb660e fix(deps): update dependency style-to-object to ^1.0.14 2025-11-16 12:42:51 +00:00
Athou
e5c271ca1c add support for more emojis (#1955) 2025-11-16 09:37:36 +01:00
renovate[bot]
f927247955 fix(deps): update mantine monorepo to ^8.3.8 2025-11-15 13:36:11 +00:00
renovate[bot]
087e38bec8 chore(deps): update dependency @types/react to ^19.2.5 2025-11-14 23:57:15 +00:00
renovate[bot]
bab3c8e6b0 fix(deps): update quarkus.version to v3.29.3 2025-11-14 16:35:26 +00:00
renovate[bot]
54ac5d9e27 chore(deps): update dependency vitest to ^4.0.9 2025-11-14 10:05:26 +00:00
renovate[bot]
36519d9053 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.1_8-jre docker digest to 015afe2 2025-11-14 05:49:21 +00:00
renovate[bot]
ccce4c622d fix(deps): update dependency react-router-dom to ^7.9.6 2025-11-13 21:02:11 +00:00
renovate[bot]
4cbf677e55 chore(deps): update react monorepo 2025-11-12 22:05:12 +00:00
renovate[bot]
1dbac44a93 chore(deps): update dependency @vitejs/plugin-react to ^5.1.1 2025-11-12 13:33:44 +00:00
Jérémie Panzer
7e1cfb5cd2 Merge pull request #1965 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to ^5.6.0 (minor)
2025-11-12 22:32:10 +09:00
renovate[bot]
df9fb956fa fix(deps): update linguijs monorepo to ^5.6.0 2025-11-12 11:35:12 +00:00
Jérémie Panzer
16dc383f2b Merge pull request #1964 from Athou/renovate/jsdom-27.x
chore(deps): update dependency jsdom to ^27.2.0
2025-11-12 20:33:53 +09:00
Jérémie Panzer
0dd7c4851b Merge pull request #1963 from Athou/renovate/com.puppycrawl.tools-checkstyle-12.1.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.1.2
2025-11-12 20:33:28 +09:00
renovate[bot]
fce4e75eef chore(deps): update dependency jsdom to ^27.2.0 2025-11-12 09:09:24 +00:00
renovate[bot]
16b578a76d chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.1.2 2025-11-12 09:09:16 +00:00
renovate[bot]
483db9881e chore(deps): update node.js to v24.11.1 2025-11-12 02:53:15 +00:00
renovate[bot]
a4053c6084 chore(deps): update dependency @types/react to ^19.2.3 2025-11-11 23:57:09 +00:00
renovate[bot]
e4f4b46047 chore(deps): update dependency @biomejs/biome to v2.3.5 2025-11-11 18:32:41 +00:00
Jérémie Panzer
36f77d5408 Merge pull request #1962 from Athou/renovate/org.sonarsource.scanner.maven-sonar-maven-plugin-5.x
chore(deps): update dependency org.sonarsource.scanner.maven:sonar-maven-plugin to v5.3.0.6276
2025-11-11 06:43:39 +09:00
renovate[bot]
b3533771dc chore(deps): update dependency org.sonarsource.scanner.maven:sonar-maven-plugin to v5.3.0.6276 2025-11-10 19:41:32 +00:00
renovate[bot]
45372cba92 chore(deps): lock file maintenance 2025-11-10 01:01:27 +00:00
renovate[bot]
dd7fb5bb0d fix(deps): update mantine monorepo to ^8.3.7 2025-11-09 13:53:33 +00:00
renovate[bot]
41bdc19a22 chore(deps): update dependency io.quarkus.platform:quarkus-maven-plugin to v3.29.2 2025-11-08 17:02:37 +00:00
renovate[bot]
8b7f22021a chore(deps): update dependency vitest to ^4.0.8 2025-11-07 16:13:57 +00:00
renovate[bot]
f0160e4d2b chore(deps): update dependency vite to ^7.2.2 2025-11-07 10:47:20 +00:00
renovate[bot]
39d727f98f fix(deps): update quarkus.version to v3.29.1 2025-11-06 22:57:39 +00:00
renovate[bot]
13cc8ac70d chore(deps): update dependency vite to ^7.2.1 (#1960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-06 18:07:54 +00:00
renovate[bot]
eb2a219ec8 fix(deps): update dependency axios to ^1.13.2 2025-11-05 23:07:57 +00:00
renovate[bot]
4a59565b20 chore(deps): update docker/setup-qemu-action digest to c7c5346 2025-11-05 19:42:18 +00:00
renovate[bot]
4b7fa96308 chore(deps): update dependency @biomejs/biome to v2.3.4 2025-11-05 14:44:25 +00:00
Jérémie Panzer
1ebc8a1e7b Merge pull request #1959 from Athou/renovate/vite-7.x
chore(deps): update dependency vite to ^7.2.0
2025-11-05 23:43:30 +09:00
renovate[bot]
df2a9aae20 chore(deps): update dependency vite to ^7.2.0 2025-11-05 13:03:49 +00:00
renovate[bot]
dd8287c9d7 chore(deps): update ibm-semeru-runtimes docker tag to open-jdk-25.0.1_8-jre 2025-11-05 07:06:59 +00:00
renovate[bot]
22fcb08dad fix(deps): update dependency @reduxjs/toolkit to ^2.10.1 2025-11-05 03:04:14 +00:00
renovate[bot]
8c2cf181bd chore(deps): update dependency vitest to ^4.0.7 2025-11-04 21:31:09 +00:00
renovate[bot]
69adae36b6 chore(deps): update debian:13.1 docker digest to 01a723b 2025-11-04 16:45:27 +00:00
Jérémie Panzer
8ab700dfa9 Merge pull request #1957 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.10.0
2025-11-04 10:33:02 +01:00
renovate[bot]
0177529b45 fix(deps): update dependency @reduxjs/toolkit to ^2.10.0 2025-11-04 07:57:22 +00:00
renovate[bot]
4c6ae3364e chore(deps): update dependency @biomejs/biome to v2.3.3 2025-11-03 11:48:29 +00:00
renovate[bot]
6df8511a6d chore(deps): lock file maintenance 2025-11-03 00:39:22 +00:00
renovate[bot]
6fa39517f8 fix(deps): update dependency react-router-dom to ^7.9.5 2025-11-01 01:44:03 +00:00
renovate[bot]
c69ce39424 chore(deps): update dependency vitest to ^4.0.6 2025-10-31 20:23:24 +00:00
Jérémie Panzer
a47f6736ac Merge pull request #1956 from Athou/renovate/jsdom-27.x
chore(deps): update dependency jsdom to ^27.1.0
2025-10-31 21:22:17 +01:00
renovate[bot]
79bd7cfff3 chore(deps): update dependency jsdom to ^27.1.0 2025-10-31 11:51:25 +00:00
renovate[bot]
bc02f23f0f fix(deps): update dependency dayjs to ^1.11.19 2025-10-31 11:51:10 +00:00
renovate[bot]
715dffb6c8 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.0_36-jre docker digest to 7cee2dc 2025-10-31 04:41:07 +00:00
renovate[bot]
702b3eb971 chore(deps): update dependency vitest to ^4.0.5 2025-10-30 21:52:45 +00:00
Jérémie Panzer
17f62bf491 Merge pull request #1954 from Athou/renovate/com.ibm.icu-icu4j-78.x
fix(deps): update dependency com.ibm.icu:icu4j to v78
2025-10-30 22:51:40 +01:00
renovate[bot]
28471302ee fix(deps): update dependency com.ibm.icu:icu4j to v78 2025-10-30 20:32:35 +00:00
renovate[bot]
d8bfdd5d3b fix(deps): update linguijs monorepo to ^5.5.2 2025-10-30 15:58:30 +00:00
Jérémie Panzer
a36e68e9c3 Merge pull request #1953 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.29.0 (minor)
2025-10-29 20:46:30 +01:00
renovate[bot]
343aed16fb fix(deps): update quarkus.version to v3.29.0 2025-10-29 17:06:51 +00:00
renovate[bot]
142d873c8b fix(deps): update mantine monorepo to ^8.3.6 2025-10-29 10:10:47 +00:00
renovate[bot]
a94b3e05d3 fix(deps): update dependency axios to ^1.13.1 2025-10-29 03:13:02 +00:00
Jérémie Panzer
26a79d58f0 Merge pull request #1952 from Athou/renovate/node-24.x
chore(deps): update node.js to v24
2025-10-29 04:12:10 +01:00
renovate[bot]
7c5e68e47d chore(deps): update node.js to v24 2025-10-28 20:36:14 +00:00
renovate[bot]
ba68627060 chore(deps): update dependency @biomejs/biome to v2.3.2 2025-10-28 20:36:01 +00:00
renovate[bot]
5bb6a7d4d4 chore(deps): update dependency vitest to ^4.0.4 2025-10-27 20:42:25 +00:00
Jérémie Panzer
76f7999046 Merge pull request #1951 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v7.1 (minor)
2025-10-27 21:41:31 +01:00
renovate[bot]
547693df4f fix(deps): update querydsl.version to v7.1 2025-10-27 20:06:14 +00:00
Jérémie Panzer
0206f8211a Merge pull request #1950 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to ^1.13.0
2025-10-27 21:05:06 +01:00
renovate[bot]
e061f2e259 fix(deps): update dependency axios to ^1.13.0 2025-10-27 18:12:02 +00:00
renovate[bot]
560ccff04a chore(deps): update graalvm/setup-graalvm digest to eec4810 2025-10-27 09:49:45 +00:00
renovate[bot]
2f0a84557b chore(deps): lock file maintenance 2025-10-27 00:39:04 +00:00
renovate[bot]
3ae7318ded chore(deps): update dependency @biomejs/biome to v2.3.1 2025-10-26 21:53:19 +00:00
renovate[bot]
6b7d66e833 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.1.1 2025-10-26 18:28:31 +00:00
renovate[bot]
ec8e594a5c fix(deps): update dependency style-to-object to ^1.0.12 2025-10-25 02:16:11 +00:00
renovate[bot]
858041772e chore(deps): update dependency vitest to ^4.0.3 2025-10-24 22:17:14 +00:00
Jérémie Panzer
b355c04d87 Merge pull request #1948 from Athou/renovate/major-github-artifact-actions
chore(deps): update github artifact actions (major)
2025-10-25 00:15:30 +02:00
renovate[bot]
4918eaf752 chore(deps): update github artifact actions 2025-10-24 19:37:52 +00:00
Jérémie Panzer
80706f006d Merge pull request #1947 from Athou/renovate/vitejs-plugin-react-5.x
chore(deps): update dependency @vitejs/plugin-react to ^5.1.0
2025-10-24 21:37:11 +02:00
Jérémie Panzer
8a7fec1207 Merge pull request #1946 from Athou/renovate/biomejs-biome-2.x
chore(deps): update dependency @biomejs/biome to v2.3.0
2025-10-24 21:36:43 +02:00
renovate[bot]
22a5b6e85e chore(deps): update dependency @vitejs/plugin-react to ^5.1.0 2025-10-24 16:33:16 +00:00
renovate[bot]
a51c533712 chore(deps): update dependency @biomejs/biome to v2.3.0 2025-10-24 16:33:08 +00:00
renovate[bot]
1f74674a11 chore(deps): update dependency vitest to ^4.0.2 2025-10-24 00:56:41 +00:00
renovate[bot]
2eada58ce5 chore(deps): update dependency vite to ^7.1.12 2025-10-23 13:30:21 +00:00
Jérémie Panzer
31e74bd4a8 Merge pull request #1945 from Athou/renovate/patch-quarkus.version
fix(deps): update quarkus.version to v3.28.5 (patch)
2025-10-23 15:29:26 +02:00
renovate[bot]
903f73ee78 fix(deps): update quarkus.version to v3.28.5 2025-10-23 04:51:46 +00:00
renovate[bot]
b21198b239 fix(deps): update dependency io.github.hakky54:ayza-for-apache5 to v10.0.1 2025-10-23 00:49:27 +00:00
renovate[bot]
e20ff09457 fix(deps): update dependency @reduxjs/toolkit to ^2.9.2 2025-10-22 23:07:16 +00:00
Jérémie Panzer
674393eabc Merge pull request #1944 from Athou/renovate/major-vitest-monorepo
chore(deps): update dependency vitest to v4
2025-10-23 01:06:24 +02:00
renovate[bot]
d78a131713 chore(deps): update dependency vitest to v4 2025-10-22 22:10:33 +00:00
renovate[bot]
e3816bf05b chore(deps): update dependency @biomejs/biome to v2.2.7 2025-10-22 11:53:45 +00:00
renovate[bot]
37fe1c60cc chore(deps): update debian:13.1 docker digest to 72547dd 2025-10-21 05:50:15 +00:00
Jérémie Panzer
e705a0d32b Merge pull request #1942 from Athou/renovate/node-22.x
chore(deps): update node.js to v22.21.0
2025-10-21 04:01:46 +02:00
renovate[bot]
eb658a644b chore(deps): update node.js to v22.21.0 2025-10-21 00:52:29 +00:00
Jérémie Panzer
cb905bfc8c Merge pull request #1941 from Athou/renovate/io.quarkiverse.playwright-quarkus-playwright-2.x
chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.2.1
2025-10-21 01:49:14 +02:00
renovate[bot]
d0accf6a84 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.2.1 2025-10-20 21:50:57 +00:00
renovate[bot]
55e6f89fc1 chore(deps): update dependency vite to ^7.1.11 2025-10-20 09:34:48 +00:00
renovate[bot]
60695a0ffc chore(deps): lock file maintenance 2025-10-20 02:37:10 +00:00
Jérémie Panzer
8a8e4655cd Merge pull request #1940 from Athou/renovate/com.puppycrawl.tools-checkstyle-12.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.1.0
2025-10-19 20:16:35 +02:00
renovate[bot]
2f4b390be1 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.1.0 2025-10-19 17:55:02 +00:00
renovate[bot]
31146cc713 chore(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.2 2025-10-19 08:44:03 +00:00
renovate[bot]
9e020ff268 chore(deps): update dependency jsdom to ^27.0.1 2025-10-18 09:56:15 +00:00
Athou
7e825192d0 enforce user password validation when created in the admin view (#1937) 2025-10-17 10:19:02 +02:00
Athou
8871ae894f handle invalid relative urls (#1939) 2025-10-17 09:04:38 +02:00
renovate[bot]
2808f4b1a2 fix(deps): update dependency @reduxjs/toolkit to ^2.9.1 2025-10-17 06:05:31 +00:00
renovate[bot]
0324c22061 fix(deps): update quarkus.version to v3.28.4 2025-10-16 18:47:22 +00:00
D. Can Celasun
57227f9544 chore: Switch to GraalVM 25
JDK 25 is the new LTS after 21.
2025-10-16 18:04:50 +01:00
renovate[bot]
59c5131f1a chore(deps): update dependency rollup-plugin-visualizer to ^6.0.5 2025-10-16 13:58:50 +00:00
Athou
ccbc07d7d8 don't show "Star/Unstar" in the context menu if the entry is not markable (#1935) 2025-10-15 07:11:48 +02:00
renovate[bot]
a0247f0036 fix(deps): update mantine monorepo to ^8.3.5 2025-10-14 21:01:50 +00:00
renovate[bot]
0979c2767b chore(deps): update dependency vite to ^7.1.10 2025-10-14 17:07:41 +00:00
renovate[bot]
9a9613bba3 chore(deps): update dependency @types/react-dom to ^19.2.2 2025-10-13 16:44:29 +00:00
Jérémie Panzer
6451f5f3b7 Merge pull request #1931 from Athou/renovate/biomejs-biome-2.2.x
chore(deps): update dependency @biomejs/biome to v2.2.6
2025-10-13 15:34:10 +02:00
Athou
4a4430ce9b fix build 2025-10-13 13:45:03 +02:00
renovate[bot]
a38d3dcf72 chore(deps): update dependency @biomejs/biome to v2.2.6 2025-10-13 10:35:05 +00:00
renovate[bot]
60e1e0d037 chore(deps): lock file maintenance 2025-10-13 01:48:54 +00:00
Athou
8071b85b3d remove unused workflows 2025-10-12 14:53:25 +02:00
Jérémie Panzer
c867bfb846 Merge pull request #1929 from aniol/patch-3
Update messages.po
2025-10-12 13:51:59 +02:00
Aniol
24b32ab69b Update messages.po
The translation has been reviewed, and some tweaks have been applied.
2025-10-12 09:20:09 +02:00
renovate[bot]
b1fc65262f chore(deps): update dependency org.jacoco:jacoco-maven-plugin to v0.8.14 2025-10-12 01:05:50 +00:00
renovate[bot]
5af3fea74c chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12.0.1 2025-10-11 21:37:13 +00:00
Athou
dde38985e4 use stable react compiler 2025-10-11 13:24:07 +02:00
Athou
3f0084fa1c make the app appear as "commafeed" when listing processes 2025-10-11 13:23:23 +02:00
renovate[bot]
8936d4fdce chore(deps): update github/codeql-action digest to f443b60 2025-10-10 18:40:20 +00:00
renovate[bot]
4c47b7d838 fix(deps): update linguijs monorepo to ^5.5.1 2025-10-10 12:34:48 +00:00
Jérémie Panzer
093a9cb8e4 Merge pull request #1927 from xmgz/master
Complete, Fix and Review galician (gl) translation
2025-10-10 14:33:46 +02:00
ghose
f27b3f8933 fixing line breaks not needed
there were many line breaks which did not were needed. Now  removed.
2025-10-10 12:13:41 +00:00
ghose
74a9e48e55 adding back header info 2025-10-10 05:36:38 +00:00
ghose
bafef26ffc Update messages.po
cleaning header
2025-10-10 05:33:53 +00:00
ghose
f8e66170bf consistency and fixes
first review
2025-10-10 05:33:01 +00:00
renovate[bot]
00bf99fe5a fix(deps): update mantine monorepo to ^8.3.4 2025-10-10 00:52:58 +00:00
renovate[bot]
05dd66177f chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.0_36-jre docker digest to f31cc59 2025-10-09 22:58:37 +00:00
renovate[bot]
d5a9e6401e fix(deps): update quarkus.version to v3.28.3 2025-10-09 17:51:36 +00:00
Jérémie Panzer
660ba67433 Merge pull request #1925 from Athou/renovate/com.puppycrawl.tools-checkstyle-12.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12
2025-10-09 19:50:55 +02:00
renovate[bot]
7ad948065b chore(deps): update dependency com.puppycrawl.tools:checkstyle to v12 2025-10-09 16:59:22 +00:00
ghose
40fcb85c93 missing text chains
there were about 80 text chains missing.
2025-10-09 12:52:45 +00:00
renovate[bot]
dcddb80f7b fix(deps): update dependency react-router-dom to ^7.9.4 2025-10-09 01:06:10 +00:00
renovate[bot]
8e349aea19 chore(deps): update dependency npm to v11.6.2 2025-10-08 21:03:39 +00:00
Jérémie Panzer
3d72725ae0 Merge pull request #1924 from Athou/renovate/github-codeql-action-4.x
chore(deps): update github/codeql-action action to v4
2025-10-08 06:36:34 +02:00
renovate[bot]
270cb340f5 chore(deps): update github/codeql-action action to v4 2025-10-07 19:00:38 +00:00
Jérémie Panzer
42b5462889 Merge pull request #1892 from Athou/renovate/monaco-editor-0.x
fix(deps): update dependency monaco-editor to ^0.54.0
2025-10-07 20:59:58 +02:00
renovate[bot]
b98ab8d011 fix(deps): update dependency monaco-editor to ^0.54.0 2025-10-07 12:51:51 +00:00
renovate[bot]
b4264a8ba3 chore(deps): update react monorepo 2025-10-07 10:14:49 +00:00
renovate[bot]
a395246d1e chore(deps): update dependency @types/react to ^19.2.1 2025-10-06 21:11:32 +00:00
renovate[bot]
4b7a2afd07 chore(deps): lock file maintenance 2025-10-06 03:45:30 +00:00
renovate[bot]
7f49ff20cf chore(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.1 2025-10-06 02:13:46 +00:00
renovate[bot]
4e9995e610 fix(deps): update dependency style-to-object to ^1.0.11 (#1923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-03 16:35:01 +00:00
renovate[bot]
9f61442cec chore(deps): update dependency vite to ^7.1.9 2025-10-03 05:30:16 +00:00
renovate[bot]
9339847d09 fix(deps): update mantine monorepo to ^8.3.3 2025-10-02 20:21:36 +00:00
Athou
39e57cb3ef fix warning 2025-10-02 22:06:24 +02:00
Athou
f3a574d05c reformat table 2025-10-02 22:02:28 +02:00
Athou
297c76006a use more records 2025-10-02 21:54:40 +02:00
renovate[bot]
62d025d827 chore(deps): update dependency vite to ^7.1.8 2025-10-02 16:37:35 +00:00
renovate[bot]
999799ea68 chore(deps): update github/codeql-action digest to 64d10c1 2025-10-02 15:25:23 +00:00
renovate[bot]
331f68253e chore(deps): update dependency rollup-plugin-visualizer to ^6.0.4 2025-10-02 13:54:43 +00:00
renovate[bot]
70d3c7a4be chore(deps): update dependency @biomejs/biome to v2.2.5 2025-10-02 13:00:18 +00:00
renovate[bot]
b3c75a0286 chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.0_36-jre docker digest to 8ae0733 2025-10-02 11:54:35 +00:00
renovate[bot]
9946120304 chore(deps): update graalvm/setup-graalvm digest to 2a24120 2025-10-02 09:03:55 +00:00
Athou
7030a67389 Merge branch 'renovate/ibm-semeru-runtimes-25.x' 2025-10-02 06:24:06 +02:00
Jérémie Panzer
eda5ef6965 Merge pull request #1921 from Athou/renovate/patch-testing-library-monorepo
chore(deps): update dependency @testing-library/jest-dom to ^6.9.1
2025-10-02 06:18:06 +02:00
Jérémie Panzer
0324479fda Merge pull request #1922 from Athou/renovate/react-monorepo
fix(deps): update react monorepo to ^19.2.0 (minor)
2025-10-02 06:18:00 +02:00
Athou
aeafecb88d update semeru pattern 2025-10-02 06:17:52 +02:00
renovate[bot]
fde7fbe21a chore(deps): update ibm-semeru-runtimes docker tag to v25 2025-10-02 00:34:50 +00:00
renovate[bot]
7116efc490 fix(deps): update react monorepo to ^19.2.0 2025-10-02 00:34:44 +00:00
renovate[bot]
1ac6058200 chore(deps): update dependency @testing-library/jest-dom to ^6.9.1 2025-10-02 00:34:27 +00:00
renovate[bot]
32b80b64f4 chore(deps): update react monorepo 2025-10-01 19:24:44 +00:00
Jérémie Panzer
9e348767dc Merge pull request #1920 from Athou/renovate/peter-evans-dockerhub-description-5.x
chore(deps): update peter-evans/dockerhub-description action to v5
2025-10-01 21:23:52 +02:00
Jérémie Panzer
bce72e1152 Merge pull request #1904 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.28.2 (minor)
2025-10-01 21:23:45 +02:00
renovate[bot]
64aba75be2 chore(deps): update peter-evans/dockerhub-description action to v5 2025-10-01 18:13:24 +00:00
renovate[bot]
ca65e13f9a fix(deps): update quarkus.version to v3.28.2 2025-10-01 18:13:15 +00:00
renovate[bot]
54797607c6 chore(deps): update dependency typescript to ^5.9.3 2025-10-01 03:33:28 +00:00
Jérémie Panzer
e174254a95 Merge pull request #1918 from Athou/renovate/testing-library-monorepo
chore(deps): update dependency @testing-library/jest-dom to ^6.9.0
2025-09-30 22:03:33 +02:00
renovate[bot]
4378e24b49 chore(deps): update dependency @testing-library/jest-dom to ^6.9.0 2025-09-30 19:28:02 +00:00
renovate[bot]
35d276ea98 chore(deps): update debian:13.1 docker digest to fd8f5a1 2025-09-30 11:44:47 +00:00
Jérémie Panzer
678c89d9c0 Merge pull request #1917 from Athou/renovate/org.codehaus.mojo-exec-maven-plugin-3.x
chore(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.0
2025-09-30 13:44:11 +02:00
renovate[bot]
0a42223de0 chore(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.0 2025-09-30 10:39:26 +00:00
renovate[bot]
54d3f3b007 chore(deps): update dependency @types/react to ^19.1.16 2025-09-30 06:14:38 +00:00
renovate[bot]
3ee58ee464 chore(deps): update debian:13.1 docker digest to 9dfe31a 2025-09-30 01:58:58 +00:00
renovate[bot]
3b5ff016fe chore(deps): update docker/login-action digest to 5e57cd1 2025-09-29 12:55:55 +00:00
Jérémie Panzer
8a8e786f5e Merge pull request #1913 from Athou/renovate/vite-plugin-checker-0.x
chore(deps): update dependency vite-plugin-checker to ^0.11.0
2025-09-29 12:30:24 +02:00
renovate[bot]
2a15f68ffb chore(deps): update dependency vite-plugin-checker to ^0.11.0 2025-09-29 10:10:00 +00:00
renovate[bot]
9387e014c1 chore(deps): lock file maintenance 2025-09-29 02:12:14 +00:00
renovate[bot]
1ef37fcaff chore(deps): update dependency @types/react to ^19.1.15 2025-09-28 15:23:14 +00:00
Jérémie Panzer
c5906a481f Merge pull request #1910 from Athou/renovate/com.puppycrawl.tools-checkstyle-11.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v11.1.0
2025-09-28 17:21:38 +02:00
renovate[bot]
ac0bc916a1 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v11.1.0 2025-09-28 13:57:20 +00:00
Athou
5bbe76d56e remove log.trace calls 2025-09-28 07:36:12 +02:00
Athou
1e6195d74c add coverage for in-page url fallback 2025-09-28 07:36:12 +02:00
Athou
85acea7e64 fix warning 2025-09-28 07:36:12 +02:00
renovate[bot]
0e4ff99602 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.5.1 2025-09-28 01:39:52 +00:00
renovate[bot]
575d2a0940 chore(deps): update dependency @vitejs/plugin-react to ^5.0.4 2025-09-27 20:22:58 +00:00
Athou
c548462eef cleanup 2025-09-27 19:10:41 +02:00
Jérémie Panzer
3b4cc66b24 Merge pull request #1909 from RazyAnas/master
Fix off-by-one error in HttpGetter.toByteArray response size check
2025-09-27 19:07:19 +02:00
AnasRazy /
6d7273f822 Merge pull request #1 from RazyAnas/RazyAnas-patch-1
What this PR does:
Fixes an off-by-one error in HttpGetter.toByteArray where responses of exactly maxBytes were being rejected. Now allows responses up to maxBytes, and only throws if the response is larger.

Why this change is needed:
Some feeds return responses exactly equal to the limit. Current implementation incorrectly throws an exception, breaking parsing.

How it works:
Reads up to maxBytes + 1 bytes.
If actual size exceeds maxBytes, throws exception. Otherwise returns full content.

Other notes:
No breaking API changes.
Safe for existing usage.
2025-09-27 15:35:16 +05:30
AnasRazy /
65014d330a Fix off-by-one bug in HttpGetter.toByteArray()
What this PR does:
Fixes an off-by-one error in HttpGetter.toByteArray where responses of exactly maxBytes were being rejected.
Now allows responses up to maxBytes, and only throws if the response is larger.

Why this change is needed:
Some feeds return responses exactly equal to the limit.
Current implementation incorrectly throws an exception, breaking parsing.

How it works:
Reads up to maxBytes + 1 bytes.
If actual size exceeds maxBytes, throws exception.
Otherwise returns full content.

Other notes:
No breaking API changes.
Safe for existing usage.
2025-09-27 15:32:31 +05:30
renovate[bot]
d9e3cf0190 fix(deps): update dependency react-router-dom to ^7.9.3 2025-09-27 04:27:25 +00:00
renovate[bot]
2d8ee54d28 chore(deps): update dependency @types/react to ^19.1.14 2025-09-27 01:45:49 +00:00
renovate[bot]
98c3bb780d chore(deps): update github/codeql-action digest to 3599b3b 2025-09-26 21:56:48 +00:00
renovate[bot]
7247c10615 chore(deps): update dependency com.github.eirslett:frontend-maven-plugin to v1.15.4 2025-09-26 04:52:35 +00:00
Athou
0787284d80 mvn wrapper update 2025-09-26 06:51:52 +02:00
renovate[bot]
1c73bffc95 chore(deps): update github/codeql-action digest to 303c0ae 2025-09-25 12:31:52 +00:00
Jérémie Panzer
6f79815933 Merge pull request #1905 from Athou/renovate/patch-react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.9.2
2025-09-25 08:37:03 +02:00
renovate[bot]
bb108d594a fix(deps): update dependency react-router-dom to ^7.9.2 2025-09-25 05:08:53 +00:00
Jérémie Panzer
f7716c8834 Merge pull request #1906 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3
2025-09-25 07:07:51 +02:00
Jérémie Panzer
5ba076b1dd Merge pull request #1907 from Athou/renovate/npm-11.6.x
chore(deps): update dependency npm to v11.6.1
2025-09-25 07:04:47 +02:00
renovate[bot]
7861b5a414 chore(deps): update dependency npm to v11.6.1 2025-09-25 05:04:27 +00:00
Athou
f36a5988d8 quarkus build is not yet stable with java 25 2025-09-25 07:03:48 +02:00
renovate[bot]
8b57240db3 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3 2025-09-24 21:05:17 +00:00
Jérémie Panzer
7b52efd2d1 Merge pull request #1903 from Athou/renovate/node-22.x
chore(deps): update node.js to v22.20.0
2025-09-24 16:42:26 +02:00
renovate[bot]
4901b838e2 chore(deps): update node.js to v22.20.0 2025-09-24 14:10:30 +00:00
Jérémie Panzer
2313a60f32 Merge pull request #1902 from Athou/renovate/patch-mantine-monorepo
fix(deps): update mantine monorepo to ^8.3.2 (patch)
2025-09-24 07:25:17 +02:00
renovate[bot]
c38e958588 fix(deps): update mantine monorepo to ^8.3.2 2025-09-23 23:39:27 +00:00
Jérémie Panzer
43b1e14f41 Merge pull request #1901 from Athou/renovate/graalvm-setup-graalvm-digest
chore(deps): update graalvm/setup-graalvm digest to e140024
2025-09-23 16:18:56 +02:00
renovate[bot]
1e23b3c355 chore(deps): update graalvm/setup-graalvm digest to e140024 2025-09-23 10:35:05 +00:00
Jérémie Panzer
85e1556148 Merge pull request #1900 from Athou/renovate/vite-7.1.x
chore(deps): update dependency vite to ^7.1.7
2025-09-22 16:07:12 +02:00
renovate[bot]
b65f333a89 chore(deps): update dependency vite to ^7.1.7 2025-09-22 06:54:21 +00:00
renovate[bot]
3dbcbb8280 chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.1 2025-09-22 05:17:18 +00:00
renovate[bot]
06e464854a chore(deps): lock file maintenance 2025-09-22 01:55:24 +00:00
Athou
f7a944a78a release 5.11.1 2025-09-22 03:53:07 +02:00
Athou
7f53531489 filter cannot be converted to lowercase (#1899) 2025-09-22 03:47:06 +02:00
renovate[bot]
8386c2889f chore(deps): update dependency vite to ^7.1.6 2025-09-18 05:15:43 +00:00
Jérémie Panzer
13d2332984 Merge pull request #1898 from Athou/renovate/org.projectlombok-lombok-1.18.x
fix(deps): update dependency org.projectlombok:lombok to v1.18.42
2025-09-18 07:14:44 +02:00
renovate[bot]
ce496c205a fix(deps): update dependency org.projectlombok:lombok to v1.18.42 2025-09-18 02:32:36 +00:00
renovate[bot]
66547661b5 fix(deps): update quarkus.version to v3.26.4 2025-09-17 18:53:21 +00:00
renovate[bot]
8568a29461 fix(deps): update dependency @fontsource/open-sans to ^5.2.7 2025-09-17 09:44:18 +00:00
renovate[bot]
5d42229aec chore(deps): update dependency @vitejs/plugin-react to ^5.0.3 2025-09-17 08:49:14 +00:00
Athou
ad8c928cf1 run CI with java 25 2025-09-16 19:09:40 +02:00
renovate[bot]
cc90883342 chore(deps): update graalvm/setup-graalvm digest to aba6a07 2025-09-16 16:45:34 +00:00
renovate[bot]
a4071da5de fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.37 2025-09-16 05:34:48 +00:00
renovate[bot]
c65dbf978b chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to 0d2e27e 2025-09-16 03:56:11 +00:00
renovate[bot]
c4ea804fee chore(deps): lock file maintenance 2025-09-15 02:03:39 +00:00
renovate[bot]
f71720c809 fix(deps): update dependency axios to ^1.12.2 2025-09-14 18:13:58 +00:00
renovate[bot]
03ba601491 fix(deps): update dependency axios to ^1.12.1 2025-09-14 01:35:06 +00:00
renovate[bot]
bdee3fc1b5 chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.4 2025-09-13 17:48:07 +00:00
renovate[bot]
2e472fa90d chore(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.4 2025-09-13 16:06:11 +00:00
Jérémie Panzer
aad7e896f2 Merge pull request #1897 from Athou/renovate/jsdom-27.x
chore(deps): update dependency jsdom to v27
2025-09-13 10:43:45 +02:00
renovate[bot]
2478fc2967 chore(deps): update dependency jsdom to v27 2025-09-13 07:06:06 +00:00
Jérémie Panzer
2db96c968d Merge pull request #1896 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to ^5.5.0 (minor)
2025-09-13 09:05:54 +02:00
Jérémie Panzer
9bc1a69ace Merge pull request #1895 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.9.1
2025-09-13 09:05:46 +02:00
renovate[bot]
cca74e9e54 fix(deps): update linguijs monorepo to ^5.5.0 2025-09-13 02:57:55 +00:00
renovate[bot]
8185411071 fix(deps): update dependency react-router-dom to ^7.9.1 2025-09-13 02:57:46 +00:00
renovate[bot]
c89addab2e chore(deps): update dependency @types/react to ^19.1.13 2025-09-13 02:57:32 +00:00
Jérémie Panzer
6c617bf9e7 Merge pull request #1894 from Athou/renovate/axios-1.x
fix(deps): update dependency axios to ^1.12.0
2025-09-12 06:31:12 +02:00
renovate[bot]
5847e340bf fix(deps): update dependency axios to ^1.12.0 2025-09-12 03:56:31 +00:00
renovate[bot]
5a5fd8f425 chore(deps): update github/codeql-action digest to 192325c 2025-09-10 21:07:58 +00:00
renovate[bot]
d6283e326d fix(deps): update mantine monorepo to ^8.3.1 2025-09-10 17:43:17 +00:00
renovate[bot]
c63deb70dd chore(deps): update dependency @biomejs/biome to v2.2.4 2025-09-10 14:34:03 +00:00
renovate[bot]
c071781099 fix(deps): update quarkus.version to v3.26.3 2025-09-10 06:47:48 +00:00
renovate[bot]
0820b4b70a chore(deps): update github/codeql-action digest to d3678e2 2025-09-09 11:57:33 +00:00
Jérémie Panzer
ac42d11251 Merge pull request #1893 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.1
2025-09-09 05:57:31 +02:00
renovate[bot]
324248ff1e chore(deps): update debian docker tag to v13.1 2025-09-09 02:03:08 +00:00
Jérémie Panzer
f32e83d43b Merge pull request #1891 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to ^8.3.0 (minor)
2025-09-08 21:50:19 +02:00
renovate[bot]
3820aaed21 fix(deps): update mantine monorepo to ^8.3.0 2025-09-08 14:18:59 +00:00
renovate[bot]
a45ef79c6f chore(deps): update dependency vite to ^7.1.5 2025-09-08 10:15:30 +00:00
renovate[bot]
9b9266a6c9 chore(deps): lock file maintenance 2025-09-08 02:40:28 +00:00
renovate[bot]
06e22030c3 chore(deps): update dependency @biomejs/biome to v2.2.3 2025-09-05 16:49:16 +00:00
renovate[bot]
ca146c977b chore(deps): update github/codeql-action digest to f1f6e5f 2025-09-05 14:15:06 +00:00
renovate[bot]
6a96a3617f fix(deps): update dependency org.projectlombok:lombok to v1.18.40 2025-09-05 03:01:33 +00:00
Jérémie Panzer
6dd6e05e0c Merge pull request #1890 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.6.0
2025-09-04 07:19:20 +02:00
renovate[bot]
1fb33d51d3 chore(deps): update dependency npm to v11.6.0 2025-09-03 21:33:32 +00:00
renovate[bot]
4841f2d7f6 fix(deps): update quarkus.version to v3.26.2 2025-09-03 17:54:08 +00:00
Athou
ad388ae056 remove search limit (#1887) 2025-09-03 07:45:15 +02:00
Jérémie Panzer
a80769fae3 Merge pull request #1889 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.9.0
2025-09-03 07:21:04 +02:00
renovate[bot]
b34c6f4c34 fix(deps): update dependency @reduxjs/toolkit to ^2.9.0 2025-09-03 04:53:28 +00:00
renovate[bot]
d6d084fbd1 chore(deps): update ncipollo/release-action digest to b7eabc9 2025-09-02 20:40:56 +00:00
renovate[bot]
1fca44c0da chore(deps): update graalvm/setup-graalvm digest to 7a1da54 2025-09-02 17:05:28 +00:00
renovate[bot]
8bf1d0b776 chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to ffcc837 2025-09-02 04:55:08 +00:00
renovate[bot]
484412514f chore(deps): update ncipollo/release-action digest to 1c89adf 2025-09-01 18:32:51 +00:00
renovate[bot]
6987449a7e chore(deps): update github/codeql-action digest to 2d92b76 2025-09-01 16:24:31 +00:00
renovate[bot]
18dac92fc1 chore(deps): update dependency vite to ^7.1.4 2025-09-01 12:34:29 +00:00
renovate[bot]
54774fcfe5 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.36 2025-08-31 20:34:06 +00:00
Athou
b431229273 sslcontext-kickstart was renamed ayza 2025-08-31 21:27:23 +02:00
renovate[bot]
658dde158e fix(deps): update mantine monorepo to ^8.2.8 2025-08-31 16:33:54 +00:00
renovate[bot]
ced3ada6fc chore(deps): update dependency com.puppycrawl.tools:checkstyle to v11.0.1 2025-08-31 14:22:18 +00:00
renovate[bot]
0db236639b fix(deps): update quarkus.version to v3.26.1 2025-08-30 05:59:50 +00:00
renovate[bot]
036ce7f94f fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.35 2025-08-29 20:09:03 +00:00
renovate[bot]
68c887ffe0 fix(deps): update dependency dayjs to ^1.11.17 2025-08-29 19:04:58 +00:00
renovate[bot]
e96da49d0a chore(deps): update react monorepo 2025-08-29 15:51:22 +00:00
Jérémie Panzer
794684bc4e Merge pull request #1884 from Athou/renovate/node-22.x
chore(deps): update node.js to v22.19.0
2025-08-29 17:31:29 +02:00
Jérémie Panzer
dd944c5293 Merge pull request #1883 from Athou/renovate/org.sonarsource.scanner.maven-sonar-maven-plugin-5.x
chore(deps): update dependency org.sonarsource.scanner.maven:sonar-maven-plugin to v5.2.0.4988
2025-08-29 17:31:22 +02:00
renovate[bot]
be878454a9 chore(deps): update node.js to v22.19.0 2025-08-29 14:22:59 +00:00
renovate[bot]
e567f81046 chore(deps): update dependency org.sonarsource.scanner.maven:sonar-maven-plugin to v5.2.0.4988 2025-08-29 14:22:56 +00:00
Jérémie Panzer
6164ca5f91 Merge pull request #1882 from Athou/renovate/quarkus.version
chore(deps): update dependency io.quarkus.platform:quarkus-maven-plugin to v3.26.0
2025-08-28 13:54:04 +02:00
renovate[bot]
655332e3fd chore(deps): update dependency io.quarkus.platform:quarkus-maven-plugin to v3.26.0 2025-08-28 11:24:18 +00:00
renovate[bot]
7e300fea87 fix(deps): update dependency dayjs to ^1.11.15 2025-08-28 06:57:43 +00:00
renovate[bot]
cea3e0aba8 chore(deps): update dependency @vitejs/plugin-react to ^5.0.2 2025-08-28 05:13:54 +00:00
renovate[bot]
459e270561 chore(deps): update dependency @types/react to ^19.1.12 2025-08-27 18:09:22 +00:00
renovate[bot]
cba660e785 fix(deps): update dependency dayjs to ^1.11.14 2025-08-27 11:32:31 +00:00
Jérémie Panzer
758301a39d Merge pull request #1881 from Athou/renovate/patch-react-monorepo
chore(deps): update dependency @types/react-dom to ^19.1.8
2025-08-27 07:37:09 +02:00
renovate[bot]
a8d0bae16e chore(deps): update dependency @types/react-dom to ^19.1.8 2025-08-26 12:15:08 +00:00
renovate[bot]
583cc39849 chore(deps): update dependency vite-plugin-checker to ^0.10.3 2025-08-25 13:09:11 +00:00
renovate[bot]
3585bd3d2d chore(deps): lock file maintenance 2025-08-25 05:13:37 +00:00
renovate[bot]
3a895b6418 fix(deps): update dependency org.jsoup:jsoup to v1.21.2 2025-08-25 00:25:27 +00:00
renovate[bot]
bb67733723 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.34 2025-08-24 22:28:11 +00:00
renovate[bot]
f380fd553f chore(deps): update dependency @biomejs/biome to v2.2.2 2025-08-23 13:07:39 +00:00
Jérémie Panzer
d22ef12adf Merge pull request #1880 from Athou/renovate/actions-upload-pages-artifact-4.x
chore(deps): update actions/upload-pages-artifact action to v4
2025-08-23 07:58:22 +02:00
renovate[bot]
eaec088348 fix(deps): update mantine monorepo to ^8.2.7 2025-08-23 01:33:04 +00:00
renovate[bot]
fa1d0b9151 fix(deps): update dependency react-router-dom to ^7.8.2 2025-08-22 21:23:18 +00:00
renovate[bot]
c0a418b8b1 chore(deps): update actions/upload-pages-artifact action to v4 2025-08-22 17:46:43 +00:00
renovate[bot]
1a4f633a28 chore(deps): update dependency @types/react to ^19.1.11 2025-08-22 17:46:33 +00:00
renovate[bot]
c92ae40db6 chore(deps): update github/codeql-action digest to 3c3833e 2025-08-21 12:52:05 +00:00
Jérémie Panzer
0b42bea600 Merge pull request #1879 from Athou/renovate/actions-setup-java-5.x
chore(deps): update actions/setup-java action to v5
2025-08-21 14:49:28 +02:00
renovate[bot]
d8565cb3d3 chore(deps): update actions/setup-java action to v5 2025-08-21 05:06:59 +00:00
Jérémie Panzer
f68798c10e Merge pull request #1878 from Athou/renovate/testing-library-monorepo
chore(deps): update dependency @testing-library/jest-dom to ^6.8.0
2025-08-21 07:06:32 +02:00
renovate[bot]
a2ab927433 chore(deps): update dependency @testing-library/jest-dom to ^6.8.0 2025-08-20 22:07:26 +00:00
renovate[bot]
c7eae71c56 fix(deps): update quarkus.version to v3.25.4 2025-08-20 22:07:14 +00:00
renovate[bot]
c3784c2606 chore(deps): update dependency vite to ^7.1.3 2025-08-19 08:49:58 +00:00
renovate[bot]
60fe263b53 chore(deps): update dependency @vitejs/plugin-react to ^5.0.1 2025-08-19 05:51:51 +00:00
renovate[bot]
aaa0cfd0c8 chore(deps): update github/codeql-action digest to 96f518a 2025-08-18 13:51:18 +00:00
renovate[bot]
a209b2774a chore(deps): lock file maintenance 2025-08-18 00:24:47 +00:00
renovate[bot]
84d67b6166 fix(deps): update mantine monorepo to ^8.2.5 2025-08-16 16:45:14 +00:00
renovate[bot]
a7a215e6c7 fix(deps): update dependency react-router-dom to ^7.8.1 2025-08-15 21:28:14 +00:00
Athou
8686fe4e97 add support for NoRouteToHostException (fixes #1876) 2025-08-14 20:41:27 +02:00
Jérémie Panzer
afe2e8f95b Merge pull request #1877 from Athou/renovate/biomejs-biome-2.x
chore(deps): update dependency @biomejs/biome to v2.2.0
2025-08-14 14:49:32 +02:00
renovate[bot]
f580226c27 chore(deps): update dependency @biomejs/biome to v2.2.0 2025-08-14 12:49:28 +00:00
renovate[bot]
e93db46e0a chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to a0585f5 2025-08-14 11:41:28 +00:00
renovate[bot]
daea4b7f84 chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to e8efb84 2025-08-14 05:08:35 +00:00
Jérémie Panzer
eb942b07b1 Merge pull request #1875 from Athou/renovate/testing-library-monorepo
chore(deps): update dependency @testing-library/jest-dom to ^6.7.0
2025-08-14 07:08:01 +02:00
renovate[bot]
804ca38db7 fix(deps): update quarkus.version to v3.25.3 (#1874)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-14 00:36:35 +00:00
renovate[bot]
7278c0beae chore(deps): update dependency @testing-library/jest-dom to ^6.7.0 2025-08-13 20:13:24 +00:00
renovate[bot]
096e3a0f5f chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to d1bc86c 2025-08-13 20:13:05 +00:00
renovate[bot]
5090c15f20 chore(deps): update ibm-semeru-runtimes:open-21.0.8_9-jre docker digest to cb42f22 2025-08-13 05:50:29 +00:00
Jérémie Panzer
cb7e74fc21 Merge pull request #1873 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13
2025-08-13 07:50:02 +02:00
renovate[bot]
ff90041ed4 chore(deps): update debian docker tag to v13 2025-08-13 03:52:10 +00:00
renovate[bot]
f8fbe1844a chore(deps): update dependency vite to ^7.1.2 2025-08-12 11:31:12 +00:00
renovate[bot]
1902172a04 chore(deps): update github/codeql-action digest to df55935 2025-08-12 10:50:16 +00:00
renovate[bot]
2df384b847 chore(deps): update dependency @types/react to ^19.1.10 2025-08-11 20:14:30 +00:00
Jérémie Panzer
65bb35b4de Merge pull request #1871 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2025-08-11 22:13:56 +02:00
Athou
97516100f5 fix npm ci after renovate lock file maintenance 2025-08-11 21:41:57 +02:00
renovate[bot]
009ec7a59b chore(deps): lock file maintenance 2025-08-11 18:37:47 +00:00
Jérémie Panzer
02890c2b69 Merge pull request #1872 from Athou/renovate/actions-checkout-5.x
chore(deps): update actions/checkout action to v5
2025-08-11 20:36:39 +02:00
renovate[bot]
0f690bf00e chore(deps): update actions/checkout action to v5 2025-08-11 17:14:57 +00:00
Athou
cfe427b34c babel-plugin-macros is not needed anymore since we now use @lingui/babel-plugin-lingui-macro 2025-08-11 14:47:48 +02:00
renovate[bot]
a44c76cdc3 chore(deps): update actions/checkout digest to 08eba0b 2025-08-11 12:14:42 +00:00
renovate[bot]
730bde3d0d fix(deps): update linguijs monorepo to ^5.4.1 2025-08-11 09:55:32 +00:00
renovate[bot]
aa006fe22a fix(deps): update quarkus.version to v3.25.2 2025-08-08 21:31:29 +00:00
renovate[bot]
ca77090ecd chore(deps): update github/codeql-action digest to 76621b6 2025-08-08 12:26:20 +00:00
renovate[bot]
5619d1a4c5 chore(deps): update dependency vite to ^7.1.1 2025-08-08 05:13:13 +00:00
Jérémie Panzer
b7c80c397d Merge pull request #1870 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.8.0
2025-08-07 23:47:12 +02:00
renovate[bot]
d1e7cd2f85 fix(deps): update dependency react-router-dom to ^7.8.0 2025-08-07 21:14:23 +00:00
renovate[bot]
7da7aeb796 chore(deps): update dependency @biomejs/biome to v2.1.4 2025-08-07 16:32:14 +00:00
Jérémie Panzer
26b46166aa Merge pull request #1869 from Athou/renovate/com.puppycrawl.tools-checkstyle-11.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v11
2025-08-07 18:31:21 +02:00
renovate[bot]
6d5eb51a5d fix(deps): update mantine monorepo to ^8.2.4 2025-08-07 11:33:53 +00:00
renovate[bot]
917b6b318f chore(deps): update dependency com.puppycrawl.tools:checkstyle to v11 2025-08-07 11:33:12 +00:00
Jérémie Panzer
bfd95687b8 Merge pull request #1868 from Athou/renovate/vitejs-plugin-react-5.x
chore(deps): update dependency @vitejs/plugin-react to v5
2025-08-07 13:32:43 +02:00
Jérémie Panzer
4198ee1af1 Merge pull request #1867 from Athou/renovate/vite-7.x
chore(deps): update dependency vite to ^7.1.0
2025-08-07 13:32:30 +02:00
renovate[bot]
e9b1280ae6 chore(deps): update dependency @vitejs/plugin-react to v5 2025-08-07 09:49:36 +00:00
renovate[bot]
3c42831db0 chore(deps): update dependency vite to ^7.1.0 2025-08-07 09:49:27 +00:00
renovate[bot]
b8482006b9 fix(deps): update quarkus.version to v3.25.1 2025-08-07 00:23:05 +00:00
313 changed files with 29721 additions and 21252 deletions

1
.github/stale.yml vendored
View File

@@ -7,6 +7,7 @@ exemptLabels:
- pinned
- security
- enhancement
- feature-request
- bug
# Label to use when marking an issue as stale
staleLabel: wontfix

View File

@@ -7,7 +7,7 @@ on:
pull_request:
env:
JAVA_VERSION: 21
JAVA_VERSION: 25
DOCKER_BUILD_SUMMARY: false
jobs:
@@ -23,18 +23,24 @@ jobs:
steps:
# Checkout
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
# Setup
- name: Set up GraalVM
uses: graalvm/setup-graalvm@7f488cf82a3629ee755e4e97342c01d6bed318fa # v1
uses: graalvm/setup-graalvm@5298d94fb55a4f185c602eeac5de1b553882abe2 # v1.6.4
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: "graalvm"
cache: "maven"
- name: Set up NodeJS cache
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: "npm"
cache-dependency-path: 'commafeed-client/package-lock.json'
- name: Install Playwright dependencies
run: sudo apt-get install -y libgbm1
if: matrix.os != 'windows-latest'
@@ -48,39 +54,39 @@ jobs:
run: mkdir -p target/pages/documentation/custom-css
- name: Convert readme file to html
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
uses: jaywcjlove/markdown-to-html-cli@cff9330af4ca8048b197a76d9eb1db189c2a7cee # v5.0.4
with:
source: README.md
output: target/pages/index.html
- name: Convert config documentation to html
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
uses: jaywcjlove/markdown-to-html-cli@cff9330af4ca8048b197a76d9eb1db189c2a7cee # v5.0.4
with:
source: commafeed-server/target/quarkus-generated-doc/config/commafeed-server.md
output: target/pages/documentation/index.html
- name: Convert custom css documentation to html
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
uses: jaywcjlove/markdown-to-html-cli@cff9330af4ca8048b197a76d9eb1db189c2a7cee # v5.0.4
with:
source: documentation/CUSTOMCSS.md
output: target/pages/documentation/custom-css/index.html
# Upload artifacts
- name: Upload cross-platform app
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: matrix.os == 'ubuntu-latest' # we only need to upload the cross-platform artifact once per database
with:
name: commafeed-${{ matrix.database }}-jvm
path: commafeed-server/target/commafeed-*.zip
- name: Upload native executable
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: commafeed-${{ matrix.database }}-${{ runner.os }}-${{ runner.arch }}
path: commafeed-server/target/commafeed-*-runner*
- name: Upload pages
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
if: matrix.os == 'ubuntu-latest' && matrix.database == 'h2' # we only need to upload the pages once
with:
path: target/pages
@@ -98,23 +104,23 @@ jobs:
steps:
# Checkout
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
# Setup
- name: Set up QEMU
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
- name: Install required packages
run: sudo apt-get install -y rename unzip
# Prepare artifacts
- name: Download artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: commafeed-${{ matrix.database }}-*
path: ./artifacts
@@ -135,7 +141,7 @@ jobs:
# Docker
- name: Login to Container Registry
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
if: ${{ env.DOCKERHUB_USERNAME != '' }}
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
@@ -143,7 +149,7 @@ jobs:
## build but don't push for PRs and renovate
- name: Docker build - native
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.native
@@ -151,7 +157,7 @@ jobs:
platforms: linux/amd64,linux/arm64/v8
- name: Docker build - jvm
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.jvm
@@ -160,7 +166,7 @@ jobs:
## build and push tag
- name: Docker build and push tag - native
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
if: ${{ github.ref_type == 'tag' }}
with:
context: .
@@ -172,7 +178,7 @@ jobs:
athou/commafeed:${{ github.ref_name }}-${{ matrix.database }}
- name: Docker build and push tag - jvm
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
if: ${{ github.ref_type == 'tag' }}
with:
context: .
@@ -185,7 +191,7 @@ jobs:
## build and push master
- name: Docker build and push master - native
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
if: ${{ github.ref_name == 'master' }}
with:
context: .
@@ -195,7 +201,7 @@ jobs:
tags: athou/commafeed:master-${{ matrix.database }}
- name: Docker build and push master - jvm
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
if: ${{ github.ref_name == 'master' }}
with:
context: .
@@ -215,12 +221,12 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: commafeed-*
path: ./artifacts
@@ -230,13 +236,13 @@ jobs:
run: chmod +x artifacts/*-runner
- name: Extract Changelog Entry
uses: mindsers/changelog-reader-action@32aa5b4c155d76c94e4ec883a223c947b2f02656 # v2
uses: mindsers/changelog-reader-action@1faaf50aa09d5793d9a100819973df801febfb31 # v2.4.0
id: changelog_reader
with:
version: ${{ github.ref_name }}
- name: Create GitHub release
uses: ncipollo/release-action@bcfe5470707e8832e12347755757cec0eb3c22af # v1
uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd # v1.21.0
with:
name: CommaFeed ${{ github.ref_name }}
body: ${{ steps.changelog_reader.outputs.changes }}
@@ -249,12 +255,12 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Update Docker Hub Description
uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4
uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -274,5 +280,5 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
- uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
id: deployment

View File

@@ -1,78 +0,0 @@
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '42 13 * * 4'
push:
branches: [ "master" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
# `publish_results: true` only works when run from the default branch. conditional can be removed if disabled.
if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request'
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore
# file_mode: git
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3
with:
sarif_file: results.sarif

View File

@@ -1,41 +0,0 @@
name: SonarQube
permissions:
contents: read
on:
push:
branches:
- master
pull_request:
types: [ opened, synchronize, reopened ]
env:
JAVA_VERSION: 21
jobs:
build:
runs-on: ubuntu-latest
steps:
# Checkout
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
# Setup
- name: Set up JDK
uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: "temurin"
cache: "maven"
- name: Install Playwright dependencies
run: sudo apt-get install -y libgbm1
# Run test coverage and SonarQube analysis
- name: Analyze with SonarQube
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn --batch-mode verify sonar:sonar -Dsonar.projectKey=Athou_commafeed

View File

@@ -1,18 +1,3 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip

View File

@@ -1,5 +1,91 @@
# Changelog
## [7.3.1]
- Prevent Host header injection attacks on the password recovery endpoint. A new setting
`commafeed.password-recovery-public-base-url` has been added to specify the base URL to use in password recovery
emails. This setting is only required when the password recovery feature is enabled, which is not the default.
## [7.3.0]
- Add support for the Google Reader API for native mobile apps that don't support the Fever API
- The profile menu now works again on mobile when action buttons are at the bottom of the screen
- More SSRF protection regarding IPv6
- Changed the default value of `blockLocalAddresses` to make CommaFeed more secure out-of-the-box. See the "Access to
local address blocked" section of the README if you subscribe to feeds that are only available on your local network.
## [7.2.1]
- correctly handle favicons hosted at the root of the domain for feeds with non-default ports
- prevent XXS injections in third party apps. The CommaFeed React client was already stripping malicious "javascript:" URLs, they are now filtered during feed parsing and no longer stored in the database/served through the REST API.
## [7.2.0]
- Add support for icons declared in feeds. This is useful for feeds exposed by RSS bridges (#2048)
- Search now also works for starred entries (#2217)
- The error message when subscribing to a feed is now properly displayed again
- Small performance improvements to the feed refresh engine
- Removed the Pocket sharing feature because the Pocket service has been discontinued
- Prevent the image proxy feature to access any URL to avoid SSRF attacks
- Strengthened the SSRF protection by also blocking ULA and CGNAT ranges
- Prevent DDOS attacks by filtering OPML files during imports
## [7.1.0]
- Display the unread count in the header on mobile, since the tree is hidden by default and the unread count is not visible otherwise (#2055)
- The feed refresh engine is now a little bit more performant (#2089)
- On shutdown, give the feed refresh engine some time to finish refreshing feeds before killing it. This is controlled by the new `commafeed.shutdown-timeout` setting, which defaults to 2 seconds
## [7.0.0]
- Replaced the JEXL filter expression for marking feed entries as read automatically with a user-friendly visual query builder. Expressions are now evaluated with Common Expression Language, which is safer than JEXL and sanboxed by default.
- Added a per-feed setting for sending push notifications to ntfy, Gotify or Pushover when new feed entries are discovered (#1610)
- Added a per-feed setting for marking entries as read after a number of days (#2041)
- The default value of `commafeed.http-client.block-local-addresses` is now false, allowing users to subscribe to feeds only available on their local network. This may be a security risk (SSRF) if your instance is accessible by untrusted users, so you may want to set it to true if you host a public instance of CommaFeed with user registeration enabled.
- When `commafeed.http-client.block-local-addresses` is enabled, SSRF is now also mitigated by blocking public websites redirecting to local ones.
## [6.2.0]
- Starred entries are no longer deleted after a certain amount of time, they are now kept indefinitely. The new `commafeed.database.cleanup.keep-starred-entries` setting can be disabled to restore the previous behavior if you want to keep deleting starred entries during normal entries cleanup (#1581)
## [6.1.1]
- Fix old starred entries not loading if they were marked as read (#2031)
## [6.1.0]
- When clicking on the password reset link, a random password is no longer generated automatically. The user is now redirected to a page where they can set their own password (#2023)
- Use browser preferred language instead of English when using CommaFeed for the first time (#2018)
- The profile menu is now closed when scrolling the page (#2019)
- The "disable pull to refresh" feature is now disabled by default (#2030)
## [6.0.0]
- When booting CommaFeed for the first time, the default "admin" account is no longer created automatically. A setup wizard will guide you through the creation of an admin account
- Default password complexity requirements have been lowered for local network deployments, where strict password rules are often unnecessary. The `commafeed.users.strict-password-policy` setting has been replaced by `commafeed.users.minimum-password-length` with a default value of `4` (#1916)
- Email addresses are no longer required when creating users and when they update their profile. The `commafeed.users.email-address-required` setting has been added to restore the previous behavior (#1914)
- Java 25+ is now required to build and run CommaFeed
## [5.12.1]
- The favicon is now crispier (#1978)
- The ReadKit iOS app now works via the Fever API (#1602)
## [5.12.0]
- Added a setting to disable the "disable pull to refresh" feature because it messes with some browsers (#1168)
- Emojis in feeds are now correctly displayed (#1955)
- Don't show "Star/Unstar" in the context menu if the entry is too old to be starred (#1935)
- Invalid relative urls in feeds no longer prevent those feeds from being parsed (#1939)
- Fix an issue that could prevent large feeds from being parsed when using Java 24+ (#1961)
- Enforce user password validation when created in the admin view (#1937)
- The process in the docker native image is now called "commafeed" instead of "application"
## [5.11.1]
- The search limit of 3 characters has been removed (#1887)
- Fix an issue that caused feed filtering expressions to be incorrectly converted to lowercase when saving them (#1899)
## [5.11.0]
- Add an option to navigate to the next unread category/feed when marking all entries as read (#1807)

View File

@@ -15,8 +15,9 @@ Google Reader inspired self-hosted RSS reader, based on Quarkus and React/TypeSc
- Supports thousands of users and millions of feeds
- OPML import/export
- REST API
- Fever-compatible API for native mobile apps
- Fever and Google Reader API for native mobile apps
- Can automatically mark articles as read based on user-defined rules
- Push notifications when new articles are published
- Highly customizable with [custom CSS](https://athou.github.io/commafeed/documentation/custom-css) and JavaScript
- [Browser extension](https://github.com/Athou/commafeed-browser-extension)
- Compiles to native code for blazing fast startup and low memory usage
@@ -26,11 +27,18 @@ Google Reader inspired self-hosted RSS reader, based on Quarkus and React/TypeSc
- MySQL
- MariaDB
## Deployment
## Usage
### Public instance
A free public instance is available at https://www.commafeed.com.
It has no ads, no tracking, and your data is never exploited or sold to third parties. The service is funded entirely through donations.
However, this public instance does have a few limitations compared to self-hosted setups, outlined [here](https://github.com/Athou/commafeed/discussions/1567).
### Docker
Docker is the easiest way to get started with CommaFeed.
Docker is the easiest way to get started with self-hosted CommaFeed.
Docker images are built automatically and are available at https://hub.docker.com/r/athou/commafeed
@@ -62,8 +70,8 @@ memory usage.
./mvnw clean package [-P<database> [-Pnative]] [-DskipTests]
- `<database>` can be one of `h2`, `postgresql`, `mysql` or `mariadb`. The default is `h2`.
- `-Pnative` compiles the application to native code. This requires GraalVM to be installed (`GRAALVM_HOME` environment
variable pointing to a GraalVM installation).
- `-Pnative` compiles the application to native code. This requires either GraalVM to be installed (`GRAALVM_HOME` environment
variable pointing to a GraalVM installation) or a container environment to be available (docker/podman/...).
- `-DskipTests` to speed up the build process by skipping tests.
When the build is complete:
@@ -103,7 +111,7 @@ There are multiple ways to configure CommaFeed:
- Environment variables (keys in UPPER_CASE)
- a `.env` file in the working directory (keys in UPPER_CASE)
The properties file is recommended because CommaFeed will be able to warn about invalid properties and typos.
When in doubt, the properties file is recommended because CommaFeed will be able to warn about invalid properties and typos.
All [CommaFeed settings](https://athou.github.io/commafeed/documentation) are optional and have sensible default values.
@@ -113,7 +121,6 @@ meaning that you will have to log back in after each restart of the application.
All other Quarkus settings can be found [here](https://quarkus.io/guides/all-config).
When started, the server will listen on http://localhost:8082.
The default user is `admin` and the default password is `admin`.
### Updates
@@ -152,6 +159,14 @@ named [Semeru](https://developer.ibm.com/languages/java/semeru-runtimes/download
This is the JVM used in
the [Docker image](https://github.com/Athou/commafeed/blob/master/commafeed-server/src/main/docker/Dockerfile.jvm).
## FAQ
### Getting "Access to local address blocked" when adding a feed
CommaFeed blocks access to local resources by default to prevent [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) attacks.
If you want to subscribe to feeds that are only available on your local network, you can disable this security measure by setting the `commafeed.http-client.block-local-addresses` variable to `false`.
Do this only if you trust all users of your CommaFeed instance not to access private resources.
## Translation
Files for internationalization are

View File

@@ -23,9 +23,6 @@ dist-ssr
*.sln
*.sw?
# rollup-plugin-visualizer
/stats.html
# vite
vite.config.ts.timestamp-*.mjs

View File

@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.1.3/schema.json",
"$schema": "https://biomejs.dev/schemas/2.5.8/schema.json",
"formatter": {
"indentStyle": "space",
"indentWidth": 4,

View File

@@ -2,6 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link rel="manifest" href="manifest.json" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

View File

@@ -1,4 +1,5 @@
import type { LinguiConfig } from "@lingui/conf"
import { formatter } from "@lingui/format-po"
const config: LinguiConfig = {
locales: [
@@ -38,11 +39,9 @@ const config: LinguiConfig = {
exclude: ["src/locales/**"],
},
],
format: "po",
formatOptions: {
origins: true,
format: formatter({
lineNumbers: false,
},
}),
sourceLocale: "en",
fallbackLocales: {
default: "en",

File diff suppressed because it is too large Load Diff

View File

@@ -15,69 +15,71 @@
"i18n:extract": "lingui extract --clean"
},
"dependencies": {
"@emotion/react": "^11.14.0",
"@fontsource/open-sans": "^5.2.6",
"@lingui/core": "^5.4.0",
"@lingui/react": "^5.4.0",
"@mantine/core": "^8.2.3",
"@mantine/form": "^8.2.3",
"@mantine/hooks": "^8.2.3",
"@mantine/modals": "^8.2.3",
"@mantine/notifications": "^8.2.3",
"@mantine/spotlight": "^8.2.3",
"@monaco-editor/react": "^4.7.0",
"@reduxjs/toolkit": "^2.8.2",
"axios": "^1.11.0",
"dayjs": "^1.11.13",
"escape-string-regexp": "^5.0.0",
"interweave": "^13.1.1",
"monaco-editor": "^0.52.2",
"mousetrap": "^1.6.5",
"react": "^19.1.1",
"react-async-hook": "^4.0.0",
"react-contexify": "^6.0.0",
"react-device-detect": "^2.2.3",
"react-dom": "^19.1.1",
"react-draggable": "^4.5.0",
"react-icons": "^5.5.0",
"react-infinite-scroller": "^1.2.6",
"react-redux": "^9.2.0",
"react-router-dom": "^7.7.1",
"react-swipeable": "^7.0.2",
"style-to-object": "^1.0.9",
"throttle-debounce": "^5.0.2",
"tinycon": "^0.6.8",
"tss-react": "^4.9.19",
"websocket-heartbeat-js": "^1.1.3"
"@emotion/react": "11.14.0",
"@fontsource/open-sans": "5.3.0",
"@lingui/core": "6.6.0",
"@lingui/react": "6.6.0",
"@mantine/core": "9.5.1",
"@mantine/dates": "9.5.1",
"@mantine/form": "9.5.1",
"@mantine/hooks": "9.5.1",
"@mantine/modals": "9.5.1",
"@mantine/notifications": "9.5.1",
"@mantine/spotlight": "9.5.1",
"@monaco-editor/react": "4.7.0",
"@react-querybuilder/mantine": "8.22.5",
"@reduxjs/toolkit": "2.12.0",
"@rolldown/plugin-babel": "0.2.3",
"axios": "1.19.0",
"dayjs": "1.11.21",
"escape-string-regexp": "5.0.0",
"interweave": "13.1.1",
"monaco-editor": "0.56.0",
"mousetrap": "1.6.5",
"react": "19.2.8",
"react-async-hook": "4.0.0",
"react-contexify": "6.0.0",
"react-dom": "19.2.8",
"react-draggable": "4.7.1",
"react-icons": "5.7.0",
"react-infinite-scroller": "1.2.6",
"react-querybuilder": "8.22.5",
"react-redux": "9.3.0",
"react-router-dom": "7.18.2",
"react-swipeable": "7.0.2",
"style-to-object": "2.0.2",
"throttle-debounce": "5.0.2",
"tinycon": "0.6.8",
"tss-react": "4.9.21",
"websocket-heartbeat-js": "1.1.3"
},
"devDependencies": {
"@biomejs/biome": "^2.1.3",
"@lingui/babel-plugin-lingui-macro": "^5.4.0",
"@lingui/cli": "^5.4.0",
"@lingui/vite-plugin": "^5.4.0",
"@testing-library/jest-dom": "^6.6.4",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/mousetrap": "^1.6.15",
"@types/react": "^19.1.9",
"@types/react-dom": "^19.1.7",
"@types/react-infinite-scroller": "^1.2.5",
"@types/throttle-debounce": "^5.0.2",
"@types/tinycon": "^0.6.7",
"@vitejs/plugin-react": "^4.7.0",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-react-compiler": "^19.1.0-rc.2",
"jsdom": "^26.1.0",
"rollup-plugin-visualizer": "^6.0.3",
"typescript": "^5.9.2",
"vite": "^7.0.6",
"vite-plugin-checker": "^0.10.2",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4"
"@babel/types": "^8.0.4",
"@biomejs/biome": "2.5.8",
"@lingui/babel-plugin-lingui-macro": "6.6.0",
"@lingui/cli": "6.6.0",
"@lingui/vite-plugin": "6.6.0",
"@testing-library/jest-dom": "7.0.1",
"@testing-library/react": "16.3.2",
"@testing-library/user-event": "14.6.4",
"@types/mousetrap": "1.6.15",
"@types/react": "19.2.18",
"@types/react-dom": "19.2.4",
"@types/react-infinite-scroller": "1.2.5",
"@types/throttle-debounce": "5.0.2",
"@types/tinycon": "0.6.7",
"@vitejs/plugin-react": "6.0.5",
"babel-plugin-react-compiler": "1.0.0",
"jsdom": "30.0.1",
"typescript": "7.0.2",
"vite": "8.2.1",
"vite-plugin-checker": "0.14.5",
"vitest": "4.1.10",
"yaml": "2.9.0"
},
"overrides": {
"react-infinite-scroller": {
"react": "^19.1.1"
"react": "19.2.8"
}
}
}

View File

@@ -6,19 +6,16 @@
<parent>
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>5.11.0</version>
<version>7.3.1</version>
</parent>
<artifactId>commafeed-client</artifactId>
<name>CommaFeed Client</name>
<properties>
<sonar.sources>package.json,src</sonar.sources>
<sonar.coverage.exclusions>**/*</sonar.coverage.exclusions>
<!-- renovate: datasource=node-version depName=node -->
<node.version>v22.18.0</node.version>
<node.version>v24.19.0</node.version>
<!-- renovate: datasource=npm depName=npm -->
<npm.version>11.5.2</npm.version>
<npm.version>12.0.2</npm.version>
</properties>
<build>
@@ -26,7 +23,7 @@
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.15.1</version>
<version>2.0.2</version>
<?m2e ignore?>
<executions>
<execution>
@@ -75,7 +72,7 @@
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<version>3.5.0</version>
<executions>
<execution>
<id>copy web interface to resources</id>
@@ -97,4 +94,49 @@
</plugin>
</plugins>
</build>
<profiles>
<!-- This profile is used to kill the Biome process on Windows -->
<!-- npm ci can fail if Biome is running (e.g., in the IDE) because it locks some files -->
<profile>
<id>kill-biome</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
<executions>
<execution>
<id>kill-biome</id>
<phase>initialize</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>taskkill</executable>
<arguments>
<argument>/F</argument>
<argument>/IM</argument>
<argument>biome.exe</argument>
</arguments>
<successCodes>
<successCode>0</successCode>
<!-- taskkill returns 128 if the process is not found, which is fine in this case -->
<successCode>128</successCode>
</successCodes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="393.84613"
width="393.84613"
viewBox="0 0 5.0480766 5.0480766"
version="1.1"
id="svg3"
xmlns="http://www.w3.org/2000/svg">
<title>CommaFeed favicon</title>
<defs
id="defs3" />
<rect
fill="#f88a14"
rx="0.53846151"
ry="0.53846151"
height="5.0480766"
width="5.0480766"
id="rect1"
x="0"
y="0"
style="stroke-width:0.769231" />
<path
d="m 1.3450904,0.64548657 c 2.9002,0 2.9002,2.91010003 2.9002,2.91010003"
fill="none"
stroke="#ffffff"
stroke-linecap="round"
stroke-width="0.78125"
id="path1" />
<path
d="m 1.3377904,1.9915866 c 1.5705,-0.00908 1.5705,1.5639 1.5705,1.5639"
fill="none"
stroke="#ffffff"
stroke-linecap="round"
stroke-width="0.78125"
id="path2" />
<path
d="m 2.0192904,3.5227866 c 0,0.23366 -0.10712,0.47418 -0.24663,0.6537 -0.1814,0.2333 -0.5705,0.5618 -0.6913,0.5653 0.0402,-0.0662 0.263,-0.5654 0.2563,-0.5654 -0.36423004,0 -0.65950004,-0.29265 -0.65950004,-0.65365 0,-0.361 0.29527,-0.65365 0.65950004,-0.65365 0.36423,0 0.68159,0.29265 0.68159,0.65365 z"
fill="#ffffff"
id="path3" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,24 +1,19 @@
import { i18n } from "@lingui/core"
import { I18nProvider } from "@lingui/react"
import { MantineProvider } from "@mantine/core"
import { MantineProvider, v8CssVariablesResolver } from "@mantine/core"
import { ModalsProvider } from "@mantine/modals"
import { Notifications } from "@mantine/notifications"
import type React from "react"
import { useEffect, useState } from "react"
import { isSafari } from "react-device-detect"
import { useEffect } from "react"
import { HashRouter, Navigate, Route, Routes, useNavigate } from "react-router-dom"
import Tinycon from "tinycon"
import { Constants } from "@/app/constants"
import { redirectTo } from "@/app/redirect/slice"
import { redirectToInitialSetup } from "@/app/redirect/thunks"
import { reloadServerInfos } from "@/app/server/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import { categoryUnreadCount } from "@/app/utils"
import { DisablePullToRefresh } from "@/components/DisablePullToRefresh"
import { ErrorBoundary } from "@/components/ErrorBoundary"
import { Header } from "@/components/header/Header"
import { Tree } from "@/components/sidebar/Tree"
import { useAppLoading } from "@/hooks/useAppLoading"
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
import { useI18n } from "@/i18n"
import { AdminUsersPage } from "@/pages/admin/AdminUsersPage"
import { MetricsPage } from "@/pages/admin/MetricsPage"
@@ -31,8 +26,10 @@ import { FeedEntriesPage } from "@/pages/app/FeedEntriesPage"
import Layout from "@/pages/app/Layout"
import { SettingsPage } from "@/pages/app/SettingsPage"
import { TagDetailsPage } from "@/pages/app/TagDetailsPage"
import { InitialSetupPage } from "@/pages/auth/InitialSetupPage"
import { LoginPage } from "@/pages/auth/LoginPage"
import { PasswordRecoveryPage } from "@/pages/auth/PasswordRecoveryPage"
import { PasswordResetPage } from "@/pages/auth/PasswordResetPage"
import { RegistrationPage } from "@/pages/auth/RegistrationPage"
import { WelcomePage } from "@/pages/WelcomePage"
@@ -46,6 +43,8 @@ function Providers(
<I18nProvider i18n={i18n}>
<MantineProvider
defaultColorScheme="auto"
// keep using css variables from mantine v8
cssVariablesResolver={v8CssVariablesResolver}
theme={{
primaryColor: primaryColor,
fontFamily: "Open Sans",
@@ -83,9 +82,11 @@ function AppRoutes() {
<Routes>
<Route path="/" element={<Navigate to={`/app/category/${Constants.categories.all.id}`} replace />} />
<Route path="welcome" element={<WelcomePage />} />
<Route path="setup" element={<InitialSetupPage />} />
<Route path="login" element={<LoginPage />} />
<Route path="register" element={<RegistrationPage />} />
<Route path="passwordRecovery" element={<PasswordRecoveryPage />} />
<Route path="passwordReset" element={<PasswordResetPage />} />
<Route path="app" element={<Layout header={<Header />} sidebar={<Tree />} sidebarVisible={sidebarVisible} />}>
<Route path="category">
<Route path=":id" element={<FeedEntriesPage sourceType="category" />} />
@@ -113,6 +114,18 @@ function AppRoutes() {
)
}
function InitialSetupHandler() {
const serverInfos = useAppSelector(state => state.server.serverInfos)
const dispatch = useAppDispatch()
useEffect(() => {
if (serverInfos?.initialSetupRequired) {
dispatch(redirectToInitialSetup())
}
}, [serverInfos, dispatch])
return null
}
function RedirectHandler() {
const target = useAppSelector(state => state.redirect.to)
const dispatch = useAppDispatch()
@@ -128,78 +141,8 @@ function RedirectHandler() {
return null
}
function UnreadCountTitleHandler({
enabled,
}: Readonly<{
enabled?: boolean
}>) {
const root = useAppSelector(state => state.tree.rootCategory)
const unreadCount = categoryUnreadCount(root)
return <title>{enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"}</title>
}
function UnreadCountFaviconHandler({ enabled }: { enabled?: boolean }) {
const root = useAppSelector(state => state.tree.rootCategory)
const unreadCount = categoryUnreadCount(root)
useEffect(() => {
if (enabled && unreadCount > 0) {
Tinycon.setBubble(unreadCount)
} else {
Tinycon.reset()
}
}, [unreadCount, enabled])
return null
}
function BrowserExtensionBadgeUnreadCountHandler() {
const root = useAppSelector(state => state.tree.rootCategory)
const { setBadgeUnreadCount } = useBrowserExtension()
useEffect(() => {
if (!root) return
const unreadCount = categoryUnreadCount(root)
setBadgeUnreadCount(unreadCount)
}, [root, setBadgeUnreadCount])
return null
}
function CustomJsHandler() {
const [scriptLoaded, setScriptLoaded] = useState(false)
const { loading } = useAppLoading()
useEffect(() => {
if (scriptLoaded || loading) {
return
}
const script = document.createElement("script")
script.src = "custom_js.js"
script.async = true
document.body.appendChild(script)
setScriptLoaded(true)
}, [scriptLoaded, loading])
return null
}
function CustomCssHandler() {
useEffect(() => {
const link = document.createElement("link")
link.rel = "stylesheet"
link.type = "text/css"
link.href = "custom_css.css"
document.head.appendChild(link)
}, [])
return null
}
export function App() {
useI18n()
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
const dispatch = useAppDispatch()
useEffect(() => {
@@ -208,19 +151,8 @@ export function App() {
return (
<Providers>
<UnreadCountTitleHandler enabled={unreadCountTitle} />
<UnreadCountFaviconHandler enabled={unreadCountFavicon} />
<BrowserExtensionBadgeUnreadCountHandler />
<CustomJsHandler />
<CustomCssHandler />
{/* disable pull-to-refresh as it messes with vertical scrolling
safari behaves weirdly when overscroll-behavior is set to none so we disable it only for other browsers
https://github.com/Athou/commafeed/issues/1168
*/}
{!isSafari && <DisablePullToRefresh />}
<HashRouter>
<InitialSetupHandler />
<RedirectHandler />
<AppRoutes />
</HashRouter>

View File

@@ -12,12 +12,15 @@ import type {
FeedModificationRequest,
GetEntriesPaginatedRequest,
IDRequest,
InitialSetupRequest,
LoginRequest,
MarkRequest,
Metrics,
MultipleMarkRequest,
PasswordResetConfirmationRequest,
PasswordResetRequest,
ProfileModificationRequest,
PushNotificationSettings,
RegistrationRequest,
ServerInfo,
Settings,
@@ -32,16 +35,17 @@ const axiosInstance = axios.create({ baseURL: "./rest", withCredentials: true })
axiosInstance.interceptors.response.use(
response => response,
error => {
if (isAuthenticationError(error)) {
if (isAuthenticationError(error) && window.location.hash !== "#/login") {
const data = error.response?.data
window.location.hash = data?.allowRegistrations ? "/welcome" : "/login"
window.location.reload()
}
throw error
}
)
function isAuthenticationError(error: unknown): error is AxiosError<AuthenticationError> {
return axios.isAxiosError(error) && !!error.response && [401, 403].includes(error.response.status)
return axios.isAxiosError(error) && error.response?.status === 401
}
export const client = {
@@ -93,9 +97,13 @@ export const client = {
})
},
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
initialSetup: async (req: InitialSetupRequest) => await axiosInstance.post("user/initialSetup", req),
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
passwordResetCallback: async (req: PasswordResetConfirmationRequest) => await axiosInstance.post("user/passwordResetCallback", req),
getSettings: async () => await axiosInstance.get<Settings>("user/settings"),
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),
sendTestPushNotification: async (settings: PushNotificationSettings) =>
await axiosInstance.post("user/pushNotificationTest", settings),
getProfile: async () => await axiosInstance.get<UserModel>("user/profile"),
saveProfile: async (req: ProfileModificationRequest) => await axiosInstance.post("user/profile", req),
deleteProfile: async () => await axiosInstance.post("user/profile/deleteAccount"),

View File

@@ -1,6 +1,6 @@
import type { IconType } from "react-icons"
import { FaAt } from "react-icons/fa"
import { SiBuffer, SiFacebook, SiGmail, SiInstapaper, SiPocket, SiTumblr, SiX } from "react-icons/si"
import { SiBuffer, SiFacebook, SiGmail, SiInstapaper, SiTumblr, SiX } from "react-icons/si"
import type { Category, Entry, SharingSettings } from "./types"
const categories: Record<string, Omit<Category, "name">> = {
@@ -58,12 +58,6 @@ const sharing: {
color: "#375672",
url: (url, desc) => `https://www.tumblr.com/share/link?url=${url}&name=${desc}`,
},
pocket: {
label: "Pocket",
icon: SiPocket,
color: "#EF4154",
url: (url, desc) => `https://getpocket.com/save?url=${url}&title=${desc}`,
},
instapaper: {
label: "Instapaper",
icon: SiInstapaper,

View File

@@ -40,7 +40,9 @@ export const loadMoreEntries = createAppAsyncThunk("entries/loadMore", async (_,
const state = thunkApi.getState()
const { source } = state.entries
const offset =
state.user.settings?.readingMode === "all" ? state.entries.entries.length : state.entries.entries.filter(e => !e.read).length
state.user.settings?.readingMode === "all" || (source.type === "category" && source.id === "starred")
? state.entries.entries.length
: state.entries.entries.filter(e => !e.read).length
const endpoint = getEndpoint(state.entries.source.type)
const result = await endpoint(buildGetEntriesPaginatedRequest(state, source, offset))
return result.data

View File

@@ -6,6 +6,8 @@ export const redirectToLogin = createAppAsyncThunk("redirect/login", (_, thunkAp
export const redirectToRegistration = createAppAsyncThunk("redirect/register", (_, thunkApi) => thunkApi.dispatch(redirectTo("/register")))
export const redirectToInitialSetup = createAppAsyncThunk("redirect/initialSetup", (_, thunkApi) => thunkApi.dispatch(redirectTo("/setup")))
export const redirectToApiDocumentation = createAppAsyncThunk("redirect/api", () => {
window.location.href = "api-documentation/"
})

View File

@@ -1,5 +1,5 @@
import { configureStore } from "@reduxjs/toolkit"
import { type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"
import { shallowEqual, type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"
import { entriesSlice } from "@/app/entries/slice"
import { redirectSlice } from "@/app/redirect/slice"
import { serverSlice } from "@/app/server/slice"
@@ -41,3 +41,4 @@ export type AppDispatch = typeof store.dispatch
export const useAppDispatch: () => AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
export const useShallowEqualAppSelector: TypedUseSelectorHook<RootState> = selector => useSelector(selector, shallowEqual)

View File

@@ -27,6 +27,7 @@ const createFeed = (id: number, unread: number): Subscription => ({
feedUrl: "",
feedLink: "",
iconUrl: "",
pushNotificationsEnabled: true,
})
const root = createCategory("root")

View File

@@ -28,6 +28,9 @@ export interface Subscription {
position: number
newestItemTime?: number
filter?: string
filterLegacy?: string
pushNotificationsEnabled: boolean
autoMarkAsReadAfterDays?: number
}
export interface Category {
@@ -109,6 +112,8 @@ export interface FeedModificationRequest {
categoryId?: string
position?: number
filter?: string
pushNotificationsEnabled: boolean
autoMarkAsReadAfterDays?: number
}
export interface GetEntriesRequest {
@@ -196,6 +201,12 @@ export interface PasswordResetRequest {
email: string
}
export interface PasswordResetConfirmationRequest {
email: string
token: string
password: string
}
export interface ProfileModificationRequest {
currentPassword: string
email: string
@@ -209,17 +220,27 @@ export interface RegistrationRequest {
email: string
}
export interface InitialSetupRequest {
name: string
password: string
email?: string
}
export interface ServerInfo {
announcement?: string
version: string
gitCommit: string
allowRegistrations: boolean
emailAddressRequired: boolean
smtpEnabled: boolean
demoAccountEnabled: boolean
websocketEnabled: boolean
websocketPingInterval: number
treeReloadInterval: number
forceRefreshCooldownDuration: number
initialSetupRequired: boolean
minimumPasswordLength: number
pushNotificationsEnabled: boolean
}
export interface SharingSettings {
@@ -228,13 +249,22 @@ export interface SharingSettings {
facebook: boolean
twitter: boolean
tumblr: boolean
pocket: boolean
instapaper: boolean
buffer: boolean
}
export type PushNotificationType = "ntfy" | "gotify" | "pushover"
export interface PushNotificationSettings {
type?: PushNotificationType
serverUrl?: string
userId?: string
userSecret?: string
topic?: string
}
export interface Settings {
language: string
language?: string
readingMode: ReadingMode
readingOrder: ReadingOrder
showRead: boolean
@@ -252,8 +282,10 @@ export interface Settings {
mobileFooter: boolean
unreadCountTitle: boolean
unreadCountFavicon: boolean
disablePullToRefresh: boolean
primaryColor?: string
sharingSettings: SharingSettings
pushNotificationSettings: PushNotificationSettings
}
export interface LocalSettings {

View File

@@ -1,30 +1,8 @@
import { t } from "@lingui/core/macro"
import { showNotification } from "@mantine/notifications"
import { createSlice, isAnyOf, type PayloadAction } from "@reduxjs/toolkit"
import { createSlice, type PayloadAction } from "@reduxjs/toolkit"
import type { LocalSettings, Settings, UserModel, ViewMode } from "@/app/types"
import {
changeCustomContextMenu,
changeEntriesToKeepOnTopWhenScrolling,
changeExternalLinkIconDisplayMode,
changeLanguage,
changeMarkAllAsReadConfirmation,
changeMarkAllAsReadNavigateToUnread,
changeMobileFooter,
changePrimaryColor,
changeReadingMode,
changeReadingOrder,
changeScrollMarks,
changeScrollMode,
changeScrollSpeed,
changeSharingSetting,
changeShowRead,
changeStarIconDisplayMode,
changeUnreadCountFavicon,
changeUnreadCountTitle,
reloadProfile,
reloadSettings,
reloadTags,
} from "./thunks"
import { changeSettings, reloadProfile, reloadSettings, reloadTags } from "./thunks"
interface UserState {
settings?: Settings
@@ -71,104 +49,16 @@ export const userSlice = createSlice({
builder.addCase(reloadTags.fulfilled, (state, action) => {
state.tags = action.payload
})
builder.addCase(changeReadingMode.pending, (state, action) => {
builder.addCase(changeSettings.pending, (state, action) => {
if (!state.settings) return
state.settings.readingMode = action.meta.arg
state.settings = { ...state.settings, ...action.meta.arg }
})
builder.addCase(changeReadingOrder.pending, (state, action) => {
if (!state.settings) return
state.settings.readingOrder = action.meta.arg
builder.addCase(changeSettings.fulfilled, () => {
showNotification({
message: t`Settings saved.`,
color: "green",
})
})
builder.addCase(changeLanguage.pending, (state, action) => {
if (!state.settings) return
state.settings.language = action.meta.arg
})
builder.addCase(changeScrollSpeed.pending, (state, action) => {
if (!state.settings) return
state.settings.scrollSpeed = action.meta.arg ? 400 : 0
})
builder.addCase(changeShowRead.pending, (state, action) => {
if (!state.settings) return
state.settings.showRead = action.meta.arg
})
builder.addCase(changeScrollMarks.pending, (state, action) => {
if (!state.settings) return
state.settings.scrollMarks = action.meta.arg
})
builder.addCase(changeScrollMode.pending, (state, action) => {
if (!state.settings) return
state.settings.scrollMode = action.meta.arg
})
builder.addCase(changeEntriesToKeepOnTopWhenScrolling.pending, (state, action) => {
if (!state.settings) return
state.settings.entriesToKeepOnTopWhenScrolling = action.meta.arg
})
builder.addCase(changeStarIconDisplayMode.pending, (state, action) => {
if (!state.settings) return
state.settings.starIconDisplayMode = action.meta.arg
})
builder.addCase(changeExternalLinkIconDisplayMode.pending, (state, action) => {
if (!state.settings) return
state.settings.externalLinkIconDisplayMode = action.meta.arg
})
builder.addCase(changeMarkAllAsReadConfirmation.pending, (state, action) => {
if (!state.settings) return
state.settings.markAllAsReadConfirmation = action.meta.arg
})
builder.addCase(changeMarkAllAsReadNavigateToUnread.pending, (state, action) => {
if (!state.settings) return
state.settings.markAllAsReadNavigateToNextUnread = action.meta.arg
})
builder.addCase(changeCustomContextMenu.pending, (state, action) => {
if (!state.settings) return
state.settings.customContextMenu = action.meta.arg
})
builder.addCase(changeMobileFooter.pending, (state, action) => {
if (!state.settings) return
state.settings.mobileFooter = action.meta.arg
})
builder.addCase(changeUnreadCountTitle.pending, (state, action) => {
if (!state.settings) return
state.settings.unreadCountTitle = action.meta.arg
})
builder.addCase(changeUnreadCountFavicon.pending, (state, action) => {
if (!state.settings) return
state.settings.unreadCountFavicon = action.meta.arg
})
builder.addCase(changePrimaryColor.pending, (state, action) => {
if (!state.settings) return
state.settings.primaryColor = action.meta.arg
})
builder.addCase(changeSharingSetting.pending, (state, action) => {
if (!state.settings) return
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
})
builder.addMatcher(
isAnyOf(
changeLanguage.fulfilled,
changeScrollSpeed.fulfilled,
changeShowRead.fulfilled,
changeScrollMarks.fulfilled,
changeScrollMode.fulfilled,
changeEntriesToKeepOnTopWhenScrolling.fulfilled,
changeStarIconDisplayMode.fulfilled,
changeExternalLinkIconDisplayMode.fulfilled,
changeMarkAllAsReadConfirmation.fulfilled,
changeMarkAllAsReadNavigateToUnread.fulfilled,
changeCustomContextMenu.fulfilled,
changeMobileFooter.fulfilled,
changeUnreadCountTitle.fulfilled,
changeUnreadCountFavicon.fulfilled,
changePrimaryColor.fulfilled,
changeSharingSetting.fulfilled
),
() => {
showNotification({
message: t`Settings saved.`,
color: "green",
})
}
)
},
})

View File

@@ -1,7 +1,6 @@
import { createAppAsyncThunk } from "@/app/async-thunk"
import { client } from "@/app/client"
import { reloadEntries } from "@/app/entries/thunks"
import type { IconDisplayMode, ReadingMode, ReadingOrder, ScrollMode, SharingSettings } from "@/app/types"
import type { Settings } from "@/app/types"
export const reloadSettings = createAppAsyncThunk("settings/reload", async () => await client.user.getSettings().then(r => r.data))
@@ -9,142 +8,8 @@ export const reloadProfile = createAppAsyncThunk("profile/reload", async () => a
export const reloadTags = createAppAsyncThunk("entries/tags", async () => await client.entry.getTags().then(r => r.data))
export const changeReadingMode = createAppAsyncThunk("settings/readingMode", (readingMode: ReadingMode, thunkApi) => {
export const changeSettings = createAppAsyncThunk("settings/change", async (newSettings: Partial<Settings>, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, readingMode })
thunkApi.dispatch(reloadEntries())
await client.user.saveSettings({ ...settings, ...newSettings })
})
export const changeReadingOrder = createAppAsyncThunk("settings/readingOrder", (readingOrder: ReadingOrder, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, readingOrder })
thunkApi.dispatch(reloadEntries())
})
export const changeLanguage = createAppAsyncThunk("settings/language", (language: string, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, language })
})
export const changeScrollSpeed = createAppAsyncThunk("settings/scrollSpeed", (speed: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, scrollSpeed: speed ? 400 : 0 })
})
export const changeShowRead = createAppAsyncThunk("settings/showRead", (showRead: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, showRead })
})
export const changeScrollMarks = createAppAsyncThunk("settings/scrollMarks", (scrollMarks: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, scrollMarks })
})
export const changeScrollMode = createAppAsyncThunk("settings/scrollMode", (scrollMode: ScrollMode, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, scrollMode })
})
export const changeEntriesToKeepOnTopWhenScrolling = createAppAsyncThunk(
"settings/entriesToKeepOnTopWhenScrolling",
(entriesToKeepOnTopWhenScrolling: number, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, entriesToKeepOnTopWhenScrolling })
}
)
export const changeStarIconDisplayMode = createAppAsyncThunk(
"settings/starIconDisplayMode",
(starIconDisplayMode: IconDisplayMode, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, starIconDisplayMode })
}
)
export const changeExternalLinkIconDisplayMode = createAppAsyncThunk(
"settings/externalLinkIconDisplayMode",
(externalLinkIconDisplayMode: IconDisplayMode, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, externalLinkIconDisplayMode })
}
)
export const changeMarkAllAsReadConfirmation = createAppAsyncThunk(
"settings/markAllAsReadConfirmation",
(markAllAsReadConfirmation: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, markAllAsReadConfirmation })
}
)
export const changeMarkAllAsReadNavigateToUnread = createAppAsyncThunk(
"settings/markAllAsReadNavigateToUnread",
(markAllAsReadNavigateToNextUnread: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, markAllAsReadNavigateToNextUnread })
}
)
export const changeCustomContextMenu = createAppAsyncThunk("settings/customContextMenu", (customContextMenu: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, customContextMenu })
})
export const changeMobileFooter = createAppAsyncThunk("settings/mobileFooter", (mobileFooter: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, mobileFooter })
})
export const changeUnreadCountTitle = createAppAsyncThunk("settings/unreadCountTitle", (unreadCountTitle: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, unreadCountTitle })
})
export const changeUnreadCountFavicon = createAppAsyncThunk("settings/unreadCountFavicon", (unreadCountFavicon: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, unreadCountFavicon })
})
export const changePrimaryColor = createAppAsyncThunk("settings/primaryColor", (primaryColor: string, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, primaryColor })
})
export const changeSharingSetting = createAppAsyncThunk(
"settings/sharingSetting",
(
sharingSetting: {
site: keyof SharingSettings
value: boolean
},
thunkApi
) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({
...settings,
sharingSettings: {
...settings.sharingSettings,
[sharingSetting.site]: sharingSetting.value,
},
})
}
)

View File

@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg height="512" width="512" viewBox="0 0 6.5625 6.5625" xmlns="http://www.w3.org/2000/svg">
<title>CommaFeed logo</title>
<rect fill="#f88a14" rx="0.7" ry="0.7" height="6.5625" width="6.5625" />
<path d="m1.9761,1.5289c2.9002,0,2.9002,2.9101,2.9002,2.9101" fill="none" stroke="#FFF" stroke-linecap="round"
stroke-width="0.78125" />
stroke-width="0.78125" />
<path d="m1.9688,2.875c1.5705-0.00908,1.5705,1.5639,1.5705,1.5639" fill="none" stroke="#FFF" stroke-linecap="round"
stroke-width="0.78125" />
stroke-width="0.78125" />
<path d="m2.6503,4.4062c0,0.23366-0.10712,0.47418-0.24663,0.6537-0.1814,0.2333-0.5705,0.5618-0.6913,0.5653,0.0402-0.0662,0.263-0.5654,0.2563-0.5654-0.36423,0-0.6595-0.29265-0.6595-0.65365s0.29527-0.65365,0.6595-0.65365,0.68159,0.29265,0.68159,0.65365z"
fill="#FFF" />
fill="#FFF" />
</svg>

Before

Width:  |  Height:  |  Size: 791 B

After

Width:  |  Height:  |  Size: 831 B

View File

@@ -1,7 +1,6 @@
import type { MessageDescriptor } from "@lingui/core"
import { useLingui } from "@lingui/react"
import { ActionIcon, Box, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core"
import type { ActionIconVariant } from "@mantine/core/lib/components/ActionIcon/ActionIcon"
import { ActionIcon, type ActionIconVariant, Box, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core"
import { forwardRef, type MouseEventHandler, type ReactNode } from "react"
import { Constants } from "@/app/constants"
import { useActionButton } from "@/hooks/useActionButton"

View File

@@ -1,4 +0,0 @@
html,
body {
overscroll-behavior: none;
}

View File

@@ -1,4 +1,3 @@
export const DisablePullToRefresh = () => {
import("./DisablePullToRefresh.css")
return null
export const DisablePullToRefresh = ({ enabled }: { enabled: boolean | undefined }) => {
return enabled ? <style>{`html, body { overscroll-behavior: none; }`}</style> : null
}

View File

@@ -14,6 +14,7 @@ interface ImageWithPlaceholderWhileLoadingProps {
placeholderHeight?: number
placeholderBackgroundColor?: string
placeholderIconSize?: number
onError?: (e: React.SyntheticEvent<HTMLImageElement, Event>) => void
}
const useStyles = tss
@@ -44,6 +45,7 @@ export function ImageWithPlaceholderWhileLoading({
title,
width,
style,
onError,
}: Readonly<ImageWithPlaceholderWhileLoadingProps>) {
const { classes } = useStyles({
placeholderWidth,
@@ -70,6 +72,7 @@ export function ImageWithPlaceholderWhileLoading({
width={width}
height={height}
onLoad={() => setLoading(false)}
onError={onError}
style={{
...style,
display: loading ? "none" : (style?.display ?? "initial"),

View File

@@ -0,0 +1,19 @@
import { Trans } from "@lingui/react/macro"
import { Checkbox, type CheckboxProps } from "@mantine/core"
import type { ReactNode } from "react"
import { useAppSelector } from "@/app/store"
export const ReceivePushNotificationsChechbox = (props: CheckboxProps) => {
const pushNotificationsEnabled = useAppSelector(state => state.server.serverInfos?.pushNotificationsEnabled)
const pushNotificationsConfigured = useAppSelector(state => !!state.user.settings?.pushNotificationSettings.type)
const disabled = !pushNotificationsEnabled || !pushNotificationsConfigured
let description: ReactNode = ""
if (!pushNotificationsEnabled) {
description = <Trans>Push notifications are not enabled on this CommaFeed instance.</Trans>
} else if (!pushNotificationsConfigured) {
description = <Trans>Push notifications are not configured in your user settings.</Trans>
}
return <Checkbox label={<Trans>Receive push notifications</Trans>} disabled={disabled} description={description} {...props} />
}

View File

@@ -7,11 +7,11 @@ const init = async () => {
async getWorker(_, label) {
let worker: typeof import("*?worker")
if (label === "css") {
worker = await import("monaco-editor/esm/vs/language/css/css.worker?worker")
worker = await import("monaco-editor/language/css/css.worker?worker")
} else if (label === "javascript") {
worker = await import("monaco-editor/esm/vs/language/typescript/ts.worker?worker")
worker = await import("monaco-editor/language/typescript/ts.worker?worker")
} else {
worker = await import("monaco-editor/esm/vs/editor/editor.worker?worker")
worker = await import("monaco-editor/editor/editor.worker?worker")
}
return new worker.default()
},

View File

@@ -145,6 +145,7 @@ export function FeedEntry(props: Readonly<FeedEntryProps>) {
component="article"
id={Constants.dom.entryId(props.entry)}
data-id={props.entry.id}
data-feed-id={props.entry.feedId}
withBorder
radius={borderRadius}
className={cx(classes.paper, {

View File

@@ -61,19 +61,21 @@ export function FeedEntryContextMenu(props: Readonly<FeedEntryContextMenuProps>)
<Separator />
<Item onClick={async () => await dispatch(starEntry({ entry: props.entry, starred: !props.entry.starred }))}>
<Group>
{props.entry.starred ? <TbStarOff size={iconSize} /> : <TbStar size={iconSize} />}
{props.entry.starred ? <Trans>Unstar</Trans> : <Trans>Star</Trans>}
</Group>
</Item>
{props.entry.markable && (
<Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}>
<Group>
{props.entry.read ? <TbMail size={iconSize} /> : <TbMailOpened size={iconSize} />}
{props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>}
</Group>
</Item>
<>
<Item onClick={async () => await dispatch(starEntry({ entry: props.entry, starred: !props.entry.starred }))}>
<Group>
{props.entry.starred ? <TbStarOff size={iconSize} /> : <TbStar size={iconSize} />}
{props.entry.starred ? <Trans>Unstar</Trans> : <Trans>Star</Trans>}
</Group>
</Item>
<Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}>
<Group>
{props.entry.read ? <TbMail size={iconSize} /> : <TbMailOpened size={iconSize} />}
{props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>}
</Group>
</Item>
</>
)}
<Item onClick={async () => await dispatch(markEntriesUpToEntry(props.entry))}>
<Group>

View File

@@ -1,3 +1,5 @@
import { useTimeout } from "@mantine/hooks"
import { useState } from "react"
import { ImageWithPlaceholderWhileLoading } from "@/components/ImageWithPlaceholderWhileLoading"
export interface FeedFaviconProps {
@@ -6,9 +8,23 @@ export interface FeedFaviconProps {
}
export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) {
// the backend always returns a favicon except when the feed has never been fetched
// this can happen when the user subscribes to a feed, the feed is added to the tree but the feed has not been fetched yet
// in this case we retry every second up to 3 times until the feed is fetched and the favicon is available
const [timestamp, setTimestamp] = useState(0)
const [retryCount, setRetryCount] = useState(0)
const { start: retry } = useTimeout(() => setTimestamp(Date.now()), 1000)
const urlWithTimestamp = url + (timestamp === 0 ? "" : `?t=${timestamp}`)
const handleError = () => {
if (retryCount < 3) {
setRetryCount(c => c + 1)
retry()
}
}
return (
<ImageWithPlaceholderWhileLoading
src={url}
src={urlWithTimestamp}
alt="feed favicon"
width={size}
height={size}
@@ -16,6 +32,7 @@ export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) {
placeholderHeight={size}
placeholderBackgroundColor="inherit"
placeholderIconSize={size}
onError={handleError}
/>
)
}

View File

@@ -1,7 +1,6 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Select, type SelectProps } from "@mantine/core"
import type { ComboboxItem } from "@mantine/core/lib/components/Combobox/Combobox.types"
import { type ComboboxItem, Select, type SelectProps } from "@mantine/core"
import { Constants } from "@/app/constants"
import { useAppSelector } from "@/app/store"
import type { Category } from "@/app/types"

View File

@@ -0,0 +1,118 @@
import { Stack } from "@mantine/core"
import { MantineValueSelector, QueryBuilderMantine } from "@react-querybuilder/mantine"
import {
type CombinatorSelectorProps,
defaultOperators,
defaultRuleProcessorCEL,
type Field,
type FormatQueryOptions,
formatQuery,
QueryBuilder,
type RuleGroupType,
} from "react-querybuilder"
import { isCELIdentifier, isCELMember, isCELStringLiteral, parseCEL } from "react-querybuilder/parseCEL"
import "react-querybuilder/dist/query-builder.css"
const fields: Field[] = [
{ name: "title", label: "Title" },
{ name: "content", label: "Content" },
{ name: "url", label: "URL" },
{ name: "author", label: "Author" },
{ name: "categories", label: "Categories" },
{ name: "titleLower", label: "Title (lower case)" },
{ name: "contentLower", label: "Content (lower case)" },
{ name: "urlLower", label: "URL (lower case)" },
{ name: "authorLower", label: "Author (lower case)" },
{ name: "categoriesLower", label: "Categories (lower case)" },
]
const textOperators = new Set(["=", "!=", "contains", "beginsWith", "endsWith", "doesNotContain", "doesNotBeginWith", "doesNotEndWith"])
function toCelString(query: RuleGroupType): string {
if (query.rules.length === 0) {
return ""
}
const celFormatOptions: FormatQueryOptions = {
format: "cel",
ruleProcessor: (rule, options, meta) => {
if (rule.operator === "matches") {
const escapedValue = String(rule.value).replaceAll("\\", "\\\\").replaceAll('"', String.raw`\"`)
return `${rule.field}.matches("${escapedValue}")`
}
return defaultRuleProcessorCEL(rule, options, meta)
},
}
return formatQuery(query, celFormatOptions)
}
function fromCelString(celString: string): RuleGroupType {
return parseCEL(celString ?? "", {
customExpressionHandler: expr => {
if (
isCELMember(expr) &&
expr.right?.value === "matches" &&
expr.left &&
isCELIdentifier(expr.left) &&
expr.list &&
isCELStringLiteral(expr.list.value[0])
) {
return {
field: expr.left.value,
operator: "matches",
value: JSON.parse(expr.list.value[0].value),
}
}
return null
},
})
}
const getOperators = () => {
const filteredDefault = defaultOperators.filter(op => textOperators.has(op.name))
return [
...filteredDefault,
{
name: "matches",
label: "matches pattern",
},
]
}
function CombinatorSelector(props: Readonly<CombinatorSelectorProps>) {
if (props.rules.length === 0) {
return null
}
return <MantineValueSelector {...props} />
}
interface FilteringExpressionEditorProps {
initialValue: string | undefined
onChange: (value: string) => void
}
export function FilteringExpressionEditor({ initialValue, onChange }: Readonly<FilteringExpressionEditorProps>) {
const handleQueryChange = (newQuery: RuleGroupType) => {
onChange(toCelString(newQuery))
}
return (
<Stack gap="sm">
<QueryBuilderMantine>
<QueryBuilder
fields={fields}
defaultQuery={fromCelString(initialValue ?? "")}
onQueryChange={handleQueryChange}
getOperators={getOperators}
addRuleToNewGroups
resetOnFieldChange={false}
controlClassnames={{ queryBuilder: "queryBuilder-branches" }}
controlElements={{ combinatorSelector: CombinatorSelector }}
/>
</QueryBuilderMantine>
</Stack>
)
}

View File

@@ -1,20 +1,30 @@
import { Highlight } from "@mantine/core"
import { useAppSelector } from "@/app/store"
import type { Entry } from "@/app/types"
import { tss } from "@/tss"
export interface FeedEntryTitleProps {
entry: Entry
}
const useStyles = tss.create(() => ({
content: {
textWrap: "inherit",
},
}))
export function FeedEntryTitle(props: Readonly<FeedEntryTitleProps>) {
const search = useAppSelector(state => state.entries.search)
const keywords = search?.split(" ")
const { classes } = useStyles()
return (
<Highlight
inherit
highlight={keywords ?? ""}
// make sure ellipsis is shown when title is too long
span
className={classes.content}
>
{props.entry.title}
</Highlight>

View File

@@ -19,7 +19,7 @@ import {
} from "react-icons/tb"
import { markAllAsReadWithConfirmationIfRequired, reloadEntries, search, selectNextEntry, selectPreviousEntry } from "@/app/entries/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import { changeReadingMode, changeReadingOrder } from "@/app/user/thunks"
import { changeSettings } from "@/app/user/thunks"
import { ActionButton } from "@/components/ActionButton"
import { Loader } from "@/components/Loader"
import { useActionButton } from "@/hooks/useActionButton"
@@ -63,11 +63,7 @@ export function Header() {
const dispatch = useAppDispatch()
const { _ } = useLingui()
const searchForm = useForm<{ search: string }>({
validate: {
search: value => (value.length > 0 && value.length < 3 ? _(msg`Search requires at least 3 characters`) : null),
},
})
const searchForm = useForm<{ search: string }>()
const { setValues } = searchForm
useEffect(() => {
@@ -77,6 +73,25 @@ export function Header() {
}, [setValues, searchFromStore])
if (!settings) return <Loader />
const toggleReadingMode = async () => {
await dispatch(
changeSettings({
readingMode: settings.readingMode === "all" ? "unread" : "all",
})
)
dispatch(reloadEntries())
}
const toggleReadingOrder = async () => {
await dispatch(
changeSettings({
readingOrder: settings.readingOrder === "asc" ? "desc" : "asc",
})
)
dispatch(reloadEntries())
}
return (
<Center className="cf-toolbar-wrapper">
<HeaderToolbar>
@@ -125,12 +140,12 @@ export function Header() {
<ActionButton
icon={settings.readingMode === "all" ? <TbEye size={iconSize} /> : <TbEyeOff size={iconSize} />}
label={settings.readingMode === "all" ? msg`All` : msg`Unread`}
onClick={async () => await dispatch(changeReadingMode(settings.readingMode === "all" ? "unread" : "all"))}
onClick={toggleReadingMode}
/>
<ActionButton
icon={settings.readingOrder === "asc" ? <TbSortAscending size={iconSize} /> : <TbSortDescending size={iconSize} />}
label={settings.readingOrder === "asc" ? msg`Asc` : msg`Desc`}
onClick={async () => await dispatch(changeReadingOrder(settings.readingOrder === "asc" ? "desc" : "asc"))}
onClick={toggleReadingOrder}
/>
<Popover>

View File

@@ -12,7 +12,7 @@ import {
} from "@mantine/core"
import { showNotification } from "@mantine/notifications"
import dayjs from "dayjs"
import { type ReactNode, useState } from "react"
import { type ReactNode, useEffect, useState } from "react"
import {
TbChartLine,
TbHeartFilled,
@@ -29,6 +29,7 @@ import {
TbUsers,
TbWorldDownload,
} from "react-icons/tb"
import { throttle } from "throttle-debounce"
import { client } from "@/app/client"
import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
@@ -96,6 +97,14 @@ const viewModeData: ViewModeControlItem[] = [
export function ProfileMenu(props: Readonly<ProfileMenuProps>) {
const [opened, setOpened] = useState(false)
// close profile menu on scroll
useEffect(() => {
const listener = throttle(100, () => setOpened(false))
window.addEventListener("scroll", listener)
return () => window.removeEventListener("scroll", listener)
}, [])
const now = useNow()
const profile = useAppSelector(state => state.user.profile)
const admin = useAppSelector(state => state.user.profile?.admin)
@@ -115,7 +124,7 @@ export function ProfileMenu(props: Readonly<ProfileMenuProps>) {
}
return (
<Menu position="bottom-end" closeOnItemClick={false} opened={opened} onChange={setOpened}>
<Menu position="bottom-end" closeOnItemClick={false} opened={opened} onChange={setOpened} preventPositionChangeWhenVisible={false}>
<Menu.Target>{props.control}</Menu.Target>
<Menu.Dropdown>
{profile && <Menu.Label>{profile.name}</Menu.Label>}

View File

@@ -1,49 +1,29 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Box, Divider, Group, NumberInput, Radio, Select, type SelectProps, SimpleGrid, Stack, Switch } from "@mantine/core"
import type { ComboboxData } from "@mantine/core/lib/components/Combobox/Combobox.types"
import {
Box,
type ComboboxData,
Divider,
Group,
Loader,
NumberInput,
Radio,
Select,
type SelectProps,
SimpleGrid,
Stack,
Switch,
} from "@mantine/core"
import type { ReactNode } from "react"
import { Constants } from "@/app/constants"
import { useAppDispatch, useAppSelector } from "@/app/store"
import type { IconDisplayMode, ScrollMode, SharingSettings } from "@/app/types"
import {
changeCustomContextMenu,
changeEntriesToKeepOnTopWhenScrolling,
changeExternalLinkIconDisplayMode,
changeLanguage,
changeMarkAllAsReadConfirmation,
changeMarkAllAsReadNavigateToUnread,
changeMobileFooter,
changePrimaryColor,
changeScrollMarks,
changeScrollMode,
changeScrollSpeed,
changeSharingSetting,
changeShowRead,
changeStarIconDisplayMode,
changeUnreadCountFavicon,
changeUnreadCountTitle,
} from "@/app/user/thunks"
import { changeSettings } from "@/app/user/thunks"
import { locales } from "@/i18n"
export function DisplaySettings() {
const language = useAppSelector(state => state.user.settings?.language)
const scrollSpeed = useAppSelector(state => state.user.settings?.scrollSpeed)
const showRead = useAppSelector(state => state.user.settings?.showRead)
const scrollMarks = useAppSelector(state => state.user.settings?.scrollMarks)
const scrollMode = useAppSelector(state => state.user.settings?.scrollMode)
const entriesToKeepOnTop = useAppSelector(state => state.user.settings?.entriesToKeepOnTopWhenScrolling)
const starIconDisplayMode = useAppSelector(state => state.user.settings?.starIconDisplayMode)
const externalLinkIconDisplayMode = useAppSelector(state => state.user.settings?.externalLinkIconDisplayMode)
const markAllAsReadConfirmation = useAppSelector(state => state.user.settings?.markAllAsReadConfirmation)
const markAllAsReadNavigateToNextUnread = useAppSelector(state => state.user.settings?.markAllAsReadNavigateToNextUnread)
const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu)
const mobileFooter = useAppSelector(state => state.user.settings?.mobileFooter)
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
const primaryColor = useAppSelector(state => state.user.settings?.primaryColor) || Constants.theme.defaultPrimaryColor
const settings = useAppSelector(state => state.user.settings)
const { _ } = useLingui()
const dispatch = useAppDispatch()
@@ -95,94 +75,66 @@ export function DisplaySettings() {
</Group>
)
if (!settings) return <Loader />
return (
<Stack>
<Divider label={<Trans>Display</Trans>} labelPosition="center" />
<Select
label={<Trans>Language</Trans>}
value={language}
value={settings.language}
data={locales.map(l => ({
value: l.key,
label: l.label,
}))}
onChange={async s => await (s && dispatch(changeLanguage(s)))}
onChange={language => language && dispatch(changeSettings({ language }))}
/>
<Select
label={<Trans>Primary color</Trans>}
data={colorData}
value={primaryColor}
onChange={async value => value && (await dispatch(changePrimaryColor(value)))}
value={settings.primaryColor}
onChange={primaryColor => primaryColor && dispatch(changeSettings({ primaryColor }))}
renderOption={colorRenderer}
/>
<Switch
label={<Trans>Show feeds and categories with no unread entries</Trans>}
checked={showRead}
onChange={async e => await dispatch(changeShowRead(e.currentTarget.checked))}
checked={settings.showRead}
onChange={e => dispatch(changeSettings({ showRead: e.currentTarget.checked }))}
/>
<Switch
label={<Trans>Show confirmation when marking all entries as read</Trans>}
checked={markAllAsReadConfirmation}
onChange={async e => await dispatch(changeMarkAllAsReadConfirmation(e.currentTarget.checked))}
checked={settings.markAllAsReadConfirmation}
onChange={e => dispatch(changeSettings({ markAllAsReadConfirmation: e.currentTarget.checked }))}
/>
<Switch
label={<Trans>Navigate to the next category/feed with unread entries when marking all entries as read</Trans>}
checked={markAllAsReadNavigateToNextUnread}
onChange={async e => await dispatch(changeMarkAllAsReadNavigateToUnread(e.currentTarget.checked))}
checked={settings.markAllAsReadNavigateToNextUnread}
onChange={e => dispatch(changeSettings({ markAllAsReadNavigateToNextUnread: e.currentTarget.checked }))}
/>
<Switch
label={<Trans>On mobile, show action buttons at the bottom of the screen</Trans>}
checked={mobileFooter}
onChange={async e => await dispatch(changeMobileFooter(e.currentTarget.checked))}
/>
<Divider label={<Trans>Browser tab</Trans>} labelPosition="center" />
<Switch
label={<Trans>Show unread count in tab title</Trans>}
checked={unreadCountTitle}
onChange={async e => await dispatch(changeUnreadCountTitle(e.currentTarget.checked))}
/>
<Switch
label={<Trans>Show unread count in tab favicon</Trans>}
checked={unreadCountFavicon}
onChange={async e => await dispatch(changeUnreadCountFavicon(e.currentTarget.checked))}
/>
<Divider label={<Trans>Entry headers</Trans>} labelPosition="center" />
<Select
label={<Trans>Show star icon</Trans>}
value={starIconDisplayMode}
data={displayModeData}
onChange={async s => await dispatch(changeStarIconDisplayMode(s as IconDisplayMode))}
/>
<Select
label={<Trans>Show external link icon</Trans>}
value={externalLinkIconDisplayMode}
data={displayModeData}
onChange={async s => await dispatch(changeExternalLinkIconDisplayMode(s as IconDisplayMode))}
/>
<Switch
label={<Trans>Show CommaFeed's own context menu on right click</Trans>}
checked={customContextMenu}
onChange={async e => await dispatch(changeCustomContextMenu(e.currentTarget.checked))}
checked={settings.mobileFooter}
onChange={e => dispatch(changeSettings({ mobileFooter: e.currentTarget.checked }))}
/>
<Divider label={<Trans>Scrolling</Trans>} labelPosition="center" />
<Switch
label={<Trans>Disable "Pull to refresh" browser behavior</Trans>}
description={<Trans>This setting can cause scrolling issues on some browsers (e.g. Safari)</Trans>}
checked={settings.disablePullToRefresh}
onChange={e => dispatch(changeSettings({ disablePullToRefresh: e.currentTarget.checked }))}
/>
<Radio.Group
label={<Trans>Scroll selected entry to the top of the page</Trans>}
value={scrollMode}
onChange={async value => await dispatch(changeScrollMode(value as ScrollMode))}
value={settings.scrollMode}
onChange={value => dispatch(changeSettings({ scrollMode: value }))}
>
<Group mt="xs">
{Object.entries(scrollModeOptions).map(e => (
@@ -195,20 +147,56 @@ export function DisplaySettings() {
label={<Trans>Entries to keep above the selected entry when scrolling</Trans>}
description={<Trans>Only applies to compact, cozy and detailed modes</Trans>}
min={0}
value={entriesToKeepOnTop}
onChange={async value => await dispatch(changeEntriesToKeepOnTopWhenScrolling(+value))}
value={settings.entriesToKeepOnTopWhenScrolling}
onChange={value => dispatch(changeSettings({ entriesToKeepOnTopWhenScrolling: +value }))}
/>
<Switch
label={<Trans>Scroll smoothly when navigating between entries</Trans>}
checked={scrollSpeed ? scrollSpeed > 0 : false}
onChange={async e => await dispatch(changeScrollSpeed(e.currentTarget.checked))}
checked={settings.scrollSpeed ? settings.scrollSpeed > 0 : false}
onChange={e => dispatch(changeSettings({ scrollSpeed: e.currentTarget.checked ? 400 : 0 }))}
/>
<Switch
label={<Trans>In expanded view, scrolling through entries mark them as read</Trans>}
checked={scrollMarks}
onChange={async e => await dispatch(changeScrollMarks(e.currentTarget.checked))}
checked={settings.scrollMarks}
onChange={e => dispatch(changeSettings({ scrollMarks: e.currentTarget.checked }))}
/>
<Divider label={<Trans>Browser tab</Trans>} labelPosition="center" />
<Switch
label={<Trans>Show unread count in tab title</Trans>}
checked={settings.unreadCountTitle}
onChange={e => dispatch(changeSettings({ unreadCountTitle: e.currentTarget.checked }))}
/>
<Switch
label={<Trans>Show unread count in tab favicon</Trans>}
checked={settings.unreadCountFavicon}
onChange={e => dispatch(changeSettings({ unreadCountFavicon: e.currentTarget.checked }))}
/>
<Divider label={<Trans>Entry headers</Trans>} labelPosition="center" />
<Select
label={<Trans>Show star icon</Trans>}
value={settings.starIconDisplayMode}
data={displayModeData}
onChange={value => dispatch(changeSettings({ starIconDisplayMode: value as IconDisplayMode }))}
/>
<Select
label={<Trans>Show external link icon</Trans>}
value={settings.externalLinkIconDisplayMode}
data={displayModeData}
onChange={value => dispatch(changeSettings({ externalLinkIconDisplayMode: value as IconDisplayMode }))}
/>
<Switch
label={<Trans>Show CommaFeed's own context menu on right click</Trans>}
checked={settings.customContextMenu}
onChange={e => dispatch(changeSettings({ customContextMenu: e.currentTarget.checked }))}
/>
<Divider label={<Trans>Sharing sites</Trans>} labelPosition="center" />
@@ -218,12 +206,14 @@ export function DisplaySettings() {
<Switch
key={site}
label={Constants.sharing[site].label}
checked={sharingSettings?.[site]}
onChange={async e =>
await dispatch(
changeSharingSetting({
site,
value: e.currentTarget.checked,
checked={settings.sharingSettings[site]}
onChange={e =>
dispatch(
changeSettings({
sharingSettings: {
...settings.sharingSettings,
[site]: e.currentTarget.checked,
},
})
)
}

View File

@@ -1,4 +1,3 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core"
@@ -13,6 +12,7 @@ import { useAppDispatch, useAppSelector } from "@/app/store"
import type { ProfileModificationRequest } from "@/app/types"
import { reloadProfile } from "@/app/user/thunks"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
interface FormData extends ProfileModificationRequest {
newPasswordConfirmation?: string
@@ -20,13 +20,17 @@ interface FormData extends ProfileModificationRequest {
export function ProfileSettings() {
const profile = useAppSelector(state => state.user.profile)
const serverInfos = useAppSelector(state => state.server.serverInfos)
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<FormData>({
validate: {
newPasswordConfirmation: (value, values) => (value !== values.newPassword ? _(msg`Passwords do not match`) : null),
newPassword: validationRules.password,
newPasswordConfirmation: (value, values) => validationRules.passwordConfirmation(value, values.newPassword),
},
validateInputOnChange: true,
})
const { setValues } = form
@@ -87,8 +91,8 @@ export function ProfileSettings() {
label={<Trans>API key</Trans>}
description={
<Trans>
This is your API key. It can be used for some read-only API operations and grants access to the Fever API.
Use the form at the bottom of the page to generate a new API key
This is your API key. It can be used for some read-only API operations and grants access to the Fever API
and the Google Reader API. Use the form at the bottom of the page to generate a new API key
</Trans>
}
readOnly
@@ -126,6 +130,22 @@ export function ProfileSettings() {
</Box>
</Input.Wrapper>
<Input.Wrapper
label={<Trans>Google Reader API</Trans>}
description={
<Trans>
CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible
mobile client. Login with your username and your <u>API key</u>.
</Trans>
}
>
<Box>
<Anchor href="rest/googlereader" target="_blank">
<Trans>Google Reader API URL</Trans>
</Anchor>
</Box>
</Input.Wrapper>
<Divider />
<PasswordInput
@@ -134,7 +154,12 @@ export function ProfileSettings() {
required
{...form.getInputProps("currentPassword")}
/>
<TextInput type="email" label={<Trans>E-mail</Trans>} {...form.getInputProps("email")} required />
<TextInput
type="email"
label={<Trans>E-mail</Trans>}
{...form.getInputProps("email")}
required={serverInfos?.emailAddressRequired}
/>
<PasswordInput
label={<Trans>New password</Trans>}
description={<Trans>Changing password will generate a new API key</Trans>}

View File

@@ -0,0 +1,124 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Button, Divider, Group, Select, Stack, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form"
import { useEffect } from "react"
import { useAsyncCallback } from "react-async-hook"
import { TbDeviceFloppy, TbSend } from "react-icons/tb"
import { client, errorToStrings } from "@/app/client"
import { redirectToSelectedSource } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import type { PushNotificationSettings as PushNotificationSettingsModel } from "@/app/types"
import { changeSettings } from "@/app/user/thunks"
import { Alert } from "@/components/Alert"
export function PushNotificationSettings() {
const notificationSettings = useAppSelector(state => state.user.settings?.pushNotificationSettings)
const pushNotificationsEnabled = useAppSelector(state => state.server.serverInfos?.pushNotificationsEnabled)
const { _ } = useLingui()
const dispatch = useAppDispatch()
const form = useForm<PushNotificationSettingsModel>()
useEffect(() => {
if (notificationSettings) form.initialize(notificationSettings)
}, [form.initialize, notificationSettings])
const handleSubmit = (values: PushNotificationSettingsModel) => {
dispatch(changeSettings({ pushNotificationSettings: values }))
}
const sendTestPushNotification = useAsyncCallback(client.user.sendTestPushNotification)
const typeInputProps = form.getInputProps("type")
if (!pushNotificationsEnabled) {
return <Trans>Push notifications are not enabled on this CommaFeed instance.</Trans>
}
return (
<form onSubmit={form.onSubmit(handleSubmit)}>
<Stack>
{sendTestPushNotification.status === "success" && (
<Alert level="success" messages={[_(msg`Test notification sent successfully.`)]} />
)}
{sendTestPushNotification.status === "error" && (
<Alert level="error" messages={errorToStrings(sendTestPushNotification.error)} />
)}
<Select
label={<Trans>Push notification service</Trans>}
description={
<Trans>
Receive push notifications when new feed entries are discovered. Enable "Receive push notifications" in the
settings of each feed for which you want to receive notifications.
</Trans>
}
data={[
{ value: "ntfy", label: "ntfy" },
{ value: "gotify", label: "Gotify" },
{ value: "pushover", label: "Pushover" },
]}
clearable
{...typeInputProps}
onChange={value => {
typeInputProps.onChange(value)
form.setFieldValue("serverUrl", "")
form.setFieldValue("topic", "")
form.setFieldValue("userSecret", "")
form.setFieldValue("userId", "")
}}
/>
{form.values.type === "ntfy" && (
<>
<TextInput
label={<Trans>Server URL</Trans>}
placeholder="https://ntfy.sh"
required
{...form.getInputProps("serverUrl")}
/>
<TextInput label={<Trans>Topic</Trans>} placeholder="commafeed" required {...form.getInputProps("topic")} />
<TextInput label={<Trans>Access token</Trans>} {...form.getInputProps("userSecret")} />
</>
)}
{form.values.type === "gotify" && (
<>
<TextInput
label={<Trans>Server URL</Trans>}
placeholder="https://gotify.example.com"
required
{...form.getInputProps("serverUrl")}
/>
<TextInput label={<Trans>App token</Trans>} required {...form.getInputProps("userSecret")} />
</>
)}
{form.values.type === "pushover" && (
<>
<TextInput label={<Trans>User key</Trans>} required {...form.getInputProps("userId")} />
<TextInput label={<Trans>API token</Trans>} required {...form.getInputProps("userSecret")} />
</>
)}
<Group>
<Button variant="default" onClick={async () => await dispatch(redirectToSelectedSource())}>
<Trans>Cancel</Trans>
</Button>
<Button type="submit" leftSection={<TbDeviceFloppy size={16} />}>
<Trans>Save</Trans>
</Button>
<Divider orientation="vertical" />
<Button
variant="outline"
leftSection={<TbSend size={16} />}
onClick={() => sendTestPushNotification.execute(form.values)}
loading={sendTestPushNotification.loading}
>
<Trans>Test</Trans>
</Button>
</Group>
</Stack>
</form>
)
}

View File

@@ -95,6 +95,7 @@ export function Tree() {
expanded={false}
level={0}
hasError={false}
hasWarning={false}
onClick={categoryClicked}
/>
)
@@ -110,6 +111,7 @@ export function Tree() {
expanded={false}
level={0}
hasError={false}
hasWarning={false}
onClick={categoryClicked}
/>
)
@@ -118,6 +120,7 @@ export function Tree() {
if (!isCategoryDisplayed(category)) return null
const hasError = !category.expanded && flattenCategoryTree(category).some(c => c.feeds.some(f => f.errorCount > errorThreshold))
const hasWarning = !category.expanded && flattenCategoryTree(category).some(c => c.feeds.some(f => !!f.filterLegacy))
return (
<TreeNode
id={category.id}
@@ -130,6 +133,7 @@ export function Tree() {
expanded={category.expanded}
level={level}
hasError={hasError}
hasWarning={hasWarning}
onClick={categoryClicked}
onIconClick={e => categoryIconClicked(e, category)}
key={category.id}
@@ -151,6 +155,7 @@ export function Tree() {
selected={source.type === "feed" && source.id === String(feed.id)}
level={level}
hasError={feed.errorCount > errorThreshold}
hasWarning={!!feed.filterLegacy}
onClick={feedClicked}
key={feed.id}
/>
@@ -168,6 +173,7 @@ export function Tree() {
selected={source.type === "tag" && source.id === tag}
level={0}
hasError={false}
hasWarning={false}
onClick={tagClicked}
key={tag}
/>

View File

@@ -15,6 +15,7 @@ interface TreeNodeProps {
expanded?: boolean
level: number
hasError: boolean
hasWarning: boolean
hasNewEntries: boolean
onClick: (e: React.MouseEvent, id: string) => void
onIconClick?: (e: React.MouseEvent, id: string) => void
@@ -24,15 +25,18 @@ const useStyles = tss
.withParams<{
selected: boolean
hasError: boolean
hasWarning: boolean
hasUnread: boolean
}>()
.create(({ theme, colorScheme, selected, hasError, hasUnread }) => {
.create(({ theme, colorScheme, selected, hasError, hasWarning, hasUnread }) => {
let backgroundColor = "inherit"
if (selected) backgroundColor = colorScheme === "dark" ? theme.colors.dark[4] : theme.colors.gray[1]
let color: string
if (hasError) {
color = theme.colors.red[6]
} else if (hasWarning) {
color = theme.colors.yellow[6]
} else if (colorScheme === "dark") {
color = hasUnread ? theme.colors.dark[0] : theme.colors.dark[3]
} else {
@@ -63,6 +67,7 @@ export function TreeNode(props: Readonly<TreeNodeProps>) {
const { classes } = useStyles({
selected: props.selected,
hasError: props.hasError,
hasWarning: props.hasWarning,
hasUnread: props.unread > 0,
})
return (

View File

@@ -6,7 +6,11 @@ const useStyles = tss.create(() => ({
badge: {
width: "3.2rem",
// for some reason, mantine Badge has "cursor: 'default'"
cursor: "pointer",
cursor: "inherit",
},
indicator: {
// ensure the indicator is not shown above the app header
zIndex: 0,
},
}))
@@ -23,7 +27,15 @@ export function UnreadCount(
const count = props.unreadCount >= 10000 ? "10k+" : props.unreadCount
return (
<Tooltip label={props.unreadCount} disabled={props.unreadCount === count} openDelay={Constants.tooltip.delay}>
<Indicator disabled={!props.showIndicator} size={4} offset={10} position="middle-start">
<Indicator
disabled={!props.showIndicator}
size={4}
offset={10}
position="middle-start"
classNames={{
indicator: classes.indicator,
}}
>
<Badge className={`${classes.badge} cf-badge`} variant="light" fullWidth>
{count}
</Badge>

3
commafeed-client/src/globals.d.ts vendored Normal file
View File

@@ -0,0 +1,3 @@
// required because of noUncheckedSideEffectImports
// https://www.typescriptlang.org/tsconfig/#noUncheckedSideEffectImports
declare module "@fontsource/open-sans"

View File

@@ -0,0 +1,17 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { useAppSelector } from "@/app/store"
export function useValidationRules() {
const minimumPasswordLength = useAppSelector(state => state.server.serverInfos?.minimumPasswordLength)
const { _ } = useLingui()
return {
password: (value: string | undefined) =>
value && minimumPasswordLength && value.length < minimumPasswordLength
? _(msg`Password must be at least ${minimumPasswordLength} characters`)
: null,
passwordConfirmation: (newPasswordConfirmation: string | undefined, newPassword: string | undefined) =>
newPasswordConfirmation && newPasswordConfirmation !== newPassword ? _(msg`Passwords do not match`) : null,
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed és un projecte de codi obert. El codi font està allotjat a </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>La sintaxi completa està disponible </0><1>aquí</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Teniu un compte?</0><1>Inicieu la sessió!</1>"
@@ -33,18 +29,22 @@ msgstr "<0>Ei,</0><1> sóc la Jérémie de Bèlgica i fa més de 10 anys que tre
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Necessites un compte?</0><1>Registreu-vos!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "Sobre"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Token d'accés"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Accions"
#: src/components/content/add/AddCategory.tsx
msgid "Add"
msgstr "Afegir"
msgstr "Afegeix"
#: src/pages/app/AddPage.tsx
msgid "Add category"
@@ -54,21 +54,24 @@ msgstr "Afegeix categoria"
msgid "Add user"
msgstr "Afegeix usuari"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Administrador"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Nom d'usuari de l'administrador"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Tot"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Sempre"
@@ -83,7 +86,7 @@ msgstr "Un fitxer opml és un fitxer XML que conté URL i categories de canals.
#: src/components/content/add/Subscribe.tsx
msgid "Analyze feed"
msgstr "Analitzar el feed"
msgstr "Analitza el canal"
#: src/components/AnnouncementDialog.tsx
msgid "Announcement"
@@ -91,11 +94,19 @@ msgstr "Anunci"
#: src/components/settings/ProfileSettings.tsx
msgid "API key"
msgstr "clau API"
msgstr "Clau API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "Token d'API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Token d'aplicació"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Estàs segur que vols suprimir la categoria <0>{categoryName}</0>?"
msgstr "Esteu segur que voleu suprimir la categoria <0>{categoryName}</0>?"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Are you sure you want to delete user <0>{userName}</0> ?"
@@ -115,61 +126,63 @@ msgstr "Esteu segur que voleu marcar les entrades més antigues de {threshold} d
#: src/pages/app/FeedDetailsPage.tsx
msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
msgstr "Estàs segur que vols cancel·lar la subscripció a <0>{feedName}</0>?"
msgstr "Esteu segur que voleu cancel·lar la subscripció a <0>{feedName}</0>?"
#: src/components/header/Header.tsx
msgid "Asc"
msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Les variables disponibles són \"títol\", \"contingut\", \"url\" \"autor\" i \"categories\" i el seu contingut es converteix en minúscules per facilitar la comparació de cadenes."
msgid "Auto-mark as read"
msgstr "Marcar com a llegit automàticament"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Enrere"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tornar a iniciar sessió"
msgstr "Torna a iniciar sessió"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr "Blau"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Extensió del navegador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Extensió del navegador necessària per a Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Extensió del navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Pestanya del navegador"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Creeu una expressió de filtratge per indicar què voleu llegir. Les entrades que no coincideixin es marcaran com a llegides automàticament."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Cancel·la"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Categoria"
@@ -197,6 +210,10 @@ msgstr "Versió de l'extensió del navegador CommaFeed {browserExtensionVersion}
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed és compatible amb l'API Fever. Utilitzeu l'URL següent al vostre client mòbil compatible amb Fever. Inicieu sessió amb el vostre nom d'usuari i la vostra <0>clau API</0>."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed és compatible amb l'API de Google Reader. Utilitzeu l'URL següent al vostre client mòbil compatible amb Google Reader. Inicieu sessió amb el vostre nom d'usuari i la vostra <0>clau API</0>."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed següent element no llegit"
@@ -209,11 +226,11 @@ msgstr "CommaFeed versió {version} ({version})."
msgid "Compact"
msgstr "Compacte"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Confirma"
@@ -221,10 +238,18 @@ msgstr "Confirma"
msgid "Confirm password"
msgstr "Confirmeu la contrasenya"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirma la contrasenya"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acollidor"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Crea un compte d'administrador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -249,8 +274,8 @@ msgstr "Codi JS personalitzat que s'executarà en carregar la pàgina"
msgid "Cyan"
msgstr "Cian"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Fosc"
@@ -258,11 +283,14 @@ msgstr "Fosc"
msgid "Date created"
msgstr "Data de creació"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "dies"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Eliminar"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Suprimeix el compte"
@@ -283,14 +311,18 @@ msgstr "Desc"
msgid "Detailed"
msgstr "Detallat"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Desactiva el comportament \"Arrossega per actualitzar\"\\ del navegador"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Mostra"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Donar"
@@ -302,15 +334,14 @@ msgstr "Descarrega"
msgid "Drag link to bookmark bar"
msgstr "Arrossegueu l'enllaç a la barra d'adreces d'interès"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "Correu electrònic"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "Adreça de correu electrònic"
@@ -319,10 +350,10 @@ msgstr "Adreça de correu electrònic"
msgid "Edit user"
msgstr "Edita l'usuari"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "activat"
msgstr "Activat"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Enter"
@@ -344,10 +375,6 @@ msgstr "Encapçalaments d'entrada"
msgid "Error"
msgstr "Error"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Exemple: {exemple}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Ampliat"
@@ -356,8 +383,8 @@ msgstr "Ampliat"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "exporteu les vostres subscripcions i categories com a fitxer OPML que es pot importar a altres serveis de lectura de feeds"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Opcions de l'extensió"
@@ -365,9 +392,8 @@ msgstr "Opcions de l'extensió"
msgid "Feed name"
msgstr "Nom del canal"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "URL del canal"
@@ -399,9 +425,9 @@ msgstr "La recuperació forçada de feeds encara no està disponible."
msgid "Forgot password?"
msgstr "Heu oblidat la contrasenya?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "primer genereu una clau API al vostre perfil."
@@ -409,9 +435,9 @@ msgstr "primer genereu una clau API al vostre perfil."
msgid "Generate new API key"
msgstr "Genera una nova clau d'API"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "URL del feed generat"
@@ -430,7 +456,15 @@ msgstr "Vés a la documentació de l'API."
#: src/pages/app/AboutPage.tsx
msgid "Goodies"
msgstr "Bones"
msgstr "Extres"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
@@ -448,10 +482,6 @@ msgstr "Verd"
msgid "Id"
msgstr "Id"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Si no està buida, una expressió que s'avalua com a \"vertader\" o \"fals\". "
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "Si l'entrada no encaixa del tot a la pantalla"
@@ -472,13 +502,21 @@ msgstr "En la vista ampliada, en desplaçar-se per les entrades, es marquen com
msgid "Indigo"
msgstr "Indi"
#: src/components/content/FeedEntryFooter.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Configuració inicial"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "L'enllaç de restabliment de la contrasenya no és vàlid. Sol·liciteu-ne un de nou."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Mantenir sense llegir"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Dreceres de teclat"
@@ -506,9 +544,9 @@ msgstr "Clar"
msgid "Lime"
msgstr "Llima"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Enllaç"
@@ -532,9 +570,8 @@ msgstr "S'estan carregant les subscripcions..."
msgid "Loading tags..."
msgstr "Carregant les etiquetes..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Inicia sessió"
@@ -546,8 +583,8 @@ msgstr "Tanca sessió"
msgid "Long press"
msgstr "Prem llargament la tecla"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Gestionar usuaris"
@@ -555,21 +592,25 @@ msgstr "Gestionar usuaris"
msgid "Mark all as read"
msgstr "Marca-ho tot com a llegit"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Marqueu totes les entrades com a llegides"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Marca com a llegit"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Marca com a llegit fins aquí"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Marca les entrades d'aquest feed com a llegides després d'aquest nombre de dies. Deixeu-ho buit per desactivar-lo."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "mètriques"
@@ -586,15 +627,15 @@ msgstr "Mou la pàgina cap avall"
msgid "Move the page up"
msgstr "Mou la pàgina cap amunt"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "No es coneix"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Nom"
@@ -606,7 +647,6 @@ msgstr "Navegueu a una subscripció introduint-ne el nom"
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr "Navega a la següent categoria/canal amb entrades no llegides quan es marquen totes les entrades com a llegides"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Mai"
@@ -615,12 +655,16 @@ msgstr "Mai"
msgid "New password"
msgstr "Contrasenya nova"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Contrasenya nova"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "El més nou primer"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Següent"
@@ -650,7 +694,7 @@ msgstr "el més vell primer"
#: src/components/settings/DisplaySettings.tsx
msgid "On desktop"
msgstr "A l'scriptori"
msgstr "A l'escriptori"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "Exportació OPML"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "Fitxer OPML"
@@ -742,19 +785,22 @@ msgstr "pares"
msgid "Parent Category"
msgstr "Categoria pare"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Contrasenya"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "La contrasenya ha de tenir almenys {minimumPasswordLength} caràcters"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperació de contrasenya"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Les contrasenyes no coincideixen"
@@ -762,8 +808,8 @@ msgstr "Les contrasenyes no coincideixen"
msgid "Pink"
msgstr "Rosa"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Posició"
@@ -779,6 +825,31 @@ msgstr "Color primari"
msgid "Profile"
msgstr "Perfil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Servei de notificacions push"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Notificacions push"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Les notificacions push no estan configurades a la vostra configuració d'usuari."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Les notificacions push no estan activades en aquesta instància de CommaFeed."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Rep notificacions push"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Rebre notificacions push quan es descobreixin noves entrades de feed. Activeu \"Rep notificacions push\" a la configuració de cada feed per al qual vulgueu rebre notificacions."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Recuperar la contrasenya"
@@ -787,8 +858,8 @@ msgstr "Recuperar la contrasenya"
msgid "Red"
msgstr "Vermell"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Actualitzar"
@@ -796,20 +867,24 @@ msgstr "Actualitzar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Els registres estan tancats en aquesta instància de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Restableix la contrasenya"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Clic dret"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Desa"
@@ -825,17 +900,11 @@ msgstr "Desplaceu-vos suaument quan navegueu entre entrades"
msgid "Scrolling"
msgstr "Desplaçament"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Cerca"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "La cerca requereix almenys 3 caràcters"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr "Selecciona el següent canal/categoria no llegit"
@@ -844,6 +913,10 @@ msgstr "Selecciona el següent canal/categoria no llegit"
msgid "Select previous unread feed/category"
msgstr "Selecciona el canal/categoria anterior sense llegir"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "URL del servidor"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
msgstr "Posa el focus a la següent entrada sense obrir-la"
@@ -868,8 +941,6 @@ msgstr "Comparteix"
msgid "Sharing sites"
msgstr "Compartir a altres llocs web"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "canvi"
@@ -918,9 +989,8 @@ msgstr "Mostra el recompte de no llegits a la icona de favorits de la pestanya"
msgid "Show unread count in tab title"
msgstr "Mostra el recompte de no llegits al títol de la pestanya"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Registra't"
@@ -928,26 +998,24 @@ msgstr "Registra't"
msgid "Something bad just happened..."
msgstr "Acaba de passar una cosa dolenta..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Espai"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Estrella"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Estrellat"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Subscriu-te"
@@ -979,7 +1047,6 @@ msgstr "Canvia al tema clar"
msgid "System"
msgstr "Sistema"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Etiquetes"
@@ -988,6 +1055,14 @@ msgstr "Etiquetes"
msgid "Teal"
msgstr "Blau verdós"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Prova"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "La notificació de prova s'ha enviat correctament."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "l'URL del canal al qual us voleu subscriure. "
@@ -996,9 +1071,18 @@ msgstr "l'URL del canal al qual us voleu subscriure. "
msgid "Theme"
msgstr "Tema"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Aquest feed té un filtre heretat que no es pot editar i no s'aplica. Torneu a crear el filtre amb el nou editor d'expressions. L'expressió del filtre heretat era: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Aquesta és la vostra clau de l'API. Es pot utilitzar per a algunes operacions de l'API de només lectura i permet accedir a l'API Fever. Utilitzeu el formulari de la part inferior de la pàgina per generar una nova clau d'API."
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Aquesta és la vostra clau API. Es pot utilitzar per a algunes operacions de l'API de només lectura i dona accés a l'API Fever i a l'API de Google Reader. Utilitzeu el formulari a la part inferior de la pàgina per generar una nova clau API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Aquesta configuració pot causar problemes de desplaçament en alguns navegadors (per exemple, Safari)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Canvia la barra lateral"
msgid "Toggle starred status of current entry"
msgstr "Commuta l'estat destacat de l'entrada actual"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Tema"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Proveu CommaFeed amb el compte de demostració: demo/demo"
@@ -1024,22 +1112,24 @@ msgstr "Prova la demostració!"
msgid "Unread"
msgstr "Sense llegir"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Desestrellar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Donar-se de baixa"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Clau d'usuari"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom d'usuari"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Nom d'usuari o correu electrònic"
@@ -1056,6 +1146,10 @@ msgstr "Avís"
msgid "Website"
msgstr "Lloc web"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Benvingut! Sembla que aquesta és la primera vegada que executeu CommaFeed. Creeu un compte d'administrador per començar."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Groc"
@@ -1067,3 +1161,7 @@ msgstr "Encara no teniu cap subscripció. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Els vostres feeds s'han posat a la cua per actualitzar-los."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "La vostra contrasenya s'ha canviat. Ara podeu iniciar la sessió amb la vostra nova contrasenya."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed ist ein Open Source Projekt. Der Quellcode wird auf auf </0><1>GitHub</1> gehostet."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>Die vollständige Syntax ist </0><1>hier</1> verfügbar<2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Haben Sie ein Konto?</0><1>Melden Sie sich an!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Hey,</0><1>Ich bin Jérémie aus Belgien und arbeite seit über 10 Ja
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Benötigen Sie ein Konto?</0><1>Hier geht's zur Registrierung!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "Über"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Zugriffstoken"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Aktionen"
@@ -54,21 +54,24 @@ msgstr "Kategorie hinzufügen"
msgid "Add user"
msgstr "Benutzer hinzufügen"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Verwaltung"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Administrator-Benutzername"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Alle"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Immer"
@@ -93,6 +96,14 @@ msgstr "Ankündigung"
msgid "API key"
msgstr "API-Schlüssel"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "API-Token"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "App-Token"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Sind Sie sicher, dass Sie die Kategorie <0>{categoryName}</0> löschen möchten?"
@@ -122,54 +133,56 @@ msgid "Asc"
msgstr "Aufsteigend"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Verfügbare Variablen sind „Titel“, „Inhalt“, „URL“, „Autor“ und „Kategorien“, und ihr Inhalt wird in Kleinbuchstaben umgewandelt, um den String-Vergleich zu erleichtern."
msgid "Auto-mark as read"
msgstr "Automatisch als gelesen markieren"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Zurück"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Zurück zum Login"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr ""
msgstr "Blau"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Browser-Erweiterung"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Browser-Erweiterung für Chrome benötigt"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Browser-Erweiterung"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
msgstr "Browsertab"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Erstellen Sie einen Filterausdruck, um anzugeben, was Sie lesen möchten. Einträge, die nicht übereinstimmen, werden automatisch als gelesen markiert."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Abbrechen"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Kategorie"
@@ -187,7 +200,7 @@ msgstr "Menü schließen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
msgstr "Befehl"
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}."
@@ -197,6 +210,10 @@ msgstr "CommaFeed Browser Erweiterung Version {browserExtensionVersion}."
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed ist mit der Fever-API kompatibel. Verwenden Sie die folgende URL in Ihrem Fever-kompatiblen mobilen Client. Melden Sie sich mit Ihrem Benutzernamen und Ihrem <0>API-Schlüssel</0> an."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed ist mit der Google-Reader-API kompatibel. Verwenden Sie die folgende URL in Ihrem Google-Reader-kompatiblen mobilen Client. Melden Sie sich mit Ihrem Benutzernamen und Ihrem <0>API-Schlüssel</0> an."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed nächstes ungelesenes Element"
@@ -209,11 +226,11 @@ msgstr "CommaFeed version {version} ({revision})."
msgid "Compact"
msgstr "Kompakt"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Bestätigen"
@@ -221,10 +238,18 @@ msgstr "Bestätigen"
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Passwort bestätigen"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Gemütlich"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Administrator-Konto erstellen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Strg"
@@ -247,10 +272,10 @@ msgstr "Einer JS Code der beim Laden der Seite ausgeführt wird"
#: src/components/settings/DisplaySettings.tsx
msgid "Cyan"
msgstr ""
msgstr "Cyan"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Dunkel"
@@ -258,11 +283,14 @@ msgstr "Dunkel"
msgid "Date created"
msgstr "Erstellungsdatum"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "Tage"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Löschen"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Konto löschen"
@@ -283,14 +311,18 @@ msgstr "Beschr"
msgid "Detailed"
msgstr "Detailliert"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Browser-Verhalten \"Zum Aktualisieren ziehen\" deaktivieren"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Anzeige"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Spenden"
@@ -302,15 +334,14 @@ msgstr "Herunterladen"
msgid "Drag link to bookmark bar"
msgstr "Link in Lesezeichenleiste ziehen"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "E-Mail"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "E-Mail-Adresse"
@@ -319,8 +350,8 @@ msgstr "E-Mail-Adresse"
msgid "Edit user"
msgstr "Benutzer bearbeiten"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Aktiviert"
@@ -334,20 +365,16 @@ msgstr "Geben Sie Ihr aktuelles Passwort ein, um die Profileinstellungen zu änd
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
msgstr "Anzahl der Einträge, die beim Scrollen über dem ausgewählten Eintrag bleiben sollen"
#: src/components/settings/DisplaySettings.tsx
msgid "Entry headers"
msgstr ""
msgstr "Eintragsüberschriften"
#: src/components/Alert.tsx
msgid "Error"
msgstr "Fehler"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Beispiel: {example}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Erweitert"
@@ -356,8 +383,8 @@ msgstr "Erweitert"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Exportieren Sie Ihre Abonnements und Kategorien als OPML-Datei, die in andere Feed-Lesedienste importiert werden kann"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Erweiterungsoptionen"
@@ -365,9 +392,8 @@ msgstr "Erweiterungsoptionen"
msgid "Feed name"
msgstr "Feedname"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "Feed-URL"
@@ -377,11 +403,11 @@ msgstr "Alle Feeds jetzt abrufen"
#: src/components/settings/ProfileSettings.tsx
msgid "Fever API"
msgstr ""
msgstr "Fever-API"
#: src/components/settings/ProfileSettings.tsx
msgid "Fever API URL"
msgstr ""
msgstr "Fever-API-URL"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Filtering expression"
@@ -389,19 +415,19 @@ msgstr "Filterausdruck"
#: src/components/header/ProfileMenu.tsx
msgid "Font size"
msgstr ""
msgstr "Schriftgröße"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
msgstr "Das Erzwingen des Feed-Abrufs ist noch nicht verfügbar."
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Passwort vergessen?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Generieren Sie zuerst einen API-Schlüssel in Ihrem Profil."
@@ -409,9 +435,9 @@ msgstr "Generieren Sie zuerst einen API-Schlüssel in Ihrem Profil."
msgid "Generate new API key"
msgstr "Neuen API-Schlüssel generieren"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "Generierte Feed-URL"
@@ -432,25 +458,29 @@ msgstr "Gehen Sie zur API-Dokumentation."
msgid "Goodies"
msgstr "Goodies"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr ""
msgstr "Traube"
#: src/components/settings/DisplaySettings.tsx
msgid "Gray"
msgstr ""
msgstr "Grau"
#: src/components/settings/DisplaySettings.tsx
msgid "Green"
msgstr ""
msgstr "Grün"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Wenn nicht leer, ein Ausdruck, der als „wahr“ oder „falsch“ ausgewertet wird."
msgstr "ID"
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
@@ -470,15 +500,23 @@ msgstr "In der erweiterten Ansicht werden Einträge beim Scrollen als gelesen ma
#: src/components/settings/DisplaySettings.tsx
msgid "Indigo"
msgstr ""
msgstr "Indigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Ersteinrichtung"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Ungültiger Link zum Zurücksetzen des Passworts. Bitte fordern Sie einen neuen an."
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Ungelesen lassen"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Tastaturkürzel"
@@ -504,17 +542,17 @@ msgstr "Hell"
#: src/components/settings/DisplaySettings.tsx
msgid "Lime"
msgstr ""
msgstr "Limette"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Verbindung"
#: src/components/settings/CustomCodeSettings.tsx
msgid "Link to the documentation"
msgstr ""
msgstr "Link zur Dokumentation"
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
@@ -532,9 +570,8 @@ msgstr "Abonnements werden geladen..."
msgid "Loading tags..."
msgstr "Tags werden geladen..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Einloggen"
@@ -546,8 +583,8 @@ msgstr "Abmelden"
msgid "Long press"
msgstr "Langer Tastendruck"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Benutzer verwalten"
@@ -555,21 +592,25 @@ msgstr "Benutzer verwalten"
msgid "Mark all as read"
msgstr "Alle als gelesen markieren"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Alle Einträge als gelesen markieren"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Als gelesen markieren"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Bis hierhin als gelesen markieren"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Markieren Sie Einträge in diesem Feed nach dieser Anzahl von Tagen als gelesen. Leer lassen zum Deaktivieren."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Metriken"
@@ -586,17 +627,17 @@ msgstr "Seite nach unten verschieben"
msgid "Move the page up"
msgstr "Bewege die Seite nach oben"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "n.v."
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr ""
msgstr "Name"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Navigate to a subscription by entering its name"
@@ -604,9 +645,8 @@ msgstr "Navigieren Sie zu einem Abonnement, indem Sie seinen Namen eingeben"
#: src/components/settings/DisplaySettings.tsx
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr ""
msgstr "Navigieren Sie zum nächsten Feed/Kategorie mit ungelesenen Einträgen, wenn Sie alle Einträge als gelesen markieren"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Niemals"
@@ -615,12 +655,16 @@ msgstr "Niemals"
msgid "New password"
msgstr "Neues Passwort"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Neues Passwort"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Neueste zuerst"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Weiter"
@@ -638,7 +682,7 @@ msgstr "Keine weiteren Einträge"
#: src/components/content/ShareButtons.tsx
msgid "No sharing options available."
msgstr ""
msgstr "Keine Optionen zum Teilen verfügbar."
#: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found"
@@ -650,11 +694,11 @@ msgstr "Älteste zuerst"
#: src/components/settings/DisplaySettings.tsx
msgid "On desktop"
msgstr ""
msgstr "Auf dem Desktop"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile"
msgstr ""
msgstr "Auf dem Handy"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen"
@@ -662,7 +706,7 @@ msgstr "Auf mobilen Geräten die Aktion-Buttons am unteren Ende des Bildschirms
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
msgstr "Gilt nur für die Modi Kompakt, Gemütlich und Detailliert"
#: src/pages/ErrorPage.tsx
msgid "Oops!"
@@ -711,24 +755,23 @@ msgstr "Aktuellen Eintrag öffnen/schließen"
#: src/pages/app/AddPage.tsx
msgid "OPML"
msgstr ""
msgstr "OPML"
#: src/components/settings/ProfileSettings.tsx
msgid "OPML export"
msgstr "OPML-Export"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPML-Datei"
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file is required"
msgstr ""
msgstr "OPML-Datei ist erforderlich"
#: src/components/settings/DisplaySettings.tsx
msgid "Orange"
msgstr ""
msgstr "Orange"
#: src/pages/app/AboutPage.tsx
msgid "Order"
@@ -742,28 +785,31 @@ msgstr "Übergeordnet"
msgid "Parent Category"
msgstr "Übergeordnete Kategorie"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Passwort"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Passwort muss mindestens {minimumPasswordLength} Zeichen lang sein"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Passwortwiederherstellung"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein"
#: src/components/settings/DisplaySettings.tsx
msgid "Pink"
msgstr ""
msgstr "Rosa"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Position"
@@ -773,22 +819,47 @@ msgstr "Vorheriges"
#: src/components/settings/DisplaySettings.tsx
msgid "Primary color"
msgstr ""
msgstr "Primärfarbe"
#: src/pages/app/SettingsPage.tsx
msgid "Profile"
msgstr "Profil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Push-Benachrichtigungsdienst"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Push-Benachrichtigungen"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Push-Benachrichtigungen sind in Ihren Benutzereinstellungen nicht konfiguriert."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Push-Benachrichtigungen sind auf dieser CommaFeed-Instanz nicht aktiviert."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Push-Benachrichtigungen erhalten"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Erhalten Sie Push-Benachrichtigungen, wenn neue Feed-Einträge entdeckt werden. Aktivieren Sie \"Push-Benachrichtigungen erhalten\" in den Einstellungen jedes Feeds, für den Sie Benachrichtigungen erhalten möchten."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Kennwort wiederherstellen"
#: src/components/settings/DisplaySettings.tsx
msgid "Red"
msgstr ""
msgstr "Rot"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Aktualisieren"
@@ -796,20 +867,24 @@ msgstr "Aktualisieren"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrierungen sind für diese CommaFeed-Instanz geschlossen"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST-API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Rechtsklick"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Speichern"
@@ -825,24 +900,22 @@ msgstr "Schnelles Scrollen beim Navigieren zwischen Einträgen"
msgid "Scrolling"
msgstr "Scrollen"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Suche"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "Suche erfordert mindestens 3 Zeichen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr ""
msgstr "Nächsten ungelesenen Feed/Kategorie auswählen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select previous unread feed/category"
msgstr ""
msgstr "Vorherigen ungelesenen Feed/Kategorie auswählen"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "Server-URL"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
@@ -868,8 +941,6 @@ msgstr "Teilen"
msgid "Sharing sites"
msgstr "Seiten teilen"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Verschiebung"
@@ -892,7 +963,7 @@ msgstr "Eintragsmenü anzeigen (Handy)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon"
msgstr ""
msgstr "Symbol für externen Link anzeigen"
#: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries"
@@ -908,19 +979,18 @@ msgstr "Natives Menü anzeigen (Desktop)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show star icon"
msgstr ""
msgstr "Stern-Symbol anzeigen"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
msgstr "Anzahl ungelesener Nachrichten im Tab-Favicon anzeigen"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
msgstr "Anzahl ungelesener Nachrichten im Tab-Titel anzeigen"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Melden Sie sich an"
@@ -928,26 +998,24 @@ msgstr "Melden Sie sich an"
msgid "Something bad just happened..."
msgstr "Etwas Schlimmes ist gerade passiert..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Raum"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Stern"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Markiert"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Abonnieren"
@@ -977,16 +1045,23 @@ msgstr "Zum Lightmode wechseln"
#: src/components/header/ProfileMenu.tsx
msgid "System"
msgstr ""
msgstr "System"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr ""
msgstr "Tags"
#: src/components/settings/DisplaySettings.tsx
msgid "Teal"
msgstr ""
msgstr "Blaugrün"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Test"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Testbenachrichtigung erfolgreich gesendet."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -996,9 +1071,18 @@ msgstr "Die URL für den Feed, den Sie abonnieren möchten. "
msgid "Theme"
msgstr "Thema"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Dieser Feed verfügt über einen veralteten Filter, der nicht bearbeitet werden kann und nicht angewendet wird. Bitte erstellen Sie den Filter mit dem neuen Ausdruckseditor neu. Der veraltete Filterausdruck war: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Dies ist Ihr API-Schlüssel. Er kann für einige schreibgeschützte API-Vorgänge verwendet werden und ermöglicht den Zugriff auf die Fever-API. Verwenden Sie das Formular unten auf der Seite, um einen neuen API-Schlüssel zu generieren"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Dies ist Ihr API-Schlüssel. Er kann für einige schreibgeschützte API-Vorgänge verwendet werden und gewährt Zugriff auf die Fever-API und die Google-Reader-API. Verwenden Sie das Formular am Ende der Seite, um einen neuen API-Schlüssel zu generieren"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Diese Einstellung kann auf einigen Browsern (z. B. Safari) zu Scrollproblemen führen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Sidebar an- und ausschalten"
msgid "Toggle starred status of current entry"
msgstr "Markierungsstatus des aktuellen Eintrags ändern"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Thema"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Testen Sie CommaFeed mit dem Demokonto: demo/demo"
@@ -1024,29 +1112,31 @@ msgstr "Testen Sie die Demo!"
msgid "Unread"
msgstr "Ungelesen"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Stern entfernen"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Abbestellen"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Benutzerschlüssel"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Benutzername"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Benutzername oder E-Mail"
#: src/components/settings/DisplaySettings.tsx
msgid "Violet"
msgstr ""
msgstr "Violett"
#: src/components/Alert.tsx
msgid "Warning"
@@ -1056,9 +1146,13 @@ msgstr "Warnung"
msgid "Website"
msgstr "Webseite"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Willkommen! Dies scheint das erste Mal zu sein, dass Sie CommaFeed ausführen. Bitte erstellen Sie ein Administrator-Konto, um zu beginnen."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""
msgstr "Gelb"
#: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
@@ -1067,3 +1161,7 @@ msgstr "Sie haben noch keine Abonnements."
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ihr Feed wurde für die Aktualisierung eingereiht."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Ihr Passwort wurde geändert. Sie können sich nun mit Ihrem neuen Passwort anmelden."

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>Complete syntax is available </0><1>here</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Have an account?</0><1>Log in!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaF
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Need an account?</0><1>Sign up!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "About"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Access token"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Actions"
@@ -54,21 +54,24 @@ msgstr "Add category"
msgid "Add user"
msgstr "Add user"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Admin"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Admin user name"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "All"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Always"
@@ -93,6 +96,14 @@ msgstr "Announcement"
msgid "API key"
msgstr "API key"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "API token"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "App token"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Are you sure you want to delete category <0>{categoryName}</0>?"
@@ -122,14 +133,15 @@ msgid "Asc"
msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgid "Auto-mark as read"
msgstr "Auto-mark as read"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Back"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Back to log in"
@@ -137,39 +149,40 @@ msgstr "Back to log in"
msgid "Blue"
msgstr "Blue"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Browser extension"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Browser extension required for Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Browser extention"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Browser tab"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Cancel"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Category"
@@ -197,6 +210,10 @@ msgstr "CommaFeed browser extension version {browserExtensionVersion}."
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed next unread item"
@@ -209,11 +226,11 @@ msgstr "CommaFeed version {version} ({revision})."
msgid "Compact"
msgstr "Compact"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Confirm"
@@ -221,10 +238,18 @@ msgstr "Confirm"
msgid "Confirm password"
msgstr "Confirm password"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirm Password"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Create Admin Account"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -249,8 +274,8 @@ msgstr "Custom JS code that will be executed on page load"
msgid "Cyan"
msgstr "Cyan"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Dark"
@@ -258,11 +283,14 @@ msgstr "Dark"
msgid "Date created"
msgstr "Date created"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "days"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Delete"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Delete account"
@@ -283,14 +311,18 @@ msgstr "Desc"
msgid "Detailed"
msgstr "Detailed"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Disable \"Pull to refresh\" browser behavior"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Display"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Donate"
@@ -302,15 +334,14 @@ msgstr "Download"
msgid "Drag link to bookmark bar"
msgstr "Drag link to bookmark bar"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "E-mail"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "E-mail address"
@@ -319,8 +350,8 @@ msgstr "E-mail address"
msgid "Edit user"
msgstr "Edit user"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Enabled"
@@ -344,10 +375,6 @@ msgstr "Entry headers"
msgid "Error"
msgstr "Error"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Example: {example}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Expanded"
@@ -356,8 +383,8 @@ msgstr "Expanded"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Extension options"
@@ -365,9 +392,8 @@ msgstr "Extension options"
msgid "Feed name"
msgstr "Feed name"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "Feed URL"
@@ -399,9 +425,9 @@ msgstr "Force fetching feeds is not yet available."
msgid "Forgot password?"
msgstr "Forgot password?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Generate an API key in your profile first."
@@ -409,9 +435,9 @@ msgstr "Generate an API key in your profile first."
msgid "Generate new API key"
msgstr "Generate new API key"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "Generated feed url"
@@ -432,6 +458,14 @@ msgstr "Go to the API documentation."
msgid "Goodies"
msgstr "Goodies"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr "Google Reader API"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr "Google Reader API URL"
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr "Grape"
@@ -448,10 +482,6 @@ msgstr "Green"
msgid "Id"
msgstr "Id"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "If the entry doesn't entirely fit on the screen"
@@ -472,13 +502,21 @@ msgstr "In expanded view, scrolling through entries mark them as read"
msgid "Indigo"
msgstr "Indigo"
#: src/components/content/FeedEntryFooter.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Initial Setup"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Invalid password reset link. Please request a new one."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Keep unread"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Keyboard shortcuts"
@@ -506,9 +544,9 @@ msgstr "Light"
msgid "Lime"
msgstr "Lime"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Link"
@@ -532,9 +570,8 @@ msgstr "Loading subscriptions..."
msgid "Loading tags..."
msgstr "Loading tags..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Log in"
@@ -546,8 +583,8 @@ msgstr "Logout"
msgid "Long press"
msgstr "Long press"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Manage users"
@@ -555,21 +592,25 @@ msgstr "Manage users"
msgid "Mark all as read"
msgstr "Mark all as read"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Mark all entries as read"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Mark as read"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Mark as read up to here"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Mark entries in this feed as read after this number of days. Leave empty to disable."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Metrics"
@@ -586,15 +627,15 @@ msgstr "Move the page down"
msgid "Move the page up"
msgstr "Move the page up"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "N/A"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Name"
@@ -606,7 +647,6 @@ msgstr "Navigate to a subscription by entering its name"
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr "Navigate to the next category/feed with unread entries when marking all entries as read"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Never"
@@ -615,12 +655,16 @@ msgstr "Never"
msgid "New password"
msgstr "New password"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "New Password"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Newest first"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Next"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "OPML export"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPML file"
@@ -742,19 +785,22 @@ msgstr "Parent"
msgid "Parent Category"
msgstr "Parent Category"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Password"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Password must be at least {minimumPasswordLength} characters"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Password Recovery"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passwords do not match"
@@ -762,8 +808,8 @@ msgstr "Passwords do not match"
msgid "Pink"
msgstr "Pink"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Position"
@@ -779,6 +825,31 @@ msgstr "Primary color"
msgid "Profile"
msgstr "Profile"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Push notification service"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Push notifications"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Push notifications are not configured in your user settings."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Push notifications are not enabled on this CommaFeed instance."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Receive push notifications"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Recover password"
@@ -787,8 +858,8 @@ msgstr "Recover password"
msgid "Red"
msgstr "Red"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Refresh"
@@ -796,20 +867,24 @@ msgstr "Refresh"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrations are closed on this CommaFeed instance"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Reset Password"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Right click"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Save"
@@ -825,17 +900,11 @@ msgstr "Scroll smoothly when navigating between entries"
msgid "Scrolling"
msgstr "Scrolling"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Search"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "Search requires at least 3 characters"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr "Select next unread feed/category"
@@ -844,6 +913,10 @@ msgstr "Select next unread feed/category"
msgid "Select previous unread feed/category"
msgstr "Select previous unread feed/category"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "Server URL"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
msgstr "Set focus on next entry without opening it"
@@ -868,8 +941,6 @@ msgstr "Share"
msgid "Sharing sites"
msgstr "Sharing sites"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -918,9 +989,8 @@ msgstr "Show unread count in tab favicon"
msgid "Show unread count in tab title"
msgstr "Show unread count in tab title"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Sign up"
@@ -928,26 +998,24 @@ msgstr "Sign up"
msgid "Something bad just happened..."
msgstr "Something bad just happened..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Space"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Star"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Starred"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Subscribe"
@@ -979,7 +1047,6 @@ msgstr "Switch to light theme"
msgid "System"
msgstr "System"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Tags"
@@ -988,6 +1055,14 @@ msgstr "Tags"
msgid "Teal"
msgstr "Teal"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Test"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Test notification sent successfully."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -996,9 +1071,18 @@ msgstr "The URL for the feed you want to subscribe to. You can also use the webs
msgid "Theme"
msgstr "Theme"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "This setting can cause scrolling issues on some browsers (e.g. Safari)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Toggle sidebar"
msgid "Toggle starred status of current entry"
msgstr "Toggle starred status of current entry"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Topic"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Try out CommaFeed with the demo account: demo/demo"
@@ -1024,22 +1112,24 @@ msgstr "Try the demo!"
msgid "Unread"
msgstr "Unread"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Unstar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Unsubscribe"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "User key"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "User name"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "User Name or E-mail"
@@ -1056,6 +1146,10 @@ msgstr "Warning"
msgid "Website"
msgstr "Website"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Yellow"
@@ -1067,3 +1161,7 @@ msgstr "You don't have any subscriptions yet. Why not try adding one by clicking
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Your feeds have been queued for refresh."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Your password has been changed. You can now log in with your new password."

View File

@@ -18,10 +18,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed es un proyecto de código abierto. El código fuente está hospedado en </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>La sintaxis completa está disponible </0><1>aquí</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>¿Tienes una cuenta?</0><1>¡Inicia sesión!</1>"
@@ -34,11 +30,15 @@ msgstr "<0>Hola,</0><1>Soy Jérémie de Bélgica y he estado trabajando en Comma
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>¿Necesitas una cuenta?</0><1>¡Regístrate!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "Acerca de"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Token de acceso"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Acciones"
@@ -55,21 +55,24 @@ msgstr "Añadir categoría"
msgid "Add user"
msgstr "Añadir usuario"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Administrador"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Nombre de usuario administrador"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Todo"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Siempre"
@@ -94,6 +97,14 @@ msgstr "Anuncio"
msgid "API key"
msgstr "Clave API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "Token de API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Token de aplicación"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "¿Estás seguro de que deseas eliminar la categoría <0>{categoryName}</0>?"
@@ -123,54 +134,56 @@ msgid "Asc"
msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Las variables disponibles son 'título', 'contenido', 'url', 'autor' y 'categorías' y su contenido se convierte a minúsculas para facilitar la comparación de cadenas."
msgid "Auto-mark as read"
msgstr "Marcar como leído automáticamente"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Atrás"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Volver a iniciar sesión"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr ""
msgstr "Azul"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Extensión del navegador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Se requiere extensión de navegador para Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Extensión del navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Pestaña del navegador"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Crea una expresión de filtrado para indicar lo que quieres leer. Las entradas que no coincidan se marcarán como leídas automáticamente."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Cancelar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Categoría"
@@ -198,6 +211,10 @@ msgstr "Versión de la extensión del navegador CommaFeed {browserExtensionVersi
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed es compatible con Fever API. Utilice la siguiente URL en su cliente móvil compatible con Fever. Inicie sesión con su nombre de usuario y su <0>clave API</0>."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed es compatible con Google Reader API. Utilice la siguiente URL en su cliente móvil compatible con Google Reader. Inicie sesión con su nombre de usuario y su <0>clave API</0>."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed siguiente elemento no leído"
@@ -210,11 +227,11 @@ msgstr "Versión de CommaFeed {version} ({revision})."
msgid "Compact"
msgstr "Compacto"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Confirmar"
@@ -222,10 +239,18 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirmar contraseña"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acogedor"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Crear cuenta de administrador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -248,10 +273,10 @@ msgstr "Código JS personalizado que se ejecutará al cargar la página"
#: src/components/settings/DisplaySettings.tsx
msgid "Cyan"
msgstr ""
msgstr "Cian"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Oscuro"
@@ -259,11 +284,14 @@ msgstr "Oscuro"
msgid "Date created"
msgstr "Fecha de creación"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "días"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Borrar"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Borrar cuenta"
@@ -284,14 +312,18 @@ msgstr "Desc"
msgid "Detailed"
msgstr "Detallado"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Desactivar el comportamiento \"Arrastrar para actualizar\" del navegador"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Mostrar"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Donar"
@@ -303,15 +335,14 @@ msgstr "Descargar"
msgid "Drag link to bookmark bar"
msgstr "Arrastra el enlace a la barra de marcadores"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "Correo electrónico"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "Dirección de correo electrónico"
@@ -320,8 +351,8 @@ msgstr "Dirección de correo electrónico"
msgid "Edit user"
msgstr "Editar usuario"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Habilitado"
@@ -345,10 +376,6 @@ msgstr "Encabezados de las entradas"
msgid "Error"
msgstr "Error"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Ejemplo: {ejemplo}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Expandido"
@@ -357,8 +384,8 @@ msgstr "Expandido"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Exporta tus suscripciones y categorías como un archivo OPML que se puede importar en otros servicios de lectura de feeds"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Opciones de la extensión"
@@ -366,9 +393,8 @@ msgstr "Opciones de la extensión"
msgid "Feed name"
msgstr "Nombre del feed"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "URL del feed"
@@ -390,19 +416,19 @@ msgstr "Expresión de filtrado"
#: src/components/header/ProfileMenu.tsx
msgid "Font size"
msgstr ""
msgstr "Tamaño de fuente"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
msgstr "Forzar la actualización de los feeds aún no está disponible."
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "¿Olvidaste la contraseña?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Primero genere una clave API en su perfil."
@@ -410,9 +436,9 @@ msgstr "Primero genere una clave API en su perfil."
msgid "Generate new API key"
msgstr "Generar nueva clave API"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "URL del feed generado"
@@ -433,26 +459,30 @@ msgstr "Ir a la documentación de la API."
msgid "Goodies"
msgstr "Golosinas"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr ""
msgstr "Uva"
#: src/components/settings/DisplaySettings.tsx
msgid "Gray"
msgstr ""
msgstr "Gris"
#: src/components/settings/DisplaySettings.tsx
msgid "Green"
msgstr ""
msgstr "Verde"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "Identificación"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Si no está vacía, una expresión que se evalúa como \"verdadera\" o \"falso\". Si es falso, las nuevas entradas de este feed se marcarán como leídas automáticamente."
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "Si la entrada no cabe completamente en la pantalla"
@@ -471,15 +501,23 @@ msgstr "En la vista ampliada, al desplazarse por las entradas marcarlas como le
#: src/components/settings/DisplaySettings.tsx
msgid "Indigo"
msgstr ""
msgstr "Índigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Configuración inicial"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Enlace de restablecimiento de contraseña no válido. Por favor, solicita uno nuevo."
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Mantener sin leer"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Atajos de teclado"
@@ -505,17 +543,17 @@ msgstr "Claro"
#: src/components/settings/DisplaySettings.tsx
msgid "Lime"
msgstr ""
msgstr "Lima"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Enlace"
#: src/components/settings/CustomCodeSettings.tsx
msgid "Link to the documentation"
msgstr ""
msgstr "Enlace a la documentación"
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
@@ -533,9 +571,8 @@ msgstr "Cargando suscripciones..."
msgid "Loading tags..."
msgstr "Cargando etiquetas..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Iniciar sesión"
@@ -547,8 +584,8 @@ msgstr "Cerrar sesión"
msgid "Long press"
msgstr "Pulsación larga"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Administrar usuarios"
@@ -556,21 +593,25 @@ msgstr "Administrar usuarios"
msgid "Mark all as read"
msgstr "Marcar todo como leído"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Marcar todas las entradas como leídas"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Marcar como leído"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Marcar como leído hasta aquí"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Marcar las entradas de este feed como leídas después de este número de días. Dejar vacío para desactivar."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Métricas"
@@ -587,15 +628,15 @@ msgstr "Mover la página hacia abajo"
msgid "Move the page up"
msgstr "Mover la página hacia arriba"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "N/D"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Nombre"
@@ -605,9 +646,8 @@ msgstr "Navegar a una suscripción introduciendo su nombre"
#: src/components/settings/DisplaySettings.tsx
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr ""
msgstr "Navegar a la siguiente categoría/feed con entradas no leídas al marcar todas como leídas"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Nunca"
@@ -616,12 +656,16 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nueva contraseña"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Nueva contraseña"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Las más recientes primero"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Siguiente"
@@ -718,7 +762,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "Exportar OPML"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "Archivo OPML"
@@ -729,7 +772,7 @@ msgstr "Es necesario un archivo OPML"
#: src/components/settings/DisplaySettings.tsx
msgid "Orange"
msgstr ""
msgstr "Naranja"
#: src/pages/app/AboutPage.tsx
msgid "Order"
@@ -743,28 +786,31 @@ msgstr "Padre"
msgid "Parent Category"
msgstr "Categoría principal"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Contraseña"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "La contraseña debe tener al menos {minimumPasswordLength} caracteres"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperación de contraseña"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
#: src/components/settings/DisplaySettings.tsx
msgid "Pink"
msgstr ""
msgstr "Rosa"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Posición"
@@ -774,22 +820,47 @@ msgstr "Previo"
#: src/components/settings/DisplaySettings.tsx
msgid "Primary color"
msgstr ""
msgstr "Color primario"
#: src/pages/app/SettingsPage.tsx
msgid "Profile"
msgstr "Perfil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Servicio de notificaciones push"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Notificaciones push"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Las notificaciones push no están configuradas en tus ajustes de usuario."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Las notificaciones push no están habilitadas en esta instancia de CommaFeed."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Recibir notificaciones push"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Recibir notificaciones push cuando se descubran nuevas entradas. Activa \"Recibir notificaciones push\" en los ajustes de cada feed del que quieras recibir notificaciones."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Recuperar contraseña"
#: src/components/settings/DisplaySettings.tsx
msgid "Red"
msgstr ""
msgstr "Rojo"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Actualizar"
@@ -797,20 +868,24 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Los registros están cerrados en esta instancia de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Restablecer contraseña"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Clic derecho"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Guardar"
@@ -826,24 +901,22 @@ msgstr "Desplazarse suavemente al navegar entre entradas"
msgid "Scrolling"
msgstr "Desplazarse"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Buscar"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "La búsqueda requiere al menos 3 caracteres"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr ""
msgstr "Seleccionar el siguiente feed/categoría no leído"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select previous unread feed/category"
msgstr ""
msgstr "Seleccionar el anterior feed/categoría no leído"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "URL del servidor"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
@@ -869,8 +942,6 @@ msgstr "Compartir"
msgid "Sharing sites"
msgstr "Compartir sitios"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -919,9 +990,8 @@ msgstr "Mostrar recuento de no leídos en la pestaña favicon"
msgid "Show unread count in tab title"
msgstr "Mostrar recuento de no leídos en el título de la pestaña"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Registrarse"
@@ -929,26 +999,24 @@ msgstr "Registrarse"
msgid "Something bad just happened..."
msgstr "Algo malo acaba de pasar..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Espacio"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Estrella"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Destacado"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Suscribirse"
@@ -980,14 +1048,21 @@ msgstr "Cambiar a tema claro"
msgid "System"
msgstr "Sistema"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Etiquetas"
#: src/components/settings/DisplaySettings.tsx
msgid "Teal"
msgstr ""
msgstr "Verde azulado"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Probar"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Notificación de prueba enviada con éxito."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -997,9 +1072,18 @@ msgstr "La URL del feed al que desea suscribirse. También puede utilizar la URL
msgid "Theme"
msgstr "Tema"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Este feed tiene un filtro heredado que no se puede editar y no se aplica. Por favor, vuelve a crear el filtro usando el nuevo editor de expresiones. La expresión del filtro heredado era: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Esta es su clave API. Se puede utilizar para algunas operaciones API de solo lectura y otorga acceso a Fever API. Utilice el formulario en la parte inferior de la página para generar una nueva clave API"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Esta es su clave API. Se puede utilizar para algunas operaciones API de solo lectura y otorga acceso a la API Fever y a la API de Google Reader. Utilice el formulario en la parte inferior de la página para generar una nueva clave API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Este ajuste puede causar problemas de desplazamiento en algunos navegadores (por ejemplo, Safari)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1013,6 +1097,10 @@ msgstr "Alternar barra lateral"
msgid "Toggle starred status of current entry"
msgstr "Alternar estado destacado de la entrada actual"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Tema"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Prueba CommaFeed con la cuenta de demostración: demo/demo"
@@ -1025,29 +1113,31 @@ msgstr "¡Prueba la demostración!"
msgid "Unread"
msgstr "No leído"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Desmarcar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Cancelar suscripción"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Clave de usuario"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nombre de usuario"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Nombre de usuario o correo electrónico"
#: src/components/settings/DisplaySettings.tsx
msgid "Violet"
msgstr ""
msgstr "Violeta"
#: src/components/Alert.tsx
msgid "Warning"
@@ -1057,9 +1147,13 @@ msgstr "Advertencia"
msgid "Website"
msgstr "Sitio web"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "¡Bienvenido! Parece que esta es la primera vez que ejecutas CommaFeed. Por favor, crea una cuenta de administrador para empezar."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""
msgstr "Amarillo"
#: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
@@ -1068,3 +1162,7 @@ msgstr "Aún no tienes ninguna suscripción. ¿Por qué no intentas agregar una
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Tus feeds se han puesto en cola para actualizarse."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Tu contraseña ha sido cambiada. Ahora puedes iniciar sesión con tu nueva contraseña."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed est un projet open-source. Les sources sont hébergées sur </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>La syntaxe complète est disponible </0><1>ici</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Déjà un compte ?</0><1>Connectez-vous !</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Salut,</0><1>Je m'appelle Jérémie, je suis belge, et je développe
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Besoin d'un compte ?</0><1>Enregistrez-vous !</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "À propos"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Jeton d'accès"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Actions"
@@ -54,21 +54,24 @@ msgstr "Ajouter une catégorie"
msgid "Add user"
msgstr "Ajouter un utilisateur"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Administrateur"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Nom de l'administrateur"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Tout"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Toujours"
@@ -93,6 +96,14 @@ msgstr "Annonces"
msgid "API key"
msgstr "Clé API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "Jeton API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Jeton Appli"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Êtes-vous sûr de vouloir supprimer la catégorie <0>{categoryName}</0> ?"
@@ -122,14 +133,15 @@ msgid "Asc"
msgstr "Ascendant"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Les variables disponibles sont 'title', 'content', 'url' 'author' et 'categories' et leur contenu est converti en minuscules pour faciliter la comparaison de chaînes."
msgid "Auto-mark as read"
msgstr "Marquer automatiquement comme lu"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Retour"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Retour à la connexion"
@@ -137,39 +149,40 @@ msgstr "Retour à la connexion"
msgid "Blue"
msgstr "Bleu"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Extension navigateur"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "L'extension navigateur est nécessaire sur Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Extension navigateur"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Onglet navigateur"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Créez une expression régulière pour filtrer ce que vous voulez lire. Les entrées qui ne correspondent pas seront automatiquement marquées comme lues."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Annuler"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Catégorie"
@@ -197,6 +210,10 @@ msgstr "Extension CommaFeed pour navigateur version {browserExtensionVersion}."
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "Commafeed est compatible avec l'API Fever, en inscrivant l'URL suivante dans votre client mobile compatible. Entrez votre nom d'utilisateur habituel, et votre <0>clef API</0> comme mot de passe."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "Commafeed est compatible avec l'API Google Reader, en inscrivant l'URL suivante dans votre client mobile compatible. Entrez votre nom d'utilisateur habituel, et votre <0>clef API</0> comme mot de passe."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed prochain article non lu"
@@ -209,11 +226,11 @@ msgstr "CommaFeed version {version} ({revision})."
msgid "Compact"
msgstr "Compact"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Confirmer"
@@ -221,10 +238,18 @@ msgstr "Confirmer"
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirmer le mot de passe"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Créer un compte adminstrateur"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -249,8 +274,8 @@ msgstr "Code JS personnalisé qui sera appliqué au chargement des pages"
msgid "Cyan"
msgstr "Cyan"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Foncé"
@@ -258,11 +283,14 @@ msgstr "Foncé"
msgid "Date created"
msgstr "Date de création"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "jours"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Effacer"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Effacer le compte"
@@ -283,14 +311,18 @@ msgstr "Descendant"
msgid "Detailed"
msgstr "Vue détaillée"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Désactiver la fonction \"tirer pour rafraîchir\" du navigateur"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Affichage"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Faire un don"
@@ -302,15 +334,14 @@ msgstr "Télécharger"
msgid "Drag link to bookmark bar"
msgstr "Déplacez le lien vers la barre de favoris"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "E-mail"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "Adresse e-mail"
@@ -319,8 +350,8 @@ msgstr "Adresse e-mail"
msgid "Edit user"
msgstr "Modifier un utilisateur"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Actif"
@@ -344,10 +375,6 @@ msgstr "En-têtes de l'entrée"
msgid "Error"
msgstr "Erreur"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Exemple : {example}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Vue étendue"
@@ -356,8 +383,8 @@ msgstr "Vue étendue"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Exporter vos abonnements et catégories en tant que fichier OPML qui peut être importé dans d'autres services de lecture de flux"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Options de l'extension"
@@ -365,9 +392,8 @@ msgstr "Options de l'extension"
msgid "Feed name"
msgstr "Nom du flux"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "URL du flux"
@@ -399,9 +425,9 @@ msgstr "La récupération forcée des flux n'est pas encore disponible."
msgid "Forgot password?"
msgstr "Mot de passe oublié ?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Générez d'abord une clé API dans votre profil."
@@ -409,9 +435,9 @@ msgstr "Générez d'abord une clé API dans votre profil."
msgid "Generate new API key"
msgstr "Générer une nouvelle clé API"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "URL du flux généré"
@@ -432,6 +458,14 @@ msgstr "Aller à la documentation de l'API."
msgid "Goodies"
msgstr "Extensions"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr "Bordeaux"
@@ -448,10 +482,6 @@ msgstr "Vert"
msgid "Id"
msgstr "Identifiant"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Si non vide, une expression évaluant à 'vrai' ou 'faux'. Si faux, les nouvelles entrées de ce flux seront marquées comme lues automatiquement."
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "Si l'entrée ne tient pas entièrement sur l'écran"
@@ -472,13 +502,21 @@ msgstr "En mode de lecture étendu, marquer les éléments comme lus lorsque la
msgid "Indigo"
msgstr "Indigo"
#: src/components/content/FeedEntryFooter.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Configuration initiale"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Lien de réinitialisation de mot de passse invalide. Recommencez la procédure."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Garder non lu"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Raccourcis clavier"
@@ -506,9 +544,9 @@ msgstr "Clair"
msgid "Lime"
msgstr "Jaune-vert"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Lien"
@@ -532,9 +570,8 @@ msgstr "Chargement des abonnements..."
msgid "Loading tags..."
msgstr "Chargement des marqueurs..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Connexion"
@@ -546,8 +583,8 @@ msgstr "Déconnexion"
msgid "Long press"
msgstr "Appui long"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Gestion des utilisateurs"
@@ -555,21 +592,25 @@ msgstr "Gestion des utilisateurs"
msgid "Mark all as read"
msgstr "Tout marquer comme lu"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Marquer toutes les entrées comme lues"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Marquer comme lu"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Marquer comme lu jusqu'ici"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Marquer les entrées de ce flux comme lues après ce nombre de jours. Laissez vide pour désactiver."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Métriques"
@@ -586,15 +627,15 @@ msgstr "Faites défiler la page vers le bas"
msgid "Move the page up"
msgstr "Faites défiler la page vers le haut"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "N/A"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Nom"
@@ -606,7 +647,6 @@ msgstr "Naviguer vers un abonnement en entrant son nom"
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr "Aller vers la catégorie/le flux comportant des entrées non lues suivant après avoir marqué toutes les entrées lues"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Jamais"
@@ -615,12 +655,16 @@ msgstr "Jamais"
msgid "New password"
msgstr "Nouveau mot de passe"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Nouveau mot de passe"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Plus récent en premier"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Suivant"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "Export du fichier OPML"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "Fichier OPML"
@@ -742,19 +785,22 @@ msgstr "Parent"
msgid "Parent Category"
msgstr "Catégorie parente"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Mot de passe"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Le mot de passe doit mesurer au moins {minimumPasswordLength} caractères"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Récupération de mot de passe"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
@@ -762,8 +808,8 @@ msgstr "Les mots de passe ne correspondent pas"
msgid "Pink"
msgstr "Rose"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Position"
@@ -779,6 +825,31 @@ msgstr "Couleur d'ambiance"
msgid "Profile"
msgstr "Profil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Service de notifications Push"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Notifications Push"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Les notifications Push ne sont pas configurées dans vos préférences."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Les notifications Push ne sont pas disponibles dans cette instance CommaFeed."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Envoyer des notifications Push"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Permet de recevoir des notifications Push quand des nouvelles entrées sont découvertes pour un flux. Activez \"Envoyer des notifications Push\" dans les paramètres des flux pour lesquels vous souhaitez être notifié."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Récupérer le mot de passe"
@@ -787,8 +858,8 @@ msgstr "Récupérer le mot de passe"
msgid "Red"
msgstr "Rouge"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Rafraîchir"
@@ -796,20 +867,24 @@ msgstr "Rafraîchir"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Les inscriptions sont fermées sur cette instance de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Clic droit"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Enregistrer"
@@ -825,17 +900,11 @@ msgstr "Défilement animé lors de la navigation entre les entrées"
msgid "Scrolling"
msgstr "Défilement"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Rechercher"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "La recherche requiert au moins 3 caractères"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr "Sélectionner l'article non lu suivant/la catégorie non lue suivante"
@@ -844,6 +913,10 @@ msgstr "Sélectionner l'article non lu suivant/la catégorie non lue suivante"
msgid "Select previous unread feed/category"
msgstr "Sélectionner l'article non lu précédent/la catégorie non lue précédente"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "URL du serveur"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
msgstr "Sélectionner l'article suivant sans l'ouvrir"
@@ -868,8 +941,6 @@ msgstr "Partager"
msgid "Sharing sites"
msgstr "Sites de partage"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Maj"
@@ -918,9 +989,8 @@ msgstr "Afficher le nombre d'entrées non lues dans la favicône de l'onglet"
msgid "Show unread count in tab title"
msgstr "Afficher le nombre d'entrées non lues dans le titre de l'onglet"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Créer un compte"
@@ -928,26 +998,24 @@ msgstr "Créer un compte"
msgid "Something bad just happened..."
msgstr "Quelque chose s'est mal passé..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Espace"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Ajouter aux favoris"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Favoris"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "S'abonner"
@@ -979,7 +1047,6 @@ msgstr "Activer le mode clair"
msgid "System"
msgstr "Système"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Marqueurs"
@@ -988,6 +1055,14 @@ msgstr "Marqueurs"
msgid "Teal"
msgstr "Bleu-vert"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Test"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Notification de test envoyée avec succès."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "L'URL du flux auquel vous souhaitez vous abonner. Vous pouvez aussi utiliser l'URL du site directement et CommaFeed va essayer de trouver le flux dans la page."
@@ -996,9 +1071,18 @@ msgstr "L'URL du flux auquel vous souhaitez vous abonner. Vous pouvez aussi util
msgid "Theme"
msgstr "Thème"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Ce flux est configuré avec un filtre obsolète, qui ne peut être ni modifié ni appliqué. Vous devez recréer ce filtre à l'aide du nouvel éditeur d'expressions régulières. Le filtre configuré était : <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Ceci est votre clef API. Elle peut être utilisée pour certaines opérations en lecture seule et donne accès à l'API Fever. Utilisez le formulaire en bas de la page pour générer une nouvelle clef API"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Ceci est votre clef API. Elle peut être utilisée pour certaines opérations en lecture seule et donne accès à l'API Fever et à l'API Google Reader. Utilisez le formulaire en bas de la page pour générer une nouvelle clef API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Cette fonctinnalité peut causer des problèmes de défilement sur certains navigateurs (Safari, par exemple)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Montrer/cacher la barre latérale"
msgid "Toggle starred status of current entry"
msgstr "Montrer/cacher le statut favori de l'entrée"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Sujet"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Essayez CommaFeed avec le compte de démonstration : demo/demo"
@@ -1024,22 +1112,24 @@ msgstr "Essayez la version de démonstration !"
msgid "Unread"
msgstr "Non lu"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Retirer des favoris"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Se désabonner"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Clé utilisateur"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Nom d'utilisateur ou e-mail"
@@ -1056,6 +1146,10 @@ msgstr "Attention"
msgid "Website"
msgstr "Site web"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Bienvenue ! Il semble que ce soit le premier démarrage de Commafeed. Avant tout, vous devez créer un compte administrateur."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Jaune"
@@ -1067,3 +1161,7 @@ msgstr "Vous n'avez pas encore d'abonnements. Pourquoi ne pas essayer d'en ajout
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Vos flux sont en cours de rafraîchissement"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Votre mot de passe a été modifié. Vous pouvez vous connecter avec votre nouveau mot de passe."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed はオープンソースのプロジェクトです。 ソースは以下でホストされています </0><1>GitHub</1>。"
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>完全な syntax </0><1>こちら</1>で利用可能です<2>。</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>アカウントをお持ちですか?</0><1>ログインしてください!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>こんにちは、</0><1>私はベルギーのジェレミーです
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>アカウントが必要ですか?</0><1>サインアップ!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "About"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "アクセストークン"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "アクション"
@@ -54,21 +54,24 @@ msgstr "カテゴリを追加"
msgid "Add user"
msgstr "ユーザー追加"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "管理者"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "管理者ユーザー名"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "すべて"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "常に"
@@ -93,6 +96,14 @@ msgstr "お知らせ"
msgid "API key"
msgstr "APIキー"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "APIトークン"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "アプリトークン"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "カテゴリ <0>{categoryName}</0> を削除してもよろしいですか?"
@@ -122,54 +133,56 @@ msgid "Asc"
msgstr "昇順"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "使用可能な変数は「title」、「content」、「url」、「author」、および「categories」であり、それらのコンテンツは文字列の比較を容易にするために小文字に変換されます。"
msgid "Auto-mark as read"
msgstr "自動的に既読にする"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "戻る"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "ログインに戻る"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr ""
msgstr "ブルー"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "ブラウザー拡張"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Chromeのブラウザー拡張が必要です"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "ブラウザー拡張"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "ブラウザータブ"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "読みたい内容を指定するためのフィルタ式を作成します。一致しないエントリは自動的に既読としてマークされます。"
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "キャンセル"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "カテゴリー"
@@ -197,6 +210,10 @@ msgstr "CommaFeed ブラウザー拡張機能のバージョンは {browserExten
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeedはFever APIと互換性があります。Fever互換のモバイルクライアントで次のURLを使用してください。ユーザー名と <0>API キー</0> でログインしてください。"
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeedはGoogle Reader APIと互換性があります。Google Reader互換のモバイルクライアントで次のURLを使用してください。ユーザー名と <0>API キー</0> でログインしてください。"
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed 次の未読アイテム"
@@ -209,11 +226,11 @@ msgstr "CommaFeed バージョン {version} ({revision})。"
msgid "Compact"
msgstr "コンパクト"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "確認"
@@ -221,10 +238,18 @@ msgstr "確認"
msgid "Confirm password"
msgstr "パスワード確認"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "パスワードの確認"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "管理者アカウントの作成"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -247,10 +272,10 @@ msgstr "ページ読み込み時に実行されるカスタムJSコード"
#: src/components/settings/DisplaySettings.tsx
msgid "Cyan"
msgstr ""
msgstr "シアン"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "ダーク"
@@ -258,11 +283,14 @@ msgstr "ダーク"
msgid "Date created"
msgstr "作成日"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "日"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "削除"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "アカウント削除"
@@ -283,14 +311,18 @@ msgstr "説明"
msgid "Detailed"
msgstr "詳細"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "ブラウザの「プルして更新」動作を無効にする"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "ディスプレイ"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "寄付"
@@ -302,15 +334,14 @@ msgstr "ダウンロード"
msgid "Drag link to bookmark bar"
msgstr "リンクをブックマークバーにドラッグ"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "メール"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "メールアドレス"
@@ -319,8 +350,8 @@ msgstr "メールアドレス"
msgid "Edit user"
msgstr "ユーザーの編集"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "有効"
@@ -344,10 +375,6 @@ msgstr "エントリーヘッダー"
msgid "Error"
msgstr "エラー"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "例: {example}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "拡張"
@@ -356,8 +383,8 @@ msgstr "拡張"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "サブスクリプションとカテゴリを、他のフィード読み取りサービスにインポートできる OPML ファイルとしてエクスポートします"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "拡張機能オプション"
@@ -365,9 +392,8 @@ msgstr "拡張機能オプション"
msgid "Feed name"
msgstr "フィード名"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "フィード URL"
@@ -389,7 +415,7 @@ msgstr "フィルタリング式"
#: src/components/header/ProfileMenu.tsx
msgid "Font size"
msgstr ""
msgstr "フォントサイズ"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
@@ -399,9 +425,9 @@ msgstr "フィードの強制フェッチはまだ利用できません。"
msgid "Forgot password?"
msgstr "パスワードをお忘れですか?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "最初にプロファイルでAPIキーを生成します。"
@@ -409,9 +435,9 @@ msgstr "最初にプロファイルでAPIキーを生成します。"
msgid "Generate new API key"
msgstr "新しいAPIキーを生成する"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "生成されたフィードURL"
@@ -432,26 +458,30 @@ msgstr "APIドキュメントに移動します。"
msgid "Goodies"
msgstr "グッズ"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr ""
msgstr "グレープ"
#: src/components/settings/DisplaySettings.tsx
msgid "Gray"
msgstr ""
msgstr "グレー"
#: src/components/settings/DisplaySettings.tsx
msgid "Green"
msgstr ""
msgstr "グリーン"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "ID"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "空でない場合は、'true' または 'false' に評価される式。 'false' の場合、このフィードの新しいエントリーは自動的に既読としてマークされます。"
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "エントリーが画面に完全に収まらない場合"
@@ -470,15 +500,23 @@ msgstr "展開ビューでエントリーをスクロールすると、それら
#: src/components/settings/DisplaySettings.tsx
msgid "Indigo"
msgstr ""
msgstr "インディゴ"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "初期設定"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "無効なパスワードリセットリンクです。新しいリンクをリクエストしてください。"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "未読のままにする"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "キーボードショートカット"
@@ -504,17 +542,17 @@ msgstr "ライト"
#: src/components/settings/DisplaySettings.tsx
msgid "Lime"
msgstr ""
msgstr "ライム"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "リンク"
#: src/components/settings/CustomCodeSettings.tsx
msgid "Link to the documentation"
msgstr ""
msgstr "ドキュメントへのリンク"
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
@@ -532,9 +570,8 @@ msgstr "サブスクリプションを読み込んでいます..."
msgid "Loading tags..."
msgstr "タグを読み込んでいます..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "ログイン"
@@ -546,8 +583,8 @@ msgstr "ログアウト"
msgid "Long press"
msgstr "長押し"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "ユーザーの管理"
@@ -555,21 +592,25 @@ msgstr "ユーザーの管理"
msgid "Mark all as read"
msgstr "すべて既読にする"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "すべてのエントリーを既読にする"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "既読にする"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "ここまで既読にする"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "この日数経過後に、このフィードのエントリを既読としてマークします。無効にするには空のままにしてください。"
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "メトリックス"
@@ -586,15 +627,15 @@ msgstr "ページを下に移動"
msgid "Move the page up"
msgstr "ページを上に移動"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "該当なし"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "名前"
@@ -604,9 +645,8 @@ msgstr "名前を入力してサブスクリプションに移動します"
#: src/components/settings/DisplaySettings.tsx
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr ""
msgstr "すべてのエントリーを既読にするとき、未読エントリーのある次のカテゴリ/フィードに移動する"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "しない"
@@ -615,12 +655,16 @@ msgstr "しない"
msgid "New password"
msgstr "新しいパスワード"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "新しいパスワード"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新順"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "次へ"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "OPML エクスポート"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPMLファイル"
@@ -728,7 +771,7 @@ msgstr "OPMLファイルは必要です"
#: src/components/settings/DisplaySettings.tsx
msgid "Orange"
msgstr ""
msgstr "オレンジ"
#: src/pages/app/AboutPage.tsx
msgid "Order"
@@ -742,28 +785,31 @@ msgstr "親"
msgid "Parent Category"
msgstr "親カテゴリ"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "パスワード"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "パスワードは {minimumPasswordLength} 文字以上である必要があります"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "パスワード回復"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "パスワードが一致しません"
#: src/components/settings/DisplaySettings.tsx
msgid "Pink"
msgstr ""
msgstr "ピンク"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "位置"
@@ -773,22 +819,47 @@ msgstr "前へ"
#: src/components/settings/DisplaySettings.tsx
msgid "Primary color"
msgstr ""
msgstr "プライマリカラー"
#: src/pages/app/SettingsPage.tsx
msgid "Profile"
msgstr "プロフィール"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "プッシュ通知サービス"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "プッシュ通知"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "ユーザー設定でプッシュ通知が設定されていません。"
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "この CommaFeed インスタンスではプッシュ通知が有効になっていません。"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "プッシュ通知を受け取る"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "新しいフィードエントリが発見されたときにプッシュ通知を受け取ります。通知を受け取りたい各フィードの設定で「プッシュ通知を受け取る」を有効にしてください。"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "パスワードの回復"
#: src/components/settings/DisplaySettings.tsx
msgid "Red"
msgstr ""
msgstr "レッド"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "リフレッシュ"
@@ -796,20 +867,24 @@ msgstr "リフレッシュ"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "このCommaFeedインスタンスの登録は終了しています"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "パスワードをリセット"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "右クリック"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "保存"
@@ -825,24 +900,22 @@ msgstr "エントリー間を移動するときにスムーズにスクロール
msgid "Scrolling"
msgstr "スクロール"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "検索"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "検索には少なくとも3文字が必要です"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr ""
msgstr "次の未読フィード/カテゴリを選択"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select previous unread feed/category"
msgstr ""
msgstr "前の未読フィード/カテゴリを選択"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "サーバーURL"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
@@ -868,8 +941,6 @@ msgstr "シェア"
msgid "Sharing sites"
msgstr "共有サイト"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -918,9 +989,8 @@ msgstr "未読数をタブのアイコンに表示する"
msgid "Show unread count in tab title"
msgstr "未読数をタブのタイトルに表示する"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "サインアップ"
@@ -928,26 +998,24 @@ msgstr "サインアップ"
msgid "Something bad just happened..."
msgstr "何か悪いことが起きました..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Space"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "スター"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "スター付き"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "購読する"
@@ -979,14 +1047,21 @@ msgstr "ライトテーマに切り替え"
msgid "System"
msgstr "システム"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "タグ"
#: src/components/settings/DisplaySettings.tsx
msgid "Teal"
msgstr ""
msgstr "ティール"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "テスト"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "テスト通知が正常に送信されました。"
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -996,9 +1071,18 @@ msgstr "購読したいフィードのURL。ウェブサイトのURLを直接使
msgid "Theme"
msgstr "テーマ"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "このフィードには、編集できず適用もされない古い形式のフィルタがあります。新しい式エディタを使用してフィルタを再作成してください。古いフィルタ式は次のとおりでした: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "これはあなたのAPIキーです。いくつかの読み取り専用API操作に使用できます。これにより、Fever APIへのアクセスが可能になります。ページの下部のフォームを使用して新しいAPIキーを生成します。"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "これはあなたのAPIキーです。一部の読み取り専用API操作に使用でき、Fever APIおよびGoogle Reader APIへのアクセスを許可します。新しいAPIキーを生成するには、ページ下部のフォームを使用してください"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "この設定により、一部のブラウザ(Safari など)でスクロールの問題が発生する可能性があります。"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "サイドバーを切り替える"
msgid "Toggle starred status of current entry"
msgstr "現在のエントリーのスターステータスを切り替える"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "トピック"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "デモアカウントでCommaFeedを試す: demo/demo"
@@ -1024,29 +1112,31 @@ msgstr "デモを試す!"
msgid "Unread"
msgstr "未読"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "スターを外す"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "退会"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "ユーザーキー"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "ユーザー名"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "ユーザー名またはメールアドレス"
#: src/components/settings/DisplaySettings.tsx
msgid "Violet"
msgstr ""
msgstr "バイオレット"
#: src/components/Alert.tsx
msgid "Warning"
@@ -1056,9 +1146,13 @@ msgstr "警告"
msgid "Website"
msgstr "ウェブサイト"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "ようこそ!CommaFeedを初めて実行するようです。開始するには管理者アカウントを作成してください。"
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""
msgstr "イエロー"
#: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
@@ -1067,3 +1161,7 @@ msgstr "まだサブスクリプションがありません。上部の + 記号
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "フィードの更新がキューに登録されました。"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "パスワードが変更されました。新しいパスワードでログインできます。"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed é um projeto de código abrto. O código está hospedado no </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>Sintaxe completa disponível </0><1>aqui</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Tem uma conta?</0><1>Faça login!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Olá,</0><1>eu sou Jérémie da Bélgica e venho trabalhando no Comma
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Precisa de uma conta?</0><1>Inscreva-se!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "Sobre"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Token de acesso"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Ações"
@@ -54,21 +54,24 @@ msgstr "Adicionar categoria"
msgid "Add user"
msgstr "Adicionar usuário"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Administrador"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Nome de usuário do administrador"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Todos"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Sempre"
@@ -93,6 +96,14 @@ msgstr "Aviso"
msgid "API key"
msgstr "chave de API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "Token de API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Token do aplicativo"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Tem certeza de que deseja excluir a categoria <0>{categoryName}</0>?"
@@ -122,14 +133,15 @@ msgid "Asc"
msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "As variáveis ​​disponíveis são 'título', 'conteúdo', 'url' 'autor' e 'categorias' e seu conteúdo é convertido em letras minúsculas para facilitar a comparação de strings."
msgid "Auto-mark as read"
msgstr "Marcar automaticamente como lido"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Voltar"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Voltar para logar"
@@ -137,39 +149,40 @@ msgstr "Voltar para logar"
msgid "Blue"
msgstr "Azul"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Extensão do navegador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Extensão para o Chrome necessária"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Extensão do navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Aba do navegador"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Crie uma expressão de filtro para indicar o que você deseja ler. As entradas que não corresponderem serão marcadas como lidas automaticamente."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Cancelar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Categoria"
@@ -197,6 +210,10 @@ msgstr "Extensão de navegador CommaFeed versão {browserExtensionVersion}."
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed é compatível com a API Fever. Use a URL a seguir no seu aplicativo móvel compatível com Fever. Entre com seu nome de usuário e sua <0>chave de API</0>."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed é compatível com a API Google Reader. Use a URL a seguir no seu aplicativo móvel compatível com Google Reader. Entre com seu nome de usuário e sua <0>chave de API</0>."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed próximo item não lido"
@@ -209,11 +226,11 @@ msgstr "CommaFeed versão {version} ({revision})."
msgid "Compact"
msgstr "Compacto"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Confirmar"
@@ -221,10 +238,18 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirmar senha"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Aconchegante"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Criar conta de administrador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -249,8 +274,8 @@ msgstr "Código JS personalizado que será executado ao carregar a página"
msgid "Cyan"
msgstr "Ciano"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Escuro"
@@ -258,11 +283,14 @@ msgstr "Escuro"
msgid "Date created"
msgstr "Data de criação"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "dias"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Excluir"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Excluir conta"
@@ -283,14 +311,18 @@ msgstr "Desc"
msgid "Detailed"
msgstr "Detalhado"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Desativar o comportamento do navegador \"Puxar para atualizar\""
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Exibir"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Doar"
@@ -302,15 +334,14 @@ msgstr "Baixar"
msgid "Drag link to bookmark bar"
msgstr "Arraste o link para a barra de favoritos"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "E-mail"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "Endereço de e-mail"
@@ -319,8 +350,8 @@ msgstr "Endereço de e-mail"
msgid "Edit user"
msgstr "Editar usuário"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Ativado"
@@ -344,10 +375,6 @@ msgstr "Cabeçalho das entredas"
msgid "Error"
msgstr "Erro"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Exemplo: {exemplo}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Expandido"
@@ -356,8 +383,8 @@ msgstr "Expandido"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Exporte suas inscrições e categorias como um arquivo OPML que pode ser importado em outros serviços de leitura de feed"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Opções da extensão"
@@ -365,9 +392,8 @@ msgstr "Opções da extensão"
msgid "Feed name"
msgstr "Nome do feed"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "URL do feed"
@@ -399,9 +425,9 @@ msgstr "Forçar a atualização de feeds não está disponível."
msgid "Forgot password?"
msgstr "Esqueceu a senha?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Gere uma chave de API em seu perfil primeiro."
@@ -409,9 +435,9 @@ msgstr "Gere uma chave de API em seu perfil primeiro."
msgid "Generate new API key"
msgstr "Gerar nova chave de API"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "URL do feed gerado"
@@ -432,6 +458,14 @@ msgstr "Vá para a documentação da API."
msgid "Goodies"
msgstr "Brindes"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr "Uva"
@@ -448,10 +482,6 @@ msgstr "Verde"
msgid "Id"
msgstr "ID"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Se não estiver vazio, uma expressão avaliada como 'true' ou 'false'. "
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "Se a entrafa não couber por completo na tela"
@@ -472,13 +502,21 @@ msgstr "Na visualização expandida, rolar pelas entradas marca-as como lidas"
msgid "Indigo"
msgstr "Índigo"
#: src/components/content/FeedEntryFooter.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Configuração inicial"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Link de redefinição de senha inválido. Solicite um novo."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Manter não lido"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Atalhos de teclado"
@@ -506,9 +544,9 @@ msgstr "Claro"
msgid "Lime"
msgstr "Lima"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Link"
@@ -532,9 +570,8 @@ msgstr "Carregando assinaturas..."
msgid "Loading tags..."
msgstr "Carregando tags..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Entrar"
@@ -546,8 +583,8 @@ msgstr "Sair"
msgid "Long press"
msgstr "Pressione e segure"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Gerenciar usuários"
@@ -555,21 +592,25 @@ msgstr "Gerenciar usuários"
msgid "Mark all as read"
msgstr "Marcar todos como lidos"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Marcar todas as entradas como lidas"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Marcar como lido"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Marcar como lido até aqui"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Marcar as entradas neste feed como lidas após este número de dias. Deixe vazio para desativar."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Métricas"
@@ -586,15 +627,15 @@ msgstr "Mova a página para baixo"
msgid "Move the page up"
msgstr "Mover a página para cima"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "N/D"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Nome"
@@ -606,7 +647,6 @@ msgstr "Navegue até uma assinatura digitando seu nome"
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr "Navegar para a próxima categoria/feed com entradas não lidas quando todas as entrafas forem lidas"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Nunca"
@@ -615,12 +655,16 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nova senha"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Nova senha"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Mais novo primeiro"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Próximo"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "Exportação OPML"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "Arquivo OPML"
@@ -742,19 +785,22 @@ msgstr "Pai"
msgid "Parent Category"
msgstr "Categoria Pai"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Senha"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "A senha deve ter pelo menos {minimumPasswordLength} caracteres"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperação de Senha"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Senhas não coincidem"
@@ -762,8 +808,8 @@ msgstr "Senhas não coincidem"
msgid "Pink"
msgstr "Rosa"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Posição"
@@ -779,6 +825,31 @@ msgstr "Cor primária"
msgid "Profile"
msgstr "Perfil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Serviço de notificação push"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Notificações push"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "As notificações push não estão configuradas nas suas configurações de usuário."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "As notificações push não estão ativadas nesta instância do CommaFeed."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Receber notificações push"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Receba notificações push quando novas entradas de feed forem descobertas. Ative \"Receber notificações push\" nas configurações de cada feed para o qual deseja receber notificações."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Recuperar senha"
@@ -787,8 +858,8 @@ msgstr "Recuperar senha"
msgid "Red"
msgstr "Vermelho"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Atualizar"
@@ -796,20 +867,24 @@ msgstr "Atualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Os registros estão fechados nesta instância do CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Redefinir senha"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Clique com o botão direito"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Salvar"
@@ -825,17 +900,11 @@ msgstr "Rolar suavemente ao navegar entre as entradas"
msgid "Scrolling"
msgstr "Deslizar"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Pesquisar"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "Pesquisa requer pelo menos 3 caracteres"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr "Selecionar próximo feed/categoria não lido"
@@ -844,6 +913,10 @@ msgstr "Selecionar próximo feed/categoria não lido"
msgid "Select previous unread feed/category"
msgstr "Selecionar feed/categoria não lido anterior"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "URL do servidor"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
msgstr "Definir o foco na próxima entrada sem abri-la"
@@ -868,8 +941,6 @@ msgstr "Compartilhar"
msgid "Sharing sites"
msgstr "Compartilhando sites"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -918,9 +989,8 @@ msgstr "Mostrar contagem de não lidos no favion da aba"
msgid "Show unread count in tab title"
msgstr "Mostrar contagem de não lidos no título da aba"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Inscreva-se"
@@ -928,26 +998,24 @@ msgstr "Inscreva-se"
msgid "Something bad just happened..."
msgstr "Algo ruim acabou de acontecer..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Espaço"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Estrela"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Com estrela"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Assinar"
@@ -979,7 +1047,6 @@ msgstr "Mudar para tema claro"
msgid "System"
msgstr "Sistema"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Etiquetas"
@@ -988,6 +1055,14 @@ msgstr "Etiquetas"
msgid "Teal"
msgstr "Azul petróleo"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Teste"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Notificação de teste enviada com sucesso."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "A URL do feed que você deseja assinar. "
@@ -996,9 +1071,18 @@ msgstr "A URL do feed que você deseja assinar. "
msgid "Theme"
msgstr "Tema"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Este feed tem um filtro legado que não pode ser editado e não é aplicado. Recrie o filtro usando o novo editor de expressões. A expressão do filtro legado era: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Esta é sua chave de API. Ela pode ser usada para algumas operações somente leitura da API e concede acesso à API do Fever. Use o formulário abaixo para gerar uma nova chave de API"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Esta é sua chave de API. Ela pode ser usada para algumas operações de API somente leitura e concede acesso à API Fever e à API Google Reader. Use o formulário na parte inferior da página para gerar uma nova chave de API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Esta configuração pode causar problemas de rolagem em alguns navegadores (ex: Safari)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Alternar barra lateral"
msgid "Toggle starred status of current entry"
msgstr "Alternar estrela da entrada atual"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Tópico"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Experimente o CommaFeed com a conta demo: demo/demo"
@@ -1024,22 +1112,24 @@ msgstr "Teste o demo!"
msgid "Unread"
msgstr "Não lido"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Desestrelar"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Cancelar inscrição"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Chave do usuário"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nome de usuário"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Nome de usuário ou e-mail"
@@ -1056,6 +1146,10 @@ msgstr "Aviso"
msgid "Website"
msgstr "Site"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Bem-vindo! Esta parece ser a primeira vez que você está executando o CommaFeed. Crie uma conta de administrador para começar."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Amarelo"
@@ -1067,3 +1161,7 @@ msgstr "Você ainda não tem nenhuma assinatura. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Seus feed foram enfileirados para atualização"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Sua senha foi alterada. Agora você pode fazer login com sua nova senha."

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed - это проект с открытым исходным кодом. Исходный код доступен по адресу </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>Полный синтаксис доступен </0><1>здесь</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Есть аккаунт?</0><1>Войти!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Здравствуйте,</0><1>Я Жереми из Бельгии,
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Нужен аккаунт?</0><1>Зарегистрируйтесь!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "О CommaFeed"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Токен доступа"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Действия"
@@ -54,21 +54,24 @@ msgstr "Добавить категорию"
msgid "Add user"
msgstr "Добавить пользователя"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Админ"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Имя администратора"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Все"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "Всегда"
@@ -93,6 +96,14 @@ msgstr "Объявление"
msgid "API key"
msgstr "Ключ API"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "API токен"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Токен приложения"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "Вы уверены, что хотите удалить категорию <0>{categoryName}</0>?"
@@ -122,54 +133,56 @@ msgid "Asc"
msgstr "По возрастанию"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Доступными переменными являются «заголовок», «контент», «url», «автор» и «категории», и их содержимое преобразуется в нижний регистр для облегчения сравнения строк."
msgid "Auto-mark as read"
msgstr "Автоматически помечать как прочитанное"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Назад"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Вернуться к входу"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr ""
msgstr "Синий"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Расширение для браузера"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Для браузера Chrome требуется расширение"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Расширение для браузера"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
msgstr "Вкладка браузера"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Создайте выражение фильтра, чтобы указать, что вы хотите читать. Записи, которые не соответствуют выражению, будут автоматически помечены как прочитанные."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "Отмена"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Категория"
@@ -187,7 +200,7 @@ msgstr "Закрыть меню"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}."
@@ -197,6 +210,10 @@ msgstr "Версия расширения браузера CommaFeed {browserExt
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed совместим с API Fever. Используйте следующий URL-адрес в мобильном клиенте, совместимом с Fever. Войдите в систему, указав свое имя пользователя и <0>API-ключ</0>."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed совместим с API Google Reader. Используйте следующий URL-адрес в мобильном клиенте, совместимом с Google Reader. Войдите в систему, указав свое имя пользователя и <0>API-ключ</0>."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed следующий непрочитанный элемент"
@@ -209,11 +226,11 @@ msgstr "CommaFeed версии {version} ({revision})."
msgid "Compact"
msgstr "Компактный"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Подтвердить"
@@ -221,10 +238,18 @@ msgstr "Подтвердить"
msgid "Confirm password"
msgstr "Подтвердить пароль"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Подтвердите пароль"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Уютно"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Создать учетную запись администратора"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -247,10 +272,10 @@ msgstr "Пользовательский JS-код, который будет в
#: src/components/settings/DisplaySettings.tsx
msgid "Cyan"
msgstr ""
msgstr "Голубой"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "Темная"
@@ -258,11 +283,14 @@ msgstr "Темная"
msgid "Date created"
msgstr "Дата создания"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "дней"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Удалить"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Удалить учетную запись"
@@ -283,14 +311,18 @@ msgstr "По убыванию"
msgid "Detailed"
msgstr "Подробно"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Отключить поведение браузера «Потяните для обновления»"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Отображение"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "Пожертвование"
@@ -302,15 +334,14 @@ msgstr "Скачать"
msgid "Drag link to bookmark bar"
msgstr "Перетащите ссылку на панель закладок"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "Электронная почта"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "Адрес электронной почты"
@@ -319,8 +350,8 @@ msgstr "Адрес электронной почты"
msgid "Edit user"
msgstr "Редактировать пользователя"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Включено"
@@ -334,20 +365,16 @@ msgstr "Введите текущий пароль, чтобы изменить
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
msgstr "Количество записей, которые должны оставаться над выбранной записью при прокрутке"
#: src/components/settings/DisplaySettings.tsx
msgid "Entry headers"
msgstr ""
msgstr "Заголовки записей"
#: src/components/Alert.tsx
msgid "Error"
msgstr "Ошибка"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Пример: {пример}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Расширенный"
@@ -356,8 +383,8 @@ msgstr "Расширенный"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Экспортируйте свои подписки и категории в виде файла OPML, который можно импортировать в другие службы чтения каналов."
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Параметры расширения"
@@ -365,9 +392,8 @@ msgstr "Параметры расширения"
msgid "Feed name"
msgstr "Имя фида"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "URL-адрес фида"
@@ -389,19 +415,19 @@ msgstr "Выражение фильтрации"
#: src/components/header/ProfileMenu.tsx
msgid "Font size"
msgstr ""
msgstr "Размер шрифта"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
msgstr "Принудительное получение фидов пока недоступно."
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Забыли пароль?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Сначала сгенерируйте ключ API в своем профиле."
@@ -409,9 +435,9 @@ msgstr "Сначала сгенерируйте ключ API в своем пр
msgid "Generate new API key"
msgstr "Создать новый ключ API"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "Сгенерированный URL фида"
@@ -432,26 +458,30 @@ msgstr "Перейдите к документации по API."
msgid "Goodies"
msgstr "Сладости"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr ""
msgstr "Виноградный"
#: src/components/settings/DisplaySettings.tsx
msgid "Gray"
msgstr ""
msgstr "Серый"
#: src/components/settings/DisplaySettings.tsx
msgid "Green"
msgstr ""
msgstr "Зеленый"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "Идентификатор"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Если не пусто, то выражение, оценивающееся как 'true' или 'false'. Если false, то новые записи для этой ленты будут автоматически помечаться как прочитанные."
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "Если запись не помещается на экране полностью"
@@ -470,15 +500,23 @@ msgstr "В развернутом виде прокрутка записей п
#: src/components/settings/DisplaySettings.tsx
msgid "Indigo"
msgstr ""
msgstr "Индиго"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Начальная настройка"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Неверная ссылка для сброса пароля. Пожалуйста, запросите новую."
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Оставить непрочитанным"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Сочетания клавиш"
@@ -504,17 +542,17 @@ msgstr "Светлая"
#: src/components/settings/DisplaySettings.tsx
msgid "Lime"
msgstr ""
msgstr "Лаймовый"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Ссылка"
#: src/components/settings/CustomCodeSettings.tsx
msgid "Link to the documentation"
msgstr ""
msgstr "Ссылка на документацию"
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
@@ -532,9 +570,8 @@ msgstr "Загрузка подписок..."
msgid "Loading tags..."
msgstr "Загрузка тегов..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Войти"
@@ -546,8 +583,8 @@ msgstr "Выйти"
msgid "Long press"
msgstr "Долгое нажатие"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Управление пользователями"
@@ -555,21 +592,25 @@ msgstr "Управление пользователями"
msgid "Mark all as read"
msgstr "Отметить все как прочитанное"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Отметить все записи как прочитанные"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Отметить как прочитанное"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Отметить как прочитанное до этого места"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Помечать записи в этом фиде как прочитанные через указанное количество дней. Оставьте пустым, чтобы отключить."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Метрики"
@@ -586,15 +627,15 @@ msgstr "Переместить страницу вниз"
msgid "Move the page up"
msgstr "Переместить страницу вверх"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "Н/Д"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "Имя"
@@ -604,9 +645,8 @@ msgstr "Перейдите к подписке, введя ее имя."
#: src/components/settings/DisplaySettings.tsx
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr ""
msgstr "Переходить к следующей категории/фиду с непрочитанными записями при пометке всех записей как прочитанных"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "Никогда"
@@ -615,12 +655,16 @@ msgstr "Никогда"
msgid "New password"
msgstr "Новый пароль"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Новый пароль"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Сначала новые"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Следующий"
@@ -638,7 +682,7 @@ msgstr "Записей больше нет"
#: src/components/content/ShareButtons.tsx
msgid "No sharing options available."
msgstr ""
msgstr "Нет доступных вариантов для обмена."
#: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found"
@@ -650,11 +694,11 @@ msgstr "Сначала самые старые"
#: src/components/settings/DisplaySettings.tsx
msgid "On desktop"
msgstr ""
msgstr "На ПК"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile"
msgstr ""
msgstr "На телефоне"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen"
@@ -662,7 +706,7 @@ msgstr "На мобильных устройствах отображать кн
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
msgstr "Применяется только к компактному, уютному и подробному режимам"
#: src/pages/ErrorPage.tsx
msgid "Oops!"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "Экспорт OPML"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPML файл"
@@ -728,7 +771,7 @@ msgstr "Необходим файл OPML"
#: src/components/settings/DisplaySettings.tsx
msgid "Orange"
msgstr ""
msgstr "Оранжевый"
#: src/pages/app/AboutPage.tsx
msgid "Order"
@@ -742,28 +785,31 @@ msgstr "Родительский"
msgid "Parent Category"
msgstr "Родительская категория"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Пароль"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Пароль должен содержать не менее {minimumPasswordLength} символов"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Восстановление пароля"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Пароли не совпадают"
#: src/components/settings/DisplaySettings.tsx
msgid "Pink"
msgstr ""
msgstr "Розовый"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Позиция"
@@ -773,22 +819,47 @@ msgstr "Предыдущий"
#: src/components/settings/DisplaySettings.tsx
msgid "Primary color"
msgstr ""
msgstr "Основной цвет"
#: src/pages/app/SettingsPage.tsx
msgid "Profile"
msgstr "Профиль"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Служба пуш-уведомлений"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Пуш-уведомления"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Пуш-уведомления не настроены в ваших пользовательских настройках."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Пуш-уведомления не включены в этом экземпляре CommaFeed."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Получать пуш-уведомления"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Получайте пуш-уведомления при обнаружении новых записей в фиде. Включите «Получать пуш-уведомления» в настройках каждого фида, для которого вы хотите получать уведомления."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Восстановить пароль"
#: src/components/settings/DisplaySettings.tsx
msgid "Red"
msgstr ""
msgstr "Красный"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Обновить"
@@ -796,20 +867,24 @@ msgstr "Обновить"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Регистрация закрыта для этого экземпляра CommaFeed."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Сброс пароля"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Правый клик"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Сохранить"
@@ -825,24 +900,22 @@ msgstr "Плавная прокрутка при переходе между з
msgid "Scrolling"
msgstr "Прокрутка"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Поиск"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "Для поиска требуется не менее 3 символов"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr ""
msgstr "Выбрать следующий непрочитанный фид/категорию"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select previous unread feed/category"
msgstr ""
msgstr "Выбрать предыдущий непрочитанный фид/категорию"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "URL сервера"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
@@ -868,8 +941,6 @@ msgstr "Поделиться"
msgid "Sharing sites"
msgstr "Обмен сайтами"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -892,7 +963,7 @@ msgstr "Показать меню входа (телефон)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon"
msgstr ""
msgstr "Показывать значок внешней ссылки"
#: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries"
@@ -908,19 +979,18 @@ msgstr "Показать родное меню (ПК)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show star icon"
msgstr ""
msgstr "Показывать значок звезды"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
msgstr "Показывать количество непрочитанных во вкладке favicon"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
msgstr "Показывать количество непрочитанных в заголовке вкладки"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Зарегистрироваться"
@@ -928,26 +998,24 @@ msgstr "Зарегистрироваться"
msgid "Something bad just happened..."
msgstr "Только что случилось что-то плохое..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Пробел"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "В избранное"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Избранное"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Подписаться"
@@ -979,14 +1047,21 @@ msgstr "Переключиться на светлую тему"
msgid "System"
msgstr "Системная"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Теги"
#: src/components/settings/DisplaySettings.tsx
msgid "Teal"
msgstr ""
msgstr "Бирюзовый"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Тест"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Тестовое уведомление успешно отправлено."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -996,9 +1071,18 @@ msgstr "URL канала, на который вы хотите подписат
msgid "Theme"
msgstr "Тема"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Этот фид имеет устаревший фильтр, который нельзя редактировать и который не применяется. Пожалуйста, создайте фильтр заново, используя новый редактор выражений. Устаревшее выражение фильтра было: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "Это ваш ключ API. Он может использоваться для некоторых операций API только для чтения и предоставляет доступ к API Fever. Чтобы сгенерировать новый ключ API, воспользуйтесь формой в нижней части страницы"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Это ваш ключ API. Он может использоваться для некоторых операций API только для чтения и предоставляет доступ к API Fever и API Google Reader. Используйте форму внизу страницы, чтобы сгенерировать новый ключ API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Этот параметр может вызвать проблемы с прокруткой в некоторых браузерах (например, Safari)"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "Переключить боковую панель"
msgid "Toggle starred status of current entry"
msgstr "Переключение статуса избранное для текущей записи"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Тема"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Попробуйте CommaFeed на демо аккаунте: demo/demo"
@@ -1024,29 +1112,31 @@ msgstr "Попробуйте демо-версию!"
msgid "Unread"
msgstr "Не прочитано"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Удалить из избранного"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Отписаться"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Ключ пользователя"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Имя пользователя"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Имя пользователя или адрес электронной почты"
#: src/components/settings/DisplaySettings.tsx
msgid "Violet"
msgstr ""
msgstr "Фиолетовый"
#: src/components/Alert.tsx
msgid "Warning"
@@ -1056,9 +1146,13 @@ msgstr "Предупреждение"
msgid "Website"
msgstr "Веб-сайт"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Добро пожаловать! Похоже, вы запускаете CommaFeed в первый раз. Пожалуйста, создайте учетную запись администратора, чтобы начать работу."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""
msgstr "Желтый"
#: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
@@ -1067,3 +1161,7 @@ msgstr "У вас еще нет подписок. Почему бы не поп
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ваши каналы были поставлены в очередь на обновление."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Ваш пароль был изменен. Теперь вы можете войти с новым паролем."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed açık kaynak kodlu bir proje. Kaynak kodları </0><1>GitHub</1>'da."
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>Tüm sözdizimi </0><1>burada</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>Hesabınız var mı?</0><1>Giriş yapın!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>Merhaba,</0><1>Ben Belçika'dan Jérémie ve 10 yıldır boş zamanla
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>Bir hesaba mı ihtiyacınız var?</0><1>Kaydolun!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "Hakkında"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "Erişim jetonu"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Eylemler"
@@ -54,24 +54,27 @@ msgstr "Kategori ekle"
msgid "Add user"
msgstr "Kullanıcı ekle"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "Yönetici"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "Yönetici kullanıcı adı"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "Tümü"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr ""
msgstr "Her zaman"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "An email has been sent if this address was registered. Check your inbox."
@@ -93,6 +96,14 @@ msgstr "Duyuru"
msgid "API key"
msgstr "API anahtarı"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "API jetonu"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "Uygulama jetonu"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "<0>{categoryName}</0> kategorisini silmek istediğinizden emin misiniz?"
@@ -122,54 +133,56 @@ msgid "Asc"
msgstr "Artan"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "Mevcut değişkenler 'title', 'content', 'url' 'yazar' ve 'kategoriler'dir ve dize karşılaştırmasını kolaylaştırmak için içerikleri küçük harfe dönüştürülür."
msgid "Auto-mark as read"
msgstr "Otomatik olarak okundu olarak işaretle"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "Geri"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Giriş yapmak için geri dön"
#: src/components/settings/DisplaySettings.tsx
msgid "Blue"
msgstr ""
msgstr "Mavi"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Tarayıcı eklentisi"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Tarayıcı eklentisi"
msgstr "Chrome için tarayıcı eklentisi gereklidir"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
msgstr "Tarayıcı sekmesi"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "Ne okumak istediğinizi belirtmek için bir filtre ifadesi oluşturun. Eşleşmeyen girişler otomatik olarak okundu olarak işaretlenecektir."
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "İptal"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Kategori"
@@ -183,11 +196,11 @@ msgstr "Feed'in çalışıp çalışmadığını kontrol edin"
#: src/pages/app/Layout.tsx
msgid "Close menu"
msgstr ""
msgstr "Menüyü kapat"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}."
@@ -195,7 +208,11 @@ msgstr "CommaFeed tarayıcı eklentisi sürüm {browserExtensionVersion}."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr ""
msgstr "CommaFeed, Fever API ile uyumludur. Fever uyumlu mobil istemcinizde aşağıdaki URL'yi kullanın. Kullanıcı adınız ve <0>API anahtarınız</0> ile giriş yapın."
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed, Google Reader API ile uyumludur. Google Reader uyumlu mobil istemcinizde aşağıdaki URL'yi kullanın. Kullanıcı adınız ve <0>API anahtarınız</0> ile giriş yapın."
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
@@ -209,11 +226,11 @@ msgstr "CommaFeed sürüm {version} ({revision})."
msgid "Compact"
msgstr "Kompakt"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "Onayla"
@@ -221,10 +238,18 @@ msgstr "Onayla"
msgid "Confirm password"
msgstr "Şifreyi onayla"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Şifreyi Onayla"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Rahat"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "Yönetici Hesabı Oluştur"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -247,22 +272,25 @@ msgstr "Sayfa yüklendiğinde çalıştırılacak özel JS kodu"
#: src/components/settings/DisplaySettings.tsx
msgid "Cyan"
msgstr ""
msgstr "Macenta"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr ""
msgstr "Koyu"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Date created"
msgstr "Oluşturulma tarihi"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "gün"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "Sil"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "Hesabı sil"
@@ -281,18 +309,22 @@ msgstr "Açılış"
#: src/components/header/ProfileMenu.tsx
msgid "Detailed"
msgstr ""
msgstr "Detaylı"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "Tarayıcının \"Yenilemek için çek\" davranışını devre dışı bırak"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "Ekran"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr ""
msgstr "Bağış Yap"
#: src/components/settings/ProfileSettings.tsx
msgid "Download"
@@ -302,15 +334,14 @@ msgstr "İndir"
msgid "Drag link to bookmark bar"
msgstr "Bağlantıyı yer işareti çubuğuna sürükleyin"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "E-posta"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "E-posta adresi"
@@ -319,8 +350,8 @@ msgstr "E-posta adresi"
msgid "Edit user"
msgstr "Kullanıcıyı düzenle"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "Etkin"
@@ -334,20 +365,16 @@ msgstr "Profil ayarlarını değiştirmek için mevcut şifrenizi girin"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
msgstr "Kaydırma sırasında seçilen girişin üzerinde tutulacak giriş sayısı"
#: src/components/settings/DisplaySettings.tsx
msgid "Entry headers"
msgstr ""
msgstr "Giriş başlıkları"
#: src/components/Alert.tsx
msgid "Error"
msgstr "Hata"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "Örnek: {örnek}."
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "Genişletilmiş"
@@ -356,8 +383,8 @@ msgstr "Genişletilmiş"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Aboneliklerinizi ve kategorilerinizi diğer besleme okuma hizmetlerinde içe aktarılabilen bir OPML dosyası olarak dışa aktarın"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "Eklenti ayarları"
@@ -365,9 +392,8 @@ msgstr "Eklenti ayarları"
msgid "Feed name"
msgstr "Yayın adı"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "Feed URL'si"
@@ -377,11 +403,11 @@ msgstr "Tüm feed'lerimi şimdi çek"
#: src/components/settings/ProfileSettings.tsx
msgid "Fever API"
msgstr ""
msgstr "Fever API"
#: src/components/settings/ProfileSettings.tsx
msgid "Fever API URL"
msgstr ""
msgstr "Fever API URL'si"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Filtering expression"
@@ -389,19 +415,19 @@ msgstr "Filtreleme ifadesi"
#: src/components/header/ProfileMenu.tsx
msgid "Font size"
msgstr ""
msgstr "Yazı boyutu"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
msgstr "Beslemeleri zorla çekme özelliği henüz mevcut değil."
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Parolanızı mı unuttunuz?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "Önce profilinizde bir API anahtarı oluşturun."
@@ -409,9 +435,9 @@ msgstr "Önce profilinizde bir API anahtarı oluşturun."
msgid "Generate new API key"
msgstr "Yeni API anahtarı oluştur"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "Oluşturulan besleme url'si"
@@ -432,29 +458,33 @@ msgstr "API belgelerine gidin."
msgid "Goodies"
msgstr "İyilikler"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr ""
msgstr "Üzüm"
#: src/components/settings/DisplaySettings.tsx
msgid "Gray"
msgstr ""
msgstr "Gri"
#: src/components/settings/DisplaySettings.tsx
msgid "Green"
msgstr ""
msgstr "Yeşil"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "Kimlik"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Boş değilse, 'doğru' veya 'yanlış' olarak değerlendirilen bir ifade. "
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr ""
msgstr "Eğer giriş ekrana tamamen sığmıyorsa"
#: src/pages/app/AboutPage.tsx
msgid "If you encounter an issue, please report it on the issues page of the GitHub project."
@@ -470,15 +500,23 @@ msgstr "Genişletilmiş görünümde, girişler arasında gezinmek onları okund
#: src/components/settings/DisplaySettings.tsx
msgid "Indigo"
msgstr ""
msgstr "İndigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Başlangıç Kurulumu"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Geçersiz şifre sıfırlama bağlantısı. Lütfen yeni bir tane isteyin."
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "Okunmadan sakla"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "Klavye kısayolları"
@@ -500,21 +538,21 @@ msgstr "Son yenileme mesajı"
#: src/components/header/ProfileMenu.tsx
msgid "Light"
msgstr ""
msgstr "Açık"
#: src/components/settings/DisplaySettings.tsx
msgid "Lime"
msgstr ""
msgstr "Limon"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "Bağlantı"
#: src/components/settings/CustomCodeSettings.tsx
msgid "Link to the documentation"
msgstr ""
msgstr "Belgelere bağlantı"
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
@@ -532,9 +570,8 @@ msgstr "Abonelikler yükleniyor..."
msgid "Loading tags..."
msgstr "Etiketler yükleniyor..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "Giriş"
@@ -546,8 +583,8 @@ msgstr "Çıkış"
msgid "Long press"
msgstr "Uzun bas"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "Kullanıcıları yönet"
@@ -555,21 +592,25 @@ msgstr "Kullanıcıları yönet"
msgid "Mark all as read"
msgstr "Tümünü okundu olarak işaretle"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "Tüm girişleri okundu olarak işaretle"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "Okundu olarak işaretle"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "Buraya kadar okundu olarak işaretle"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "Bu beslemedeki girişleri şu kadar gün sonra okundu olarak işaretle. Devre dışı bırakmak için boş bırakın."
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Metrikler"
@@ -586,15 +627,15 @@ msgstr "Sayfayı aşağı taşı"
msgid "Move the page up"
msgstr "Sayfayı yukarı taşı"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "Yok"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "İsim"
@@ -604,23 +645,26 @@ msgstr "Adını girerek bir aboneliğe gidin"
#: src/components/settings/DisplaySettings.tsx
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr ""
msgstr "Tüm girişleri okundu olarak işaretlerken okunmamış girişleri olan bir sonraki kategoriye/beslemeye git"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr ""
msgstr "Asla"
#: src/components/settings/ProfileSettings.tsx
msgid "New password"
msgstr "Yeni şifre"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Yeni Şifre"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Önce en yenisi"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "Sonraki"
@@ -638,7 +682,7 @@ msgstr "Başka giriş yok"
#: src/components/content/ShareButtons.tsx
msgid "No sharing options available."
msgstr ""
msgstr "Paylaşım seçeneği mevcut değil."
#: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found"
@@ -650,19 +694,19 @@ msgstr "Önce en eski"
#: src/components/settings/DisplaySettings.tsx
msgid "On desktop"
msgstr ""
msgstr "Masaüstünde"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile"
msgstr ""
msgstr "Mobilde"
#: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen"
msgstr ""
msgstr "Mobilde, eylem düğmelerini ekranın altında göster"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
msgstr "Yalnızca kompakt, rahat ve detaylı modlar için geçerlidir"
#: src/pages/ErrorPage.tsx
msgid "Oops!"
@@ -695,7 +739,7 @@ msgstr "Bağlantıyı yeni sekmede aç"
#: src/pages/app/Layout.tsx
msgid "Open menu"
msgstr ""
msgstr "Menüyü aç"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Open next entry"
@@ -717,18 +761,17 @@ msgstr "OPML"
msgid "OPML export"
msgstr "OPML dışa aktarma"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPML dosyası"
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file is required"
msgstr ""
msgstr "OPML dosyası gereklidir"
#: src/components/settings/DisplaySettings.tsx
msgid "Orange"
msgstr ""
msgstr "Turuncu"
#: src/pages/app/AboutPage.tsx
msgid "Order"
@@ -742,28 +785,31 @@ msgstr "Ebeveyn"
msgid "Parent Category"
msgstr "Üst Kategori"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "Şifre"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Şifre en az {minimumPasswordLength} karakter olmalıdır"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Parola Kurtarma"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Parolalar eşleşmiyor"
#: src/components/settings/DisplaySettings.tsx
msgid "Pink"
msgstr ""
msgstr "Pembe"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "Konum"
@@ -773,22 +819,47 @@ msgstr "Önceki"
#: src/components/settings/DisplaySettings.tsx
msgid "Primary color"
msgstr ""
msgstr "Birincil renk"
#: src/pages/app/SettingsPage.tsx
msgid "Profile"
msgstr "Profil"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "Push bildirim servisi"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "Push bildirimleri"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "Push bildirimleri kullanıcı ayarlarınızda yapılandırılmamış."
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "Bu CommaFeed örneğinde push bildirimleri etkin değil."
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "Push bildirimlerini al"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "Yeni besleme girişleri keşfedildiğinde push bildirimleri alın. Bildirim almak istediğiniz her beslemenin ayarlarında \"Push bildirimlerini al\" seçeneğini etkinleştirin."
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Şifreyi kurtar"
#: src/components/settings/DisplaySettings.tsx
msgid "Red"
msgstr ""
msgstr "Kırmızı"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Yenile"
@@ -796,26 +867,30 @@ msgstr "Yenile"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Bu CommaFeed örneğinde kayıtlar kapalı"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Şifreyi Sıfırla"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Sağ tık"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "Kaydet"
#: src/components/settings/DisplaySettings.tsx
msgid "Scroll selected entry to the top of the page"
msgstr ""
msgstr "Seçilen girişi sayfanın üstüne kaydır"
#: src/components/settings/DisplaySettings.tsx
msgid "Scroll smoothly when navigating between entries"
@@ -823,26 +898,24 @@ msgstr "Girişler arasında gezinirken sorunsuz ilerleyin"
#: src/components/settings/DisplaySettings.tsx
msgid "Scrolling"
msgstr ""
msgstr "Kaydırma"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "Ara"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "Arama için en az 3 karakter gerekiyor"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr ""
msgstr "Sonraki okunmamış beslemeyi/kategoriyi seç"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select previous unread feed/category"
msgstr ""
msgstr "Önceki okunmamış beslemeyi/kategoriyi seç"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "Sunucu URL'si"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
@@ -868,8 +941,6 @@ msgstr "Paylaş"
msgid "Sharing sites"
msgstr "Siteleri paylaşma"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Vardiya"
@@ -892,7 +963,7 @@ msgstr "Giriş menüsünü göster (mobil)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon"
msgstr ""
msgstr "Harici bağlantı simgesini göster"
#: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries"
@@ -908,19 +979,18 @@ msgstr "Orijinal tarayıcı menüsünü göster (masaüstü)"
#: src/components/settings/DisplaySettings.tsx
msgid "Show star icon"
msgstr ""
msgstr "Yıldız simgesini göster"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
msgstr "Sekme simgesinde okunmamış sayısını göster"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
msgstr "Sekme başlığında okunmamış sayısını göster"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "Kaydolun"
@@ -928,26 +998,24 @@ msgstr "Kaydolun"
msgid "Something bad just happened..."
msgstr "Az önce kötü bir şey oldu..."
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "Uzay"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "Yıldız"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "Yıldızlı"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "Abone ol"
@@ -965,7 +1033,7 @@ msgstr "Başarı"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Swipe header to the left"
msgstr ""
msgstr "Başlığı sola kaydır"
#: src/pages/WelcomePage.tsx
msgid "Switch to dark theme"
@@ -977,16 +1045,23 @@ msgstr "Aydınlık temaya geç"
#: src/components/header/ProfileMenu.tsx
msgid "System"
msgstr ""
msgstr "Sistem"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "Etiketler"
#: src/components/settings/DisplaySettings.tsx
msgid "Teal"
msgstr ""
msgstr "Camgöbeği"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "Test"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "Test bildirimi başarıyla gönderildi."
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
@@ -996,9 +1071,18 @@ msgstr "Abone olmak istediğiniz beslemenin URL'si. "
msgid "Theme"
msgstr "Tema"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "Bu beslemenin düzenlenemeyen ve uygulanmayan eski bir filtresi var. Lütfen yeni ifade düzenleyiciyi kullanarak filtreyi yeniden oluşturun. Eski filtre ifadesi şuydu: <0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr ""
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "Bu, API anahtarınızdır. Bazı salt okunur API işlemleri için kullanılabilir ve Fever API ile Google Reader API'ye erişim sağlar. Yeni bir API anahtarı oluşturmak için sayfanın altındaki formu kullanın"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Bu ayar bazı tarayıcılarda (örneğin Safari) kaydırma sorunlarına neden olabilir"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1010,7 +1094,11 @@ msgstr "Kenar çubuğunu göster/gizle"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle starred status of current entry"
msgstr ""
msgstr "Geçerli girişin yıldızlı durumunu değiştir"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "Konu"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
@@ -1024,29 +1112,31 @@ msgstr "Demo'yu deneyin!"
msgid "Unread"
msgstr "Okunmamış"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "Yıldızı kaldır"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "Aboneliği iptal et"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "Kullanıcı anahtarı"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Kullanıcı adı"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "Kullanıcı Adı veya E-posta"
#: src/components/settings/DisplaySettings.tsx
msgid "Violet"
msgstr ""
msgstr "Menekşe"
#: src/components/Alert.tsx
msgid "Warning"
@@ -1056,9 +1146,13 @@ msgstr "Uyarı"
msgid "Website"
msgstr "Web sitesi"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "Hoş geldiniz! Görünüşe göre CommaFeed'i ilk kez çalıştırıyorsunuz. Başlamak için lütfen bir yönetici hesabı oluşturun."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""
msgstr "Sarı"
#: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
@@ -1067,3 +1161,7 @@ msgstr "Henüz aboneliğiniz yok. Sayfanın üstündeki + işaretiyle feed ekley
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Feed'leriniz yenileme için sıraya alındı."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Şifreniz değiştirildi. Artık yeni şifrenizle giriş yapabilirsiniz."

View File

@@ -17,10 +17,6 @@ msgstr ""
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "<0>CommaFeed是一个开源项目,源码托管在 </0><1>GitHub</1>。"
#: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
msgstr "<0>可以使用完整的语法 </0><1>详情</1><2>.</2>"
#: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>"
msgstr "<0>有帐号吗?</0><1>登录!</1>"
@@ -33,11 +29,15 @@ msgstr "<0>您好,</0><1>我是来自比利时的Jérémie,已经在业余时
msgid "<0>Need an account?</0><1>Sign up!</1>"
msgstr "<0>需要一个帐户?</0><1>注册!</1>"
#: src/pages/app/AboutPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx
msgid "About"
msgstr "关于"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Access token"
msgstr "访问令牌"
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "操作"
@@ -54,21 +54,24 @@ msgstr "添加类别"
msgid "Add user"
msgstr "添加用户"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Admin"
msgstr "管理员"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/components/header/Header.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr "管理员用户名"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "All"
msgstr "全部"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Always"
msgstr "总是"
@@ -93,6 +96,14 @@ msgstr "公告"
msgid "API key"
msgstr "API 密钥"
#: src/components/settings/PushNotificationSettings.tsx
msgid "API token"
msgstr "API 令牌"
#: src/components/settings/PushNotificationSettings.tsx
msgid "App token"
msgstr "应用令牌"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "您确定要删除类别 <0>{categoryName}</0> 吗?"
@@ -122,14 +133,15 @@ msgid "Asc"
msgstr "升序"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
msgstr "可用变量为'title'、'content'、'url'、'author'和'categories',它们的内容被转换为小写以方便字符串比较。"
msgid "Auto-mark as read"
msgstr "自动标记为已读"
#: src/components/content/add/Subscribe.tsx
msgid "Back"
msgstr "返回"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "返回登录"
@@ -137,39 +149,40 @@ msgstr "返回登录"
msgid "Blue"
msgstr "蓝"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "浏览器扩展"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "浏览器扩展"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "浏览器标签页"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/AddCategory.tsx
msgid "Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read automatically."
msgstr "构建过滤表达式以指示您想阅读的内容。不匹配的条目将被自动标记为已读。"
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Cancel"
msgstr "取消"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/AboutPage.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "类别"
@@ -197,6 +210,10 @@ msgstr "CommaFeed的浏览器扩展版本:{browserExtensionVersion}。"
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed 和 Fever API 兼容,可以在您Fever兼容的移动客户端中使用以下网址,通过用户名和<0>API密钥</0>登录。"
#: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Google Reader API. Use the following URL in your Google Reader-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "CommaFeed 和 Google Reader API 兼容,可以在您Google Reader兼容的移动客户端中使用以下网址,通过用户名和<0>API密钥</0>登录。"
#: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item"
msgstr "CommaFeed 下一个未读项目"
@@ -209,11 +226,11 @@ msgstr "CommaFeed版本:{version} ({revision})"
msgid "Compact"
msgstr "紧凑"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Confirm"
msgstr "确认"
@@ -221,10 +238,18 @@ msgstr "确认"
msgid "Confirm password"
msgstr "确认密码"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "确认密码"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "宽松"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr "创建管理员帐号"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -249,8 +274,8 @@ msgstr "将在页面加载时执行的自定义JS代码"
msgid "Cyan"
msgstr "青"
#: src/components/settings/DisplaySettings.tsx
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Dark"
msgstr "暗黑"
@@ -258,11 +283,14 @@ msgstr "暗黑"
msgid "Date created"
msgstr "创建日期"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "天"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete"
msgstr "删除"
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/ProfileSettings.tsx
msgid "Delete account"
msgstr "删除帐号"
@@ -283,14 +311,18 @@ msgstr "降序"
msgid "Detailed"
msgstr "详细"
#: src/pages/app/SettingsPage.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr "禁用浏览器的“下拉刷新”功能"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
#: src/pages/app/SettingsPage.tsx
msgid "Display"
msgstr "显示"
#: src/pages/app/DonatePage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx
msgid "Donate"
msgstr "捐赠"
@@ -302,15 +334,14 @@ msgstr "下载"
msgid "Drag link to bookmark bar"
msgstr "拖动链接到书签栏"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
msgstr "电子邮件"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address"
msgstr "电子邮件地址"
@@ -319,8 +350,8 @@ msgstr "电子邮件地址"
msgid "Edit user"
msgstr "编辑用户"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Enabled"
msgstr "已启用"
@@ -344,10 +375,6 @@ msgstr "条目头部"
msgid "Error"
msgstr "错误"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}."
msgstr "示例:{示例}。"
#: src/components/header/ProfileMenu.tsx
msgid "Expanded"
msgstr "展开"
@@ -356,8 +383,8 @@ msgstr "展开"
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "将您的订阅和类别导出为 OPML 文件,可以在其它信息流阅读服务中导入"
#: src/pages/WelcomePage.tsx
#: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx
msgid "Extension options"
msgstr "扩展选项"
@@ -365,9 +392,8 @@ msgstr "扩展选项"
msgid "Feed name"
msgstr "信息流名称"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Feed URL"
msgstr "信息流网址"
@@ -399,9 +425,9 @@ msgstr "强制获取订阅源功能不可用。"
msgid "Forgot password?"
msgstr "忘记密码?"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first."
msgstr "首先在您的配置文件中生成一个 API 密钥。"
@@ -409,9 +435,9 @@ msgstr "首先在您的配置文件中生成一个 API 密钥。"
msgid "Generate new API key"
msgstr "生成新的 API 密钥"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url"
msgstr "生成信息流网址"
@@ -432,6 +458,14 @@ msgstr "API 文档"
msgid "Goodies"
msgstr "好东西"
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API"
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "Google Reader API URL"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
msgstr "深紫"
@@ -448,10 +482,6 @@ msgstr "绿"
msgid "Id"
msgstr "序号"
#: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "如果不为空,则表达式的计算结果为“真”或“假”。如果为“假”,则此信息流的新条目将自动标记为已读。"
#: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen"
msgstr "如果条目不能完全显示在屏幕上"
@@ -472,13 +502,21 @@ msgstr "在展开视图中,滚动条目将它们标记为已读"
msgid "Indigo"
msgstr "靛蓝"
#: src/components/content/FeedEntryFooter.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "初始化设置"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "密码重置链接无效,请重新申请。"
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
msgstr "保持未读状态"
#: src/pages/app/AboutPage.tsx
#: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts"
msgstr "键盘快捷键"
@@ -506,9 +544,9 @@ msgstr "浅色"
msgid "Lime"
msgstr "浅黄"
#: src/pages/app/TagDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx
msgid "Link"
msgstr "链接"
@@ -532,9 +570,8 @@ msgstr "正在加载订阅..."
msgid "Loading tags..."
msgstr "正在加载标签..."
#: src/pages/auth/LoginPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "Log in"
msgstr "登录"
@@ -546,8 +583,8 @@ msgstr "注销"
msgid "Long press"
msgstr "长按"
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx
msgid "Manage users"
msgstr "管理用户"
@@ -555,21 +592,25 @@ msgstr "管理用户"
msgid "Mark all as read"
msgstr "全部标记为已读"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Mark all entries as read"
msgstr "将所有条目标记为已读"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read"
msgstr "标记为已读"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Mark as read up to here"
msgstr "标记为已读到这里"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Mark entries in this feed as read after this number of days. Leave empty to disable."
msgstr "在此天数后将此信息流中的条目标记为已读。留空以禁用。"
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "指标"
@@ -586,15 +627,15 @@ msgstr "下移页面"
msgid "Move the page up"
msgstr "上移页面"
#: src/pages/app/FeedDetailsPage.tsx
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
msgstr "不适用"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Name"
msgstr "​​名称"
@@ -606,7 +647,6 @@ msgstr "通过输入订阅名称导航到订阅"
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
msgstr "将所有条目标记为已读时导航到下一个包含未读条目的类别/信息流"
#: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx
msgid "Never"
msgstr "从不"
@@ -615,12 +655,16 @@ msgstr "从不"
msgid "New password"
msgstr "新密码"
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "新密码"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新的优先"
#: src/components/header/Header.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx
msgid "Next"
msgstr "下一个"
@@ -717,7 +761,6 @@ msgstr "OPML"
msgid "OPML export"
msgstr "OPML 导出"
#: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx
msgid "OPML file"
msgstr "OPML 文件"
@@ -742,19 +785,22 @@ msgstr "父类别"
msgid "Parent Category"
msgstr "父类别"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Password"
msgstr "密码"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "密码最少需要 {minimumPasswordLength} 个字符"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "密码恢复"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "密码不匹配"
@@ -762,8 +808,8 @@ msgstr "密码不匹配"
msgid "Pink"
msgstr "粉红"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Position"
msgstr "位置"
@@ -779,6 +825,31 @@ msgstr "主颜色"
msgid "Profile"
msgstr "配置文件"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notification service"
msgstr "推送通知服务"
#: src/pages/app/SettingsPage.tsx
msgid "Push notifications"
msgstr "推送通知"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Push notifications are not configured in your user settings."
msgstr "您的用户设置中未配置推送通知。"
#: src/components/ReceivePushNotificationsChechbox.tsx
#: src/components/settings/PushNotificationSettings.tsx
msgid "Push notifications are not enabled on this CommaFeed instance."
msgstr "此 CommaFeed 实例未启用推送通知。"
#: src/components/ReceivePushNotificationsChechbox.tsx
msgid "Receive push notifications"
msgstr "接收推送通知"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Receive push notifications when new feed entries are discovered. Enable \"Receive push notifications\" in the settings of each feed for which you want to receive notifications."
msgstr "当发现新的信息流条目时接收推送通知。在您希望接收通知的每个信息流设置中启用“接收推送通知”。"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "找回密码"
@@ -787,8 +858,8 @@ msgstr "找回密码"
msgid "Red"
msgstr "红"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/header/Header.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "刷新"
@@ -796,20 +867,24 @@ msgstr "刷新"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "此 CommaFeed 实例上的注册已关闭"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "重置密码"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "右键单击"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/components/settings/PushNotificationSettings.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Save"
msgstr "保存"
@@ -825,17 +900,11 @@ msgstr "在条目之间导航时平滑滚动"
msgid "Scrolling"
msgstr "滚动"
#: src/components/sidebar/TreeSearch.tsx
#: src/components/sidebar/TreeSearch.tsx
#: src/components/header/Header.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/TreeSearch.tsx
msgid "Search"
msgstr "搜索"
#: src/components/header/Header.tsx
msgid "Search requires at least 3 characters"
msgstr "搜索至少需要 3 个字符"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Select next unread feed/category"
msgstr "选择下一个未读信息流/类别"
@@ -844,6 +913,10 @@ msgstr "选择下一个未读信息流/类别"
msgid "Select previous unread feed/category"
msgstr "选择上一个未读信息流/类别"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Server URL"
msgstr "服务器网址"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it"
msgstr "将焦点放在下一个条目而不打开它"
@@ -868,8 +941,6 @@ msgstr "分享"
msgid "Sharing sites"
msgstr "共享站点"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift"
msgstr "Shift"
@@ -918,9 +989,8 @@ msgstr "在标签页图标上显示未读数量"
msgid "Show unread count in tab title"
msgstr "在标签页标题中显示未读数量"
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
msgstr "注册"
@@ -928,26 +998,24 @@ msgstr "注册"
msgid "Something bad just happened..."
msgstr "刚刚发生了不好的事情……"
#: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Space"
msgstr "空格"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Star"
msgstr "星标"
#: src/pages/app/FeedEntriesPage.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/components/sidebar/Tree.tsx
#: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedEntriesPage.tsx
msgid "Starred"
msgstr "已加星标"
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe"
msgstr "订阅"
@@ -979,7 +1047,6 @@ msgstr "切换到浅色主题"
msgid "System"
msgstr "跟随系统"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Tags"
msgstr "标签"
@@ -988,6 +1055,14 @@ msgstr "标签"
msgid "Teal"
msgstr "青绿"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test"
msgstr "测试"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Test notification sent successfully."
msgstr "测试通知发送成功。"
#: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "您要订阅的信息流的网址。您也可以直接使用网站的网址,CommaFeed 会尝试在页面中找到信息流。"
@@ -996,9 +1071,18 @@ msgstr "您要订阅的信息流的网址。您也可以直接使用网站的网
msgid "Theme"
msgstr "主题"
#. placeholder {0}: feed.filterLegacy
#: src/pages/app/FeedDetailsPage.tsx
msgid "This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using the new expression editor. The legacy filter expression was: <0>{0}</0>"
msgstr "此信息流具有无法编辑且未应用的旧版过滤器。请使用新的表达式编辑器重新创建过滤器。旧版过滤器表达式为:<0>{0}</0>"
#: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
msgstr "这是您的API 密钥,它可以被用于Fever API的只读操作及访问授权。使用页面底部的表单生成一个新的API密钥。"
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API and the Google Reader API. Use the form at the bottom of the page to generate a new API key"
msgstr "这是您的 API 密钥。它可用于某些只读 API 操作,并授予对 Fever API 和 Google Reader API 的访问权限。使用页面底部的表单生成新的 API 密钥"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "此设置在部分浏览器(例如 Safari)中可能导致滚动问题"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
@@ -1012,6 +1096,10 @@ msgstr "切换侧边栏"
msgid "Toggle starred status of current entry"
msgstr "切换当前条目的星标状态"
#: src/components/settings/PushNotificationSettings.tsx
msgid "Topic"
msgstr "主题"
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "使用演示帐户试用 CommaFeed:demo/demo"
@@ -1024,22 +1112,24 @@ msgstr "尝试 demo!"
msgid "Unread"
msgstr "未读"
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx
msgid "Unstar"
msgstr "取消星标"
#: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Unsubscribe"
msgstr "取消订阅"
#: src/components/settings/PushNotificationSettings.tsx
msgid "User key"
msgstr "用户密钥"
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "用户名"
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
msgid "User Name or E-mail"
msgstr "用户名或电子邮件"
@@ -1056,6 +1146,10 @@ msgstr "警告"
msgid "Website"
msgstr "网站"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr "欢迎!当前页仅当您第一次使用CommaFeed时出现,请创建一个管理员帐号以开始使用。"
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "黄"
@@ -1067,3 +1161,7 @@ msgstr "您还没有任何订阅。"
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "您的订阅已经进入刷新队列。"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "您的密码已更改。您现在可以使用新密码登录。"

View File

@@ -15,9 +15,10 @@ dayjs.extend(relativeTime)
dayjs.extend(duration)
const root = document.getElementById("root")
root &&
ReactDOM.createRoot(root).render(
<Provider store={store}>
<App />
</Provider>
)
if (!root) throw new Error("root element not found")
ReactDOM.createRoot(root).render(
<Provider store={store}>
<App />
</Provider>
)

View File

@@ -19,10 +19,8 @@ const shownGauges: Record<string, string> = {
"com.commafeed.backend.feed.FeedRefreshEngine.queue.size": "Feed Refresh Engine queue size",
"com.commafeed.backend.feed.FeedRefreshEngine.worker.active": "Feed Refresh Engine active HTTP workers",
"com.commafeed.backend.feed.FeedRefreshEngine.updater.active": "Feed Refresh Engine active database update workers",
"com.commafeed.backend.HttpGetter.pool.max": "HttpGetter max pool size",
"com.commafeed.backend.HttpGetter.pool.size": "HttpGetter current pool size",
"com.commafeed.backend.HttpGetter.pool.leased": "HttpGetter active connections",
"com.commafeed.backend.HttpGetter.pool.pending": "HttpGetter waiting for a connection",
"com.commafeed.backend.feed.FeedRefreshEngine.notifier.active": "Feed Refresh Engine active push notifications workers",
"com.commafeed.backend.feed.FeedRefreshEngine.notifier.queue": "Feed Refresh Engine queued push notifications workers",
"com.commafeed.backend.HttpGetter.cache.size": "HttpGetter cached entries",
"com.commafeed.backend.HttpGetter.cache.memoryUsage": "HttpGetter cache memory usage",
"com.commafeed.frontend.ws.WebSocketSessions.users": "WebSocket users",
@@ -35,10 +33,11 @@ export function MetricsPage() {
setLoading: state => ({ ...state, loading: true }),
})
const { execute } = query
useEffect(() => {
const interval = setInterval(() => query.execute(), 2000)
const interval = setInterval(() => execute(), 2000)
return () => clearInterval(interval)
}, [query.execute])
}, [execute])
if (!query.result) return <Loader />
const { meters, gauges } = query.result.data

View File

@@ -107,7 +107,7 @@ export function AboutPage() {
<List>
<List.Item>
<Anchor href={Constants.browserExtensionUrl} target="_blank" rel="noreferrer">
<Trans>Browser extention</Trans>
<Trans>Browser extension</Trans>
</Anchor>
</List.Item>
<List.Item>

View File

@@ -1,10 +1,27 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Code, Container, Divider, Group, Input, NumberInput, Stack, Text, TextInput, Title } from "@mantine/core"
import {
Anchor,
Box,
Button,
Code,
Container,
Divider,
Group,
Input,
Alert as MantineAlert,
NumberInput,
Stack,
Text,
TextInput,
Title,
} from "@mantine/core"
import { useForm } from "@mantine/form"
import { openConfirmModal } from "@mantine/modals"
import { useEffect } from "react"
import { useAsync, useAsyncCallback } from "react-async-hook"
import { TbDeviceFloppy, TbTrash } from "react-icons/tb"
import { TbAlertTriangle, TbDeviceFloppy, TbTrash } from "react-icons/tb"
import { useParams } from "react-router-dom"
import { client, errorToStrings } from "@/app/client"
import { redirectToRootCategory, redirectToSelectedSource } from "@/app/redirect/thunks"
@@ -13,46 +30,17 @@ import { reloadTree } from "@/app/tree/thunks"
import type { FeedModificationRequest } from "@/app/types"
import { Alert } from "@/components/Alert"
import { CategorySelect } from "@/components/content/add/CategorySelect"
import { FilteringExpressionEditor } from "@/components/content/edit/FilteringExpressionEditor"
import { Loader } from "@/components/Loader"
import { ReceivePushNotificationsChechbox } from "@/components/ReceivePushNotificationsChechbox"
import { RelativeDate } from "@/components/RelativeDate"
function FilteringExpressionDescription() {
const example = <Code>url.contains('youtube') or (author eq 'athou' and title.contains('github'))</Code>
return (
<div>
<div>
<Trans>
If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read
automatically.
</Trans>
</div>
<div>
<Trans>
Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case
to ease string comparison.
</Trans>
</div>
<div>
<Trans>Example: {example}.</Trans>
</div>
<div>
<Trans>
<span>Complete syntax is available </span>
<a href="https://commons.apache.org/proper/commons-jexl/reference/syntax.html" target="_blank" rel="noreferrer">
here
</a>
<span>.</span>
</Trans>
</div>
</div>
)
}
export function FeedDetailsPage() {
const { id } = useParams()
if (!id) throw Error("id required")
if (!id) throw new Error("id required")
const apiKey = useAppSelector(state => state.user.profile?.apiKey)
const { _ } = useLingui()
const dispatch = useAppDispatch()
const query = useAsync(async () => await client.feed.get(id), [id])
const feed = query.result?.data
@@ -158,11 +146,36 @@ export function FeedDetailsPage() {
<TextInput label={<Trans>Name</Trans>} {...form.getInputProps("name")} required />
<CategorySelect label={<Trans>Category</Trans>} {...form.getInputProps("categoryId")} clearable />
<NumberInput label={<Trans>Position</Trans>} {...form.getInputProps("position")} required min={0} />
<TextInput
label={<Trans>Filtering expression</Trans>}
description={<FilteringExpressionDescription />}
{...form.getInputProps("filter")}
<ReceivePushNotificationsChechbox {...form.getInputProps("pushNotificationsEnabled", { type: "checkbox" })} />
<NumberInput
label={<Trans>Auto-mark as read</Trans>}
description={<Trans>Mark entries in this feed as read after this number of days. Leave empty to disable.</Trans>}
suffix={` ${_(msg`days`)}`}
{...form.getInputProps("autoMarkAsReadAfterDays")}
min={1}
max={3650}
/>
<Input.Wrapper
label={<Trans>Filtering expression</Trans>}
description={
<Trans>
Build a filter expression to indicate what you want to read. Entries that don't match will be marked as read
automatically.
</Trans>
}
>
{feed.filterLegacy && (
<MantineAlert color="yellow" icon={<TbAlertTriangle />}>
<Trans>
This feed has a legacy filter that cannot be edited and is not applied. Please recreate the filter using
the new expression editor. The legacy filter expression was: <Code>{feed.filterLegacy}</Code>
</Trans>
</MantineAlert>
)}
<Box mt="xs">
<FilteringExpressionEditor initialValue={feed.filter} onChange={value => form.setFieldValue("filter", value)} />
</Box>
</Input.Wrapper>
<Group>
<Button variant="default" onClick={async () => await dispatch(redirectToSelectedSource())}>

View File

@@ -8,9 +8,11 @@ import { Constants } from "@/app/constants"
import type { EntrySourceType } from "@/app/entries/slice"
import { loadEntries } from "@/app/entries/thunks"
import { redirectToCategoryDetails, redirectToFeedDetails, redirectToTagDetails } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import { flattenCategoryTree } from "@/app/utils"
import { useAppDispatch, useAppSelector, useShallowEqualAppSelector } from "@/app/store"
import { categoryHasNewEntries, categoryUnreadCount, flattenCategoryTree } from "@/app/utils"
import { FeedEntries } from "@/components/content/FeedEntries"
import { UnreadCount } from "@/components/sidebar/UnreadCount"
import { useMobile } from "@/hooks/useMobile"
import { tss } from "@/tss"
function NoSubscriptionHelp() {
@@ -33,6 +35,12 @@ const useStyles = tss.create(() => ({
sourceWebsiteLink: {
color: "inherit",
textDecoration: "none",
overflow: "hidden",
},
titleText: {
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
},
}))
@@ -48,6 +56,33 @@ export function FeedEntriesPage(props: Readonly<FeedEntriesPageProps>) {
const sourceLabel = useAppSelector(state => state.entries.sourceLabel)
const sourceWebsiteUrl = useAppSelector(state => state.entries.sourceWebsiteUrl)
const hasMore = useAppSelector(state => state.entries.hasMore)
const mobile = useMobile()
const sidebarVisible = useAppSelector(state => state.tree.sidebarVisible)
const { unreadCount, hasNewEntries } = useShallowEqualAppSelector(state => {
const root = state.tree.rootCategory
if (!root) return { unreadCount: 0, hasNewEntries: false }
if (props.sourceType === "category") {
const category = id === Constants.categories.all.id ? root : flattenCategoryTree(root).find(c => c.id === id)
return {
unreadCount: categoryUnreadCount(category),
hasNewEntries: categoryHasNewEntries(category),
}
}
if (props.sourceType === "feed") {
const feed = flattenCategoryTree(root)
.flatMap(c => c.feeds)
.find(f => f.id === +id)
return {
unreadCount: feed?.unread ?? 0,
hasNewEntries: !!feed?.hasNewEntries,
}
}
return { unreadCount: 0, hasNewEntries: false }
})
const showUnreadCount = mobile || !sidebarVisible
const dispatch = useAppDispatch()
let title: React.ReactNode = sourceLabel
@@ -89,16 +124,23 @@ export function FeedEntriesPage(props: Readonly<FeedEntriesPageProps>) {
return (
// add some room at the bottom of the page in order to be able to scroll the current entry at the top of the page when expanding
<Box mb={viewport.height * 0.7}>
<Group gap="xl" className="cf-entries-title">
<Group className="cf-entries-title" wrap="nowrap">
{sourceWebsiteUrl && (
<a href={sourceWebsiteUrl} target="_blank" rel="noreferrer" className={classes.sourceWebsiteLink}>
<Title order={3}>{title}</Title>
<Title order={3} className={classes.titleText}>
{title}
</Title>
</a>
)}
{!sourceWebsiteUrl && <Title order={3}>{title}</Title>}
{!sourceWebsiteUrl && (
<Title order={3} className={classes.titleText}>
{title}
</Title>
)}
<ActionIcon onClick={titleClicked} variant="subtle" color={theme.primaryColor}>
<TbEdit size={18} />
</ActionIcon>
{showUnreadCount && <UnreadCount unreadCount={unreadCount} showIndicator={hasNewEntries} />}
</Group>
<FeedEntries />

View File

@@ -1,10 +1,11 @@
import { msg } from "@lingui/core/macro"
import { ActionIcon, AppShell, Box, Center, Group, ScrollArea, Title, useMantineTheme } from "@mantine/core"
import { type ReactNode, type RefObject, Suspense, useEffect, useRef } from "react"
import { type ReactNode, type RefObject, Suspense, useEffect, useRef, useState } from "react"
import Draggable from "react-draggable"
import { TbMenu2, TbPlus, TbX } from "react-icons/tb"
import { Outlet } from "react-router-dom"
import { useSwipeable } from "react-swipeable"
import Tinycon from "tinycon"
import { Constants } from "@/app/constants"
import { redirectToAdd, redirectToRootCategory } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
@@ -12,8 +13,10 @@ import { setMobileMenuOpen } from "@/app/tree/slice"
import { reloadTree } from "@/app/tree/thunks"
import { setSidebarWidth } from "@/app/user/slice"
import { reloadProfile, reloadSettings, reloadTags } from "@/app/user/thunks"
import { categoryUnreadCount } from "@/app/utils"
import { ActionButton } from "@/components/ActionButton"
import { AnnouncementDialog } from "@/components/AnnouncementDialog"
import { DisablePullToRefresh } from "@/components/DisablePullToRefresh"
import { Loader } from "@/components/Loader"
import { Logo } from "@/components/Logo"
import { MarkAllAsReadConfirmationDialog } from "@/components/MarkAllAsReadConfirmationDialog"
@@ -51,6 +54,78 @@ function LogoAndTitle() {
)
}
function UnreadCountTitleHandler({
enabled,
}: Readonly<{
enabled?: boolean
}>) {
const root = useAppSelector(state => state.tree.rootCategory)
const unreadCount = categoryUnreadCount(root)
return <title>{enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"}</title>
}
function UnreadCountFaviconHandler({ enabled }: { enabled?: boolean }) {
const root = useAppSelector(state => state.tree.rootCategory)
const unreadCount = categoryUnreadCount(root)
useEffect(() => {
if (enabled && unreadCount > 0) {
Tinycon.setBubble(unreadCount)
} else {
Tinycon.reset()
}
}, [unreadCount, enabled])
return null
}
function BrowserExtensionBadgeUnreadCountHandler() {
const root = useAppSelector(state => state.tree.rootCategory)
const { setBadgeUnreadCount } = useBrowserExtension()
useEffect(() => {
if (!root) return
const unreadCount = categoryUnreadCount(root)
setBadgeUnreadCount(unreadCount)
}, [root, setBadgeUnreadCount])
return null
}
function CustomJsHandler() {
const [scriptLoaded, setScriptLoaded] = useState(false)
const { loading } = useAppLoading()
useEffect(() => {
if (scriptLoaded || loading) {
return
}
const script = document.createElement("script")
script.src = "custom_js.js"
script.async = true
document.body.appendChild(script)
setScriptLoaded(true)
return () => script.remove()
}, [scriptLoaded, loading])
return null
}
function CustomCssHandler() {
useEffect(() => {
const link = document.createElement("link")
link.rel = "stylesheet"
link.type = "text/css"
link.href = "custom_css.css"
document.head.appendChild(link)
return () => link.remove()
}, [])
return null
}
const useStyles = tss
.withParams<{
sidebarWidth: number
@@ -75,6 +150,9 @@ export default function Layout(props: Readonly<LayoutProps>) {
const draggableSeparator = useRef<HTMLDivElement>(null)
const { loading } = useAppLoading()
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
const disablePullToRefresh = useAppSelector(state => state.user.settings?.disablePullToRefresh)
const mobileMenuOpen = useAppSelector(state => state.tree.mobileMenuOpen)
const webSocketConnected = useAppSelector(state => state.server.webSocketConnected)
const treeReloadInterval = useAppSelector(state => state.server.serverInfos?.treeReloadInterval)
@@ -173,61 +251,69 @@ export default function Layout(props: Readonly<LayoutProps>) {
if (loading) return <LoadingPage />
return (
<Box {...swipeHandlers}>
<AppShell
header={{ height: Constants.layout.headerHeight, collapsed: headerInFooter }}
footer={{ height: Constants.layout.headerHeight, collapsed: !headerInFooter }}
navbar={{
width: sidebarWidth,
breakpoint: Constants.layout.mobileBreakpoint,
collapsed: { mobile: !mobileMenuOpen, desktop: !props.sidebarVisible },
}}
padding={{ base: 6, [Constants.layout.mobileBreakpointName]: "md" }}
>
<AppShell.Header>{!headerInFooter && header}</AppShell.Header>
<AppShell.Footer>{headerInFooter && header}</AppShell.Footer>
<AppShell.Navbar p={sidebarPadding}>
<AppShell.Section grow component={ScrollArea} mx="-sm" px="sm">
<Box className={classes.sidebarContent}>{props.sidebar}</Box>
</AppShell.Section>
</AppShell.Navbar>
<OnDesktop>
<Draggable
nodeRef={draggableSeparator as RefObject<HTMLElement>}
axis="x"
defaultPosition={{
x: sidebarWidth,
y: 0,
}}
bounds={{
left: 120,
right: 1000,
}}
grid={[30, 30]}
onDrag={(_e, data) => {
dispatch(setSidebarWidth(data.x))
}}
>
<Box
ref={draggableSeparator}
style={{
position: "fixed",
height: "100%",
width: "10px",
cursor: "ew-resize",
<>
<UnreadCountTitleHandler enabled={unreadCountTitle} />
<UnreadCountFaviconHandler enabled={unreadCountFavicon} />
<BrowserExtensionBadgeUnreadCountHandler />
<CustomJsHandler />
<CustomCssHandler />
<DisablePullToRefresh enabled={disablePullToRefresh} />
<Box {...swipeHandlers}>
<AppShell
header={{ height: Constants.layout.headerHeight, collapsed: headerInFooter }}
footer={{ height: Constants.layout.headerHeight, collapsed: !headerInFooter }}
navbar={{
width: sidebarWidth,
breakpoint: Constants.layout.mobileBreakpoint,
collapsed: { mobile: !mobileMenuOpen, desktop: !props.sidebarVisible },
}}
padding={{ base: 6, [Constants.layout.mobileBreakpointName]: "md" }}
>
<AppShell.Header>{!headerInFooter && header}</AppShell.Header>
<AppShell.Footer>{headerInFooter && header}</AppShell.Footer>
<AppShell.Navbar p={sidebarPadding}>
<AppShell.Section grow component={ScrollArea} mx="-sm" px="sm">
<Box className={classes.sidebarContent}>{props.sidebar}</Box>
</AppShell.Section>
</AppShell.Navbar>
<OnDesktop>
<Draggable
nodeRef={draggableSeparator as RefObject<HTMLElement>}
axis="x"
defaultPosition={{
x: sidebarWidth,
y: 0,
}}
/>
</Draggable>
</OnDesktop>
bounds={{
left: 120,
right: 1000,
}}
grid={[30, 30]}
onDrag={(_e, data) => {
dispatch(setSidebarWidth(data.x))
}}
>
<Box
ref={draggableSeparator}
style={{
position: "fixed",
height: "100%",
width: "10px",
cursor: "ew-resize",
}}
/>
</Draggable>
</OnDesktop>
<AppShell.Main>
<Suspense fallback={<Loader />}>
<AnnouncementDialog />
<MarkAllAsReadConfirmationDialog />
<Outlet />
</Suspense>
</AppShell.Main>
</AppShell>
</Box>
<AppShell.Main>
<Suspense fallback={<Loader />}>
<AnnouncementDialog />
<MarkAllAsReadConfirmationDialog />
<Outlet />
</Suspense>
</AppShell.Main>
</AppShell>
</Box>
</>
)
}

View File

@@ -1,9 +1,10 @@
import { Trans } from "@lingui/react/macro"
import { Container, Tabs } from "@mantine/core"
import { TbCode, TbPhoto, TbUser } from "react-icons/tb"
import { TbBell, TbCode, TbPhoto, TbUser } from "react-icons/tb"
import { CustomCodeSettings } from "@/components/settings/CustomCodeSettings"
import { DisplaySettings } from "@/components/settings/DisplaySettings"
import { ProfileSettings } from "@/components/settings/ProfileSettings"
import { PushNotificationSettings } from "@/components/settings/PushNotificationSettings"
export function SettingsPage() {
return (
@@ -13,6 +14,9 @@ export function SettingsPage() {
<Tabs.Tab value="display" leftSection={<TbPhoto size={16} />}>
<Trans>Display</Trans>
</Tabs.Tab>
<Tabs.Tab value="push-notifications" leftSection={<TbBell size={16} />}>
<Trans>Push notifications</Trans>
</Tabs.Tab>
<Tabs.Tab value="customCode" leftSection={<TbCode size={16} />}>
<Trans>Custom code</Trans>
</Tabs.Tab>
@@ -25,6 +29,10 @@ export function SettingsPage() {
<DisplaySettings />
</Tabs.Panel>
<Tabs.Panel value="push-notifications" pt="xl">
<PushNotificationSettings />
</Tabs.Panel>
<Tabs.Panel value="customCode" pt="xl">
<CustomCodeSettings />
</Tabs.Panel>

View File

@@ -0,0 +1,95 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Box, Button, Container, Paper, PasswordInput, Stack, TextInput, Title } from "@mantine/core"
import { useForm } from "@mantine/form"
import { useAsyncCallback } from "react-async-hook"
import { client, errorToStrings } from "@/app/client"
import { redirectToRootCategory } from "@/app/redirect/thunks"
import { useAppDispatch } from "@/app/store"
import type { InitialSetupRequest } from "@/app/types"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
import { PageTitle } from "@/pages/PageTitle"
export function InitialSetupPage() {
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<InitialSetupRequest>({
initialValues: {
name: "",
password: "",
email: "",
},
validate: {
password: validationRules.password,
},
validateInputOnChange: true,
})
const login = useAsyncCallback(client.user.login, {
onSuccess: () => {
dispatch(redirectToRootCategory())
},
})
const setup = useAsyncCallback(client.user.initialSetup, {
onSuccess: () => {
login.execute(form.values)
},
})
return (
<Container size="xs">
<PageTitle />
<Paper>
<Title order={2} mb="md">
<Trans>Initial Setup</Trans>
</Title>
<Box mb="md">
<Trans>
Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get
started.
</Trans>
</Box>
{setup.error && (
<Box mb="md">
<Alert messages={errorToStrings(setup.error)} />
</Box>
)}
<form onSubmit={form.onSubmit(setup.execute)}>
<Stack>
<TextInput
label={<Trans>Admin user name</Trans>}
placeholder={_(msg`Admin user name`)}
{...form.getInputProps("name")}
size="md"
required
autoCapitalize="off"
/>
<PasswordInput
label={<Trans>Password</Trans>}
placeholder={_(msg`Password`)}
{...form.getInputProps("password")}
size="md"
required
/>
<TextInput
type="email"
label={<Trans>E-mail</Trans>}
placeholder={_(msg`E-mail`)}
{...form.getInputProps("email")}
size="md"
/>
<Button type="submit" loading={setup.loading}>
<Trans>Create Admin Account</Trans>
</Button>
</Stack>
</form>
</Paper>
</Container>
)
}

View File

@@ -0,0 +1,119 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Center, Container, Group, Paper, PasswordInput, Stack, Title } from "@mantine/core"
import { useForm } from "@mantine/form"
import { useState } from "react"
import { useAsyncCallback } from "react-async-hook"
import { Link, useSearchParams } from "react-router-dom"
import { client, errorToStrings } from "@/app/client"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
import { PageTitle } from "@/pages/PageTitle"
interface PasswordResetFormValues {
password: string
passwordConfirmation: string
}
export function PasswordResetPage() {
const [message, setMessage] = useState("")
const [searchParams] = useSearchParams()
const { _ } = useLingui()
const validationRules = useValidationRules()
const email = searchParams.get("email") ?? ""
const token = searchParams.get("token") ?? ""
const form = useForm<PasswordResetFormValues>({
initialValues: {
password: "",
passwordConfirmation: "",
},
validate: {
password: validationRules.password,
passwordConfirmation: (value, values) => validationRules.passwordConfirmation(value, values.password),
},
validateInputOnChange: true,
})
const resetPassword = useAsyncCallback(client.user.passwordResetCallback, {
onSuccess: () => {
setMessage(_(msg`Your password has been changed. You can now log in with your new password.`))
form.reset()
},
})
const isMissingParams = !email || !token
return (
<Container size="xs">
<PageTitle />
<Paper>
<Title order={2} mb="md">
<Trans>Reset Password</Trans>
</Title>
{resetPassword.error && (
<Box mb="md">
<Alert messages={errorToStrings(resetPassword.error)} />
</Box>
)}
{isMissingParams && (
<Box mb="md">
<Alert messages={[_(msg`Invalid password reset link. Please request a new one.`)]} />
</Box>
)}
{message && (
<Box mb="md">
<Alert level="success" messages={[message]} />
</Box>
)}
{!isMissingParams && !message && (
<form
onSubmit={form.onSubmit(values => {
resetPassword.execute({
email,
token,
password: values.password,
})
})}
>
<Stack>
<PasswordInput
label={<Trans>New Password</Trans>}
placeholder={_(msg`New Password`)}
{...form.getInputProps("password")}
size="md"
required
/>
<PasswordInput
label={<Trans>Confirm Password</Trans>}
placeholder={_(msg`Confirm Password`)}
{...form.getInputProps("passwordConfirmation")}
size="md"
required
/>
<Button type="submit" loading={resetPassword.loading}>
<Trans>Reset Password</Trans>
</Button>
</Stack>
</form>
)}
<Center mt="md">
<Group>
<Anchor component={Link} to="/login">
<Trans>Back to log in</Trans>
</Anchor>
</Group>
</Center>
</Paper>
</Container>
)
}

View File

@@ -10,12 +10,14 @@ import { redirectToRootCategory } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import type { RegistrationRequest } from "@/app/types"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
import { PageTitle } from "@/pages/PageTitle"
export function RegistrationPage() {
const serverInfos = useAppSelector(state => state.server.serverInfos)
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<RegistrationRequest>({
initialValues: {
@@ -23,6 +25,10 @@ export function RegistrationPage() {
password: "",
email: "",
},
validate: {
password: validationRules.password,
},
validateInputOnChange: true,
})
const login = useAsyncCallback(client.user.login, {
@@ -72,7 +78,7 @@ export function RegistrationPage() {
placeholder={_(msg`E-mail address`)}
{...form.getInputProps("email")}
size="md"
required
required={serverInfos.emailAddressRequired}
/>
<PasswordInput
label={<Trans>Password</Trans>}

View File

@@ -8,12 +8,11 @@
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"allowJs": false,
"skipLibCheck": true,
"esModuleInterop": false,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Node",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,

View File

@@ -1,29 +1,20 @@
import { lingui } from "@lingui/vite-plugin"
import react from "@vitejs/plugin-react"
import { visualizer } from "rollup-plugin-visualizer"
import babel from "@rolldown/plugin-babel"
import react, { reactCompilerPreset } from "@vitejs/plugin-react"
import { defineConfig } from "vite"
import checker from "vite-plugin-checker"
import tsconfigPaths from "vite-tsconfig-paths"
// https://vitejs.dev/config/
export default defineConfig(() => ({
plugins: [
react({
babel: {
plugins: [
// support for lingui macros
// needs to be before the react compiler plugin
"@lingui/babel-plugin-lingui-macro",
// react compiler
["babel-plugin-react-compiler", { target: "19" }],
],
},
react(),
babel({
presets: [reactCompilerPreset()],
plugins: ["@lingui/babel-plugin-lingui-macro"],
}),
lingui(),
tsconfigPaths(),
visualizer(),
checker({
typescript: true,
// temporary disabled until TypeScript 7 exposes a stable api
// typescript: true,
biome: {
command: "check",
flags: "--error-on-warnings",
@@ -45,22 +36,32 @@ export default defineConfig(() => ({
"/logout": "http://localhost:8083",
},
},
build: {
chunkSizeWarningLimit: 3500,
rollupOptions: {
output: {
manualChunks: id => {
// output mantine as its own chunk because it is quite large
if (id.includes("@mantine")) {
return "mantine"
}
},
},
},
resolve: {
tsconfigPaths: true,
},
legacy: {
// required for websocket-heartbeat-js
inconsistentCjsInterop: true,
},
test: {
environment: "jsdom",
globals: true,
setupFiles: "./src/setupTests.ts",
},
build: {
chunkSizeWarningLimit: 4000,
rolldownOptions: {
output: {
codeSplitting: {
groups: [
// output mantine as its own chunk because it is quite large
{
name: "mantine",
test: "@mantine",
},
],
},
},
},
},
}))

View File

@@ -1,401 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="23">
<profile kind="CodeFormatterProfile" name="CommaFeed" version="23">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="48"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="140"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="48"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="140"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8" />
<property name="fileExtensions" value="java" />
@@ -40,11 +40,6 @@
<module name="AvoidStarImport" />
<module name="AvoidStaticImport" />
<module name="IllegalImport" />
<module name="ImportOrder">
<property name="groups" value="/^java\./,javax,jakarta,org,com" />
<property name="ordered" value="true" />
<property name="separated" value="true" />
</module>
<module name="RedundantImport" />
<module name="UnusedImports" />
@@ -60,7 +55,7 @@
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="ignore|ignored" />
<message key="catch.block.empty"
value="Empty catch block. You can use the name 'ignore' or 'ignored' for the exception variable if you really want an empty catch block, but you should strongly consider at the very least logging something." />
value="Empty catch block. You can use the name 'ignore' or 'ignored' for the exception variable if you really want an empty catch block, but you should strongly consider at the very least logging something." />
</module>
<module name="LeftCurly" />
<module name="NeedBraces" />
@@ -76,7 +71,7 @@
<module name="FallThrough" />
<module name="IllegalInstantiation">
<property name="classes"
value="java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short" />
value="java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short" />
</module>
<module name="IllegalType" />
<module name="ModifiedControlVariable">
@@ -113,12 +108,6 @@
<module name="NoLineWrap" />
<module name="NoWhitespaceBefore" />
<module name="ParenPad" />
<module name="RegexpSinglelineJava">
<property name="format" value="^\t* +\t*\S" />
<property name="message" value="Line has leading space characters; indentation should be performed with tabs only." />
<property name="ignoreComments" value="true" />
</module>
<module name="WhitespaceAround" />
</module>
</module>

View File

@@ -1,7 +0,0 @@
#Organize Import Order
#Wed Jan 29 15:15:04 CET 2025
0=java
1=javax
2=jakarta
3=org
4=com

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
FROM ibm-semeru-runtimes:open-21.0.8_9-jre@sha256:551139c6639d176c9591c2e2eee16b0092b97a31761c8a9202cf9fffc844d845
FROM ibm-semeru-runtimes:open-jdk-25.0.4.0-jre@sha256:02888a2306c2cb8af22a05b2c41be90fdc9df5f4611861ddf6ea90c874de65e6
EXPOSE 8082
RUN mkdir -p /commafeed/data

View File

@@ -1,4 +1,4 @@
FROM debian:12.11@sha256:b6507e340c43553136f5078284c8c68d86ec8262b1724dde73c325e8d3dcdeba
FROM debian:13.6@sha256:34cd9e9fd437c0a095ec39cb2e73422c9f30821b0d0848ed74fd0d43bae4d958
ARG TARGETARCH
EXPOSE 8082
@@ -6,7 +6,7 @@ EXPOSE 8082
RUN mkdir -p /commafeed/data
VOLUME /commafeed/data
COPY artifacts/commafeed-*-${TARGETARCH}-runner /commafeed/application
COPY artifacts/commafeed-*-${TARGETARCH}-runner /commafeed/commafeed
WORKDIR /commafeed
CMD ["./application"]
CMD ["./commafeed"]

View File

@@ -4,11 +4,11 @@ Official docker images for https://github.com/Athou/commafeed/
## Quickstart
Start CommaFeed with a H2 embedded database. Then login as `admin/admin` on http://localhost:8082/
Start CommaFeed with a H2 embedded database. The app will be accessible on http://localhost:8082/
### docker
`docker run --name commafeed --detach --publish 8082:8082 --restart unless-stopped --volume /path/to/commafeed/db:/commafeed/data --memory 256M athou/commafeed:latest-h2`
`docker run --name commafeed --detach --publish 8082:8082 --restart unless-stopped --volume /path/to/commafeed/data:/commafeed/data --memory 256M athou/commafeed:latest-h2`
### docker-compose
@@ -18,7 +18,7 @@ services:
image: athou/commafeed:latest-h2
restart: unless-stopped
volumes:
- /path/to/commafeed/db:/commafeed/data
- ./data:/commafeed/data
deploy:
resources:
limits:
@@ -56,7 +56,7 @@ services:
POSTGRES_PASSWORD: commafeed
POSTGRES_DB: commafeed
volumes:
- /path/to/commafeed/db:/var/lib/postgresql/data
- ./data:/var/lib/postgresql
```
CommaFeed also supports:
@@ -93,3 +93,12 @@ Tags are of the form `<version>-<database>[-jvm]` where:
- `master` (always points to the latest git commit)
- `<database>` is the database to use (`h2`, `postgresql`, `mysql` or `mariadb`)
- `-jvm` is optional and indicates that CommaFeed is running on a JVM, and not compiled natively.
## FAQ
### Getting "Access to local address blocked" when adding a feed
CommaFeed blocks access to local resources by default to prevent [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) attacks.
If you want to subscribe to feeds that are only available on your local network, you can disable this security measure by setting the `COMMAFEED_HTTP_CLIENT_BLOCK_LOCAL_ADDRESSES` variable to `false`.
Do this only if you trust all users of your CommaFeed instance not to access private resources.

View File

@@ -1,38 +1,59 @@
package com.commafeed;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Singleton;
import com.commafeed.backend.feed.FeedRefreshEngine;
import com.commafeed.backend.service.db.DatabaseStartupService;
import com.commafeed.backend.feed.ImageProxyUrl;
import com.commafeed.backend.task.TaskScheduler;
import com.commafeed.security.password.PasswordConstraintValidator;
import io.quarkus.runtime.ShutdownEvent;
import io.quarkus.runtime.StartupEvent;
import lombok.RequiredArgsConstructor;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Singleton;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SystemProperties;
@Slf4j
@Singleton
@RequiredArgsConstructor
public class CommaFeedApplication {
private final DatabaseStartupService databaseStartupService;
private final FeedRefreshEngine feedRefreshEngine;
private final TaskScheduler taskScheduler;
private final CommaFeedConfiguration config;
private final FeedRefreshEngine feedRefreshEngine;
private final TaskScheduler taskScheduler;
private final CommaFeedConfiguration config;
public void start(@Observes StartupEvent ev) {
PasswordConstraintValidator.setStrict(config.users().strictPasswordPolicy());
public void start(@Observes StartupEvent ev) {
log.info("starting up...");
databaseStartupService.populateInitialData();
// disable entity expansion limits added in JDK24+ (#1961)
// we already strip doctype declarations in XMLCleaner to prevent xxe attacks
// we also already limit the size of feeds we download in HttpGetter
System.setProperty(SystemProperties.JDK_XML_MAX_GENERAL_ENTITY_SIZE_LIMIT, "0");
System.setProperty(SystemProperties.JDK_XML_TOTAL_ENTITY_SIZE_LIMIT, "0");
feedRefreshEngine.start();
taskScheduler.start();
}
PasswordConstraintValidator.setMinimumPasswordLength(
config.users().minimumPasswordLength());
public void stop(@Observes ShutdownEvent ev) {
feedRefreshEngine.stop();
taskScheduler.stop();
}
if (config.imageProxyEnabled()) {
ImageProxyUrl.generateKey();
}
if (config.passwordRecoveryEnabled() && config.passwordRecoveryPublicBaseUrl().isEmpty()) {
throw new IllegalStateException(
"password recovery is enabled but no public base url is set");
}
feedRefreshEngine.start();
taskScheduler.start();
}
public void stop(@Observes ShutdownEvent ev) {
log.info("shutting down...");
feedRefreshEngine.stop();
taskScheduler.stop();
}
}

View File

@@ -1,12 +1,5 @@
package com.commafeed;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Positive;
import com.commafeed.backend.feed.FeedRefreshIntervalCalculator;
import io.quarkus.runtime.annotations.ConfigDocSection;
@@ -16,346 +9,362 @@ import io.quarkus.runtime.configuration.MemorySize;
import io.smallrye.config.ConfigMapping;
import io.smallrye.config.WithDefault;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Positive;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;
/**
* CommaFeed configuration
*
* Default values are for production, they can be overridden in application.properties for other profiles
* <p>Default values are for production, they can be overridden in application.properties for other
* profiles
*/
@ConfigMapping(prefix = "commafeed")
@ConfigRoot(phase = ConfigPhase.RUN_TIME)
public interface CommaFeedConfiguration {
/**
* Whether to expose a robots.txt file that disallows web crawlers and search engine indexers.
*/
@WithDefault("true")
boolean hideFromWebCrawlers();
/**
* Whether to expose a robots.txt file that disallows web crawlers and search engine indexers.
*/
@WithDefault("true")
boolean hideFromWebCrawlers();
/**
* If enabled, images in feed entries will be proxied through the server instead of accessed directly by the browser.
*
* This is useful if commafeed is accessed through a restricting proxy that blocks some feeds that are followed.
*/
@WithDefault("false")
boolean imageProxyEnabled();
/**
* If enabled, images in feed entries will be proxied through the server instead of accessed
* directly by the browser.
*
* <p>This is useful if commafeed is accessed through a restricting proxy that blocks some feeds
* that are followed.
*/
@WithDefault("false")
boolean imageProxyEnabled();
/**
* Enable password recovery via email.
*
* Quarkus mailer will need to be configured.
*/
@WithDefault("false")
boolean passwordRecoveryEnabled();
/**
* Enable password recovery via email.
*
* <p>Quarkus mailer will need to be configured.
*/
@WithDefault("false")
boolean passwordRecoveryEnabled();
/**
* Message displayed in a notification at the bottom of the page.
*/
Optional<String> announcement();
/**
* The base URL of the application to use in the password recovery link in the email. We can't
* use the URL sent by the browser of the user because of malicious Host header injection
* attacks.
*/
Optional<String> passwordRecoveryPublicBaseUrl();
/**
* Google Auth key for fetching Youtube channel favicons.
*/
Optional<String> googleAuthKey();
/** Message displayed in a notification at the bottom of the page. */
Optional<String> announcement();
/**
* HTTP client configuration
*/
@ConfigDocSection
HttpClient httpClient();
/** Google Auth key for fetching Youtube channel favicons. */
Optional<String> googleAuthKey();
/**
* Feed refresh engine settings.
*/
@ConfigDocSection
FeedRefresh feedRefresh();
/** HTTP client configuration */
@ConfigDocSection
HttpClient httpClient();
/**
* Database settings.
*/
@ConfigDocSection
Database database();
/** Feed refresh engine settings. */
@ConfigDocSection
FeedRefresh feedRefresh();
/**
* Users settings.
*/
@ConfigDocSection
Users users();
/** Push notification settings. */
@ConfigDocSection
PushNotifications pushNotifications();
/**
* Websocket settings.
*/
@ConfigDocSection
Websocket websocket();
/** Database settings. */
@ConfigDocSection
Database database();
interface HttpClient {
/**
* User-Agent string that will be used by the http client, leave empty for the default one.
*/
Optional<String> userAgent();
/** Users settings. */
@ConfigDocSection
Users users();
/**
* Time to wait for a connection to be established.
*/
@WithDefault("5s")
Duration connectTimeout();
/** Websocket settings. */
@ConfigDocSection
Websocket websocket();
/**
* Time to wait for SSL handshake to complete.
*/
@WithDefault("5s")
Duration sslHandshakeTimeout();
/**
* Duration to wait for the feed refresh engine and the task scheduler to stop when the
* application is shutting down.
*/
@WithDefault("2s")
Duration shutdownTimeout();
/**
* Time to wait between two packets before timeout.
*/
@WithDefault("10s")
Duration socketTimeout();
interface HttpClient {
/**
* User-Agent string that will be used by the http client, leave empty for the default one.
*/
Optional<String> userAgent();
/**
* Time to wait for the full response to be received.
*/
@WithDefault("10s")
Duration responseTimeout();
/** Time to wait for a connection to be established. */
@WithDefault("5s")
Duration connectTimeout();
/**
* Time to live for a connection in the pool.
*/
@WithDefault("30s")
Duration connectionTimeToLive();
/** Time to wait for SSL handshake to complete. */
@WithDefault("5s")
Duration sslHandshakeTimeout();
/**
* Time between eviction runs for idle connections.
*/
@WithDefault("1m")
Duration idleConnectionsEvictionInterval();
/** Time to wait between two packets before timeout. */
@WithDefault("10s")
Duration socketTimeout();
/**
* If a feed is larger than this, it will be discarded to prevent memory issues while parsing the feed.
*/
@WithDefault("5M")
MemorySize maxResponseSize();
/** Time to wait for the full response to be received. */
@WithDefault("10s")
Duration responseTimeout();
/**
* Prevent access to local addresses to mitigate server-side request forgery (SSRF) attacks, which could potentially expose internal
* resources.
*
* You may want to disable this if you subscribe to feeds that are only available on your local network and you trust all users of
* your CommaFeed instance.
*/
@WithDefault("true")
boolean blockLocalAddresses();
/** Time to live for a connection in the pool. */
@WithDefault("30s")
Duration connectionTimeToLive();
/**
* HTTP client cache configuration
*/
@ConfigDocSection
HttpClientCache cache();
}
/** Time between eviction runs for idle connections. */
@WithDefault("1m")
Duration idleConnectionsEvictionInterval();
interface HttpClientCache {
/**
* Whether to enable the cache. This cache is used to avoid spamming feeds in short bursts (e.g. when subscribing to a feed for the
* first time or when clicking "fetch all my feeds now").
*/
@WithDefault("true")
boolean enabled();
/**
* If a feed is larger than this, it will be discarded to prevent memory issues while
* parsing the feed.
*/
@WithDefault("5M")
MemorySize maxResponseSize();
/**
* Maximum amount of memory the cache can use.
*/
@WithDefault("10M")
MemorySize maximumMemorySize();
/**
* Prevent access to local addresses to mitigate server-side request forgery (SSRF) attacks,
* which could potentially expose internal resources.
*
* <p>You may want to enable this if you host a public instance of CommaFeed with
* registrations open.
*/
@WithDefault("true")
boolean blockLocalAddresses();
/**
* Duration after which an entry is removed from the cache.
*/
@WithDefault("1m")
Duration expiration();
}
/** HTTP client cache configuration */
@ConfigDocSection
HttpClientCache cache();
}
interface FeedRefresh {
/**
* Default amount of time CommaFeed will wait before refreshing a feed.
*/
@WithDefault("5m")
Duration interval();
interface HttpClientCache {
/**
* Whether to enable the cache. This cache is used to avoid spamming feeds in short bursts
* (e.g. when subscribing to a feed for the first time or when clicking "fetch all my feeds
* now").
*/
@WithDefault("true")
boolean enabled();
/**
* Maximum amount of time CommaFeed will wait before refreshing a feed. This is used as an upper bound when:
*
* <ul>
* <li>an error occurs while refreshing a feed and we're backing off exponentially</li>
* <li>we receive a Cache-Control header from the feed</li>
* <li>we receive a Retry-After header from the feed</li>
* </ul>
*/
@WithDefault("4h")
Duration maxInterval();
/** Maximum amount of memory the cache can use. */
@WithDefault("10M")
MemorySize maximumMemorySize();
/**
* If enabled, CommaFeed will calculate the next refresh time based on the feed's average time between entries and the time since
* the last entry was published. The interval will be sometimes between the default refresh interval
* (`commafeed.feed-refresh.interval`) and the maximum refresh interval (`commafeed.feed-refresh.max-interval`).
*
* See {@link FeedRefreshIntervalCalculator} for details.
*/
@WithDefault("true")
boolean intervalEmpirical();
/** Duration after which an entry is removed from the cache. */
@WithDefault("1m")
Duration expiration();
}
/**
* Feed refresh engine error handling settings.
*/
@ConfigDocSection
FeedRefreshErrorHandling errors();
interface FeedRefresh {
/** Default amount of time CommaFeed will wait before refreshing a feed. */
@WithDefault("5m")
Duration interval();
/**
* Amount of http threads used to fetch feeds.
*/
@Min(1)
@WithDefault("3")
int httpThreads();
/**
* Maximum amount of time CommaFeed will wait before refreshing a feed. This is used as an
* upper bound when:
*
* <ul>
* <li>an error occurs while refreshing a feed and we're backing off exponentially
* <li>we receive a Cache-Control header from the feed
* <li>we receive a Retry-After header from the feed
* </ul>
*/
@WithDefault("4h")
Duration maxInterval();
/**
* Amount of threads used to insert new entries in the database.
*/
@Min(1)
@WithDefault("1")
int databaseThreads();
/**
* If enabled, CommaFeed will calculate the next refresh time based on the feed's average
* time between entries and the time since the last entry was published. The interval will
* be sometimes between the default refresh interval (`commafeed.feed-refresh.interval`) and
* the maximum refresh interval (`commafeed.feed-refresh.max-interval`).
*
* <p>See {@link FeedRefreshIntervalCalculator} for details.
*/
@WithDefault("true")
boolean intervalEmpirical();
/**
* Duration after which a user is considered inactive. Feeds for inactive users are not refreshed until they log in again.
*
* 0 to disable.
*/
@WithDefault("0")
Duration userInactivityPeriod();
/** Feed refresh engine error handling settings. */
@ConfigDocSection
FeedRefreshErrorHandling errors();
/**
* Duration after which the evaluation of a filtering expresion to mark an entry as read is considered to have timed out.
*/
@WithDefault("500ms")
Duration filteringExpressionEvaluationTimeout();
/** Amount of http threads used to fetch feeds. */
@Min(1)
@WithDefault("3")
int httpThreads();
/**
* Duration after which the "Fetch all my feeds now" action is available again after use to avoid spamming feeds.
*/
@WithDefault("0")
Duration forceRefreshCooldownDuration();
}
/** Amount of threads used to insert new entries in the database. */
@Min(1)
@WithDefault("1")
int databaseThreads();
interface FeedRefreshErrorHandling {
/**
* Number of retries before backoff is applied.
*/
@Min(0)
@WithDefault("3")
int retriesBeforeBackoff();
/**
* Duration after which a user is considered inactive. Feeds for inactive users are not
* refreshed until they log in again.
*
* <p>0 to disable.
*/
@WithDefault("0")
Duration userInactivityPeriod();
/**
* Duration to wait before retrying after an error. Will be multiplied by the number of errors since the last successful fetch.
*/
@WithDefault("1h")
Duration backoffInterval();
}
/**
* Duration after which the evaluation of a filtering expresion to mark an entry as read is
* considered to have timed out.
*/
@WithDefault("500ms")
Duration filteringExpressionEvaluationTimeout();
interface Database {
/**
* Timeout applied to all database queries.
*
* 0 to disable.
*/
@WithDefault("0")
Duration queryTimeout();
/**
* Duration after which the "Fetch all my feeds now" action is available again after use to
* avoid spamming feeds.
*/
@WithDefault("0")
Duration forceRefreshCooldownDuration();
}
/**
* Database cleanup settings.
*/
@ConfigDocSection
Cleanup cleanup();
interface PushNotifications {
/** Whether to enable push notifications to notify users of new entries in their feeds. */
@WithDefault("true")
boolean enabled();
interface Cleanup {
/**
* Maximum age of feed entries in the database. Older entries will be deleted.
*
* 0 to disable.
*/
@WithDefault("365d")
Duration entriesMaxAge();
/** Amount of threads used to send external notifications about new entries. */
@Min(1)
@WithDefault("5")
int threads();
/**
* Maximum age of feed entry statuses (read/unread) in the database. Older statuses will be deleted.
*
* 0 to disable.
*/
@WithDefault("0")
Duration statusesMaxAge();
/**
* Maximum amount of notifications that can be queued before new notifications are
* discarded.
*/
@Min(1)
@WithDefault("100")
int queueCapacity();
}
/**
* Maximum number of entries per feed to keep in the database.
*
* 0 to disable.
*/
@WithDefault("500")
int maxFeedCapacity();
interface FeedRefreshErrorHandling {
/** Number of retries before backoff is applied. */
@Min(0)
@WithDefault("3")
int retriesBeforeBackoff();
/**
* Limit the number of feeds a user can subscribe to.
*
* 0 to disable.
*/
@WithDefault("0")
int maxFeedsPerUser();
/**
* Duration to wait before retrying after an error. Will be multiplied by the number of
* errors since the last successful fetch.
*/
@WithDefault("1h")
Duration backoffInterval();
}
/**
* Rows to delete per query while cleaning up old entries.
*/
@Positive
@WithDefault("100")
int batchSize();
interface Database {
/**
* Timeout applied to all database queries.
*
* <p>0 to disable.
*/
@WithDefault("0")
Duration queryTimeout();
default Instant statusesInstantThreshold() {
return statusesMaxAge().toMillis() > 0 ? Instant.now().minus(statusesMaxAge()) : null;
}
}
}
/** Database cleanup settings. */
@ConfigDocSection
Cleanup cleanup();
interface Users {
/**
* Whether to let users create accounts for themselves.
*/
@WithDefault("false")
boolean allowRegistrations();
interface Cleanup {
/**
* Maximum age of feed entries in the database. Older entries will be deleted.
*
* <p>0 to disable.
*/
@WithDefault("365d")
Duration entriesMaxAge();
/**
* Whether to enable strict password validation (1 uppercase char, 1 lowercase char, 1 digit, 1 special char).
*/
@WithDefault("true")
boolean strictPasswordPolicy();
/**
* Maximum age of feed entry statuses (read/unread) in the database. Older statuses will
* be deleted.
*
* <p>0 to disable.
*/
@WithDefault("0")
Duration statusesMaxAge();
/**
* Whether to create a demo account the first time the app starts.
*/
@WithDefault("false")
boolean createDemoAccount();
}
/**
* Maximum number of entries per feed to keep in the database.
*
* <p>0 to disable.
*/
@WithDefault("500")
int maxFeedCapacity();
interface Websocket {
/**
* Enable websocket connection so the server can notify web clients that there are new entries for feeds.
*/
@WithDefault("true")
boolean enabled();
/**
* Limit the number of feeds a user can subscribe to.
*
* <p>0 to disable.
*/
@WithDefault("0")
int maxFeedsPerUser();
/**
* Interval at which the client will send a ping message on the websocket to keep the connection alive.
*/
@WithDefault("15m")
Duration pingInterval();
/** Rows to delete per query while cleaning up old entries. */
@Positive
@WithDefault("100")
int batchSize();
/**
* If the websocket connection is disabled or the connection is lost, the client will reload the feed tree at this interval.
*/
@WithDefault("30s")
Duration treeReloadInterval();
}
/** Whether to keep starred entries when cleaning up old entries. */
@WithDefault("true")
boolean keepStarredEntries();
default Instant statusesInstantThreshold() {
return statusesMaxAge().toMillis() > 0
? Instant.now().minus(statusesMaxAge())
: null;
}
}
}
interface Users {
/** Whether to let users create accounts for themselves. */
@WithDefault("false")
boolean allowRegistrations();
/** Minimum password length for user accounts. */
@WithDefault("4")
int minimumPasswordLength();
/** Whether an email address is required when creating a user account. */
@WithDefault("false")
boolean emailAddressRequired();
/** Whether to create a demo account the first time the app starts. */
@WithDefault("false")
boolean createDemoAccount();
}
interface Websocket {
/**
* Enable websocket connection so the server can notify web clients that there are new
* entries for feeds.
*/
@WithDefault("true")
boolean enabled();
/**
* Interval at which the client will send a ping message on the websocket to keep the
* connection alive.
*/
@WithDefault("15m")
Duration pingInterval();
/**
* If the websocket connection is disabled or the connection is lost, the client will reload
* the feed tree at this interval.
*/
@WithDefault("30s")
Duration treeReloadInterval();
}
}

View File

@@ -4,6 +4,5 @@ import lombok.experimental.UtilityClass;
@UtilityClass
public class CommaFeedConstants {
public static final String USERNAME_ADMIN = "admin";
public static final String USERNAME_DEMO = "demo";
public static final String USERNAME_DEMO = "demo";
}

View File

@@ -1,25 +1,24 @@
package com.commafeed;
import java.time.InstantSource;
import com.codahale.metrics.MetricRegistry;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Singleton;
import com.codahale.metrics.MetricRegistry;
import java.time.InstantSource;
@Singleton
public class CommaFeedProducers {
@Produces
@Singleton
public InstantSource instantSource() {
return InstantSource.system();
}
@Produces
@Singleton
public MetricRegistry metricRegistry() {
return new MetricRegistry();
}
@Produces
@Singleton
public InstantSource instantSource() {
return InstantSource.system();
}
@Produces
@Singleton
public MetricRegistry metricRegistry() {
return new MetricRegistry();
}
}

View File

@@ -1,30 +1,29 @@
package com.commafeed;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import jakarta.inject.Singleton;
import lombok.Getter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
@Singleton
@Getter
public class CommaFeedVersion {
private final String version;
private final String gitCommit;
private final String version;
private final String gitCommit;
public CommaFeedVersion() throws IOException {
Properties properties = new Properties();
try (InputStream stream = getClass().getResourceAsStream("/git.properties")) {
if (stream != null) {
properties.load(stream);
}
}
this.version = properties.getProperty("git.build.version", "unknown");
this.gitCommit = properties.getProperty("git.commit.id.abbrev", "unknown");
}
public CommaFeedVersion() throws IOException {
Properties properties = new Properties();
try (InputStream stream = getClass().getResourceAsStream("/git.properties")) {
if (stream != null) {
properties.load(stream);
}
}
this.version = properties.getProperty("git.build.version", "unknown");
this.gitCommit = properties.getProperty("git.commit.id.abbrev", "unknown");
}
}

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