Compare commits

..

146 Commits

Author SHA1 Message Date
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
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
100 changed files with 2552 additions and 1167 deletions

View File

@@ -7,7 +7,7 @@ on:
pull_request:
env:
JAVA_VERSION: 21
JAVA_VERSION: 25
DOCKER_BUILD_SUMMARY: false
jobs:
@@ -23,13 +23,13 @@ jobs:
steps:
# Checkout
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
with:
fetch-depth: 0
# Setup
- name: Set up GraalVM
uses: graalvm/setup-graalvm@eec48106e0bf45f2976c2ff0c3e22395cced8243 # v1
uses: graalvm/setup-graalvm@54b4f5a65c1a84b2fdfdc2078fe43df32819e4b1 # v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: "graalvm"
@@ -67,14 +67,14 @@ jobs:
# Upload artifacts
- name: Upload cross-platform app
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
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@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: commafeed-${{ matrix.database }}-${{ runner.os }}-${{ runner.arch }}
path: commafeed-server/target/commafeed-*-runner*
@@ -98,7 +98,7 @@ jobs:
steps:
# Checkout
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
with:
fetch-depth: 0
@@ -107,14 +107,14 @@ jobs:
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Install required packages
run: sudo apt-get install -y rename unzip
# Prepare artifacts
- name: Download artifacts
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
with:
pattern: commafeed-${{ matrix.database }}-*
path: ./artifacts
@@ -215,12 +215,12 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
with:
pattern: commafeed-*
path: ./artifacts
@@ -249,7 +249,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
with:
fetch-depth: 0

View File

@@ -1,3 +1,3 @@
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.12/apache-maven-3.9.12-bin.zip

View File

@@ -1,5 +1,17 @@
# Changelog
## [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)

View File

@@ -26,11 +26,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
@@ -103,7 +110,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 +120,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

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.3.6/schema.json",
"$schema": "https://biomejs.dev/schemas/2.3.11/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" />

File diff suppressed because it is too large Load Diff

View File

@@ -17,66 +17,65 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@fontsource/open-sans": "^5.2.7",
"@lingui/core": "^5.6.0",
"@lingui/react": "^5.6.0",
"@mantine/core": "^8.3.8",
"@mantine/form": "^8.3.8",
"@mantine/hooks": "^8.3.8",
"@mantine/modals": "^8.3.8",
"@mantine/notifications": "^8.3.8",
"@mantine/spotlight": "^8.3.8",
"@lingui/core": "^5.7.0",
"@lingui/react": "^5.7.0",
"@mantine/core": "^8.3.11",
"@mantine/form": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/modals": "^8.3.11",
"@mantine/notifications": "^8.3.11",
"@mantine/spotlight": "^8.3.11",
"@monaco-editor/react": "^4.7.0",
"@reduxjs/toolkit": "^2.10.1",
"@reduxjs/toolkit": "^2.11.2",
"axios": "^1.13.2",
"dayjs": "^1.11.19",
"escape-string-regexp": "^5.0.0",
"interweave": "^13.1.1",
"monaco-editor": "^0.54.0",
"monaco-editor": "^0.55.1",
"mousetrap": "^1.6.5",
"react": "^19.2.0",
"react": "^19.2.3",
"react-async-hook": "^4.0.0",
"react-contexify": "^6.0.0",
"react-dom": "^19.2.0",
"react-dom": "^19.2.3",
"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.9.6",
"react-router-dom": "^7.11.0",
"react-swipeable": "^7.0.2",
"style-to-object": "^1.0.14",
"throttle-debounce": "^5.0.2",
"tinycon": "^0.6.8",
"tss-react": "^4.9.19",
"tss-react": "^4.9.20",
"websocket-heartbeat-js": "^1.1.3"
},
"devDependencies": {
"@biomejs/biome": "^2.3.6",
"@lingui/babel-plugin-lingui-macro": "^5.6.0",
"@lingui/cli": "^5.6.0",
"@lingui/vite-plugin": "^5.6.0",
"@biomejs/biome": "^2.3.11",
"@lingui/babel-plugin-lingui-macro": "^5.7.0",
"@lingui/cli": "^5.7.0",
"@lingui/vite-plugin": "^5.7.0",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.0",
"@testing-library/react": "^16.3.1",
"@testing-library/user-event": "^14.6.1",
"@types/mousetrap": "^1.6.15",
"@types/react": "^19.2.6",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/react-infinite-scroller": "^1.2.5",
"@types/throttle-debounce": "^5.0.2",
"@types/tinycon": "^0.6.7",
"@vitejs/plugin-react": "^5.1.1",
"@vitejs/plugin-react": "^5.1.2",
"babel-plugin-react-compiler": "1.0.0",
"jsdom": "^27.2.0",
"rollup-plugin-visualizer": "^6.0.5",
"jsdom": "^27.4.0",
"typescript": "^5.9.3",
"vite": "^7.2.2",
"vite-plugin-checker": "^0.11.0",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^4.0.10",
"yaml": "^2.8.1"
"vite": "^7.3.1",
"vite-plugin-checker": "^0.12.0",
"vite-tsconfig-paths": "^6.0.3",
"vitest": "^4.0.16",
"yaml": "^2.8.2"
},
"overrides": {
"react-infinite-scroller": {
"react": "^19.2.0"
"react": "^19.2.3"
}
}
}

View File

@@ -6,19 +6,16 @@
<parent>
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>5.12.0</version>
<version>6.0.0</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>v24.11.1</node.version>
<node.version>v24.12.0</node.version>
<!-- renovate: datasource=npm depName=npm -->
<npm.version>11.6.3</npm.version>
<npm.version>11.7.0</npm.version>
</properties>
<build>
@@ -26,7 +23,7 @@
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.15.4</version>
<version>2.0.0</version>
<?m2e ignore?>
<executions>
<execution>
@@ -75,7 +72,7 @@
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<version>3.4.0</version>
<executions>
<execution>
<id>copy web interface to resources</id>

View File

@@ -0,0 +1,62 @@
<?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"
sodipodi:docname="favicon.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.21875"
inkscape:cx="207.17949"
inkscape:cy="187.07692"
inkscape:window-width="1440"
inkscape:window-height="855"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg3" />
<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.9 KiB

View File

@@ -9,6 +9,7 @@ import { HashRouter, Navigate, Route, Routes, useNavigate } from "react-router-d
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"
@@ -30,6 +31,7 @@ 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 { RegistrationPage } from "@/pages/auth/RegistrationPage"
@@ -82,6 +84,7 @@ 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 />} />
@@ -112,6 +115,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()
@@ -216,6 +231,7 @@ export function App() {
<DisablePullToRefresh enabled={disablePullToRefresh} />
<HashRouter>
<InitialSetupHandler />
<RedirectHandler />
<AppRoutes />
</HashRouter>

View File

@@ -12,6 +12,7 @@ import type {
FeedModificationRequest,
GetEntriesPaginatedRequest,
IDRequest,
InitialSetupRequest,
LoginRequest,
MarkRequest,
Metrics,
@@ -32,16 +33,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,6 +95,7 @@ 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),
getSettings: async () => await axiosInstance.get<Settings>("user/settings"),
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),

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

@@ -209,17 +209,25 @@ 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
}
export interface SharingSettings {

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

@@ -215,6 +215,7 @@ export function DisplaySettings() {
<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={disablePullToRefresh}
onChange={async e => await dispatch(changeDisablePullToRefresh(e.currentTarget.checked))}
/>

View File

@@ -20,6 +20,7 @@ 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()
@@ -134,7 +135,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

@@ -60,6 +60,11 @@ msgstr "إضافة مستخدم"
msgid "Admin"
msgstr "إداري"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ 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
@@ -225,6 +230,10 @@ msgstr "تأكيد كلمة المرور"
msgid "Cozy"
msgstr "دافئ"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "السيطرة"
@@ -309,6 +318,8 @@ msgstr "اسحب الرابط إلى شريط الإشارات"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "في العرض الموسع ، التمرير عبر الإدخالات
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "الفئة الأصل"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "الموضوع"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "تبديل قراءة حالة الإدخال الحالي"
@@ -1035,6 +1056,10 @@ msgstr "إلغاء النجم"
msgid "Unsubscribe"
msgstr "إلغاء الاشتراك"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "اسم المستخدم"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Afegeix usuari"
msgid "Admin"
msgstr "Administrador"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ msgstr "Torna a iniciar sessió"
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"
@@ -225,6 +230,10 @@ msgstr "Confirmeu la contrasenya"
msgid "Cozy"
msgstr "Acollidor"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -285,7 +294,7 @@ msgstr "Detallat"
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr ""
msgstr "Desactiva el comportament \"Arrossega per actualitzar\"\\ del navegador"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
@@ -309,6 +318,8 @@ msgstr "Arrossegueu l'enllaç a la barra d'adreces d'interès"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -434,7 +445,7 @@ msgstr "Vés a la documentació de l'API."
#: src/pages/app/AboutPage.tsx
msgid "Goodies"
msgstr "Bones"
msgstr "Extres"
#: src/components/settings/DisplaySettings.tsx
msgid "Grape"
@@ -476,6 +487,10 @@ msgstr "En la vista ampliada, en desplaçar-se per les entrades, es marquen com
msgid "Indigo"
msgstr "Indi"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Categoria pare"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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."
#: 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"
msgstr "Canvia l'estat de lectura de l'entrada actual"
@@ -1035,6 +1056,10 @@ msgstr "Desestrellar"
msgid "Unsubscribe"
msgstr "Donar-se de baixa"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom d'usuari"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Groc"

View File

@@ -60,6 +60,11 @@ msgstr "Přidat uživatele"
msgid "Admin"
msgstr "Správce"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Zpět k přihlášení"
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
@@ -225,6 +230,10 @@ msgstr "Potvrďte heslo"
msgid "Cozy"
msgstr "Útulný"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Přetáhněte odkaz na lištu záložek"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "V rozšířeném zobrazení je procházením označíte jako přečtené
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Rodičovská kategorie"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Téma"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Přepne stav čtení aktuálního záznamu"
@@ -1035,6 +1056,10 @@ msgstr "Odstranit hvězdu"
msgid "Unsubscribe"
msgstr "Odhlásit odběr"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Uživatelské jméno"
@@ -1056,6 +1081,10 @@ msgstr "Varování"
msgid "Website"
msgstr "Webové stránky"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Ychwanegu defnyddiwr"
msgid "Admin"
msgstr "Gweinyddol"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Yn ôl i fewngofnodi"
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
@@ -225,6 +230,10 @@ msgstr "Cadarnhau'r cyfrinair"
msgid "Cozy"
msgstr "clyd"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Llusgwch y ddolen i'r bar nod tudalen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Mewn gwedd estynedig, mae sgrolio trwy gofnodion yn nodi eu bod wedi'u d
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Categori Rhiant"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Thema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Toglo statws darllen y cofnod cyfredol"
@@ -1035,6 +1056,10 @@ msgstr "dad-seren"
msgid "Unsubscribe"
msgstr "Dad-danysgrifio"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Enw defnyddiwr"
@@ -1056,6 +1081,10 @@ msgstr "Rhybudd"
msgid "Website"
msgstr "Gwefan"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Tilføj bruger"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Tilbage for at logge ind"
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
@@ -225,6 +230,10 @@ msgstr "Bekræft adgangskode"
msgid "Cozy"
msgstr "Hyggeligt"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Træk linket til bogmærkelinjen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "I udvidet visning markerer du dem som læst, når du ruller gennem poste
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Forældrekategori"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Skift læsestatus for den aktuelle post"
@@ -1035,6 +1056,10 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Afmeld"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brugernavn"
@@ -1056,6 +1081,10 @@ msgstr "Advarsel"
msgid "Website"
msgstr "Hjemmeside"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Benutzer hinzufügen"
msgid "Admin"
msgstr "Verwaltung"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ msgstr "Zurück zum Login"
msgid "Blue"
msgstr ""
#: 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 ""
@@ -225,6 +230,10 @@ msgstr "Passwort bestätigen"
msgid "Cozy"
msgstr "Gemütlich"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Strg"
@@ -309,6 +318,8 @@ msgstr "Link in Lesezeichenleiste ziehen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "In der erweiterten Ansicht werden Einträge beim Scrollen als gelesen ma
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Übergeordnete Kategorie"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Thema"
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"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Lesestatus des aktuellen Eintrags umschalten"
@@ -1035,6 +1056,10 @@ msgstr "Stern entfernen"
msgid "Unsubscribe"
msgstr "Abbestellen"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Benutzername"
@@ -1056,6 +1081,10 @@ 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Add user"
msgid "Admin"
msgstr "Admin"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ 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"
@@ -225,6 +230,10 @@ msgstr "Confirm password"
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"
@@ -309,6 +318,8 @@ msgstr "Drag link to bookmark bar"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "In expanded view, scrolling through entries mark them as read"
msgid "Indigo"
msgstr "Indigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr "Initial Setup"
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Parent Category"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Theme"
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"
#: 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"
msgstr "Toggle read status of current entry"
@@ -1035,6 +1056,10 @@ msgstr "Unstar"
msgid "Unsubscribe"
msgstr "Unsubscribe"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr "User created."
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "User name"
@@ -1056,6 +1081,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"

View File

@@ -61,6 +61,11 @@ msgstr "Añadir usuario"
msgid "Admin"
msgstr "Administrador"
#: src/pages/auth/InitialSetupPage.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
@@ -138,14 +143,14 @@ msgstr "Volver a iniciar sesión"
msgid "Blue"
msgstr ""
#: 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"
@@ -226,6 +231,10 @@ msgstr "Confirmar contraseña"
msgid "Cozy"
msgstr "Acogedor"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -310,6 +319,8 @@ msgstr "Arrastra el enlace a la barra de marcadores"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -477,6 +488,10 @@ msgstr "En la vista ampliada, al desplazarse por las entradas marcarlas como le
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -748,6 +763,8 @@ msgid "Parent Category"
msgstr "Categoría principal"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1001,6 +1018,10 @@ msgstr "Tema"
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"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Alternar estado de lectura de la entrada actual"
@@ -1036,6 +1057,10 @@ msgstr "Desmarcar"
msgid "Unsubscribe"
msgstr "Cancelar suscripción"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nombre de usuario"
@@ -1057,6 +1082,10 @@ 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "افزودن کاربر"
msgid "Admin"
msgstr "مدیر"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ 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
@@ -225,6 +230,10 @@ msgstr "رمز عبور را تأیید کنید"
msgid "Cozy"
msgstr "دنج"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "پیوند را به نوار نشانک بکشید"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "در نمای بازشده، پیمایش در ورودی‌ها، آن
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "دسته والد"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "تم"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "وضعیت خواندن ورودی فعلی را تغییر دهید"
@@ -1035,6 +1056,10 @@ msgstr ""
msgid "Unsubscribe"
msgstr "لغو اشتراک"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "نام کاربری"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Lisää käyttäjä"
msgid "Admin"
msgstr "Järjestelmänvalvoja"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Takaisin sisäänkirjautumiseen"
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
@@ -225,6 +230,10 @@ msgstr "Vahvista salasana"
msgid "Cozy"
msgstr "Viihtyisä"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Vedä linkki kirjanmerkkipalkkiin"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Merkitse ne luetuiksi laajennetussa näkymässä vierittämällä merkin
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Pääluokka"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Teema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Vaihda nykyisen merkinnän lukutila"
@@ -1035,6 +1056,10 @@ msgstr "Poista tähti"
msgid "Unsubscribe"
msgstr "Peruuta tilaus"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Käyttäjänimi"
@@ -1056,6 +1081,10 @@ msgstr "Varoitus"
msgid "Website"
msgstr "Verkkosivusto"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Ajouter un utilisateur"
msgid "Admin"
msgstr "Administrateur"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ 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"
@@ -225,6 +230,10 @@ msgstr "Confirmer le mot de passe"
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -285,7 +294,7 @@ msgstr "Vue détaillée"
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr ""
msgstr "Désactiver la fonction \"tirer pour rafraîchir\" du navigateur"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
@@ -309,6 +318,8 @@ msgstr "Déplacez le lien vers la barre de favoris"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "En mode de lecture étendu, marquer les éléments comme lus lorsque la
msgid "Indigo"
msgstr "Indigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Catégorie parente"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Thème"
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"
#: 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"
msgstr "Marquer l'entrée actuelle comme lue/non lue"
@@ -1035,6 +1056,10 @@ msgstr "Retirer des favoris"
msgid "Unsubscribe"
msgstr "Se désabonner"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Jaune"

View File

@@ -9,7 +9,7 @@ msgstr ""
"Language: gl\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-10-10 07:30+0200\n"
"PO-Revision-Date: 2025-12-27 15:30+0200\n"
"Last-Translator: José M. <correoxm@disroot.org>\n"
"Language-Team: gl\n"
"Plural-Forms: \n"
@@ -61,6 +61,11 @@ msgstr "Engadir persoa usuaria"
msgid "Admin"
msgstr "Administración"
#: src/pages/auth/InitialSetupPage.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
@@ -92,7 +97,7 @@ msgstr "Anuncio"
#: src/components/settings/ProfileSettings.tsx
msgid "API key"
msgstr "Chave API"
msgstr "Clave API"
#: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
@@ -108,7 +113,7 @@ msgstr "Tes certeza de querer eliminar a túa conta? Non é posible desfacer a e
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Are you sure you want to mark all entries of <0>{sourceLabel}</0> as read?"
msgstr "es certeza de querer marcar todos os artigos de <0>{sourceLabel}</0> como lidos?"
msgstr "Tes certeza de querer marcar todos os artigos de <0>{sourceLabel}</0> como lidos?"
#: src/components/MarkAllAsReadConfirmationDialog.tsx
msgid "Are you sure you want to mark entries older than {threshold} days of <0>{sourceLabel}</0> as read?"
@@ -138,14 +143,14 @@ msgstr "Volver para iniciar sesión"
msgid "Blue"
msgstr "Azul"
#: src/pages/app/AboutPage.tsx
msgid "Browser extension"
msgstr "Complemento do navegador"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome"
msgstr "Complemento para o navegador requerido para Chrome"
#: src/pages/app/AboutPage.tsx
msgid "Browser extention"
msgstr "Complemento do navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Pestana do navegador"
@@ -226,6 +231,10 @@ msgstr "Confirmar contrasinal"
msgid "Cozy"
msgstr "Acolledor"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -286,7 +295,7 @@ msgstr "Detallado"
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr ""
msgstr "Desactivar comportamento \"Tira para actualizar\" no navegador"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
@@ -310,6 +319,8 @@ msgstr "Arrastra a ligazón á barra de marcadores"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -477,6 +488,10 @@ msgstr "Na vista ampliada, ao desprazarse polas entradas márcaas como lidas"
msgid "Indigo"
msgstr "Índigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -748,6 +763,8 @@ msgid "Parent Category"
msgstr "Categoría superior"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1001,6 +1018,10 @@ msgstr "Decorado"
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 é a túa clave da API. Pode usarse para algunhas operacións da API de só-lectura e concede acceso á API Fever. Usa o formulario da parte inferior da páxina para crear unha nova clave da API"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr "Este axuste pode causar problemas nalgúns navegadores (ex. Safari) ao desprazarse"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Cambiar o estado de lectura da entrada actual"
@@ -1036,6 +1057,10 @@ msgstr "Retirar estrela"
msgid "Unsubscribe"
msgstr "Cancelar a subscrición"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Identificador"
@@ -1057,6 +1082,10 @@ msgstr "Aviso"
msgid "Website"
msgstr "Páxina 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Amarelo"

View File

@@ -60,6 +60,11 @@ msgstr "Felhasználó hozzáadása"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Vissza a bejelentkezéshez"
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
@@ -225,6 +230,10 @@ msgstr "Erősítse meg a jelszót"
msgid "Cozy"
msgstr "Hangulatos"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Húzza a hivatkozást a könyvjelzősávra"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Kibontott nézetben a bejegyzések görgetése olvasottként jelöli meg
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Szülő kategória"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Téma"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Az aktuális bejegyzés olvasási állapotának váltása"
@@ -1035,6 +1056,10 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Leiratkozás"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Felhasználónév"
@@ -1056,6 +1081,10 @@ msgstr "Figyelem"
msgid "Website"
msgstr "Webhely"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Tambahkan pengguna"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Kembali untuk masuk"
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
@@ -225,6 +230,10 @@ msgstr "Konfirmasi kata sandi"
msgid "Cozy"
msgstr "Nyaman"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Seret tautan ke bilah bookmark"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Dalam tampilan yang diperluas, menggulir entri menandainya sebagai telah
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Kategori Induk"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Beralih status baca entri saat ini"
@@ -1035,6 +1056,10 @@ msgstr "Hapus bintang"
msgid "Unsubscribe"
msgstr "Berhenti berlangganan"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nama pengguna"
@@ -1056,6 +1081,10 @@ msgstr "Peringatan"
msgid "Website"
msgstr "Situs 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Aggiungi utente"
msgid "Admin"
msgstr "Ammin"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Torna per accedere"
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
@@ -225,6 +230,10 @@ msgstr "Conferma password"
msgid "Cozy"
msgstr "Accogliente"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "ctrl"
@@ -309,6 +318,8 @@ msgstr "Trascina il collegamento sulla barra dei preferiti"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Nella vista espansa, scorrendo le voci contrassegnale come lette"
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Categoria padre"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Commuta lo stato di lettura della voce corrente"
@@ -1035,6 +1056,10 @@ msgstr "Elimina le stelle"
msgid "Unsubscribe"
msgstr "Annulla iscrizione"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nome utente"
@@ -1056,6 +1081,10 @@ msgstr "Avviso"
msgid "Website"
msgstr "Sito 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "ユーザー追加"
msgid "Admin"
msgstr "管理者"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ msgstr "ログインに戻る"
msgid "Blue"
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 "ブラウザータブ"
@@ -225,6 +230,10 @@ msgstr "パスワード確認"
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -309,6 +318,8 @@ msgstr "リンクをブックマークバーにドラッグ"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "展開ビューでエントリーをスクロールすると、それら
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "親カテゴリ"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "テーマ"
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キーを生成します。"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "現在のエントリーの読み取りステータスを切り替えます"
@@ -1035,6 +1056,10 @@ msgstr "スターを外す"
msgid "Unsubscribe"
msgstr "退会"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "ユーザー名"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "사용자 추가"
msgid "Admin"
msgstr "관리자"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ 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
@@ -225,6 +230,10 @@ msgstr "비밀번호 확인"
msgid "Cozy"
msgstr "코지"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "컨트롤"
@@ -309,6 +318,8 @@ msgstr "링크를 북마크바로 드래그"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "확장 보기에서 항목을 스크롤하면 읽은 것으로 표시됩
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "부모 카테고리"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "테마"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "현재 항목의 읽기 상태 전환"
@@ -1035,6 +1056,10 @@ msgstr "별표 제거"
msgid "Unsubscribe"
msgstr "구독 취소"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "사용자 이름"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Tambah pengguna"
msgid "Admin"
msgstr "Pentadbir"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Kembali untuk log masuk"
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
@@ -225,6 +230,10 @@ msgstr "Sahkan kata laluan"
msgid "Cozy"
msgstr "Nyaman"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Seret pautan ke bar penanda halaman"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Dalam paparan yang diperluas, menatal melalui entri menandakannya sebaga
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Kategori Induk"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Togol status bacaan entri semasa"
@@ -1035,6 +1056,10 @@ msgstr "Nyahbintang"
msgid "Unsubscribe"
msgstr "Nyahlanggan"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nama pengguna"
@@ -1056,6 +1081,10 @@ msgstr "Amaran"
msgid "Website"
msgstr "Laman 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Legg til bruker"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Tilbake for å logge inn"
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
@@ -225,6 +230,10 @@ msgstr "Bekreft passord"
msgid "Cozy"
msgstr "Koselig"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Dra lenken til bokmerkelinjen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "I utvidet visning merker du dem som lest ved å rulle gjennom oppføring
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Overordnet kategori"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Veksle lesestatus for gjeldende oppføring"
@@ -1035,6 +1056,10 @@ msgstr "Fjern stjerne"
msgid "Unsubscribe"
msgstr "Avslutt abonnementet"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brukernavn"
@@ -1056,6 +1081,10 @@ msgstr "Advarsel"
msgid "Website"
msgstr "Nettsted"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Gebruiker toevoegen"
msgid "Admin"
msgstr "Beheerder"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Terug naar inloggen"
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
@@ -225,6 +230,10 @@ msgstr "Bevestig wachtwoord"
msgid "Cozy"
msgstr "Gezellig"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Link naar bladwijzerbalk slepen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "In de uitgevouwen weergave markeert het scrollen door items ze als gelez
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Oudercategorie"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Thema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Toggle leesstatus van huidige invoer"
@@ -1035,6 +1056,10 @@ msgstr "Sterren uit"
msgid "Unsubscribe"
msgstr "Afmelden"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Gebruikersnaam"
@@ -1056,6 +1081,10 @@ msgstr "Waarschuwing"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Legg til bruker"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Tilbake for å logge inn"
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
@@ -225,6 +230,10 @@ msgstr "Bekreft passord"
msgid "Cozy"
msgstr "Koselig"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Dra lenken til bokmerkelinjen"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "I utvidet visning merker du dem som lest ved å rulle gjennom oppføring
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Overordnet kategori"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Veksle lesestatus for gjeldende oppføring"
@@ -1035,6 +1056,10 @@ msgstr "Fjern stjerne"
msgid "Unsubscribe"
msgstr "Avslutt abonnementet"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brukernavn"
@@ -1056,6 +1081,10 @@ msgstr "Advarsel"
msgid "Website"
msgstr "Nettsted"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Dodaj użytkownika"
msgid "Admin"
msgstr "Administracja"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Powrót do logowania"
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
@@ -225,6 +230,10 @@ msgstr "Potwierdź hasło"
msgid "Cozy"
msgstr "Przytulny"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Przeciągnij link do paska zakładek"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "W widoku rozszerzonym przewijanie wpisów oznacza je jako przeczytane"
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Kategoria nadrzędna"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Motyw"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Przełącz stan odczytu bieżącego wpisu"
@@ -1035,6 +1056,10 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Anuluj subskrypcję"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nazwa użytkownika"
@@ -1056,6 +1081,10 @@ msgstr "Ostrzeżenie"
msgid "Website"
msgstr "Strona internetowa"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Adicionar usuário"
msgid "Admin"
msgstr "Administrador"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ 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"
@@ -225,6 +230,10 @@ msgstr "Confirmar senha"
msgid "Cozy"
msgstr "Aconchegante"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -309,6 +318,8 @@ msgstr "Arraste o link para a barra de favoritos"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Na visualização expandida, rolar pelas entradas marca-as como lidas"
msgid "Indigo"
msgstr "Índigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Categoria Pai"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Alternar o status de leitura da entrada atual"
@@ -1035,6 +1056,10 @@ msgstr "Desestrelar"
msgid "Unsubscribe"
msgstr "Cancelar inscrição"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nome de usuário"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "Amarelo"

View File

@@ -60,6 +60,11 @@ msgstr "Добавить пользователя"
msgid "Admin"
msgstr "Админ"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ msgstr "Вернуться к входу"
msgid "Blue"
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 ""
@@ -225,6 +230,10 @@ msgstr "Подтвердить пароль"
msgid "Cozy"
msgstr "Уютно"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -309,6 +318,8 @@ msgstr "Перетащите ссылку на панель закладок"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "В развернутом виде прокрутка записей п
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Родительская категория"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Тема"
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, воспользуйтесь формой в нижней части страницы"
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Переключить статус чтения текущей записи"
@@ -1035,6 +1056,10 @@ msgstr "Удалить из избранного"
msgid "Unsubscribe"
msgstr "Отписаться"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Имя пользователя"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Pridať užívateľa"
msgid "Admin"
msgstr "Správca"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Späť na prihlásenie"
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
@@ -225,6 +230,10 @@ msgstr "Potvrďte heslo"
msgid "Cozy"
msgstr "Útulný"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Presuňte odkaz na lištu so záložkami"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "V rozšírenom zobrazení ich rolovanie cez položky označí ako preč
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Rodičovská kategória"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Téma"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Prepne stav čítania aktuálneho záznamu"
@@ -1035,6 +1056,10 @@ msgstr "Odobrať hviezdičku"
msgid "Unsubscribe"
msgstr "Zrušte odber"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Meno používateľa"
@@ -1056,6 +1081,10 @@ msgstr "Varovanie"
msgid "Website"
msgstr "Webová stránka"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Lägg till användare"
msgid "Admin"
msgstr ""
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ msgstr "Tillbaka för att logga in"
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
@@ -225,6 +230,10 @@ msgstr "Bekräfta lösenord"
msgid "Cozy"
msgstr "Mysigt"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr ""
@@ -309,6 +318,8 @@ msgstr "Dra länken till bokmärkesfältet"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "I utökad vy, rullning genom poster markerar dem som lästa"
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Föräldrakategori"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Växla lässtatus för aktuell post"
@@ -1035,6 +1056,10 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Avregistrera"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Användarnamn"
@@ -1056,6 +1081,10 @@ msgstr "Varning"
msgid "Website"
msgstr "Webbplats"
#: 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "Kullanıcı ekle"
msgid "Admin"
msgstr "Yönetici"
#: src/pages/auth/InitialSetupPage.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
@@ -137,14 +142,14 @@ msgstr "Giriş yapmak için geri dön"
msgid "Blue"
msgstr ""
#: 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"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
@@ -225,6 +230,10 @@ msgstr "Şifreyi onayla"
msgid "Cozy"
msgstr "Rahat"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -309,6 +318,8 @@ msgstr "Bağlantıyı yer işareti çubuğuna sürükleyin"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "Genişletilmiş görünümde, girişler arasında gezinmek onları okund
msgid "Indigo"
msgstr ""
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "Üst Kategori"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "Tema"
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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry"
msgstr "Geçerli girişin okuma durumunu değiştir"
@@ -1035,6 +1056,10 @@ msgstr "Yıldızı kaldır"
msgid "Unsubscribe"
msgstr "Aboneliği iptal et"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Kullanıcı adı"
@@ -1056,6 +1081,10 @@ 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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr ""

View File

@@ -60,6 +60,11 @@ msgstr "添加用户"
msgid "Admin"
msgstr "管理员"
#: src/pages/auth/InitialSetupPage.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
@@ -137,12 +142,12 @@ 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
@@ -225,6 +230,10 @@ msgstr "确认密码"
msgid "Cozy"
msgstr "宽松"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
msgstr "Ctrl"
@@ -285,7 +294,7 @@ msgstr "详细"
#: src/components/settings/DisplaySettings.tsx
msgid "Disable \"Pull to refresh\" browser behavior"
msgstr ""
msgstr "禁用浏览器的“下拉刷新”功能"
#: src/components/header/ProfileMenu.tsx
#: src/components/settings/DisplaySettings.tsx
@@ -309,6 +318,8 @@ msgstr "拖动链接到书签栏"
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "E-mail"
@@ -476,6 +487,10 @@ msgstr "在展开视图中,滚动条目将它们标记为已读"
msgid "Indigo"
msgstr "靛蓝"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -747,6 +762,8 @@ msgid "Parent Category"
msgstr "父类别"
#: src/components/admin/UserEdit.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/LoginPage.tsx
#: src/pages/auth/RegistrationPage.tsx
@@ -1000,6 +1017,10 @@ msgstr "主题"
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密钥。"
#: 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"
msgstr "切换当前条目的阅读状态"
@@ -1035,6 +1056,10 @@ msgstr "取消星标"
msgid "Unsubscribe"
msgstr "取消订阅"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "用户名"
@@ -1056,6 +1081,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 ""
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
msgstr "黄"

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

@@ -0,0 +1,89 @@
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 { PageTitle } from "@/pages/PageTitle"
export function InitialSetupPage() {
const dispatch = useAppDispatch()
const { _ } = useLingui()
const form = useForm<InitialSetupRequest>({
initialValues: {
name: "",
password: "",
email: "",
},
})
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

@@ -72,7 +72,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

@@ -1,6 +1,5 @@
import { lingui } from "@lingui/vite-plugin"
import react from "@vitejs/plugin-react"
import { visualizer } from "rollup-plugin-visualizer"
import { defineConfig } from "vite"
import checker from "vite-plugin-checker"
import tsconfigPaths from "vite-tsconfig-paths"
@@ -21,7 +20,6 @@ export default defineConfig(() => ({
}),
lingui(),
tsconfigPaths(),
visualizer(),
checker({
typescript: true,
biome: {

View File

@@ -6,13 +6,13 @@
<parent>
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>5.12.0</version>
<version>6.0.0</version>
</parent>
<artifactId>commafeed-server</artifactId>
<name>CommaFeed Server</name>
<properties>
<quarkus.version>3.29.4</quarkus.version>
<quarkus.version>3.30.6</quarkus.version>
<querydsl.version>7.1</querydsl.version>
<rome.version>2.1.0</rome.version>
@@ -117,7 +117,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.2</version>
<version>3.6.3</version>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
@@ -145,7 +145,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
<version>3.8.0</version>
<executions>
<execution>
<phase>package</phase>
@@ -192,6 +192,8 @@
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<quarkus.datasource.db-kind>${build.database}</quarkus.datasource.db-kind>
</systemPropertyVariables>
<!-- fix for java.lang.NoClassDefFoundError: Could not initialize class org.jboss.threads.JDKSpecific$ThreadAccess (#1938) -->
<argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
</configuration>
<!-- failsafe plugin does not seem to be able to pick up dependencies declared in profiles -->
<dependencies>
@@ -299,7 +301,7 @@
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>12.1.2</version>
<version>13.0.0</version>
</dependency>
</dependencies>
<executions>
@@ -357,7 +359,7 @@
<dependency>
<groupId>com.commafeed</groupId>
<artifactId>commafeed-client</artifactId>
<version>5.12.0</version>
<version>6.0.0</version>
</dependency>
<!-- compile-time processors -->
@@ -492,12 +494,12 @@
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.21.2</version>
<version>1.22.1</version>
</dependency>
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>78.1</version>
<version>78.2</version>
</dependency>
<dependency>
<groupId>net.sourceforge.cssparser</groupId>
@@ -512,18 +514,17 @@
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.5.1</version>
</dependency>
<!-- add brotli support for httpclient5 -->
<dependency>
<groupId>org.brotli</groupId>
<artifactId>dec</artifactId>
<version>0.1.2</version>
<version>5.6</version>
</dependency>
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>ayza-for-apache5</artifactId>
<version>10.0.1</version>
<version>10.0.3</version>
</dependency>
<dependency>
<groupId>org.brotli</groupId>
<artifactId>dec</artifactId>
<version>0.1.2</version>
</dependency>
<!-- test dependencies -->
@@ -540,7 +541,7 @@
<dependency>
<groupId>io.quarkiverse.playwright</groupId>
<artifactId>quarkus-playwright</artifactId>
<version>2.2.1</version>
<version>2.3.1</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@@ -1,4 +1,4 @@
FROM ibm-semeru-runtimes:open-jdk-25.0.1_8-jre@sha256:015afe20b069a2e0a0e956117ad515f319a4a4e6a3dee5682f3428010fdfc151
FROM ibm-semeru-runtimes:open-jdk-25.0.1_8-jre@sha256:d88c854ca5506a04dd2cdaedb98dcf23d6b1b077aebaf738d5c3c5d8c94fff20
EXPOSE 8082
RUN mkdir -p /commafeed/data

View File

@@ -1,4 +1,4 @@
FROM debian:13.2@sha256:8f6a88feef3ed01a300dafb87f208977f39dccda1fd120e878129463f7fa3b8f
FROM debian:13.2@sha256:c71b05eac0b20adb4cdcc9f7b052227efd7da381ad10bb92f972e8eae7c6cdc9
ARG TARGETARCH
EXPOSE 8082

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:

View File

@@ -4,7 +4,6 @@ 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.task.TaskScheduler;
import com.commafeed.security.password.PasswordConstraintValidator;
@@ -16,15 +15,12 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class CommaFeedApplication {
private final DatabaseStartupService databaseStartupService;
private final FeedRefreshEngine feedRefreshEngine;
private final TaskScheduler taskScheduler;
private final CommaFeedConfiguration config;
public void start(@Observes StartupEvent ev) {
PasswordConstraintValidator.setStrict(config.users().strictPasswordPolicy());
databaseStartupService.populateInitialData();
PasswordConstraintValidator.setMinimumPasswordLength(config.users().minimumPasswordLength());
feedRefreshEngine.start();
taskScheduler.start();

View File

@@ -326,10 +326,16 @@ public interface CommaFeedConfiguration {
boolean allowRegistrations();
/**
* Whether to enable strict password validation (1 uppercase char, 1 lowercase char, 1 digit, 1 special char).
* Minimum password length for user accounts.
*/
@WithDefault("true")
boolean strictPasswordPolicy();
@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.

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";
}

View File

@@ -2,12 +2,16 @@ package com.commafeed;
import jakarta.annotation.Priority;
import jakarta.validation.ValidationException;
import jakarta.ws.rs.core.NewCookie;
import jakarta.ws.rs.ext.Provider;
import org.jboss.resteasy.reactive.RestResponse;
import org.jboss.resteasy.reactive.RestResponse.ResponseBuilder;
import org.jboss.resteasy.reactive.RestResponse.Status;
import org.jboss.resteasy.reactive.server.ServerExceptionMapper;
import com.commafeed.security.CookieService;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.security.AuthenticationFailedException;
import io.quarkus.security.UnauthorizedException;
@@ -18,17 +22,18 @@ import lombok.RequiredArgsConstructor;
@Priority(1)
public class ExceptionMappers {
private final CookieService cookieService;
private final CommaFeedConfiguration config;
@ServerExceptionMapper(UnauthorizedException.class)
public RestResponse<UnauthorizedResponse> unauthorized(UnauthorizedException e) {
return RestResponse.status(RestResponse.Status.UNAUTHORIZED,
new UnauthorizedResponse(e.getMessage(), config.users().allowRegistrations()));
return RestResponse.status(Status.UNAUTHORIZED, new UnauthorizedResponse(e.getMessage(), config.users().allowRegistrations()));
}
@ServerExceptionMapper(AuthenticationFailedException.class)
public RestResponse<AuthenticationFailed> authenticationFailed(AuthenticationFailedException e) {
return RestResponse.status(RestResponse.Status.UNAUTHORIZED, new AuthenticationFailed(e.getMessage()));
NewCookie logoutCookie = cookieService.buildLogoutCookie();
return ResponseBuilder.create(Status.UNAUTHORIZED, new AuthenticationFailed(e.getMessage())).cookie(logoutCookie).build();
}
@ServerExceptionMapper(ValidationException.class)

View File

@@ -9,10 +9,13 @@ import java.time.Duration;
import java.time.Instant;
import java.time.InstantSource;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Optional;
import java.util.SequencedMap;
import java.util.concurrent.ExecutionException;
import java.util.stream.Stream;
import java.util.zip.GZIPInputStream;
import jakarta.inject.Singleton;
import jakarta.ws.rs.core.CacheControl;
@@ -24,6 +27,9 @@ import org.apache.hc.client5.http.SystemDefaultDnsResolver;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.config.TlsConfig;
import org.apache.hc.client5.http.entity.DeflateInputStream;
import org.apache.hc.client5.http.entity.InputStreamFactory;
import org.apache.hc.client5.http.entity.compress.ContentCoding;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
@@ -41,6 +47,7 @@ import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
import org.apache.hc.core5.http.message.BasicHeader;
import org.apache.hc.core5.util.TimeValue;
import org.apache.hc.core5.util.Timeout;
import org.brotli.dec.BrotliInputStream;
import org.jboss.resteasy.reactive.common.headers.CacheControlDelegate;
import com.codahale.metrics.MetricRegistry;
@@ -287,6 +294,11 @@ public class HttpGetter {
headers.add(new BasicHeader(HttpHeaders.PRAGMA, "No-cache"));
headers.add(new BasicHeader(HttpHeaders.CACHE_CONTROL, "no-cache"));
SequencedMap<String, InputStreamFactory> contentDecoderMap = new LinkedHashMap<>();
contentDecoderMap.put(ContentCoding.GZIP.token(), GZIPInputStream::new);
contentDecoderMap.put(ContentCoding.DEFLATE.token(), DeflateInputStream::new);
contentDecoderMap.put(ContentCoding.BROTLI.token(), BrotliInputStream::new);
return HttpClientBuilder.create()
.useSystemProperties()
.disableAutomaticRetries()
@@ -296,6 +308,7 @@ public class HttpGetter {
.setConnectionManager(connectionManager)
.evictExpiredConnections()
.evictIdleConnections(TimeValue.of(idleConnectionsEvictionInterval))
.setContentDecoderRegistry(new LinkedHashMap<>(contentDecoderMap))
.build();
}

View File

@@ -32,4 +32,8 @@ public class UserRoleDAO extends GenericDAO<UserRole> {
public Set<Role> findRoles(User user) {
return findAll(user).stream().map(UserRole::getRole).collect(Collectors.toSet());
}
public long countAdmins() {
return query().select(ROLE.count()).from(ROLE).where(ROLE.role.eq(Role.ADMIN)).fetchOne();
}
}

View File

@@ -101,7 +101,7 @@ public class DefaultFaviconFetcher extends AbstractFaviconFetcher {
return null;
}
String href = icons.get(0).attr("abs:href");
String href = icons.getFirst().attr("abs:href");
if (StringUtils.isBlank(href)) {
log.debug("No icon found in page");
return null;

View File

@@ -17,7 +17,7 @@ public record Favicon(byte[] icon, MediaType mediaType) {
try {
return MediaType.valueOf(contentType);
} catch (Exception e) {
log.debug("invalid content type '{}' received, returning default value", contentType);
log.debug("invalid content type '{}' received, returning default value", contentType, e);
return DEFAULT_MEDIA_TYPE;
}
}

View File

@@ -164,9 +164,11 @@ public class FeedRefreshEngine {
Instant lastLoginThreshold = config.feedRefresh().userInactivityPeriod().isZero() ? null
: Instant.now().minus(config.feedRefresh().userInactivityPeriod());
List<Feed> feeds = feedDAO.findNextUpdatable(max, lastLoginThreshold);
// update disabledUntil to prevent feeds from being returned again by feedDAO.findNextUpdatable()
Instant nextUpdateDate = Instant.now().plus(config.feedRefresh().interval());
feedDAO.setDisabledUntil(feeds.stream().map(AbstractModel::getId).toList(), nextUpdateDate);
if (!feeds.isEmpty()) {
// update disabledUntil to prevent feeds from being returned again by feedDAO.findNextUpdatable()
Instant nextUpdateDate = Instant.now().plus(config.feedRefresh().interval());
feedDAO.setDisabledUntil(feeds.stream().map(AbstractModel::getId).toList(), nextUpdateDate);
}
return feeds;
});
}

View File

@@ -30,7 +30,11 @@ public class OPMLImporter {
private final FeedSubscriptionService feedSubscriptionService;
public void importOpml(User user, String xml) throws IllegalArgumentException, FeedException {
xml = xml.substring(xml.indexOf('<'));
int index = xml.indexOf('<');
if (index == -1) {
throw new IllegalArgumentException("Invalid OPML: no start tag found");
}
xml = xml.substring(index);
WireFeedInput input = new WireFeedInput();
Opml feed = (Opml) input.build(new StringReader(xml));
List<Outline> outlines = feed.getOutlines();

View File

@@ -1,7 +1,6 @@
package com.commafeed.backend.service;
import java.time.Instant;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
@@ -95,7 +94,7 @@ public class UserService {
}
String computedFeverApiKey = Digests.md5Hex(user.getName() + ":" + user.getApiKey());
if (!computedFeverApiKey.equals(feverApiKey)) {
if (!computedFeverApiKey.equalsIgnoreCase(feverApiKey)) {
return Optional.empty();
}
@@ -139,10 +138,6 @@ public class UserService {
return user;
}
public void createAdminUser() {
register(CommaFeedConstants.USERNAME_ADMIN, "admin", "admin@commafeed.com", Arrays.asList(Role.ADMIN, Role.USER), true);
}
public void createDemoUser() {
register(CommaFeedConstants.USERNAME_DEMO, "demo", "demo@commafeed.com", Collections.singletonList(Role.USER), true);
}

View File

@@ -25,23 +25,8 @@ public class DatabaseStartupService {
private final UserService userService;
private final CommaFeedConfiguration config;
public void populateInitialData() {
long count = unitOfWork.call(userDAO::count);
if (count == 0) {
unitOfWork.run(this::initialData);
}
}
private void initialData() {
log.info("populating database with default values");
try {
userService.createAdminUser();
if (config.users().createDemoAccount()) {
userService.createDemoUser();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
public boolean isInitialSetupRequired() {
return unitOfWork.call(userDAO::count) == 0;
}
/**

View File

@@ -14,7 +14,7 @@ public class InPageReferenceFeedURLProvider implements FeedURLProvider {
@Override
public List<String> get(String url, String urlContent) {
Document doc = Jsoup.parse(urlContent, url);
if (!"html".equals(doc.children().get(0).tagName())) {
if (!"html".equals(doc.children().getFirst().tagName())) {
return List.of();
}
return Stream.concat(doc.select("link[type=application/atom+xml]").stream(), doc.select("link[type=application/rss+xml]").stream())

View File

@@ -25,6 +25,9 @@ public class ServerInfo implements Serializable {
@Schema(required = true)
private boolean allowRegistrations;
@Schema(required = true)
private boolean emailAddressRequired;
@Schema(required = true)
private boolean smtpEnabled;
@@ -43,4 +46,7 @@ public class ServerInfo implements Serializable {
@Schema(required = true)
private long forceRefreshCooldownDuration;
@Schema(required = true)
private boolean initialSetupRequired;
}

View File

@@ -0,0 +1,25 @@
package com.commafeed.frontend.model.request;
import java.io.Serializable;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import com.commafeed.security.password.ValidPassword;
import lombok.Data;
@SuppressWarnings("serial")
@Schema(description = "Initial admin account setup request")
@Data
public class InitialSetupRequest implements Serializable {
@Schema(description = "admin username", required = true)
private String name;
@Schema(description = "admin password", required = true)
@ValidPassword
private String password;
@Schema(description = "admin email")
private String email;
}

View File

@@ -26,7 +26,6 @@ import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
import com.codahale.metrics.MetricRegistry;
import com.commafeed.CommaFeedConstants;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.dao.UserRoleDAO;
import com.commafeed.backend.model.User;
@@ -101,8 +100,8 @@ public class AdminREST {
if (req.isAdmin() && !roles.contains(Role.ADMIN)) {
userRoleDAO.persist(new UserRole(u, Role.ADMIN));
} else if (!req.isAdmin() && roles.contains(Role.ADMIN)) {
if (CommaFeedConstants.USERNAME_ADMIN.equals(u.getName())) {
return Response.status(Status.FORBIDDEN).entity("You cannot remove the admin role from the admin user.").build();
if (userRoleDAO.countAdmins() == 1) {
return Response.status(Status.FORBIDDEN).entity("You cannot remove the admin role from the last admin user.").build();
}
for (UserRole userRole : userRoleDAO.findAll(u)) {
if (userRole.getRole() == Role.ADMIN) {

View File

@@ -178,7 +178,7 @@ public class CategoryREST {
boolean hasMore = entries.getEntries().size() > limit;
if (hasMore) {
entries.setHasMore(true);
entries.getEntries().remove(entries.getEntries().size() - 1);
entries.getEntries().removeLast();
}
entries.setTimestamp(System.currentTimeMillis());
@@ -337,7 +337,7 @@ public class CategoryREST {
}
FeedCategory parent = null;
if (req.getParentId() != null && !CategoryREST.ALL.equals(req.getParentId())
if (req.getParentId() != null && !ALL.equals(req.getParentId())
&& !Strings.CS.equals(req.getParentId(), String.valueOf(req.getId()))) {
parent = feedCategoryDAO.findById(user, Long.valueOf(req.getParentId()));
}

View File

@@ -181,7 +181,7 @@ public class FeedREST {
boolean hasMore = entries.getEntries().size() > limit;
if (hasMore) {
entries.setHasMore(true);
entries.getEntries().remove(entries.getEntries().size() - 1);
entries.getEntries().removeLast();
}
} else {
return Response.status(Status.NOT_FOUND).entity("<message>feed not found</message>").build();

View File

@@ -22,6 +22,7 @@ import com.commafeed.CommaFeedVersion;
import com.commafeed.backend.HttpGetter;
import com.commafeed.backend.HttpGetter.HttpResult;
import com.commafeed.backend.feed.ImageProxyUrl;
import com.commafeed.backend.service.db.DatabaseStartupService;
import com.commafeed.frontend.model.ServerInfo;
import com.commafeed.security.Roles;
@@ -39,6 +40,7 @@ public class ServerREST {
private final HttpGetter httpGetter;
private final CommaFeedConfiguration config;
private final CommaFeedVersion version;
private final DatabaseStartupService databaseStartupService;
@Path("/get")
@GET
@@ -51,12 +53,14 @@ public class ServerREST {
infos.setVersion(version.getVersion());
infos.setGitCommit(version.getGitCommit());
infos.setAllowRegistrations(config.users().allowRegistrations());
infos.setEmailAddressRequired(config.users().emailAddressRequired());
infos.setSmtpEnabled(config.passwordRecoveryEnabled());
infos.setDemoAccountEnabled(config.users().createDemoAccount());
infos.setWebsocketEnabled(config.websocket().enabled());
infos.setWebsocketPingInterval(config.websocket().pingInterval().toMillis());
infos.setTreeReloadInterval(config.websocket().treeReloadInterval().toMillis());
infos.setForceRefreshCooldownDuration(config.feedRefresh().forceRefreshCooldownDuration().toMillis());
infos.setInitialSetupRequired(databaseStartupService.isInitialSetupRequired());
return infos;
}

View File

@@ -5,7 +5,9 @@ import java.net.URISyntaxException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import jakarta.annotation.security.PermitAll;
@@ -36,6 +38,7 @@ import com.commafeed.CommaFeedConfiguration;
import com.commafeed.CommaFeedConstants;
import com.commafeed.backend.Digests;
import com.commafeed.backend.Urls;
import com.commafeed.backend.dao.UnitOfWork;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.dao.UserRoleDAO;
import com.commafeed.backend.dao.UserSettingsDAO;
@@ -50,8 +53,10 @@ import com.commafeed.backend.model.UserSettings.ScrollMode;
import com.commafeed.backend.service.MailService;
import com.commafeed.backend.service.PasswordEncryptionService;
import com.commafeed.backend.service.UserService;
import com.commafeed.backend.service.db.DatabaseStartupService;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.InitialSetupRequest;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.frontend.model.request.ProfileModificationRequest;
import com.commafeed.frontend.model.request.RegistrationRequest;
@@ -78,9 +83,11 @@ public class UserREST {
private final UserSettingsDAO userSettingsDAO;
private final UserService userService;
private final PasswordEncryptionService encryptionService;
private final DatabaseStartupService databaseStartupService;
private final MailService mailService;
private final CommaFeedConfiguration config;
private final UriInfo uri;
private final UnitOfWork unitOfWork;
@Path("/settings")
@GET
@@ -231,7 +238,7 @@ public class UserREST {
public Response saveUserProfile(@Valid @Parameter(required = true) ProfileModificationRequest request) {
User user = authenticationContext.getCurrentUser();
if (CommaFeedConstants.USERNAME_DEMO.equals(user.getName())) {
return Response.status(Status.FORBIDDEN).build();
return Response.status(Status.FORBIDDEN).entity("the profile of the demo account cannot be modified").build();
}
Optional<User> login = userService.login(user.getName(), request.getCurrentPassword());
@@ -276,6 +283,31 @@ public class UserREST {
}
}
@Path("/initialSetup")
@PermitAll
@POST
@Transactional
@Operation(
summary = "Create the initial admin account",
description = "This endpoint is only available when no users exist in the database")
public Response initialSetup(@Valid @Parameter(required = true) InitialSetupRequest req) {
boolean initialSetupRequired = databaseStartupService.isInitialSetupRequired();
if (!initialSetupRequired) {
return Response.status(Status.BAD_REQUEST).entity("Initial setup has already been completed").build();
}
userService.register(req.getName(), req.getPassword(), req.getEmail(), List.of(Role.ADMIN, Role.USER), true);
if (config.users().createDemoAccount()) {
User demo = userDAO.findByName(CommaFeedConstants.USERNAME_DEMO);
if (demo == null) {
userService.createDemoUser();
}
}
return Response.ok().build();
}
@Path("/passwordReset")
@PermitAll
@POST
@@ -361,9 +393,15 @@ public class UserREST {
@Operation(summary = "Delete the user account")
public Response deleteUser() {
User user = authenticationContext.getCurrentUser();
if (CommaFeedConstants.USERNAME_ADMIN.equals(user.getName()) || CommaFeedConstants.USERNAME_DEMO.equals(user.getName())) {
return Response.status(Status.FORBIDDEN).build();
if (CommaFeedConstants.USERNAME_DEMO.equals(user.getName())) {
return Response.status(Status.FORBIDDEN).entity("the demo account cannot be deleted").build();
}
Set<Role> roles = userRoleDAO.findRoles(user);
if (roles.contains(Role.ADMIN) && userRoleDAO.countAdmins() == 1) {
return Response.status(Status.FORBIDDEN).entity("The last admin account cannot be deleted").build();
}
userService.unregister(userDAO.findById(user.getId()));
return Response.ok().build();
}

View File

@@ -27,6 +27,7 @@ import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedMap;
import jakarta.ws.rs.core.UriInfo;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.jboss.resteasy.reactive.server.multipart.FormValue;
import org.jboss.resteasy.reactive.server.multipart.MultipartFormDataInput;
@@ -93,8 +94,8 @@ public class FeverREST {
@Operation(hidden = true)
public FeverResponse formUrlencoded(@Context UriInfo uri, @PathParam("userId") Long userId, MultivaluedMap<String, String> form) {
Map<String, String> params = new HashMap<>();
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.get(0)));
form.forEach((k, v) -> params.put(k, v.get(0)));
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.getFirst()));
form.forEach((k, v) -> params.put(k, v.getFirst()));
return handle(userId, params);
}
@@ -106,7 +107,7 @@ public class FeverREST {
@Operation(hidden = true)
public FeverResponse noForm(@Context UriInfo uri, @PathParam("userId") Long userId) {
Map<String, String> params = new HashMap<>();
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.get(0)));
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.getFirst()));
return handle(userId, params);
}
@@ -118,7 +119,7 @@ public class FeverREST {
@Operation(hidden = true)
public FeverResponse get(@Context UriInfo uri, @PathParam("userId") Long userId) {
Map<String, String> params = new HashMap<>();
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.get(0)));
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.getFirst()));
return handle(userId, params);
}
@@ -131,7 +132,7 @@ public class FeverREST {
@Operation(hidden = true)
public FeverResponse formData(@Context UriInfo uri, @PathParam("userId") Long userId, MultipartFormDataInput form) {
Map<String, String> params = new HashMap<>();
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.get(0)));
uri.getQueryParameters().forEach((k, v) -> params.put(k, v.getFirst()));
form.getValues().forEach((k, v) -> params.put(k, v.stream().map(FormValue::getValue).findFirst().orElse(null)));
return handle(userId, params);
}
@@ -177,8 +178,8 @@ public class FeverREST {
List<String> entryIds = Stream.of(withIds.split(",")).map(String::trim).toList();
resp.setItems(buildItems(user, subscriptions, entryIds));
} else {
Long sinceId = params.containsKey("since_id") ? Long.valueOf(params.get("since_id")) : null;
Long maxId = params.containsKey("max_id") ? Long.valueOf(params.get("max_id")) : null;
Long sinceId = Optional.ofNullable(params.get("since_id")).filter(StringUtils::isNotBlank).map(Long::valueOf).orElse(null);
Long maxId = Optional.ofNullable(params.get("max_id")).filter(StringUtils::isNotBlank).map(Long::valueOf).orElse(null);
resp.setItems(buildItems(user, subscriptions, sinceId, maxId));
}
}

View File

@@ -1,8 +1,5 @@
package com.commafeed.frontend.servlet;
import java.time.Instant;
import java.util.Date;
import jakarta.annotation.security.PermitAll;
import jakarta.inject.Singleton;
import jakarta.ws.rs.GET;
@@ -11,26 +8,25 @@ import jakarta.ws.rs.core.NewCookie;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.openapi.annotations.Operation;
import com.commafeed.security.CookieService;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Path("/logout")
@PermitAll
@Singleton
public class LogoutServlet {
private final UriInfo uri;
private final String cookieName;
public LogoutServlet(UriInfo uri, @ConfigProperty(name = "quarkus.http.auth.form.cookie-name") String cookieName) {
this.uri = uri;
this.cookieName = cookieName;
}
private final CookieService cookieService;
@GET
@Operation(hidden = true)
public Response get() {
NewCookie removeCookie = new NewCookie.Builder(cookieName).maxAge(0).expiry(Date.from(Instant.EPOCH)).path("/").build();
NewCookie removeCookie = cookieService.buildLogoutCookie();
return Response.temporaryRedirect(uri.getBaseUri()).cookie(removeCookie).build();
}
}

View File

@@ -0,0 +1,24 @@
package com.commafeed.security;
import java.time.Instant;
import java.util.Date;
import jakarta.inject.Singleton;
import jakarta.ws.rs.core.NewCookie;
import io.quarkus.vertx.http.runtime.VertxHttpConfig;
@Singleton
public class CookieService {
private final String cookieName;
public CookieService(VertxHttpConfig config) {
this.cookieName = config.auth().form().cookieName();
}
public NewCookie buildLogoutCookie() {
return new NewCookie.Builder(cookieName).maxAge(0).expiry(Date.from(Instant.EPOCH)).path("/").build();
}
}

View File

@@ -6,8 +6,6 @@ import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;
import org.passay.CharacterRule;
import org.passay.EnglishCharacterData;
import org.passay.LengthRule;
import org.passay.PasswordData;
import org.passay.PasswordValidator;
@@ -19,7 +17,7 @@ import lombok.Setter;
public class PasswordConstraintValidator implements ConstraintValidator<ValidPassword, String> {
@Setter
private static boolean strict = true;
private static int minimumPasswordLength;
@Override
public void initialize(ValidPassword constraintAnnotation) {
@@ -32,7 +30,7 @@ public class PasswordConstraintValidator implements ConstraintValidator<ValidPas
return true;
}
PasswordValidator validator = strict ? buildStrictPasswordValidator() : buildLoosePasswordValidator();
PasswordValidator validator = buildPasswordValidator();
RuleResult result = validator.validate(new PasswordData(value));
if (result.isValid()) {
@@ -45,28 +43,11 @@ public class PasswordConstraintValidator implements ConstraintValidator<ValidPas
return false;
}
private PasswordValidator buildStrictPasswordValidator() {
private PasswordValidator buildPasswordValidator() {
return new PasswordValidator(
// length
new LengthRule(8, 256),
// 1 uppercase char
new CharacterRule(EnglishCharacterData.UpperCase, 1),
// 1 lowercase char
new CharacterRule(EnglishCharacterData.LowerCase, 1),
// 1 digit
new CharacterRule(EnglishCharacterData.Digit, 1),
// 1 special char
new CharacterRule(EnglishCharacterData.Special, 1),
new LengthRule(minimumPasswordLength, 256),
// no whitespace
new WhitespaceRule());
}
private PasswordValidator buildLoosePasswordValidator() {
return new PasswordValidator(
// length
new LengthRule(6, 256),
// no whitespace
new WhitespaceRule());
}
}

View File

@@ -2,6 +2,7 @@
quarkus.http.port=8082
quarkus.http.test-port=8085
quarkus.http.enable-compression=true
quarkus.http.enable-decompression=true
# http cache
quarkus.http.static-resources.max-age=P365d

View File

@@ -6,8 +6,6 @@ import jakarta.persistence.EntityManager;
import org.hibernate.Session;
import org.kohsuke.MetaInfServices;
import com.commafeed.backend.service.db.DatabaseStartupService;
import io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback;
import io.quarkus.test.junit.callback.QuarkusTestMethodContext;
@@ -26,7 +24,5 @@ public class DatabaseReset implements QuarkusTestBeforeEachCallback {
.getSessionFactory()
.getSchemaManager()
.truncateMappedObjects();
CDI.current().select(DatabaseStartupService.class).get().populateInitialData();
}
}

View File

@@ -0,0 +1,6 @@
package com.commafeed;
public class TestConstants {
public static final String ADMIN_USERNAME = "admin";
public static final String ADMIN_PASSWORD = "admin";
}

View File

@@ -11,7 +11,6 @@ import java.time.Instant;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPOutputStream;
@@ -308,23 +307,26 @@ class HttpGetterTest {
@Nested
class Compression {
@Test
void deflate() throws Exception {
supportsCompression("deflate", DeflaterOutputStream::new);
}
private static final String ACCEPT_ENCODING = "gzip, deflate, br";
@Test
void gzip() throws Exception {
supportsCompression("gzip", GZIPOutputStream::new);
}
@Test
void deflate() throws Exception {
supportsCompression("deflate", DeflaterOutputStream::new);
}
void supportsCompression(String encoding, CompressionOutputStreamFunction compressionOutputStreamFunction) throws Exception {
String body = "my body";
HttpGetterTest.this.mockServerClient.when(HttpRequest.request().withMethod("GET")).respond(req -> {
String acceptEncodingHeader = req.getFirstHeader(HttpHeaders.ACCEPT_ENCODING);
if (!Set.of(acceptEncodingHeader.split(", ")).contains(encoding)) {
throw new Exception(encoding + " should be in the Accept-Encoding header");
if (!ACCEPT_ENCODING.equals(acceptEncodingHeader)) {
throw new Exception("Wrong value in the Accept-Encoding header, should be '%s' but was '%s'".formatted(ACCEPT_ENCODING,
acceptEncodingHeader));
}
ByteArrayOutputStream output = new ByteArrayOutputStream();

View File

@@ -31,10 +31,10 @@ class FeedUtilsTest {
Assertions.assertEquals("Test Entry", syndEntry.getTitle());
Assertions.assertEquals("Author Name", syndEntry.getAuthor());
Assertions.assertEquals(1, syndEntry.getContents().size());
Assertions.assertEquals("This is a test entry content.", syndEntry.getContents().get(0).getValue());
Assertions.assertEquals("This is a test entry content.", syndEntry.getContents().getFirst().getValue());
Assertions.assertEquals(1, syndEntry.getEnclosures().size());
Assertions.assertEquals("http://example.com/enclosure.mp3", syndEntry.getEnclosures().get(0).getUrl());
Assertions.assertEquals("audio/mpeg", syndEntry.getEnclosures().get(0).getType());
Assertions.assertEquals("http://example.com/enclosure.mp3", syndEntry.getEnclosures().getFirst().getUrl());
Assertions.assertEquals("audio/mpeg", syndEntry.getEnclosures().getFirst().getType());
Assertions.assertEquals("http://example.com/test-entry", syndEntry.getLink());
Assertions.assertEquals(Date.from(Instant.ofEpochSecond(1)), syndEntry.getPublishedDate());
}

View File

@@ -188,7 +188,7 @@ class UserServiceTest {
void apiLoginShouldReturnUserIfUserFoundFromApikeyLookupNotDisabled() {
Mockito.when(userDAO.findByApiKey("apikey")).thenReturn(normalUser);
Optional<User> returnedUser = userService.login("apikey");
Assertions.assertEquals(normalUser, returnedUser.get());
Assertions.assertEquals(Optional.of(normalUser), returnedUser);
}
}

View File

@@ -1,8 +1,10 @@
package com.commafeed.e2e;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
@@ -20,6 +22,11 @@ class AuthentificationIT {
@InjectPlaywright
private BrowserContext context;
@BeforeEach
void setup() {
PlaywrightTestUtils.initialSetup();
}
@AfterEach
void cleanup() {
context.clearCookies();
@@ -29,7 +36,7 @@ class AuthentificationIT {
void loginFail() {
Page page = context.newPage();
page.navigate(getLoginPageUrl());
PlaywrightTestUtils.login(page, "admin", "wrong_password");
PlaywrightTestUtils.login(page, TestConstants.ADMIN_USERNAME, "wrong_password");
PlaywrightAssertions.assertThat(page.getByRole(AriaRole.ALERT)).containsText("wrong username or password");
}
@@ -46,13 +53,10 @@ class AuthentificationIT {
Page page = context.newPage();
page.navigate(getLoginPageUrl());
page.getByText("Sign up!").click();
PlaywrightTestUtils.register(page, "user", "user@domain.com", "pass");
PlaywrightTestUtils.register(page, "user", "user@domain.com", "p");
Locator alert = page.getByRole(AriaRole.ALERT);
PlaywrightAssertions.assertThat(alert).containsText("Password must be 8 or more characters in length.");
PlaywrightAssertions.assertThat(alert).containsText("Password must contain 1 or more uppercase characters.");
PlaywrightAssertions.assertThat(alert).containsText("Password must contain 1 or more digit characters.");
PlaywrightAssertions.assertThat(alert).containsText("Password must contain 1 or more special characters.");
PlaywrightAssertions.assertThat(alert).containsText("Password must be 4 or more characters in length.");
}
@Test

View File

@@ -0,0 +1,33 @@
package com.commafeed.e2e;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.assertions.PlaywrightAssertions;
import com.microsoft.playwright.options.AriaRole;
import io.quarkiverse.playwright.InjectPlaywright;
import io.quarkiverse.playwright.WithPlaywright;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
@WithPlaywright
class InitialSetupIT {
@InjectPlaywright
private BrowserContext context;
@Test
void createAdminAccount() {
Page page = context.newPage();
page.navigate("http://localhost:8085");
page.getByPlaceholder("Admin User Name").fill(TestConstants.ADMIN_USERNAME);
page.getByPlaceholder("Password").fill(TestConstants.ADMIN_PASSWORD);
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Create Admin Account")).click();
PlaywrightAssertions.assertThat(page).hasURL("http://localhost:8085/#/app/category/all");
}
}

View File

@@ -1,16 +1,28 @@
package com.commafeed.e2e;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.request.InitialSetupRequest;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Page.GetByRoleOptions;
import com.microsoft.playwright.options.AriaRole;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import lombok.experimental.UtilityClass;
@UtilityClass
public class PlaywrightTestUtils {
public static void initialSetup() {
InitialSetupRequest req = new InitialSetupRequest();
req.setName(TestConstants.ADMIN_USERNAME);
req.setPassword(TestConstants.ADMIN_PASSWORD);
RestAssured.given().body(req).contentType(ContentType.JSON).post("rest/user/initialSetup").then().statusCode(200);
}
public static void login(Page page) {
login(page, "admin", "admin");
login(page, TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
public static void login(Page page, String username, String password) {

View File

@@ -16,6 +16,7 @@ import org.mockserver.integration.ClientAndServer;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Entries;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.Locator;
@@ -45,7 +46,8 @@ class ReadingIT {
.withBody(IOUtils.toString(getClass().getResource("/feed/rss.xml"), StandardCharsets.UTF_8))
.withDelay(TimeUnit.MILLISECONDS, 100));
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
PlaywrightTestUtils.initialSetup();
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

View File

@@ -21,10 +21,12 @@ import org.mockserver.integration.ClientAndServer;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Category;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Subscription;
import com.commafeed.frontend.model.request.AddCategoryRequest;
import com.commafeed.frontend.model.request.InitialSetupRequest;
import com.commafeed.frontend.model.request.SubscribeRequest;
import io.restassured.RestAssured;
@@ -76,11 +78,20 @@ public abstract class BaseIT {
mockServerClient.when(FEED_REQUEST).respond(HttpResponse.response().withBody(IOUtils.toString(resource, StandardCharsets.UTF_8)));
}
protected void initialSetup(String userName, String password) {
InitialSetupRequest req = new InitialSetupRequest();
req.setName(userName);
req.setPassword(password);
req.setEmail(userName + "@commafeed.com");
RestAssured.given().body(req).contentType(ContentType.JSON).post("rest/user/initialSetup").then().statusCode(200);
}
protected List<HttpCookie> login() {
List<Header> setCookieHeaders = RestAssured.given()
.auth()
.none()
.formParams("j_username", "admin", "j_password", "admin")
.formParams("j_username", TestConstants.ADMIN_USERNAME, "j_password", TestConstants.ADMIN_PASSWORD)
.post("j_security_check")
.then()
.statusCode(HttpStatus.SC_OK)

View File

@@ -8,9 +8,11 @@ import jakarta.ws.rs.core.HttpHeaders;
import org.apache.hc.core5.http.HttpStatus;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.ExceptionMappers.UnauthorizedResponse;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.MarkRequest;
@@ -24,6 +26,11 @@ import io.restassured.http.ContentType;
@QuarkusTest
class SecurityIT extends BaseIT {
@BeforeEach
void setup() {
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@Test
void notLoggedIn() {
UnauthorizedResponse info = RestAssured.given()
@@ -49,7 +56,13 @@ class SecurityIT extends BaseIT {
@Test
void basicAuthLogin() {
RestAssured.given().auth().preemptive().basic("admin", "admin").get("rest/user/profile").then().statusCode(HttpStatus.SC_OK);
RestAssured.given()
.auth()
.preemptive()
.basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD)
.get("rest/user/profile")
.then()
.statusCode(HttpStatus.SC_OK);
}
@Test
@@ -57,7 +70,7 @@ class SecurityIT extends BaseIT {
RestAssured.given()
.auth()
.preemptive()
.basic("admin", "wrong-password")
.basic(TestConstants.ADMIN_USERNAME, "wrong-password")
.get("rest/user/profile")
.then()
.statusCode(HttpStatus.SC_UNAUTHORIZED);
@@ -72,12 +85,12 @@ class SecurityIT extends BaseIT {
void apiKey() {
// create api key
ProfileModificationRequest req = new ProfileModificationRequest();
req.setCurrentPassword("admin");
req.setCurrentPassword(TestConstants.ADMIN_PASSWORD);
req.setNewApiKey(true);
RestAssured.given()
.auth()
.preemptive()
.basic("admin", "admin")
.basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD)
.body(req)
.contentType(ContentType.JSON)
.post("rest/user/profile")
@@ -88,7 +101,7 @@ class SecurityIT extends BaseIT {
String apiKey = RestAssured.given()
.auth()
.preemptive()
.basic("admin", "admin")
.basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD)
.get("rest/user/profile")
.then()
.statusCode(HttpStatus.SC_OK)
@@ -103,7 +116,7 @@ class SecurityIT extends BaseIT {
long subscriptionId = RestAssured.given()
.auth()
.preemptive()
.basic("admin", "admin")
.basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD)
.body(subscribeRequest)
.contentType(ContentType.JSON)
.post("rest/feed/subscribe")

View File

@@ -27,6 +27,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.request.FeedModificationRequest;
import io.quarkus.test.junit.QuarkusTest;
@@ -40,7 +41,8 @@ class WebSocketIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

View File

@@ -9,6 +9,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.AdminSaveUserRequest;
import com.commafeed.frontend.model.request.IDRequest;
@@ -23,7 +24,8 @@ class AdminIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

View File

@@ -11,6 +11,7 @@ import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.xml.sax.InputSource;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Category;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Entry;
@@ -35,7 +36,8 @@ import io.restassured.http.ContentType;
class CategoryIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach
@@ -58,9 +60,9 @@ class CategoryIT extends BaseIT {
Category root = getRootCategory();
Assertions.assertEquals(2, root.getChildren().size());
Assertions.assertEquals("test-category-1", root.getChildren().get(0).getName());
Assertions.assertEquals(1, root.getChildren().get(0).getChildren().size());
Assertions.assertEquals("modified-category-2", root.getChildren().get(0).getChildren().get(0).getName());
Assertions.assertEquals("test-category-1", root.getChildren().getFirst().getName());
Assertions.assertEquals(1, root.getChildren().getFirst().getChildren().size());
Assertions.assertEquals("modified-category-2", root.getChildren().getFirst().getChildren().getFirst().getName());
request = new CategoryModificationRequest();
request.setId(Long.valueOf(category3Id));
@@ -79,7 +81,7 @@ class CategoryIT extends BaseIT {
Category root = getRootCategory();
Assertions.assertEquals(1, root.getChildren().size());
Assertions.assertTrue(root.getChildren().get(0).isExpanded());
Assertions.assertTrue(root.getChildren().getFirst().isExpanded());
CollapseRequest request = new CollapseRequest();
request.setId(Long.valueOf(categoryId));
@@ -88,7 +90,7 @@ class CategoryIT extends BaseIT {
root = getRootCategory();
Assertions.assertEquals(1, root.getChildren().size());
Assertions.assertFalse(root.getChildren().get(0).isExpanded());
Assertions.assertFalse(root.getChildren().getFirst().isExpanded());
}
@Test
@@ -178,7 +180,7 @@ class CategoryIT extends BaseIT {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Assertions.assertEquals(0, getCategoryEntries(CategoryREST.STARRED).getEntries().size());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
StarRequest starRequest = new StarRequest();
starRequest.setId(entry.getId());
@@ -188,7 +190,7 @@ class CategoryIT extends BaseIT {
Entries starredEntries = getCategoryEntries(CategoryREST.STARRED);
Assertions.assertEquals(1, starredEntries.getEntries().size());
Assertions.assertEquals(entry.getId(), starredEntries.getEntries().get(0).getId());
Assertions.assertEquals(entry.getId(), starredEntries.getEntries().getFirst().getId());
}
@Test
@@ -196,7 +198,7 @@ class CategoryIT extends BaseIT {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Assertions.assertEquals(0, getTaggedEntries("my-tag").getEntries().size());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
TagRequest tagRequest = new TagRequest();
tagRequest.setEntryId(Long.valueOf(entry.getId()));
@@ -205,7 +207,7 @@ class CategoryIT extends BaseIT {
Entries taggedEntries = getTaggedEntries("my-tag");
Assertions.assertEquals(1, taggedEntries.getEntries().size());
Assertions.assertEquals(entry.getId(), taggedEntries.getEntries().get(0).getId());
Assertions.assertEquals(entry.getId(), taggedEntries.getEntries().getFirst().getId());
}
@Test

View File

@@ -22,6 +22,7 @@ import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.xml.sax.InputSource;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Entry;
import com.commafeed.frontend.model.FeedInfo;
import com.commafeed.frontend.model.Subscription;
@@ -43,7 +44,8 @@ class FeedIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

View File

@@ -6,6 +6,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.backend.Digests;
import com.commafeed.frontend.model.Entry;
import com.commafeed.frontend.model.UserModel;
@@ -28,11 +29,12 @@ class FeverIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
// create api key
ProfileModificationRequest req = new ProfileModificationRequest();
req.setCurrentPassword("admin");
req.setCurrentPassword(TestConstants.ADMIN_PASSWORD);
req.setNewApiKey(true);
RestAssured.given().body(req).contentType(ContentType.JSON).post("rest/user/profile").then().statusCode(HttpStatus.SC_OK);
@@ -80,7 +82,7 @@ class FeverIT extends BaseIT {
FeverResponse feverResponse = client.execute("items");
Assertions.assertEquals(2, feverResponse.getItems().size());
FeverItem item = feverResponse.getItems().get(0);
FeverItem item = feverResponse.getItems().getFirst();
Assertions.assertEquals(subscriptionId, item.getFeedId());
Assertions.assertEquals("Item 2", item.getTitle());
Assertions.assertEquals("Item 2 description", item.getHtml());
@@ -92,7 +94,7 @@ class FeverIT extends BaseIT {
@Test
void entriesByIds() {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
FeverResponse feverResponse = client.execute("items", new Param("with_ids", entry.getId()));
Assertions.assertEquals(1, feverResponse.getItems().size());
@@ -101,7 +103,7 @@ class FeverIT extends BaseIT {
@Test
void savedEntries() {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
StarRequest starRequest = new StarRequest();
starRequest.setId(entry.getId());
@@ -116,7 +118,7 @@ class FeverIT extends BaseIT {
@Test
void markEntry() {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
client.execute("_", new Param("mark", "item"), new Param("id", entry.getId()), new Param("as", "read"));
Assertions.assertEquals(1, getFeedEntries(subscriptionId).getEntries().stream().filter(Entry::isRead).count());
@@ -147,7 +149,7 @@ class FeverIT extends BaseIT {
@Test
void tagEntry() {
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
Entry entry = getFeedEntries(subscriptionId).getEntries().get(0);
Entry entry = getFeedEntries(subscriptionId).getEntries().getFirst();
client.execute("_", new Param("mark", "item"), new Param("id", entry.getId()), new Param("as", "saved"));
Assertions.assertEquals(1, getFeedEntries(subscriptionId).getEntries().stream().filter(Entry::isStarred).count());
@@ -161,7 +163,7 @@ class FeverIT extends BaseIT {
createCategory("category-1");
FeverResponse feverResponse = client.execute("groups");
Assertions.assertEquals(1, feverResponse.getGroups().size());
Assertions.assertEquals("category-1", feverResponse.getGroups().get(0).getTitle());
Assertions.assertEquals("category-1", feverResponse.getGroups().getFirst().getTitle());
}
@Test

View File

@@ -11,6 +11,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.integration.BaseIT;
@@ -29,7 +30,8 @@ class UserIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
mailbox.clear();
}
@@ -48,12 +50,12 @@ class UserIT extends BaseIT {
List<MailMessage> mails = mailbox.getMailMessagesSentTo("admin@commafeed.com");
Assertions.assertEquals(1, mails.size());
MailMessage message = mails.get(0);
MailMessage message = mails.getFirst();
Assertions.assertEquals("CommaFeed - Password recovery", message.getSubject());
Assertions.assertTrue(message.getHtml().startsWith("You asked for password recovery for account 'admin'"));
Assertions.assertEquals("admin@commafeed.com", message.getTo().get(0));
Assertions.assertEquals("admin@commafeed.com", message.getTo().getFirst());
Element a = Jsoup.parse(message.getHtml()).select("a").get(0);
Element a = Jsoup.parse(message.getHtml()).select("a").getFirst();
String link = a.attr("href");
String newPasswordResponse = RestAssured.given().urlEncodingEnabled(false).get(link).then().statusCode(200).extract().asString();
Assertions.assertTrue(newPasswordResponse.contains("Your new password is:"));

View File

@@ -6,6 +6,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Settings;
import com.commafeed.integration.BaseIT;
@@ -18,7 +19,8 @@ class CustomCodeIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

View File

@@ -8,8 +8,10 @@ import jakarta.ws.rs.core.HttpHeaders;
import org.apache.hc.core5.http.HttpStatus;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
@@ -19,6 +21,11 @@ import io.restassured.http.Headers;
@QuarkusTest
class LogoutIT extends BaseIT {
@BeforeEach
void setup() {
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@Test
void test() {
List<HttpCookie> cookies = login();

View File

@@ -7,6 +7,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
@@ -17,7 +18,8 @@ class NextUnreadIT extends BaseIT {
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
initialSetup(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, TestConstants.ADMIN_PASSWORD);
}
@AfterEach

12
pom.xml
View File

@@ -5,16 +5,13 @@
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>5.12.0</version>
<version>6.0.0</version>
<name>CommaFeed</name>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
<sonar.organization>athou</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<maven.compiler.release>25</maven.compiler.release>
</properties>
<build>
@@ -41,11 +38,6 @@
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>5.3.0.6276</version>
</plugin>
</plugins>
</build>