Compare commits

...

623 Commits
4.6.0 ... 5.5.0

Author SHA1 Message Date
Athou
dbce12492b release 5.5.0 2025-02-09 16:31:06 +01:00
renovate[bot]
85f5eaffec fix(deps): update mantine monorepo to ^7.16.3 2025-02-09 06:12:54 +00:00
Athou
106276351e use React 19 features to be able to remove unmaintained React Helmet 2025-02-07 20:13:13 +01:00
Athou
961fb6a464 redoc upgrade 2025-02-07 19:42:39 +01:00
Jérémie Panzer
ac3d9ef57f Merge pull request #1675 from Athou/renovate/docker-setup-qemu-action-digest
chore(deps): update docker/setup-qemu-action digest to 4574d27
2025-02-06 19:55:54 +01:00
Jérémie Panzer
3478ee4815 Merge pull request #1674 from Athou/renovate/docker-setup-buildx-action-digest
chore(deps): update docker/setup-buildx-action digest to f7ce87c
2025-02-06 19:55:49 +01:00
renovate[bot]
3dc02d7ba1 chore(deps): update docker/setup-qemu-action digest to 4574d27 2025-02-06 16:38:04 +00:00
renovate[bot]
c886f8b83c chore(deps): update docker/setup-buildx-action digest to f7ce87c 2025-02-06 16:38:00 +00:00
renovate[bot]
4a2154d0b3 fix(deps): update quarkus.version to v3.18.2 2025-02-05 19:35:32 +00:00
Jérémie Panzer
ba530d5019 Merge pull request #1673 from Athou/renovate/vite-6.x
chore(deps): update dependency vite to ^6.1.0
2025-02-05 20:34:57 +01:00
renovate[bot]
85b6209c52 chore(deps): update dependency vite to ^6.1.0 2025-02-05 16:58:47 +00:00
Athou
7ff86a5e31 make audio enclosures fill available width 2025-02-05 16:51:23 +01:00
Athou
8edd6a1e2d correctly handle 0 as a Retry-Header value (#1671) 2025-02-05 07:50:10 +01:00
Jérémie Panzer
6e65ed49e9 Merge pull request #1670 from Athou/renovate/com.microsoft.playwright-playwright-1.x
chore(deps): update dependency com.microsoft.playwright:playwright to v1.50.0
2025-02-04 23:29:26 +01:00
renovate[bot]
711b01abfa chore(deps): update dependency com.microsoft.playwright:playwright to v1.50.0 2025-02-04 22:01:19 +00:00
renovate[bot]
c7014ca2a1 chore(deps): update dependency vitest to ^3.0.5 2025-02-03 16:31:55 +00:00
renovate[bot]
a3984cd959 chore(deps): lock file maintenance 2025-02-03 08:00:36 +00:00
Athou
8d85b1bcba tweak tests to be more resilient 2025-02-03 08:55:26 +01:00
Athou
c451eee406 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.4.2
remove workaround that is no longer needed
2025-02-02 15:58:59 +01:00
Jérémie Panzer
8f42135996 Merge pull request #1669 from Athou/renovate/linguijs-monorepo
fix(deps): update linguijs monorepo to ^5.2.0 (minor)
2025-02-01 16:28:59 +01:00
renovate[bot]
2c26aeed17 fix(deps): update linguijs monorepo to ^5.2.0 2025-02-01 14:12:40 +00:00
renovate[bot]
e2c4aa998b fix(deps): update dependency react-router-dom to ^7.1.5 2025-02-01 13:20:46 +00:00
Athou
c9e3b7f349 renovate already builds on push, don't trigger twice when it opens a PR 2025-02-01 14:19:50 +01:00
Athou
ebb4e52ba7 don't use lingui before it's initialized 2025-02-01 12:32:44 +01:00
Jérémie Panzer
1ddfdfb12e Merge pull request #1666 from Athou/renovate/quarkus.version
fix(deps): update quarkus.version to v3.18.1 (minor)
2025-01-31 07:47:00 +01:00
Jérémie Panzer
81f16aea62 Merge pull request #1667 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.1.0
2025-01-31 07:25:16 +01:00
renovate[bot]
429ec193c8 fix(deps): update dependency react-router-dom to ^7.1.4 2025-01-30 18:19:26 +00:00
renovate[bot]
732b714448 chore(deps): update dependency npm to v11.1.0 2025-01-30 01:05:55 +00:00
renovate[bot]
82e0405ad9 fix(deps): update quarkus.version to v3.18.1 2025-01-29 20:55:23 +00:00
Athou
9ef002fcd1 swagger-ui-react is no longer used 2025-01-29 15:06:00 +01:00
Athou
ec938e416c README clarification 2025-01-28 10:32:04 +01:00
Athou
37cf711cbc add support for the Retry-After header sent by OpenRSS 2025-01-27 07:48:19 +01:00
renovate[bot]
de441e4ff7 chore(deps): lock file maintenance 2025-01-27 01:07:29 +00:00
renovate[bot]
46251526b6 fix(deps): update dependency @reduxjs/toolkit to ^2.5.1 2025-01-26 22:09:50 +00:00
Jérémie Panzer
67eeea0b06 Merge pull request #1664 from Athou/renovate/com.puppycrawl.tools-checkstyle-10.21.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.2
2025-01-26 23:09:03 +01:00
renovate[bot]
b49ccc4cd9 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.2 2025-01-26 16:48:25 +00:00
renovate[bot]
8586a8b57b fix(deps): update mantine monorepo to ^7.16.2 2025-01-26 13:53:50 +00:00
Jérémie Panzer
d9f63786a8 Merge pull request #1663 from Athou/renovate/swagger-ui-react-4.x
chore(deps): update dependency @types/swagger-ui-react to ^4.19.0
2025-01-26 14:53:04 +01:00
renovate[bot]
8f0c8b68b9 chore(deps): update dependency @types/swagger-ui-react to ^4.19.0 2025-01-26 12:40:20 +00:00
Jérémie Panzer
15e574c5c4 Merge pull request #1662 from Athou/renovate/docker-build-push-action-digest
chore(deps): update docker/build-push-action digest to ca877d9
2025-01-24 11:21:15 +01:00
renovate[bot]
fe532242b4 chore(deps): update docker/build-push-action digest to ca877d9 2025-01-24 09:35:09 +00:00
renovate[bot]
fb48ff0858 chore(deps): update dependency vitest to ^3.0.4 2025-01-23 21:13:02 +00:00
Athou
8d850639d7 remove branches-ignore because it applies to target branch 2025-01-23 22:11:53 +01:00
Athou
ee73195915 add github actions permissions 2025-01-23 21:50:27 +01:00
Athou
72d9dad61b fix "an artifact with this name already exists on the workflow run" 2025-01-23 21:50:12 +01:00
Athou
fde8dab8cd simplify youtube channels url detection 2025-01-23 21:49:52 +01:00
Athou
dae5efa787 allow next Java LTS version 2025-01-23 21:49:28 +01:00
Jérémie Panzer
3c067140fd Merge pull request #1661 from Athou/renovate/patch-react-monorepo
chore(deps): update dependency @types/react to ^19.0.8
2025-01-23 18:39:30 +01:00
renovate[bot]
4ccbe81e87 chore(deps): update dependency @types/react to ^19.0.8 2025-01-23 13:31:56 +00:00
Jérémie Panzer
3d5d93bb72 Merge pull request #1660 from Athou/renovate/patch-quarkus.version
fix(deps): update quarkus.version to v3.17.8 (patch)
2025-01-22 21:55:17 +01:00
renovate[bot]
4138b6eb9b fix(deps): update quarkus.version to v3.17.8 2025-01-22 18:33:36 +00:00
Jérémie Panzer
9c39c95a9b Merge pull request #1659 from Athou/renovate/pin-dependencies
chore(deps): pin dependencies
2025-01-22 10:53:56 +01:00
Jérémie Panzer
32b2bf99a4 Merge pull request #1658 from Athou/renovate/node-22.13.x
chore(deps): update node.js to v22.13.1
2025-01-22 08:19:38 +01:00
renovate[bot]
cf459876af chore(deps): update node.js to v22.13.1 2025-01-22 06:53:04 +00:00
renovate[bot]
6698bd74b5 chore(deps): pin dependencies 2025-01-22 06:52:59 +00:00
Athou
c81d06e5f3 pin github actions 2025-01-22 07:52:09 +01:00
renovate[bot]
b12a78dc84 fix(deps): update dependency tss-react to ^4.9.15 2025-01-21 21:34:41 +00:00
renovate[bot]
b076587e44 chore(deps): update dependency vitest to ^3.0.3 2025-01-21 17:42:28 +00:00
renovate[bot]
bb12f16bea chore(deps): update dependency vite to ^6.0.11 2025-01-21 12:35:00 +00:00
renovate[bot]
e80caadd12 chore(deps): update dependency vite to ^6.0.10 2025-01-20 21:35:21 +00:00
renovate[bot]
846d93f2b2 chore(deps): lock file maintenance 2025-01-20 19:18:35 +00:00
Steven Conaway
0ed6f6ef9c chore(deps): move to react@^19 (#1657)
* chore(deps): move to react@^19

* chore(deps): manually override old peer dependencies

* chore(deps): upgrade rollup-plugin-visualizer

* chore(deps): remove `package-lock.json` and `node_modules/` and regen lockfile

* chore(deps): remove randomly added dependencies

* chore(deps): change override for react@^19 peer dep
2025-01-20 19:59:42 +01:00
renovate[bot]
15992dcb80 chore(deps): update dependency vite to ^6.0.9 2025-01-20 14:11:24 +00:00
renovate[bot]
1a5c399b54 chore(deps): lock file maintenance 2025-01-20 01:15:47 +00:00
Athou
5e92f9ffb8 we can skip the docker step altogether for PRs 2025-01-19 21:40:30 +01:00
renovate[bot]
71164d1b69 fix(deps): update mantine monorepo to ^7.16.1 2025-01-19 13:51:46 +00:00
renovate[bot]
6947670fe6 fix(deps): update dependency react-router-dom to ^7.1.3 2025-01-17 22:16:53 +00:00
renovate[bot]
30810e37b9 chore(deps): update dependency vitest to ^3.0.2 2025-01-17 21:52:28 +00:00
Athou
b17b2767b0 run CI on pull requests 2025-01-17 22:40:47 +01:00
Athou
d37cf5bbcf release 5.4.0 2025-01-17 17:15:09 +01:00
Athou
045baba705 use github actions to build a native arm64 docker image 2025-01-17 16:12:05 +01:00
renovate[bot]
3623dc8e1d chore(deps): update dependency vitest to ^3.0.1 2025-01-16 20:17:53 +00:00
renovate[bot]
2610c37067 fix(deps): update swagger.version to v2.2.28 2025-01-16 18:17:44 +00:00
renovate[bot]
286b69a646 fix(deps): update dependency react-router-dom to ^7.1.2 2025-01-16 15:56:44 +00:00
Jérémie Panzer
9673f27090 Merge pull request #1656 from Athou/renovate/major-vitest-monorepo
chore(deps): update dependency vitest to v3
2025-01-16 16:55:55 +01:00
renovate[bot]
0722599f6d chore(deps): update dependency vitest to v3 2025-01-16 14:17:05 +00:00
Jérémie Panzer
1df40d8370 Merge pull request #1655 from Athou/renovate/redoc-2.x
fix(deps): update dependency redoc to ^2.3.0
2025-01-16 15:15:28 +01:00
renovate[bot]
457e4ec69e fix(deps): update dependency redoc to ^2.3.0 2025-01-16 13:56:26 +00:00
renovate[bot]
647310a45f fix(deps): update quarkus.version to v3.17.7 2025-01-15 17:22:28 +00:00
renovate[bot]
e85c92f216 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v2.44.2 2025-01-15 02:04:18 +00:00
renovate[bot]
d93b0dbfd4 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.30 2025-01-14 20:40:37 +00:00
Jérémie Panzer
b4e61ef547 Merge pull request #1654 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo to ^7.16.0 (minor)
2025-01-14 14:14:01 +01:00
Jérémie Panzer
71dffbba46 Merge pull request #1653 from Athou/renovate/debian-12.x
chore(deps): update debian docker tag to v12.9
2025-01-14 14:13:51 +01:00
renovate[bot]
2c0b0c4e3b fix(deps): update mantine monorepo to ^7.16.0 2025-01-14 12:49:52 +00:00
renovate[bot]
d868e58e1e chore(deps): update debian docker tag to v12.9 2025-01-14 12:49:31 +00:00
renovate[bot]
90eb2095bf chore(deps): lock file maintenance 2025-01-13 01:27:25 +00:00
Athou
62d3ed16e6 remove DOCTYPE declarations (#1260) 2025-01-10 16:18:49 +01:00
Jérémie Panzer
74f7c48818 Merge pull request #1652 from Athou/renovate/jsdom-26.x
chore(deps): update dependency jsdom to v26
2025-01-10 15:43:55 +01:00
renovate[bot]
23fe9c29ed chore(deps): update dependency jsdom to v26 2025-01-09 10:23:05 +00:00
renovate[bot]
8f7be8278a chore(deps): update dependency typescript to ^5.7.3 (#1651)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-09 05:40:40 +00:00
renovate[bot]
49118b6ea0 fix(deps): update quarkus.version to v3.17.6 2025-01-08 17:50:38 +00:00
Jérémie Panzer
d97bd04ae2 Merge pull request #1649 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-2.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v2.44.1
2025-01-08 18:50:20 +01:00
Jérémie Panzer
8d11309b64 Merge pull request #1650 from Athou/renovate/node-22.x
chore(deps): update node.js to v22.13.0
2025-01-08 18:50:07 +01:00
renovate[bot]
68c24e4cb8 chore(deps): update node.js to v22.13.0 2025-01-08 17:21:57 +00:00
renovate[bot]
4e43e0235f chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v2.44.1 2025-01-08 15:35:52 +00:00
renovate[bot]
62b79a9625 fix(deps): update mantine monorepo to ^7.15.3 2025-01-08 15:35:49 +00:00
renovate[bot]
cb0706808c chore(deps): lock file maintenance 2025-01-06 02:01:57 +00:00
renovate[bot]
ffd5704b1e chore(deps): update dependency vite to ^6.0.7 2025-01-02 23:21:46 +00:00
Jérémie Panzer
3987077e5a Merge pull request #1647 from Athou/renovate/io.github.hakky54-sslcontext-kickstart-for-apache5-9.x
fix(deps): update dependency io.github.hakky54:sslcontext-kickstart-for-apache5 to v9
2025-01-01 16:02:38 +01:00
renovate[bot]
2e01a76784 fix(deps): update dependency io.github.hakky54:sslcontext-kickstart-for-apache5 to v9 2025-01-01 13:58:06 +00:00
Athou
8254093f5f fix tests failing because pubDate is older than a year 2024-12-30 08:07:03 +01:00
Jérémie Panzer
0b06526756 Merge pull request #1646 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2024-12-30 07:20:00 +01:00
renovate[bot]
06731ae76d chore(deps): lock file maintenance 2024-12-30 00:18:52 +00:00
Jérémie Panzer
9a59453792 Merge pull request #1645 from Athou/renovate/patch-fontsource-monorepo
fix(deps): update dependency @fontsource/open-sans to ^5.1.1
2024-12-29 19:01:50 +01:00
renovate[bot]
c195a52c89 fix(deps): update dependency @fontsource/open-sans to ^5.1.1 2024-12-29 14:30:46 +00:00
Jérémie Panzer
3d7924f953 Merge pull request #1644 from Athou/renovate/com.puppycrawl.tools-checkstyle-10.21.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.1
2024-12-29 10:20:33 +01:00
renovate[bot]
f29efd7fae chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.1 2024-12-28 15:55:17 +00:00
Jérémie Panzer
157bff3c83 Merge pull request #1643 from Athou/renovate/rollup-plugin-visualizer-5.13.x
chore(deps): update dependency rollup-plugin-visualizer to ^5.13.1
2024-12-28 13:41:58 +01:00
renovate[bot]
5c17bbc36d chore(deps): update dependency rollup-plugin-visualizer to ^5.13.1 2024-12-27 11:16:46 +00:00
Jérémie Panzer
c85e72e70c Merge pull request #1642 from Athou/renovate/rollup-plugin-visualizer-5.x
chore(deps): update dependency rollup-plugin-visualizer to ^5.13.0
2024-12-27 12:16:03 +01:00
renovate[bot]
01150f67e1 chore(deps): update dependency rollup-plugin-visualizer to ^5.13.0 2024-12-27 10:55:17 +00:00
Jérémie Panzer
75aca7aa6f Merge pull request #1638 from bestZwei/patch-1
Update zh/messages.po
2024-12-27 05:05:22 +01:00
zwei
affde7e43c Update messages.po
add a few Chinese Translations
2024-12-26 22:49:36 +08:00
renovate[bot]
b9b1b53235 chore(deps): update dependency vite to ^6.0.6 2024-12-26 05:23:50 +00:00
renovate[bot]
708ebb8abc fix(deps): update dependency react-router-dom to ^7.1.1 2024-12-23 18:42:33 +00:00
renovate[bot]
83e763df0a fix(deps): update mantine monorepo to ^7.15.2 2024-12-23 11:22:09 +00:00
Jérémie Panzer
0ff812c1ea Merge pull request #1637 from Athou/renovate/lock-file-maintenance
chore(deps): lock file maintenance
2024-12-23 12:21:17 +01:00
renovate[bot]
3e9dd6d8e2 chore(deps): lock file maintenance 2024-12-23 10:39:01 +00:00
Jérémie Panzer
23af73e847 Merge pull request #1626 from Athou/renovate/mantine-monorepo
fix(deps): update mantine monorepo (minor)
2024-12-23 11:37:18 +01:00
renovate[bot]
e79e4719fd fix(deps): update mantine monorepo 2024-12-23 10:17:49 +00:00
Jérémie Panzer
23fef98432 Merge pull request #1636 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.1.0
2024-12-21 10:50:32 +01:00
renovate[bot]
22478252e7 fix(deps): update dependency react-router-dom to ^7.1.0 2024-12-21 02:23:37 +00:00
Jérémie Panzer
76b1f3cd35 Merge pull request #1635 from Athou/renovate/vite-6.0.x
chore(deps): update dependency vite to ^6.0.5
2024-12-20 22:47:21 +01:00
renovate[bot]
420d73ec6a chore(deps): update dependency vite to ^6.0.5 2024-12-20 11:53:07 +00:00
renovate[bot]
e0211cfa0c chore(deps): update dependency @types/react to ^18.3.18 2024-12-20 02:18:48 +00:00
renovate[bot]
25a92c651c fix(deps): update quarkus.version to v3.17.5 2024-12-19 20:26:08 +00:00
renovate[bot]
0781205c69 chore(deps): update dependency vite to ^6.0.4 2024-12-19 11:15:48 +00:00
Jérémie Panzer
5102dd5e30 Merge pull request #1613 from Athou/renovate/vite-6.x
chore(deps): update dependency vite to v6
2024-12-16 21:30:14 +01:00
renovate[bot]
6ccfc3fd67 chore(deps): update dependency vite to v6 2024-12-16 20:14:47 +00:00
Athou
2791ed91ab lingui update 2024-12-16 21:11:54 +01:00
Jérémie Panzer
f40c198233 Merge pull request #1634 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11
2024-12-16 20:57:57 +01:00
renovate[bot]
003dc63121 chore(deps): update dependency npm to v11 2024-12-16 19:36:39 +00:00
renovate[bot]
f8ef1e2a99 chore(deps): update dependency @types/react to ^18.3.17 2024-12-16 15:42:17 +00:00
renovate[bot]
14c7078940 fix(deps): update querydsl.version to v6.10.1 2024-12-16 00:30:43 +00:00
Jérémie Panzer
074836d3e8 Merge pull request #1632 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v6.10 (minor)
2024-12-14 06:59:55 +01:00
renovate[bot]
0cdbc144b3 fix(deps): update querydsl.version to v6.10 2024-12-13 20:09:27 +00:00
Jérémie Panzer
dc63ec24c0 Merge pull request #1630 from Athou/renovate/com.puppycrawl.tools-checkstyle-10.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.0
2024-12-12 22:42:41 +01:00
renovate[bot]
6d4c6c36a5 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.21.0 2024-12-12 20:31:27 +00:00
renovate[bot]
464af5f4d9 fix(deps): update swagger.version to v2.2.27 2024-12-11 18:13:04 +00:00
renovate[bot]
aa94a46a3d fix(deps): update quarkus.version to v3.17.4 2024-12-11 16:27:30 +00:00
renovate[bot]
8542197dc3 chore(deps): update react monorepo 2024-12-11 06:15:47 +00:00
Jérémie Panzer
64d77eaef4 Merge pull request #1628 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.5.0
2024-12-11 07:14:49 +01:00
Jérémie Panzer
675ef8794c Merge pull request #1627 from Athou/renovate/react-redux-9.x
fix(deps): update dependency react-redux to ^9.2.0
2024-12-11 07:14:17 +01:00
renovate[bot]
4bcdbeb516 fix(deps): update dependency @reduxjs/toolkit to ^2.5.0 2024-12-11 04:59:19 +00:00
renovate[bot]
a9f37739fb fix(deps): update dependency react-redux to ^9.2.0 2024-12-11 02:11:18 +00:00
renovate[bot]
5ab0fc19da chore(deps): update dependency @types/react-dom to ^18.3.3 2024-12-09 22:54:32 +00:00
renovate[bot]
7b232425f3 fix(deps): update dependency monaco-editor to ^0.52.2 2024-12-09 19:06:36 +00:00
Jérémie Panzer
c0e7668140 Merge pull request #1625 from Athou/renovate/emotion-monorepo
fix(deps): update dependency @emotion/react to ^11.14.0
2024-12-09 16:02:32 +01:00
renovate[bot]
ae3f059257 fix(deps): update dependency @emotion/react to ^11.14.0 2024-12-09 12:04:31 +00:00
renovate[bot]
d44c7c1e95 fix(deps): update dependency tss-react to ^4.9.14 2024-12-09 07:48:44 +00:00
renovate[bot]
6cd9d134cf chore(deps): update dependency vite-tsconfig-paths to ^5.1.4 2024-12-07 05:53:17 +00:00
renovate[bot]
6f21ba8afc chore(deps): update react monorepo 2024-12-05 19:55:23 +00:00
renovate[bot]
b2fe13c117 chore(deps): update dependency npm to v10.9.2 2024-12-05 01:06:03 +00:00
renovate[bot]
03ece7a262 chore(deps): update dependency @types/react to ^18.3.13 (#1622)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-05 01:05:43 +00:00
renovate[bot]
697fde2d0e chore(deps): update quarkus.version to v3.17.3 2024-12-04 20:09:33 +00:00
renovate[bot]
7f0f85b356 fix(deps): update dependency axios to ^1.7.9 2024-12-04 09:43:27 +00:00
Jérémie Panzer
a7d41debfe Merge pull request #1621 from Athou/renovate/node-22.x
chore(deps): update node.js to v22.12.0
2024-12-04 07:21:31 +01:00
renovate[bot]
57bf758108 chore(deps): update node.js to v22.12.0 2024-12-03 21:03:12 +00:00
Jérémie Panzer
b37d933047 Merge pull request #1620 from Athou/renovate/react-icons-5.x
fix(deps): update dependency react-icons to ^5.4.0
2024-12-03 13:08:38 +01:00
renovate[bot]
80ffef4555 fix(deps): update dependency react-icons to ^5.4.0 2024-12-03 11:31:44 +00:00
renovate[bot]
af5a0002aa fix(deps): update dependency react-router-dom to ^7.0.2 2024-12-03 04:09:43 +00:00
Athou
cd24e412e3 release 5.3.6 2024-12-02 18:50:14 +01:00
Athou
a073d843ab ignore invalid cache control values (#1619) 2024-12-02 18:43:46 +01:00
renovate[bot]
8ccb59ed18 chore(deps): update dependency vitest to ^2.1.8 2024-12-02 14:56:45 +00:00
renovate[bot]
e6dc7d2d0d chore(deps): lock file maintenance 2024-12-02 03:59:25 +00:00
Athou
f7b21ca3f6 release 5.3.5 2024-12-02 04:57:26 +01:00
Athou
df3a1bcdb6 update changelog 2024-12-02 04:54:58 +01:00
renovate[bot]
5bec494a7c fix(deps): update dependency org.jsoup:jsoup to v1.18.3 2024-12-02 03:18:47 +00:00
renovate[bot]
d8eef4dd9f chore(deps): lock file maintenance 2024-12-02 02:00:17 +00:00
renovate[bot]
d80138caf3 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.20.2 2024-12-01 06:04:51 +00:00
Athou
d26c103aa5 migrate to markdown documentation 2024-12-01 06:04:08 +01:00
Athou
249231f57e add support for JDK 23 compilation (#1618) 2024-12-01 05:43:35 +01:00
Athou
7a838cddad honor Cache-Control response header (#1615) 2024-11-29 17:06:57 +01:00
renovate[bot]
477f2cd6db fix(deps): update dependency io.quarkus.platform:quarkus-bom to v3.17.2 2024-11-29 13:10:54 +00:00
Athou
9915f05f73 remove lingui warnings 2024-11-29 14:08:25 +01:00
Athou
0a16bb2fba if width is specified, keep images aspect ratio (#1595) 2024-11-29 13:30:48 +01:00
Jérémie Panzer
3d4faf2406 Merge pull request #1616 from Athou/renovate/major-linguijs-monorepo
chore(deps): update linguijs monorepo to v5 (major)
2024-11-29 07:42:28 +01:00
Jérémie Panzer
63de6fe833 Merge pull request #1617 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.4.0
2024-11-29 07:42:17 +01:00
renovate[bot]
9c6219a58a fix(deps): update dependency @reduxjs/toolkit to ^2.4.0 2024-11-28 22:00:49 +00:00
renovate[bot]
3e664d4287 chore(deps): update linguijs monorepo to v5 2024-11-28 19:15:26 +00:00
renovate[bot]
4c4ffd84f3 chore(deps): update linguijs monorepo to ^4.14.1 2024-11-28 15:13:09 +00:00
renovate[bot]
f555f0e392 fix(deps): update mantine monorepo to ^7.14.3 2024-11-28 14:43:41 +00:00
renovate[bot]
124166738b fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.29 2024-11-28 09:55:36 +00:00
Jérémie Panzer
8b32dcc576 Merge pull request #1614 from Athou/renovate/quarkus.version
fix(deps): update dependency io.quarkus.platform:quarkus-bom to v3.17.0
2024-11-27 16:13:19 +01:00
renovate[bot]
105651215a fix(deps): update dependency io.quarkus.platform:quarkus-bom to v3.17.0 2024-11-27 14:52:32 +00:00
renovate[bot]
d9c6cbd072 fix(deps): update dependency org.jsoup:jsoup to v1.18.2 2024-11-27 13:00:42 +00:00
renovate[bot]
b4c52e06fe chore(deps): update dependency vitest to ^2.1.6 2024-11-27 11:35:05 +00:00
Athou
2565dfe528 remove workaround because quarkus.http.auth.form.cookie-max-age is now available 2024-11-27 10:05:26 +01:00
Athou
b5036c9148 Merge branch 'renovate/quarkus.version' 2024-11-27 10:00:53 +01:00
renovate[bot]
e2c8ddb8f7 chore(deps): update quarkus.version to v3.16.4 2024-11-27 10:00:32 +01:00
renovate[bot]
85fbd284fa chore(deps): update dependency @vitejs/plugin-react to ^4.3.4 2024-11-26 11:15:33 +00:00
renovate[bot]
559fb69a64 fix(deps): update dependency axios to ^1.7.8 2024-11-25 23:25:26 +00:00
renovate[bot]
054c76716a chore(deps): lock file maintenance 2024-11-25 00:49:27 +00:00
renovate[bot]
ba17c9350f fix(deps): update mantine monorepo to ^7.14.2 2024-11-24 14:33:06 +00:00
Jérémie Panzer
781015eea4 Merge pull request #1608 from Athou/renovate/major-react-router-monorepo
fix(deps): update dependency react-router-dom to v7
2024-11-23 15:40:57 +01:00
Jérémie Panzer
13e5c0e8d2 Merge pull request #1607 from Athou/renovate/com.microsoft.playwright-playwright-1.x
chore(deps): update dependency com.microsoft.playwright:playwright to v1.49.0
2024-11-23 15:40:41 +01:00
Jérémie Panzer
4d88a30848 Merge pull request #1597 from Athou/renovate/com.puppycrawl.tools-checkstyle-10.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.20.1
2024-11-23 15:40:05 +01:00
Jérémie Panzer
19c03de9e4 Merge pull request #1604 from Athou/renovate/debian-12.x
chore(deps): update debian docker tag to v12.8
2024-11-23 15:39:57 +01:00
Jérémie Panzer
e3169c9f2d Merge pull request #1609 from Athou/renovate/querydsl.version
fix(deps): update querydsl.version to v6.9 (minor)
2024-11-23 15:39:46 +01:00
Jérémie Panzer
e90fb0b56f Merge pull request #1611 from Athou/renovate/typescript-5.x
chore(deps): update dependency typescript to ^5.7.2
2024-11-23 15:39:31 +01:00
renovate[bot]
69607a5122 chore(deps): update dependency typescript to ^5.7.2 2024-11-22 19:13:41 +00:00
renovate[bot]
21eb8e6d9f fix(deps): update dependency react-router-dom to v7 2024-11-22 16:56:53 +00:00
renovate[bot]
a28a6b9dc4 fix(deps): update dependency io.github.openfeign.querydsl:querydsl-jpa to v6.9 2024-11-22 14:10:54 +00:00
renovate[bot]
a9cadbafeb chore(deps): update dependency com.microsoft.playwright:playwright to v1.49.0 2024-11-22 03:47:15 +00:00
renovate[bot]
d491af5a8d chore(deps): update dependency npm to v10.9.1 2024-11-22 00:38:41 +00:00
renovate[bot]
39c7934fb8 fix(deps): update dependency @emotion/react to ^11.13.5 2024-11-20 10:41:11 +00:00
renovate[bot]
76eba8cc63 chore(deps): update dependency vite-tsconfig-paths to ^5.1.3 2024-11-19 23:22:57 +00:00
renovate[bot]
7549ff2491 chore(deps): update dependency @types/tinycon to ^0.6.7 2024-11-19 18:55:08 +00:00
renovate[bot]
66cd18bc4b chore(deps): update dependency io.swagger.core.v3:swagger-maven-plugin-jakarta to v2.2.26 2024-11-19 06:34:58 +00:00
renovate[bot]
44d7a2c340 chore(deps): update dependency io.quarkus.platform:quarkus-maven-plugin to v3.15.2 2024-11-19 02:12:42 +00:00
renovate[bot]
d6ee63a01f chore(deps): update ibm-semeru-runtimes docker tag to open-21.0.5_11-jre 2024-11-18 22:02:31 +00:00
renovate[bot]
a495c9cacd fix(deps): update mantine monorepo to ^7.14.1 2024-11-18 04:24:54 +00:00
renovate[bot]
530185d15c chore(deps): lock file maintenance 2024-11-18 01:29:43 +00:00
renovate[bot]
8dd28c25a7 fix(deps): update dependency org.projectlombok:lombok to v1.18.36 2024-11-15 22:09:25 +00:00
renovate[bot]
50884b236c chore(deps): update dependency vitest to ^2.1.5 2024-11-13 16:06:06 +00:00
renovate[bot]
da9fe09e58 chore(deps): update dependency @types/tinycon to ^0.6.6 2024-11-12 09:54:28 +00:00
renovate[bot]
3c24c9aa7a chore(deps): update debian docker tag to v12.8 2024-11-12 02:04:08 +00:00
renovate[bot]
9d10a4b46f fix(deps): update dependency react-router-dom to ^6.28.0 2024-11-12 02:04:06 +00:00
renovate[bot]
d56ed3bd06 chore(deps): update linguijs monorepo to ^4.14.0 2024-11-11 21:19:20 +00:00
renovate[bot]
41c1c429d0 chore(deps): update dependency vite-tsconfig-paths to ^5.1.2 2024-11-11 19:43:20 +00:00
renovate[bot]
1a3d890b40 chore(deps): lock file maintenance (#1603)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 19:42:44 +00:00
renovate[bot]
e3ec9b2ccd chore(deps): update dependency vite to ^5.4.11 2024-11-11 13:43:13 +00:00
renovate[bot]
f69878a242 fix(deps): update mantine monorepo to ^7.13.5 2024-11-09 02:31:03 +00:00
renovate[bot]
ea766706fb chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.20.1 2024-11-07 19:31:05 +00:00
renovate[bot]
306507af80 fix(deps): update dependency react-swipeable to ^7.0.2 2024-11-04 17:47:41 +00:00
renovate[bot]
67084783b2 chore(deps): lock file maintenance 2024-11-04 00:09:27 +00:00
renovate[bot]
7cbb75f717 chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.2 2024-11-02 21:48:13 +00:00
renovate[bot]
1c335492d5 chore(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.2 2024-11-02 20:25:15 +00:00
Jérémie Panzer
de92e74c8e Merge pull request #1594 from Athou/renovate/node-22.x
chore(deps): update dependency node to v22
2024-10-29 18:07:01 +01:00
renovate[bot]
9cbbd30618 chore(deps): update dependency node to v22 2024-10-29 16:43:49 +00:00
Jérémie Panzer
f14f1493c4 Merge pull request #1593 from Athou/renovate/patch-vitest-monorepo
chore(deps): update dependency vitest to ^2.1.4
2024-10-29 00:09:00 +01:00
renovate[bot]
e68c8fdbe1 chore(deps): update dependency vitest to ^2.1.4 2024-10-28 22:13:08 +00:00
renovate[bot]
e094972aa2 fix(deps): update dependency org.apache.httpcomponents.client5:httpclient5 to v5.4.1 2024-10-28 19:56:15 +00:00
renovate[bot]
ff831c6d2b chore(deps): lock file maintenance 2024-10-28 01:19:01 +00:00
Jérémie Panzer
9957cda11a Merge pull request #1592 from Athou/renovate/com.puppycrawl.tools-checkstyle-10.x
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.19.0
2024-10-26 16:33:49 +02:00
renovate[bot]
6809822000 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.19.0 2024-10-26 13:58:03 +00:00
Jérémie Panzer
8048b1a9aa Merge pull request #1591 from Athou/renovate/org.apache.maven.plugins-maven-checkstyle-plugin-3.x
chore(deps): update dependency org.apache.maven.plugins:maven-checkstyle-plugin to v3.6.0
2024-10-26 05:57:45 +02:00
renovate[bot]
8557bd018a chore(deps): update dependency org.apache.maven.plugins:maven-checkstyle-plugin to v3.6.0 2024-10-25 18:25:58 +00:00
Jérémie Panzer
183d5fd162 Merge pull request #1590 from Athou/renovate/com.ibm.icu-icu4j-76.x
fix(deps): update dependency com.ibm.icu:icu4j to v76
2024-10-25 17:22:54 +02:00
renovate[bot]
411f86fbeb fix(deps): update dependency com.ibm.icu:icu4j to v76 2024-10-25 06:17:19 +00:00
renovate[bot]
5493046f25 fix(deps): update mantine monorepo to ^7.13.4 2024-10-23 18:02:39 +00:00
Athou
42015015a5 release 5.3.4 2024-10-23 20:01:40 +02:00
Athou
f3d2808f7d add support for Internationalized Domain Names (#1588) 2024-10-23 19:58:47 +02:00
renovate[bot]
906c353a7f chore(deps): update dependency @types/react to ^18.3.12 2024-10-23 06:05:51 +00:00
renovate[bot]
93dea83cd3 chore(deps): update dependency vite to ^5.4.10 2024-10-23 03:47:21 +00:00
renovate[bot]
1fc76ce1ad chore(deps): update dependency org.apache.maven.plugins:maven-help-plugin to v3.5.1 2024-10-21 19:53:59 +00:00
Athou
a337b01bc7 release 5.3.3 2024-10-21 21:53:28 +02:00
Athou
689e5c0004 remove image bottom margins (#1587) 2024-10-21 21:51:46 +02:00
Athou
d5a3c81c85 release 5.3.2 2024-10-21 21:20:27 +02:00
Athou
8230fde5d2 preserve style attribute from images (#1587) 2024-10-21 21:15:57 +02:00
renovate[bot]
b35513ea84 chore(deps): lock file maintenance 2024-10-21 01:29:16 +00:00
renovate[bot]
42a7785ca1 chore(deps): update dependency @vitejs/plugin-react to ^4.3.3 2024-10-19 18:29:57 +00:00
Jérémie Panzer
ea5ee4f04f Merge pull request #1586 from Athou/renovate/com.microsoft.playwright-playwright-1.x
chore(deps): update dependency com.microsoft.playwright:playwright to v1.48.0
2024-10-18 05:53:42 +02:00
renovate[bot]
3e14b12d4f chore(deps): update dependency com.microsoft.playwright:playwright to v1.48.0 2024-10-17 21:46:18 +00:00
renovate[bot]
78cc30f828 chore(deps): update dependency @biomejs/biome to v1.9.4 2024-10-17 21:46:15 +00:00
renovate[bot]
6091c84e60 fix(deps): update mantine monorepo to ^7.13.3 2024-10-17 09:14:54 +00:00
Jérémie Panzer
6ea95ad254 Merge pull request #1585 from Athou/renovate/redoc-2.x
fix(deps): update dependency redoc to ^2.2.0
2024-10-16 14:24:28 +02:00
renovate[bot]
7f888d926e fix(deps): update dependency redoc to ^2.2.0 2024-10-16 11:00:17 +00:00
Jérémie Panzer
5e4e02474f Merge pull request #1583 from Athou/renovate/linguijs-monorepo
chore(deps): update linguijs monorepo to ^4.13.0 (minor)
2024-10-15 16:07:30 +02:00
renovate[bot]
bff8611b42 chore(deps): update linguijs monorepo to ^4.13.0 2024-10-15 10:56:26 +00:00
renovate[bot]
f674048af3 fix(deps): update dependency org.passay:passay to v1.6.6 2024-10-15 02:21:46 +00:00
Jérémie Panzer
0265c24cf9 Merge pull request #1582 from Athou/renovate/reduxjs-toolkit-2.x
fix(deps): update dependency @reduxjs/toolkit to ^2.3.0
2024-10-15 04:21:26 +02:00
renovate[bot]
f8c3a229ec fix(deps): update dependency @reduxjs/toolkit to ^2.3.0 2024-10-14 21:53:07 +00:00
renovate[bot]
c424f40420 chore(deps): update dependency vitest to ^2.1.3 2024-10-14 21:52:47 +00:00
renovate[bot]
b77666cfe5 chore(deps): update dependency vite to ^5.4.9 2024-10-14 19:06:28 +00:00
renovate[bot]
193d1604d9 chore(deps): lock file maintenance 2024-10-14 03:20:28 +00:00
renovate[bot]
4efc6296b5 chore(deps): lock file maintenance 2024-10-14 01:22:19 +00:00
Jérémie Panzer
f753a4bdda Merge pull request #1578 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^6.27.0
2024-10-12 07:25:02 +02:00
Jérémie Panzer
afaaaf9657 Merge pull request #1577 from Athou/renovate/linguijs-monorepo
chore(deps): update linguijs monorepo to ^4.12.0 (minor)
2024-10-12 07:24:54 +02:00
renovate[bot]
4d46896bf0 fix(deps): update dependency react-router-dom to ^6.27.0 2024-10-11 20:09:41 +00:00
renovate[bot]
2ad28c927f chore(deps): update linguijs monorepo to ^4.12.0 2024-10-11 15:36:55 +00:00
renovate[bot]
b9680a66ef chore(deps): update dependency @types/react-dom to ^18.3.1 2024-10-11 15:36:38 +00:00
Athou
4f687d5857 indicate that -Xmx also works for the native package (#1539) 2024-10-10 15:29:18 +02:00
renovate[bot]
9cca026834 chore(deps): update dependency typescript to ^5.6.3 2024-10-09 01:04:51 +00:00
renovate[bot]
058a9cd192 fix(deps): update dependency @reduxjs/toolkit to ^2.2.8 2024-10-08 07:21:11 +00:00
renovate[bot]
57d2ede86e chore(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.1 2024-10-07 13:07:50 +00:00
renovate[bot]
e3abea4ec5 chore(deps): lock file maintenance 2024-10-07 00:38:09 +00:00
renovate[bot]
b831f1f35c chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.1 2024-10-06 12:53:45 +00:00
Athou
74bce1308c release 5.3.1 2024-10-04 20:33:56 +02:00
Athou
98cfa6d2c8 add regression test 2024-10-04 20:24:43 +02:00
Athou
99a02a2186 fix issue with some HTTP feeds (#1572) 2024-10-04 20:20:02 +02:00
Jérémie Panzer
3431a813b1 Merge pull request #1574 from Athou/renovate/npm-10.x
chore(deps): update dependency npm to v10.9.0
2024-10-04 07:51:15 +02:00
renovate[bot]
e9e0e8d32b chore(deps): update dependency npm to v10.9.0 2024-10-03 19:31:06 +00:00
renovate[bot]
2d14409d35 fix(deps): update dependency io.dropwizard.metrics:metrics-json to v4.2.28 2024-10-03 19:31:04 +00:00
Jérémie Panzer
a8200e5c58 Merge pull request #1573 from Athou/renovate/node-20.x
chore(deps): update dependency node to v20.18.0
2024-10-03 21:30:44 +02:00
renovate[bot]
79a8df8b06 chore(deps): update dependency node to v20.18.0 2024-10-03 19:00:34 +00:00
renovate[bot]
061a5f0262 fix(deps): update mantine monorepo to ^7.13.2 2024-10-03 13:32:54 +00:00
renovate[bot]
821bdb3b0f chore(deps): update dependency vitest to ^2.1.2 2024-10-02 21:46:25 +00:00
renovate[bot]
606dfa9299 chore(deps): update dependency @types/react to ^18.3.11 2024-10-02 18:42:46 +00:00
renovate[bot]
131357c616 fix(deps): update swagger.version to v2.2.25 2024-10-02 13:17:53 +00:00
renovate[bot]
f6d3493bad chore(deps): update dependency @biomejs/biome to v1.9.3 2024-10-01 14:28:45 +00:00
renovate[bot]
0c6104e25b fix(deps): update mantine monorepo to ^7.13.1 2024-09-30 09:40:08 +00:00
Jérémie Panzer
d73735a35d Merge pull request #1571 from Athou/renovate/vitejs-plugin-react-4.3.x
chore(deps): update dependency @vitejs/plugin-react to ^4.3.2
2024-09-30 06:31:07 +02:00
renovate[bot]
e725d2d6b6 chore(deps): update dependency @vitejs/plugin-react to ^4.3.2 2024-09-30 04:02:46 +00:00
renovate[bot]
f0e1279d68 chore(deps): lock file maintenance 2024-09-30 00:36:34 +00:00
renovate[bot]
c74c74d2c4 chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.18.2 2024-09-29 19:11:52 +00:00
renovate[bot]
aa70cf5dcd chore(deps): update dependency @types/react to ^18.3.10 2024-09-27 16:41:55 +00:00
Jérémie Panzer
1055259627 Merge pull request #1569 from canoine/patch-1
Update fr/messages.po
2024-09-26 22:35:33 +02:00
canoine
302d37b6ef Update fr/messages.po
French translation update
2024-09-26 21:41:37 +02:00
Jérémie Panzer
8532a73d94 Merge pull request #1565 from Athou/renovate/quarkus.version
chore(deps): update quarkus.version to v3.15.1 (minor)
2024-09-26 10:25:09 +02:00
Athou
ffafb272cb update docs 2024-09-26 10:08:52 +02:00
Jérémie Panzer
22e0171a34 Merge pull request #1566 from dai/master
chore(ja): translated some strings
2024-09-26 10:03:32 +02:00
renovate[bot]
2b410f040c Update quarkus.version to v3.15.1 2024-09-26 08:02:28 +00:00
dai
259e8ad4e5 chore: translated some strings
Chore: Translated some new strings and reworked some wording.
2024-09-26 14:25:19 +09:00
Jérémie Panzer
21244dd9f5 Merge pull request #1564 from Athou/renovate/mantine-monorepo
Update mantine monorepo to ^7.13.0 (minor)
2024-09-25 12:52:53 +02:00
renovate[bot]
bc6206180d Update mantine monorepo to ^7.13.0 2024-09-25 09:53:00 +00:00
renovate[bot]
6e22d21358 Update dependency vite to ^5.4.8 2024-09-25 05:04:17 +00:00
renovate[bot]
95bdb4e700 Update dependency @types/react to ^18.3.9 2024-09-24 15:24:13 +00:00
Athou
9b7dbc68ab release 5.3.0 2024-09-24 07:58:43 +02:00
Athou
dc86c9b0db also manually load more entries if needed when pressing the next entry button in the header (#1557) 2024-09-24 07:54:50 +02:00
renovate[bot]
cb92ed753f Update swagger.version to v2.2.24 2024-09-23 16:36:50 +00:00
renovate[bot]
10a085e24e Lock file maintenance 2024-09-23 00:08:26 +00:00
renovate[bot]
3400a39edf Update dependency jsdom to ^25.0.1 2024-09-22 07:08:58 +00:00
Athou
21efffa345 Update dependency io.github.hakky54:sslcontext-kickstart-for-apache5 to v8.3.7
Update dependency org.apache.httpcomponents.client5:httpclient5 to v5.4
2024-09-22 09:07:20 +02:00
renovate[bot]
e2e80ba7e5 Update dependency com.github.eirslett:frontend-maven-plugin to v1.15.1 2024-09-21 18:11:14 +00:00
Jérémie Panzer
d988dba66e Merge pull request #1563 from Athou/renovate/querydsl.version
Update querydsl.version to v6.8 (minor)
2024-09-21 15:42:21 +02:00
renovate[bot]
403201fbff Update querydsl.version to v6.8 2024-09-21 13:25:28 +00:00
Athou
3cc93b51bb set default cooldown duration to 0 so it's not a breaking change 2024-09-21 10:57:16 +02:00
Athou
6a7d83bb45 show an error if force fetching feeds is not yet available 2024-09-21 10:31:17 +02:00
Athou
19c8db8b31 add a cooldown on the force refresh action (#1556) 2024-09-21 08:24:14 +02:00
renovate[bot]
0d75688ec8 Update dependency vite to ^5.4.7 2024-09-20 16:39:11 +00:00
renovate[bot]
e01dcb2f5b Update dependency @types/react to ^18.3.8 2024-09-19 22:25:45 +00:00
Jérémie Panzer
57757e2c14 Merge pull request #1561 from Athou/renovate/monaco-editor-0.x
Update dependency monaco-editor to ^0.52.0
2024-09-19 17:59:58 +02:00
renovate[bot]
779cd2fcfe Update dependency monaco-editor to ^0.52.0 2024-09-19 13:51:05 +00:00
renovate[bot]
94919f22e4 Update dependency @biomejs/biome to v1.9.2 2024-09-19 13:51:00 +00:00
Athou
d5cf690703 release 5.2.0 2024-09-18 17:21:10 +02:00
Athou
191574dace manually load more entries if needed when pressing a keyboard shortcut to go to the next entry (#1557) 2024-09-18 16:23:53 +02:00
renovate[bot]
ee7c6792c9 Update dependency @types/react to ^18.3.7 2024-09-17 11:39:38 +00:00
renovate[bot]
e2962dc2eb Update dependency vite to ^5.4.6 2024-09-16 23:19:58 +00:00
Jérémie Panzer
8c335cb8fd Merge pull request #1555 from victorhck/master
Update messages.po
2024-09-16 18:40:24 +02:00
Victorhck
461c18a591 Update messages.po
Keep in spanish the same name for Shift Key
2024-09-16 16:59:56 +02:00
Jérémie Panzer
363837ab26 we no longer need this file thanks to quarkus dev services 2024-09-16 15:55:06 +02:00
renovate[bot]
a184485421 Update dependency @types/react to ^18.3.6 2024-09-16 11:44:00 +00:00
renovate[bot]
f992c3f1a6 Lock file maintenance 2024-09-16 01:01:23 +00:00
Jérémie Panzer
3219a9e313 Merge pull request #1554 from Athou/renovate/biomejs-biome-1.9.x
Update dependency @biomejs/biome to v1.9.1
2024-09-15 21:39:44 +02:00
renovate[bot]
4717c31058 Update dependency @biomejs/biome to v1.9.1 2024-09-15 18:33:30 +00:00
Athou
693844828b comment tweak 2024-09-15 12:18:56 +02:00
renovate[bot]
ef4b479638 Update quarkus.version to v3.14.4 2024-09-14 16:38:57 +00:00
Athou
8eefb1bcfb add http cache to avoid fetching feeds too often (#1431) 2024-09-14 14:00:15 +02:00
Athou
ada9a5039b add support for all charsets in native mode 2024-09-14 07:56:36 +02:00
Athou
cca2d49cc3 Revert "reduce artifact size by using a smaller library for charset detection" because juniversalchardet doesn't support as many charsets as icu4j 2024-09-13 23:40:13 +02:00
Athou
f4a43e9950 only compute rtl once by storing it in the database on fetch 2024-09-13 22:25:02 +02:00
Athou
9a89b39b62 fix formatting 2024-09-13 21:57:21 +02:00
Jérémie Panzer
2dba844b6c Merge pull request #1552 from victorhck/master
uptade and improve Spanish translation
2024-09-13 21:56:49 +02:00
renovate[bot]
3101dc91de Update dependency vitest to ^2.1.1 2024-09-13 15:51:45 +00:00
Victorhck
83cacd97f3 fix typo Spanish messages.po 2024-09-13 17:19:44 +02:00
Victorhck
aa179c21f8 uptade and improve Spanish translation 2024-09-13 17:17:35 +02:00
Athou
31cf4d8bb2 use our own bidi detector to drop 10Mb from gwt 2024-09-13 16:05:21 +02:00
Athou
19bcc2c0da reduce artifact size by using a smaller library for charset detection 2024-09-13 14:48:24 +02:00
renovate[bot]
ca803ff7ce Update dependency vite to ^5.4.5 2024-09-13 09:42:41 +00:00
Athou
0e26d975aa we don't need quarkus-extension-processor at runtime 2024-09-13 10:55:02 +02:00
Athou
86a3cb67f2 exclude unused database dependencies from final artifact 2024-09-13 10:20:19 +02:00
Jérémie Panzer
6297463445 Merge pull request #1551 from Athou/renovate/com.microsoft.playwright-playwright-1.x
Update dependency com.microsoft.playwright:playwright to v1.47.0
2024-09-13 03:56:06 +02:00
renovate[bot]
1a3a3076b1 Update dependency com.microsoft.playwright:playwright to v1.47.0 2024-09-13 00:06:46 +00:00
Jérémie Panzer
7fb9cfeaf1 Merge pull request #1550 from Athou/renovate/vitest-monorepo
Update dependency vitest to ^2.1.0
2024-09-12 20:46:39 +02:00
renovate[bot]
5c7dbe6304 Update dependency vitest to ^2.1.0 2024-09-12 16:01:52 +00:00
Jérémie Panzer
c41fd9216a Merge pull request #1549 from Athou/renovate/fontsource-monorepo
Update dependency @fontsource/open-sans to ^5.1.0
2024-09-12 16:42:21 +02:00
Jérémie Panzer
91a9ad79f0 Merge pull request #1548 from Athou/renovate/biomejs-biome-1.x
Update dependency @biomejs/biome to v1.9.0
2024-09-12 16:42:10 +02:00
renovate[bot]
906458dc96 Update dependency @fontsource/open-sans to ^5.1.0 2024-09-12 14:21:15 +00:00
renovate[bot]
2f4fddf539 Update dependency @biomejs/biome to v1.9.0 2024-09-12 14:21:09 +00:00
renovate[bot]
a8157143b9 Update dependency io.quarkus.platform:quarkus-bom to v3.14.3 2024-09-11 14:55:31 +00:00
Athou
92576e28e9 fix tests incorrectly always running with h2 2024-09-11 16:49:02 +02:00
Athou
a6e34a2960 no need to repeat the plugin, we can just use the variable 2024-09-11 16:35:08 +02:00
renovate[bot]
306cf7aab7 Update dependency vite to ^5.4.4 2024-09-11 12:55:32 +00:00
Athou
f3b806686d help during development by showing typescript errors for the whole project 2024-09-11 14:54:01 +02:00
Athou
6634cfb991 load from old settings if new settings are not found to smooth transition 2024-09-11 07:52:41 +02:00
Athou
9930bb68b2 rename variable because it now contains a duration 2024-09-10 20:47:08 +02:00
Athou
37722131e5 remove warning about deprecated findDOMNode 2024-09-10 20:16:24 +02:00
Athou
5f2d213419 move other settings to localSettings too 2024-09-10 20:16:24 +02:00
Athou
e119941762 add option to keep some entries above the selected entry when scrolling 2024-09-10 20:16:24 +02:00
Athou
ba496c1395 no longer fetch feeds without subscriptions 2024-09-10 11:16:25 +02:00
renovate[bot]
9c3fc84542 Update dependency react-router-dom to ^6.26.2 2024-09-09 17:31:13 +00:00
Jérémie Panzer
b017ce936a Merge pull request #1546 from Athou/renovate/typescript-5.x
Update dependency typescript to ^5.6.2
2024-09-09 19:30:40 +02:00
renovate[bot]
d696b0581b Update dependency typescript to ^5.6.2 2024-09-09 17:03:23 +00:00
Athou
e4b2880f2b funding links tweaks 2024-09-09 18:56:04 +02:00
renovate[bot]
e071049969 Lock file maintenance 2024-09-09 03:25:09 +00:00
renovate[bot]
5e1f592951 Lock file maintenance 2024-09-09 00:21:56 +00:00
renovate[bot]
231f82da28 Update dependency @fontsource/open-sans to ^5.0.30 2024-09-08 04:53:38 +00:00
Athou
9a28bc7334 release 5.1.1 2024-09-06 11:44:37 +02:00
Athou
00907e92ff indicate that we actually set a boolean value (#1544) 2024-09-06 10:12:05 +02:00
Athou
5669798881 tweak bug report template 2024-09-06 09:09:14 +02:00
Athou
f3a62a5f75 always show current feed/category (#1543) 2024-09-06 09:09:14 +02:00
Jérémie Panzer
3b20ed222c Merge pull request #1542 from Athou/renovate/debian-12.x
Update debian Docker tag to v12.7
2024-09-05 04:42:59 +02:00
renovate[bot]
1f40f3f59c Update debian Docker tag to v12.7 2024-09-05 02:04:26 +00:00
Athou
a8d890524f fix doc 2024-09-04 20:22:24 +02:00
renovate[bot]
b635799e80 Update quarkus.version to v3.14.2 2024-09-04 17:32:46 +00:00
renovate[bot]
50ea66620d Update dependency tss-react to ^4.9.13 2024-09-04 07:10:20 +00:00
Athou
46581d0e22 quarkus has an extension that pulls both junit and mockito 2024-09-04 09:09:28 +02:00
renovate[bot]
a3562867a6 Update dependency vite to ^5.4.3 2024-09-03 19:41:15 +00:00
Athou
c0117ada93 add a link to the feed of the GitHub release page in the README 2024-09-03 19:38:55 +02:00
Jérémie Panzer
a3dcb2c03e Merge pull request #1540 from dai/master
Update messages.po
2024-09-03 10:45:13 +02:00
dai
8f8aaa5a1d Update messages.po
Updated and added Japanese language file.
2024-09-03 16:31:15 +09:00
renovate[bot]
85482422fd Lock file maintenance 2024-09-02 15:50:13 +00:00
Athou
643c969faf release 5.1.0 2024-09-02 17:47:08 +02:00
renovate[bot]
85f9469d6d Update linguijs monorepo to ^4.11.4 2024-09-02 14:07:26 +00:00
renovate[bot]
0df0d50695 Lock file maintenance 2024-09-02 01:33:37 +00:00
Athou
5e9256c197 reduce intermediate database cleanup logging level to reduce logging volume 2024-09-01 21:51:07 +02:00
Athou
b67e1a92f5 fix hibernate warnings about wrong types 2024-09-01 18:21:26 +02:00
Athou
d250e4bc26 add missing foreign key on feedentrystatuses.user_id 2024-09-01 18:02:38 +02:00
Athou
dcf1f41f2d add config doc sections 2024-09-01 13:47:09 +02:00
renovate[bot]
3df6ba1457 Update dependency axios to ^1.7.7 2024-08-31 22:33:06 +00:00
renovate[bot]
b89928f6c6 Update dependency axios to ^1.7.6 2024-08-30 21:06:14 +00:00
renovate[bot]
2e014484e3 Update mantine monorepo to ^7.12.2 2024-08-30 18:47:41 +00:00
renovate[bot]
3b2b18fd2e Update dependency com.puppycrawl.tools:checkstyle to v10.18.1 2024-08-30 15:35:27 +00:00
renovate[bot]
ebf1e592ff Update dependency @types/react to ^18.3.5 2024-08-30 10:40:03 +00:00
renovate[bot]
88404b91d8 Update dependency npm to v10.8.3 2024-08-28 20:30:31 +00:00
Athou
9cbb60313c there are only native implementations of brotli encoders, don't use them because it doesn't work on all platforms 2024-08-28 20:53:48 +02:00
Jérémie Panzer
b95d417f5e Merge pull request #1526 from Athou/renovate/quarkus.version
Update quarkus.version to v3.14.1 (minor)
2024-08-28 19:27:02 +02:00
Athou
994f1fb121 quarkus-config-doc-maven-plugin is now required to generate the documentation 2024-08-28 19:08:34 +02:00
renovate[bot]
e533c1fa4b Update quarkus.version to v3.14.1 2024-08-28 16:31:58 +00:00
renovate[bot]
d0d946ffe9 Update dependency vitest-mock-extended to ^2.0.2 2024-08-28 15:39:32 +00:00
Athou
e3bcc824c7 use a property to sync swagger versions 2024-08-28 17:36:15 +02:00
Athou
357e4e207f add a test to make sure brotli compression is supported 2024-08-28 17:34:24 +02:00
Athou
2aee961600 specify what version of checkstyle we want to use 2024-08-28 09:20:18 +02:00
Athou
3aa1987319 make renovate ignore all "io.quarkus" versions 2024-08-28 09:10:03 +02:00
Jérémie Panzer
ae15f61fc2 Merge pull request #1535 from Athou/renovate/org.apache.maven.plugins-maven-failsafe-plugin-3.x
Update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.0
2024-08-27 16:55:50 +02:00
Jérémie Panzer
e58f92a812 Merge pull request #1536 from Athou/renovate/org.apache.maven.plugins-maven-surefire-plugin-3.x
Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.0
2024-08-27 16:55:38 +02:00
renovate[bot]
46383924b1 Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.0 2024-08-27 14:39:46 +00:00
renovate[bot]
071920e864 Update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.0 2024-08-27 14:39:42 +00:00
Athou
012238e6a9 Docker README tweak 2024-08-27 13:40:18 +02:00
Athou
a565566c50 remove deprecation warning 2024-08-27 09:02:42 +02:00
Athou
550804c666 use @Transactional where possible 2024-08-27 08:47:39 +02:00
Athou
f7a4a33f5e fix wrong path in documentation 2024-08-27 08:41:53 +02:00
Athou
f1b19ebae3 after reading the spec, what we want is actually "no-cache" that actually means "cache but revalidate immediately" using If-Modified-Since request headers and 304 response codes 2024-08-26 11:41:56 +02:00
Jérémie Panzer
4049fa2e17 Merge pull request #1534 from canoine/master
Update fr/messages.po
2024-08-26 09:43:21 +02:00
canoine
28808cf4f5 Merge pull request #2 from canoine/canoine-patch-1
Update fr/messages.po
2024-08-26 09:07:18 +02:00
canoine
870b46cf9d Update fr/messages.po
Blind update, as I didn't find where some of the new fields are shown.
2024-08-26 08:58:03 +02:00
renovate[bot]
9c20dea99c Lock file maintenance 2024-08-26 02:13:39 +00:00
Athou
63c7679067 make sure the webapp and openapi documentation are always up to date by preventing caching 2024-08-26 00:28:44 +02:00
Athou
764c1a6430 add setting for showing unread count in tab/favicon (#1518) 2024-08-25 20:24:57 +02:00
renovate[bot]
bb6578bdd0 Update dependency org.passay:passay to v1.6.5 2024-08-25 03:23:37 +00:00
renovate[bot]
748c8531ad Lock file maintenance 2024-08-23 19:32:29 +00:00
Athou
a734fe68d2 fix link README 2024-08-23 21:21:15 +02:00
renovate[bot]
cc5ebc55a4 Update dependency axios to ^1.7.5 2024-08-23 14:17:51 +00:00
Jérémie Panzer
aa396c1e1c Merge pull request #1531 from Athou/renovate/monaco-editor-0.x
Update dependency monaco-editor to ^0.51.0
2024-08-23 11:51:22 +02:00
Athou
fbf87ff291 make renovate ignore quarkus-extension-processor 2024-08-23 11:44:24 +02:00
renovate[bot]
e9f3ffddf4 Update dependency monaco-editor to ^0.51.0 2024-08-23 09:33:00 +00:00
Jérémie Panzer
695518d68b Merge pull request #1530 from Athou/renovate/querydsl.version
Update querydsl.version to v6.7 (minor)
2024-08-23 05:34:54 +02:00
renovate[bot]
5d96c1e12b Update querydsl.version to v6.7 2024-08-22 22:39:22 +00:00
Jérémie Panzer
3a72a1cc04 Merge pull request #1529 from Athou/renovate/org.apache.maven.plugins-maven-checkstyle-plugin-3.x
Update dependency org.apache.maven.plugins:maven-checkstyle-plugin to v3.5.0
2024-08-22 21:15:42 +02:00
renovate[bot]
54f5714108 Update dependency org.apache.maven.plugins:maven-checkstyle-plugin to v3.5.0 2024-08-22 18:58:15 +00:00
Jérémie Panzer
04811c7eca Merge pull request #1528 from Athou/renovate/org.apache.maven.plugins-maven-help-plugin-3.x
Update dependency org.apache.maven.plugins:maven-help-plugin to v3.5.0
2024-08-22 07:10:46 +02:00
renovate[bot]
6856736ddb Update dependency org.apache.maven.plugins:maven-help-plugin to v3.5.0 2024-08-21 21:04:31 +00:00
Athou
db6c43993a simpler workaround for cookie max-age 2024-08-21 21:56:57 +02:00
Jérémie Panzer
508a22576a Merge pull request #1527 from Athou/renovate/node-20.x
Update dependency node to v20.17.0
2024-08-21 21:35:26 +02:00
renovate[bot]
8fb012b3a1 Update dependency node to v20.17.0 2024-08-21 18:25:57 +00:00
renovate[bot]
133781d314 Update dependency @emotion/react to ^11.13.3 2024-08-21 11:41:31 +00:00
renovate[bot]
50cb12896e Update dependency vite to ^5.4.2 2024-08-21 02:14:50 +00:00
renovate[bot]
79a4315941 Update dependency @types/react to ^18.3.4 2024-08-20 22:13:31 +00:00
renovate[bot]
33a2f76521 Update dependency dayjs to ^1.11.13 2024-08-20 19:25:48 +00:00
Jérémie Panzer
d4041a1d88 Merge pull request #1525 from Athou/renovate/patch-quarkus.version
Update quarkus.version to v3.13.3 (patch)
2024-08-20 21:24:48 +02:00
renovate[bot]
09f2f56446 Update quarkus.version to v3.13.3 2024-08-20 17:16:54 +00:00
Athou
a0c3eda506 remove warning 2024-08-20 10:03:15 +02:00
Athou
84de3199cc guava version is managed by quarkus 2024-08-20 10:01:13 +02:00
Athou
a7e8309d63 fix docker readme missing word 2024-08-20 08:36:31 +02:00
Athou
7e74d2f6f4 release 5.0.2 2024-08-20 07:27:46 +02:00
Athou
dc25d53dc0 github actions is sometimes slow, increase timeout for tests 2024-08-20 00:03:45 +02:00
Athou
ac1a927836 remove google-api-services-youtube because it doesn't play nicely with native-image 2024-08-19 23:55:38 +02:00
Athou
b50b69adb2 Revert "better workaround for cookie max-age" because it causes issues with favicon fetching 2024-08-19 18:27:50 +02:00
Athou
b112e912af release 5.0.1 2024-08-19 15:55:13 +02:00
Athou
ece55727d3 better workaround for cookie max-age 2024-08-19 14:31:12 +02:00
Athou
181dd24b57 format both Dockerfiles the same way 2024-08-19 10:29:35 +02:00
Athou
10008ca0e8 add link to all quarkus settings 2024-08-19 09:38:26 +02:00
Athou
134c4621a8 docker README tweaks 2024-08-19 08:47:23 +02:00
Athou
51f15bf487 github actions is sometimes very slow, increase default timeouts for tests 2024-08-19 08:26:06 +02:00
renovate[bot]
49ae2c88ad Lock file maintenance 2024-08-19 05:53:45 +00:00
Jérémie Panzer
43a628fc55 Merge pull request #1523 from Athou/renovate/org.apache.maven.plugins-maven-surefire-plugin-3.x
Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.4.0
2024-08-19 07:51:49 +02:00
Jérémie Panzer
7f71f95f7c Merge pull request #1522 from Athou/renovate/org.apache.maven.plugins-maven-failsafe-plugin-3.x
Update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.4.0
2024-08-19 07:51:41 +02:00
Athou
e8d5eab419 compile to native image with support for older CPUs 2024-08-19 07:08:18 +02:00
renovate[bot]
de3a6b1f20 Update dependency io.dropwizard.metrics:metrics-json to v4.2.27 2024-08-19 00:25:33 +00:00
renovate[bot]
849742e19a Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.4.0 2024-08-18 21:04:13 +00:00
renovate[bot]
b6392b114c Update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.4.0 2024-08-18 21:04:10 +00:00
Athou
4db0c775ff add settings documentation 2024-08-18 21:23:42 +02:00
Athou
ff9374f1ed README tweak 2024-08-18 19:20:34 +02:00
Athou
ea86c9bb1f README tweak 2024-08-18 17:07:31 +02:00
Athou
e6dd088abe fix typo 2024-08-18 17:00:59 +02:00
Jérémie Panzer
c039d8f3a4 Merge pull request #1521 from Athou/renovate/com.google.apis-google-api-services-youtube-3.0.x
Update dependency com.google.apis:google-api-services-youtube to v3-rev20240814-2.0.0
2024-08-18 14:51:39 +02:00
renovate[bot]
bffa6329fd Update dependency com.google.apis:google-api-services-youtube to v3-rev20240814-2.0.0 2024-08-18 10:58:38 +00:00
Athou
b88e5d2847 increase ssl handshake timeout during tests to fix build on slower machines 2024-08-18 12:25:52 +02:00
Jérémie Panzer
0fc4fcd406 Merge pull request #1516 from Athou/renovate/react-icons-5.x
Update dependency react-icons to ^5.3.0
2024-08-18 10:39:10 +02:00
Athou
f04ca21394 Twitter has been renamed X 2024-08-18 10:15:17 +02:00
renovate[bot]
a82fca130f Update dependency react-icons to ^5.3.0 2024-08-18 07:58:41 +00:00
Athou
70d494798c Docker readme tweaks 2024-08-18 09:45:44 +02:00
Athou
cf02bf221b release 5.0.0 2024-08-18 09:35:36 +02:00
renovate[bot]
9eb03d7455 Update quarkus.version to v3.13.2 2024-08-18 08:21:57 +02:00
renovate[bot]
12c8fdeec2 Update ibm-semeru-runtimes Docker tag to open-21.0.4_7-jre 2024-08-18 05:58:53 +00:00
Athou
851babfe2a remove quarkus branch from ci 2024-08-18 07:55:51 +02:00
Jérémie Panzer
859490806b Merge pull request #1520 from Athou/quarkus
Migrate to Quarkus (#1517)
2024-08-18 07:54:43 +02:00
renovate[bot]
2c828b50da Update dependency @fontsource/open-sans to ^5.0.29 2024-08-18 01:32:31 +00:00
Athou
ede7834cb8 configurable filtering expression evaluation timeout 2024-08-17 23:26:42 +02:00
Athou
3627ee369d version dockerhub readme and update it automatically on release 2024-08-17 23:16:19 +02:00
Athou
c4c41d1494 increase timeout a little bit because github actions are laggy 2024-08-17 22:29:40 +02:00
Athou
c577e77f8f README tweaks 2024-08-17 22:27:30 +02:00
Athou
9218f19832 javadoc tweaks 2024-08-17 22:11:47 +02:00
renovate[bot]
ecbc2133a4 Update dependency maven to v3.9.9 2024-08-17 20:10:04 +00:00
Athou
e38ca66c51 try to fix "Illegal attempt to associate a ManagedEntity with two open persistence contexts" 2024-08-17 16:22:46 +02:00
Athou
2395a2670e add ResourceBundle needed for cssparser in native image 2024-08-17 00:43:32 +02:00
Athou
e7748d787f no need to start a transaction to fetch favicons 2024-08-16 22:29:12 +02:00
Athou
012ce71134 configurable http client timeouts 2024-08-16 21:16:02 +02:00
Athou
1b1a3f49c1 keep using the same css parser as before 2024-08-16 19:01:44 +02:00
Athou
5b77860189 use join to speed up cleanup 2024-08-16 17:42:15 +02:00
Athou
b333e8d90a set a timeout on ssl handshakes 2024-08-16 14:40:16 +02:00
Athou
ab6457ef3f README tweaks 2024-08-16 14:23:18 +02:00
Athou
5c69daec08 restore welcome page on 401 2024-08-16 14:02:49 +02:00
Athou
1bfa3ebb8e set the default h2 path to a relative one next to the executable 2024-08-16 13:47:15 +02:00
Athou
2694fea211 cleanup 2024-08-16 08:45:30 +02:00
Athou
720eddeb66 CHANGELOG tweaks 2024-08-16 08:31:23 +02:00
Athou
ab334a7bc6 feed needs to be known to be deleted 2024-08-16 07:31:22 +02:00
Athou
214dfe580a more rome classes 2024-08-16 07:22:25 +02:00
Athou
4ef53eab3a mute rome modules warnings in production 2024-08-16 06:19:35 +02:00
Athou
2f51547f0d add missing rome classes 2024-08-16 06:15:52 +02:00
Athou
da910ac336 mute MediaModuleParser warnings 2024-08-16 05:53:23 +02:00
Athou
643954f7c9 timeout should be an Integer 2024-08-16 05:48:01 +02:00
renovate[bot]
63061482d0 Update dependency vite to ^5.4.1 2024-08-15 19:16:05 +00:00
renovate[bot]
86d4f5a670 Update dependency react-router-dom to ^6.26.1 2024-08-15 17:31:29 +00:00
Athou
815093f1c6 remove STARTUP_TIME because static fields are initialized at compile time in native mode 2024-08-15 12:17:28 +02:00
Athou
47d39831d3 use Duration for query timeout 2024-08-15 09:05:56 +02:00
Athou
c18ed829aa generate jvm package with a -jvm suffix 2024-08-14 23:08:24 +02:00
Athou
e757e61b79 config comment tweaks 2024-08-14 21:34:05 +02:00
Athou
d612d83874 resolve public url dynamically, remove publicUrl config element 2024-08-14 21:07:45 +02:00
Athou
e170dfe60b prepare 5.0.0 changelog 2024-08-14 20:43:54 +02:00
Athou
69cd90edd8 only use rest-assured for tests 2024-08-14 16:00:47 +02:00
renovate[bot]
f506f722c2 Update dependency axios to ^1.7.4 2024-08-13 20:16:28 +00:00
Athou
857736adad README tweaks 2024-08-13 17:26:51 +02:00
Athou
a92df774bd rome needs to clone Date in native mode 2024-08-13 16:13:05 +02:00
Athou
f2c6734c79 fix warning in native mode about parser not found 2024-08-13 16:12:40 +02:00
Athou
77b6cf75a5 README tweaks 2024-08-13 15:05:40 +02:00
Athou
3b56496196 javadoc tweaks 2024-08-13 12:49:04 +02:00
Athou
aabbf0a5d1 use a relative link 2024-08-13 12:49:04 +02:00
Athou
9a43fd434f ci for quarkus branch 2024-08-13 12:49:04 +02:00
Athou
21ce9db4b0 README update 2024-08-13 12:49:04 +02:00
Athou
044694487d remove redis as caching is no longer needed now 2024-08-13 12:49:04 +02:00
Athou
3af8485326 TODO remove redis 2024-08-13 12:49:04 +02:00
Athou
f7adef0648 add windows builds 2024-08-13 12:49:04 +02:00
Athou
dc16e43154 add release ci job 2024-08-13 12:49:04 +02:00
Athou
78a5267198 fix opml import encoding issue 2024-08-13 12:49:04 +02:00
Athou
04af355e0c remove unused timers page 2024-08-13 12:49:04 +02:00
Athou
89405009ec set a Max-Age on the auth cookie 2024-08-13 12:49:04 +02:00
Athou
6b0aa32da2 use profile instead of system property to set db-kind 2024-08-13 12:49:04 +02:00
Athou
aaf237d111 use quarkus mailer for password recovery 2024-08-13 12:49:04 +02:00
Athou
1fd48a0a40 merge docker amd64 and arm64 tags 2024-08-13 12:49:03 +02:00
Athou
09e0a51b46 restore Docker workflow 2024-08-13 12:49:00 +02:00
Athou
cc32f8ad16 WIP 2024-08-13 12:48:37 +02:00
renovate[bot]
2f6ddf0e70 Update mariadb Docker tag to v11.4.3 2024-08-13 00:48:48 +00:00
renovate[bot]
c3973755da Update ibm-semeru-runtimes Docker tag to open-21.0.4_7-jre 2024-08-12 23:34:26 +00:00
renovate[bot]
42537a65b9 Update dependency com.h2database:h2 to v2.3.232 2024-08-12 19:41:12 +00:00
Athou
906c92e54f fix badge layout 2024-08-12 21:13:46 +02:00
renovate[bot]
cc69968d78 Update mantine monorepo to ^7.12.1 2024-08-12 14:48:18 +00:00
renovate[bot]
dcde2083ec Lock file maintenance 2024-08-12 01:26:56 +00:00
Jérémie Panzer
7469784059 Merge pull request #1514 from Athou/renovate/com.microsoft.playwright-playwright-1.x
Update dependency com.microsoft.playwright:playwright to v1.46.0
2024-08-10 12:14:13 +02:00
renovate[bot]
c13a693456 Update dependency com.microsoft.playwright:playwright to v1.46.0 2024-08-09 23:05:37 +00:00
Jérémie Panzer
e3c482d664 Merge pull request #1510 from Athou/renovate/vite-5.x
Update dependency vite to ^5.4.0
2024-08-09 16:48:43 +02:00
renovate[bot]
1fd33a5585 Update dependency vite to ^5.4.0 2024-08-09 14:34:49 +00:00
Jérémie Panzer
0742778e6a Merge pull request #1513 from Athou/renovate/patch-linguijs-monorepo
Update linguijs monorepo to ^4.11.3 (patch)
2024-08-09 16:33:03 +02:00
Jérémie Panzer
152479c888 Merge pull request #1511 from Athou/renovate/vite-tsconfig-paths-5.x
Update dependency vite-tsconfig-paths to v5
2024-08-09 16:32:23 +02:00
Jérémie Panzer
a297f8c0c8 Merge pull request #1512 from Athou/renovate/postgres-16.x
Update postgres Docker tag to v16.4
2024-08-09 16:31:59 +02:00
renovate[bot]
92aeee0572 Update linguijs monorepo to ^4.11.3 2024-08-09 11:41:52 +00:00
renovate[bot]
050756517e Update dependency vite-tsconfig-paths to v5 2024-08-08 22:34:31 +00:00
renovate[bot]
0bb46f291a Update postgres Docker tag to v16.4 2024-08-08 22:34:10 +00:00
Jérémie Panzer
1eecabf105 Merge pull request #1508 from Athou/renovate/mantine-monorepo
Update mantine monorepo to ^7.12.0 (minor)
2024-08-05 19:16:47 +02:00
renovate[bot]
da1bd8d32e Update mantine monorepo to ^7.12.0 2024-08-05 16:28:35 +00:00
Athou
124983a396 rename metrics a little 2024-08-05 09:05:01 +02:00
Athou
43613688da evict unused HTTP connections 2024-08-05 08:41:12 +02:00
Athou
43aa69cd18 don't crash vite on error in dev mode 2024-08-05 08:28:17 +02:00
Athou
780b7666c5 add metrics for HttpGetter connection pool 2024-08-05 08:28:17 +02:00
renovate[bot]
70b4534e14 Lock file maintenance 2024-08-05 01:13:51 +00:00
Athou
24666fd7fc migrate to lingui.config.ts to benefit from typing 2024-08-03 22:29:09 +02:00
Athou
de80aa6bb3 replace t` with msg` to fix labels not being translated correctly 2024-08-03 13:09:15 +02:00
Athou
6c7e2ea847 add missing translation key for the Cmd key on MacOS 2024-08-03 12:56:56 +02:00
Athou
6ea318acd3 remove right section as we don't show keyboard shortcuts anywhere else 2024-08-03 12:54:57 +02:00
Athou
2f4ee7cff8 add data attributes to tree elements (#1507) 2024-08-03 12:37:33 +02:00
Athou
9d9d758fa6 use article instead of div (#1507) 2024-08-03 11:34:36 +02:00
Athou
a071b7c265 add aria-label to action buttons (#1507) 2024-08-03 11:30:29 +02:00
Athou
3a57b68fa3 use a different icon for filtering unread entries and marking an entry as read (#1506) 2024-08-03 10:24:06 +02:00
Jérémie Panzer
f2f36baf1b Merge pull request #1505 from Athou/renovate/querydsl.version
Update querydsl.version to v6.6 (minor)
2024-08-02 19:28:04 +02:00
renovate[bot]
1aaf9e747a Update querydsl.version to v6.6 2024-08-02 17:00:53 +00:00
Athou
92611772a9 reduce bottom margin slightly to avoid having a scrollbar in the extension popup when there are no entries 2024-08-02 10:37:40 +02:00
renovate[bot]
fb159dc46b Update dependency axios to ^1.7.3 2024-08-01 16:19:28 +00:00
Jérémie Panzer
78ea0873f2 Merge pull request #1504 from Athou/renovate/react-router-monorepo
Update dependency react-router-dom to ^6.26.0
2024-08-01 18:18:45 +02:00
renovate[bot]
faabc01dbc Update dependency react-router-dom to ^6.26.0 2024-08-01 13:48:59 +00:00
renovate[bot]
5acfe9e92a Update dependency tss-react to ^4.9.12 2024-08-01 12:45:12 +00:00
renovate[bot]
4388a8b6ce Update testcontainers-java monorepo to v1.20.1 2024-07-31 16:31:47 +00:00
renovate[bot]
7414bd15b0 Update dependency vitest to ^2.0.5 2024-07-31 13:41:55 +00:00
Jérémie Panzer
52d6021f3c Merge pull request #1503 from Athou/renovate/redis-7.x
Update redis Docker tag to v7.4.0
2024-07-30 07:14:48 +02:00
renovate[bot]
f7acc27fcb Update redis Docker tag to v7.4.0 2024-07-30 04:46:37 +00:00
renovate[bot]
175a293327 Update dependency redis.clients:jedis to v5.1.4 2024-07-29 17:17:09 +00:00
renovate[bot]
21dd6519b0 Update bouncycastle.version to v1.78.1 2024-07-29 11:25:29 +00:00
Athou
72f55c34b7 add test to make sure HttpGetter supports compression 2024-07-29 13:20:18 +02:00
Athou
1b1d3c791b add test to make sure HttpGetter ignores invalid certificates 2024-07-29 10:39:35 +02:00
renovate[bot]
159c2c01a7 Lock file maintenance 2024-07-29 00:18:18 +00:00
Athou
272f5b42f9 simplify stackoverflow urls 2024-07-28 09:58:24 +02:00
renovate[bot]
2395d0782e Update dependency @reduxjs/toolkit to ^2.2.7 2024-07-27 18:19:48 +00:00
Athou
da81830e43 add a test case for feeds that do not return a content length 2024-07-27 01:01:11 +02:00
renovate[bot]
63a602cf8a Update dependency tss-react to ^4.9.11 2024-07-26 16:23:31 +00:00
renovate[bot]
0244b5c3e3 Update dependency vite to ^5.3.5 2024-07-25 12:40:59 +00:00
Jérémie Panzer
9592e86fa9 Merge pull request #1497 from Athou/renovate/node-20.x
Update dependency node to v20.16.0
2024-07-24 21:11:44 +02:00
renovate[bot]
e6840bb50c Update dependency node to v20.16.0 2024-07-24 16:31:02 +00:00
Jérémie Panzer
b6890378a1 Merge pull request #1496 from Athou/renovate/vitest-mock-extended-2.x
Update dependency vitest-mock-extended to v2
2024-07-23 21:56:08 +02:00
renovate[bot]
ba72ed0b93 Update dependency vitest-mock-extended to v2 2024-07-23 19:45:08 +00:00
renovate[bot]
e2fb576858 Update ibm-semeru-runtimes Docker tag to open-21.0.3_9-jre 2024-07-23 15:40:19 +00:00
Athou
608b099b4d make renovate pickup semeru 2024-07-23 17:39:37 +02:00
renovate[bot]
c2e0c81f7e Update mysql Docker tag to v9.0.1 2024-07-23 07:16:23 +00:00
renovate[bot]
7071d01a59 Update dependency typescript to ^5.5.4 2024-07-23 04:26:11 +00:00
renovate[bot]
30cd2b9b53 Update dependency com.microsoft.playwright:playwright to v1.45.1 2024-07-23 00:05:41 +00:00
Athou
abc498b09c semeru already defines a JAVA_TOOL_OPTIONS variable with a shared classes cache, we don't want to override it 2024-07-22 16:52:30 +02:00
renovate[bot]
31081e1089 Update dependency vitest to ^2.0.4 2024-07-22 09:53:53 +00:00
renovate[bot]
4a16b8d072 Lock file maintenance 2024-07-22 02:12:54 +00:00
Jérémie Panzer
9c04095292 Merge pull request #1492 from Athou/renovate/emotion-monorepo
Update dependency @emotion/react to ^11.13.0
2024-07-20 14:55:31 +02:00
renovate[bot]
643f98d59e Update dependency @emotion/react to ^11.13.0 2024-07-20 09:06:33 +00:00
Jérémie Panzer
f4da19183e Merge pull request #1491 from Athou/renovate/emotion-monorepo
Update dependency @emotion/react to ^11.12.0
2024-07-19 09:56:36 +02:00
renovate[bot]
de40f253b5 Update dependency @emotion/react to ^11.12.0 2024-07-19 07:28:55 +00:00
renovate[bot]
f6543e407a Update dependency dayjs to ^1.11.12 2024-07-18 13:26:56 +00:00
renovate[bot]
4d462a8e9e Update dependency react-router-dom to ^6.25.1 2024-07-17 22:23:50 +00:00
Jérémie Panzer
018ee1f3e6 Merge pull request #1490 from Athou/renovate/testcontainers-java-monorepo
Update testcontainers-java monorepo to v1.20.0 (minor)
2024-07-18 00:22:46 +02:00
renovate[bot]
752268fed1 Update testcontainers-java monorepo to v1.20.0 2024-07-17 22:10:29 +00:00
renovate[bot]
8fe9a6cc3a Update dependency org.mariadb.jdbc:mariadb-java-client to v3.4.1 2024-07-17 20:48:37 +00:00
Athou
b17a17ba10 don't parse feeds that are too large to prevent memory issues 2024-07-16 21:20:06 +02:00
renovate[bot]
b3545b60ea Update dependency vite to ^5.3.4 2024-07-16 13:43:12 +00:00
Jérémie Panzer
e6da3f693d Merge pull request #1488 from Athou/renovate/react-router-monorepo
Update dependency react-router-dom to ^6.25.0
2024-07-16 15:42:04 +02:00
renovate[bot]
4ab09da434 Update dependency react-router-dom to ^6.25.0 2024-07-16 13:28:04 +00:00
renovate[bot]
5e8daf29bf Update dependency vitest-mock-extended to ^1.3.2 2024-07-15 21:14:52 +00:00
Athou
024a1067bb update h2 2024-07-15 21:48:49 +02:00
renovate[bot]
c427da72b9 Update dependency vitest to ^2.0.3 2024-07-15 14:05:06 +00:00
298 changed files with 9290 additions and 8592 deletions

View File

@@ -1,8 +1 @@
# ignore everything commafeed-client
*
# allow only what we need
!commafeed-server/target/commafeed.jar
!commafeed-server/config.docker-warmup.yml
!commafeed-server/config.yml.example

7
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,5 @@
github: [athou] github: [ athou ]
custom: ['https://www.paypal.com/donate/?business=9CNQHMJG2ZJVY&no_recurring=0&item_name=CommaFeed&currency_code=EUR'] custom: [
'https://github.com/sponsors/Athou',
'https://www.paypal.com/donate/?business=9CNQHMJG2ZJVY&no_recurring=0&item_name=CommaFeed&currency_code=EUR'
]

View File

@@ -25,7 +25,8 @@ If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):** **Environment (please complete the following information):**
- CommaFeed version (or "commafeed.com"): 3.2.1 - commafeed.com or self-hosted:
- If self-hosted, CommaFeed version [e.g. 5.1.0 (a3dcb2c)]:
- Browser [e.g. chrome, firefox]: - Browser [e.g. chrome, firefox]:
- Device [e.g. desktop, mobile]: - Device [e.g. desktop, mobile]:

View File

@@ -1,121 +0,0 @@
name: Java CI
on: [ push ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ "17", "21" ]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
# Setup
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
distribution: "temurin"
cache: "maven"
# Build & Test
- name: Build with Maven
run: mvn --batch-mode --no-transfer-progress install
env:
TEST_DATABASE: h2
- name: Run integration tests on PostgreSQL
run: mvn --batch-mode --no-transfer-progress failsafe:integration-test failsafe:verify
env:
TEST_DATABASE: postgresql
- name: Run integration tests on MySQL
run: mvn --batch-mode --no-transfer-progress failsafe:integration-test failsafe:verify
env:
TEST_DATABASE: mysql
- name: Run integration tests on MariaDB
run: mvn --batch-mode --no-transfer-progress failsafe:integration-test failsafe:verify
env:
TEST_DATABASE: mariadb
- name: Run integration tests with Redis cache enabled
run: mvn --batch-mode --no-transfer-progress failsafe:integration-test failsafe:verify
env:
TEST_DATABASE: h2
REDIS: true
# Upload artifacts
- name: Upload JAR
uses: actions/upload-artifact@v4
if: ${{ matrix.java == '17' }}
with:
name: commafeed.jar
path: commafeed-server/target/commafeed.jar
- name: Upload Playwright artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-artifacts
path: |
**/target/playwright-artifacts/
# Docker
- name: Login to Container Registry
uses: docker/login-action@v3
if: ${{ matrix.java == '17' && (github.ref_type == 'tag' || github.ref_name == 'master') }}
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker build and push tag
uses: docker/build-push-action@v6
if: ${{ matrix.java == '17' && github.ref_type == 'tag' }}
with:
context: .
push: true
platforms: linux/amd64,linux/arm64/v8
tags: |
athou/commafeed:latest
athou/commafeed:${{ github.ref_name }}
- name: Docker build and push master
uses: docker/build-push-action@v6
if: ${{ matrix.java == '17' && github.ref_name == 'master' }}
with:
context: .
push: true
platforms: linux/amd64,linux/arm64/v8
tags: athou/commafeed:master
# Create GitHub release after Docker image has been published
- name: Extract Changelog Entry
uses: mindsers/changelog-reader-action@v2
if: ${{ matrix.java == '17' && github.ref_type == 'tag' }}
id: changelog_reader
with:
version: ${{ github.ref_name }}
- name: Create GitHub release
uses: softprops/action-gh-release@v2
if: ${{ matrix.java == '17' && github.ref_type == 'tag' }}
with:
name: CommaFeed ${{ github.ref_name }}
body: ${{ steps.changelog_reader.outputs.changes }}
draft: false
prerelease: false
files: |
commafeed-server/target/commafeed.jar
commafeed-server/config.yml.example

208
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,208 @@
name: ci
permissions:
contents: read
on:
push:
pull_request:
env:
JAVA_VERSION: 21
DOCKER_BUILD_SUMMARY: false
jobs:
build:
if: github.event_name != 'pull_request' || github.actor != 'renovate[bot]' # renovate already triggers the build on pushes
strategy:
matrix:
os: [ "ubuntu-latest", "ubuntu-24.04-arm", "windows-latest" ]
database: [ "h2", "postgresql", "mysql", "mariadb" ]
runs-on: ${{ matrix.os }}
steps:
# Checkout
- name: Configure git to checkout as-is
run: git config --global core.autocrlf false
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
# Setup
- name: Set up GraalVM
uses: graalvm/setup-graalvm@aafbedb8d382ed0ca6167d3a051415f20c859274 # v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: "graalvm"
cache: "maven"
- name: Install Playwright dependencies
run: sudo apt-get install -y libgbm1
if: matrix.os != 'windows-latest'
# Build & Test
- name: Build with Maven
run: mvn --batch-mode --no-transfer-progress install -Pnative -P${{ matrix.database }} -DskipTests=${{ matrix.os == 'windows-latest' && matrix.database != 'h2' }}
# Upload artifacts
- name: Upload cross-platform app
uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4
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@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4
with:
name: commafeed-${{ matrix.database }}-${{ runner.os }}-${{ runner.arch }}
path: commafeed-server/target/commafeed-*-runner*
docker:
runs-on: ubuntu-latest
needs: build
if: ${{ github.ref_type == 'tag' || github.ref_name == 'master' }}
strategy:
matrix:
database: [ "h2", "postgresql", "mysql", "mariadb" ]
steps:
# Checkout
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
# Setup
- name: Set up QEMU
uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3
- name: Install required packages
run: sudo apt-get install -y rename unzip
# Prepare artifacts
- name: Download artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
with:
pattern: commafeed-${{ matrix.database }}-*
path: ./artifacts
merge-multiple: true
- name: Set the exec flag on the native executables
run: chmod +x artifacts/*-runner
- name: Rename native executables to match buildx TARGETARCH
run: |
rename 's/x86_64/amd64/g' artifacts/*
rename 's/aarch_64/arm64/g' artifacts/*
- name: Unzip jvm package
run: |
unzip artifacts/*-jvm.zip -d artifacts/extracted-jvm-package
rename 's/commafeed-.*/quarkus-app/g' artifacts/extracted-jvm-package/*
# Docker
- name: Login to Container Registry
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
## tags
- name: Docker build and push tag - native
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
if: ${{ github.ref_type == 'tag' }}
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.native
push: true
platforms: linux/amd64,linux/arm64/v8
tags: |
athou/commafeed:latest-${{ matrix.database }}
athou/commafeed:${{ github.ref_name }}-${{ matrix.database }}
- name: Docker build and push tag - jvm
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
if: ${{ github.ref_type == 'tag' }}
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.jvm
push: true
platforms: linux/amd64,linux/arm64/v8
tags: |
athou/commafeed:latest-${{ matrix.database }}-jvm
athou/commafeed:${{ github.ref_name }}-${{ matrix.database }}-jvm
## master
- name: Docker build and push master - native
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
if: ${{ github.ref_name == 'master' }}
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.native
push: true
platforms: linux/amd64,linux/arm64/v8
tags: athou/commafeed:master-${{ matrix.database }}
- name: Docker build and push master - jvm
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
if: ${{ github.ref_name == 'master' }}
with:
context: .
file: commafeed-server/src/main/docker/Dockerfile.jvm
push: true
platforms: linux/amd64,linux/arm64/v8
tags: athou/commafeed:master-${{ matrix.database }}-jvm
release:
runs-on: ubuntu-latest
needs:
- build
- docker
permissions:
contents: write
if: github.ref_type == 'tag'
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
with:
pattern: commafeed-*
path: ./artifacts
merge-multiple: true
- name: Set the exec flag on the native executables
run: chmod +x artifacts/*-runner
- name: Extract Changelog Entry
uses: mindsers/changelog-reader-action@32aa5b4c155d76c94e4ec883a223c947b2f02656 # v2
id: changelog_reader
with:
version: ${{ github.ref_name }}
- name: Create GitHub release
uses: ncipollo/release-action@cdcc88a9acf3ca41c16c37bb7d21b9ad48560d87 # v1
with:
name: CommaFeed ${{ github.ref_name }}
body: ${{ steps.changelog_reader.outputs.changes }}
artifacts: ./artifacts/*
- name: Update Docker Hub Description
uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae # v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: athou/commafeed
short-description: ${{ github.event.repository.description }}
readme-filepath: commafeed-server/src/main/docker/README.md

View File

@@ -15,4 +15,4 @@
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
distributionType=only-script distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

View File

@@ -1,5 +1,102 @@
# Changelog # Changelog
## [5.5.0]
- CommaFeed now honors the Retry-After response header and will not try to refresh a feed sooner than the value of this header
- Audio enclosures (e.g. podcasts) now fill available entry width
- Fix an issue with some labels not correctly internationalized
## [5.4.0]
- An arm64 native executable is now available for download on the releases page
- The native executable Docker image now supports arm64
- Fixed an issue with feeds that declared an invalid DOCTYPE (#1260)
## [5.3.6]
- Ignore invalid Cache-Control header values (#1619)
## [5.3.5]
- Fixed an issue with the aspect ratio of images of some feeds (#1595)
- CommaFeed now honors the Cache-Control response header and will not try to refresh a feed sooner than its max-age property (#1615)
- Added support for compilation with JDK 23+. If you're building CommaFeed from sources with a JDK 17 or 21, you may need to update it to the most recent patch version to support `-proc:full` (#1618)
## [5.3.4]
- Added support for Internationalized Domain Names (#1588)
## [5.3.3]
- Removed image bottom margins (#1587)
## [5.3.2]
- Fixed an issue that could cause some images from not being rendered correctly (#1587)
## [5.3.1]
- Fixed an issue that could cause some HTTP feeds to return a 400 error (#1572)
## [5.3.0]
- Added a setting to set a cooldown on the "fetch all my feeds" action, disabled by default (#1556)
- Fixed an issue that could cause entries to not correctly load when using the "next" header button (#1557)
## [5.2.0]
- Added an option to keep a number of entries above the selected entry when scrolling
- Added a cache to the HTTP client to reduce the number of requests made to feeds when subscribing (#1431)
- Feeds are no longer refreshed between the moment its last user unsubscribes and the moment the feed is cleaned up (every hour)
- Fixed an issue that could cause entries to not correctly load when using keyboard navigation (#1557)
## [5.1.1]
- Fixed database migration issue when upgrading from 5.0.0 to 5.1.0 on MariaDB (#1544)
- When feeds without unread entries are hidden from the tree, the feed is displayed in the tree until another one is selected (#1543)
## [5.1.0]
- Added a setting for showing/hiding unread count in the browser's tab title/favicon (#1518)
- Fixed an issue that could prevent the app from starting on some systems (#1532)
- Added a cache busting filter for the webapp index.html and openapi documentation to make sure they are always up to date
- Reduced database cleanup log verbosity
## [5.0.2]
- Fix favicon fetching for Youtube channels in native mode when Google auth key is set
- Fix an error that appears in the logs when fetching some favicons
## [5.0.1]
- Configure native compilation to support older CPU architectures (#1524)
## [5.0.0]
CommaFeed is now powered by Quarkus instead of Dropwizard. Read the rationale behind this change in
the [announcement](https://github.com/Athou/commafeed/discussions/1517).
The gist of it is that CommaFeed can now be compiled to a native binary, resulting in blazing fast startup times (around
0.3s) and very low memory footprint (< 50M).
- CommaFeed now has a different package for each supported database.
- If you are deploying CommaFeed with a precompiled package, please
read [this section of the README](https://github.com/Athou/commafeed/tree/master?tab=readme-ov-file#download-a-precompiled-package).
- If you are building CommaFeed from sources, please
read [this section of the README](https://github.com/Athou/commafeed/tree/master?tab=readme-ov-file#build-from-sources).
- If you are using the Docker image, please read the instructions on
the [Docker Hub page](https://hub.docker.com/r/athou/commafeed).
- Due to the switch to Quarkus, the way CommaFeed is configured is very different (the `config.yml` file is gone).
Please
read [this section of the README](https://github.com/Athou/commafeed/tree/master?tab=readme-ov-file#configuration).
Note that a lot of configuration elements have been removed or renamed and are now nested/grouped by feature.
- Added a setting to prevent parsing large feeds to avoid out of memory errors. The default is 5MB.
- Use a different icon for filtering unread entries and marking an entry as read (#1506)
- Added various HTML attributes to ease custom JS/CSS customization (#1507)
- The Redis cache has been removed. There have been multiple enhancements to the feed refresh engine and it is no longer
needed, even for instances with a large number of feeds.
- The H2 migration tool that automatically upgrades H2 databases from format 2 to 3 has been removed. If you're using
the H2 embedded database, please upgrade to at least version 4.3.0 before upgrading to CommaFeed 5.0.0.
## [4.6.0] ## [4.6.0]
- switched from Temurin to OpenJ9 as the JVM used in the Docker image, resulting in memory usage reduction by up to 50% - switched from Temurin to OpenJ9 as the JVM used in the Docker image, resulting in memory usage reduction by up to 50%

View File

@@ -1,19 +0,0 @@
FROM ibm-semeru-runtimes:open-21-jre
EXPOSE 8082
RUN mkdir -p /commafeed/data
VOLUME /commafeed/data
RUN apt update && apt install -y wait-for-it && apt clean
ENV JAVA_TOOL_OPTIONS -Djava.net.preferIPv4Stack=true -Xtune:virtualized -Xminf0.05 -Xmaxf0.1
COPY commafeed-server/config.docker-warmup.yml .
COPY commafeed-server/config.yml.example config.yml
COPY commafeed-server/target/commafeed.jar .
# build openj9 shared classes cache to improve startup time
RUN sh -c 'java -Xshareclasses -jar commafeed.jar server config.docker-warmup.yml &' ; wait-for-it -t 600 localhost:8088 -- pkill java ; rm -rf config.warmup.yml
CMD ["java", "-Xshareclasses", "-jar", "commafeed.jar", "server", "config.yml"]

105
README.md
View File

@@ -1,6 +1,6 @@
# CommaFeed # CommaFeed
Google Reader inspired self-hosted RSS reader, based on Dropwizard and React/TypeScript. Google Reader inspired self-hosted RSS reader, based on Quarkus and React/TypeScript.
![preview](https://user-images.githubusercontent.com/1256795/184886828-1973f148-58a9-4c6d-9587-ee5e5d3cc2cb.png) ![preview](https://user-images.githubusercontent.com/1256795/184886828-1973f148-58a9-4c6d-9587-ee5e5d3cc2cb.png)
@@ -8,14 +8,22 @@ Google Reader inspired self-hosted RSS reader, based on Dropwizard and React/Typ
- 4 different layouts - 4 different layouts
- Light/Dark theme - Light/Dark theme
- Fully responsive - Fully responsive, works great on both mobile and desktop
- Keyboard shortcuts for almost everything - Keyboard shortcuts for almost everything
- Support for right-to-left feeds - Support for right-to-left feeds
- Translated in 25+ languages - Translated in 25+ languages
- Supports thousands of users and millions of feeds - Supports thousands of users and millions of feeds
- OPML import/export - OPML import/export
- REST API and a Fever-compatible API for native mobile apps - REST API
- Fever-compatible API for native mobile apps
- Can automatically mark articles as read based on user-defined rules
- [Browser extension](https://github.com/Athou/commafeed-browser-extension) - [Browser extension](https://github.com/Athou/commafeed-browser-extension)
- Compiles to native code for blazing fast startup and low memory usage
- Supports 4 databases
- H2 (embedded database)
- PostgreSQL
- MySQL
- MariaDB
## Deployment ## Deployment
@@ -33,26 +41,78 @@ PikaPods shares 20% of the revenue back to CommaFeed.
[![PikaPods](https://www.pikapods.com/static/run-button.svg)](https://www.pikapods.com/pods?run=commafeed) [![PikaPods](https://www.pikapods.com/static/run-button.svg)](https://www.pikapods.com/pods?run=commafeed)
### Download precompiled package ### Download a precompiled package
mkdir commafeed && cd commafeed Go to the [release page](https://github.com/Athou/commafeed/releases) and download the latest version for your operating
wget https://github.com/Athou/commafeed/releases/latest/download/commafeed.jar system and database of choice.
wget https://github.com/Athou/commafeed/releases/latest/download/config.yml.example -O config.yml
java -Djava.net.preferIPv4Stack=true -jar commafeed.jar server config.yml
The server will listen on http://localhost:8082. The default There are two types of packages:
user is `admin` and the default password is `admin`.
- The `linux-x86_64` and `windows-x86_64` packages are compiled natively and contain an executable that can be run
directly.
- The `jvm` package is a zip file containing all `.jar` files required to run the application. This package works on all
platforms and is started with `java -jar quarkus-run.jar`.
If available for your operating system, the native package is recommended because it has a faster startup time and lower
memory usage.
### Build from sources ### Build from sources
git clone https://github.com/Athou/commafeed.git ./mvnw clean package [-P<database>] [-Pnative] [-DskipTests]
cd commafeed
./mvnw clean package
cp commafeed-server/config.yml.example config.yml
java -Djava.net.preferIPv4Stack=true -jar commafeed-server/target/commafeed.jar server config.yml
The server will listen on http://localhost:8082. The default - `<database>` can be one of `h2`, `postgresql`, `mysql` or `mariadb`. The default is `h2`.
user is `admin` and the default password is `admin`. - `-Pnative` compiles the application to native code. This requires GraalVM to be installed (`GRAALVM_HOME` environment
variable pointing to a GraalVM installation).
- `-DskipTests` to speed up the build process by skipping tests.
When the build is complete:
- a zip containing all jars required to run the application is located at
`commafeed-server/target/commafeed-<version>-<database>-jvm.zip`. Extract it and run the application with
`java -jar quarkus-run.jar`
- if you used the native profile, the executable is located at
`commafeed-server/target/commafeed-<version>-<database>-<platform>-<arch>-runner[.exe]`
## Configuration
CommaFeed doesn't require any configuration to run with its embedded database (H2). The database file will be stored in
the `data` directory of the current directory.
To use a different database, you will need to configure the following properties:
- `quarkus.datasource.jdbc.url`
- e.g. for H2: `jdbc:h2:./data/db;DEFRAG_ALWAYS=TRUE`
- e.g. for PostgreSQL: `jdbc:postgresql://localhost:5432/commafeed`
- e.g. for MySQL:
`jdbc:mysql://localhost/commafeed?autoReconnect=true&failOverReadOnly=false&maxReconnects=20&rewriteBatchedStatements=true&timezone=UTC`
- e.g. for MariaDB:
`jdbc:mariadb://localhost/commafeed?autoReconnect=true&failOverReadOnly=false&maxReconnects=20&rewriteBatchedStatements=true&timezone=UTC`
- `quarkus.datasource.username`
- `quarkus.datasource.password`
There are multiple ways to configure CommaFeed:
- a `config/application.properties` [properties](https://en.wikipedia.org/wiki/.properties) file relative to the working
directory (keys in kebab-case)
- Command line arguments each prefixed with `-D` (keys in kebab-case)
- 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.
All [CommaFeed settings](commafeed-server/doc/commafeed.md) are optional and have sensible default values.
When logging in, credentials are stored in an encrypted cookie. The encryption key is randomly generated at startup,
meaning that you will have to log back in after each restart of the application. To prevent this, you can set the
`quarkus.http.auth.session.encryption-key` property to a fixed value (min. 16 characters).
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
When CommaFeed is up and running, you can subscribe to [this feed](https://github.com/Athou/commafeed/releases.atom) to be notified of new releases.
### Memory management ### Memory management
@@ -60,12 +120,12 @@ The Java Virtual Machine (JVM) is rather greedy by default and will not release
operating system. This is because acquiring memory from the operating system is a relatively expensive operation. operating system. This is because acquiring memory from the operating system is a relatively expensive operation.
This can be problematic on systems with limited memory. This can be problematic on systems with limited memory.
#### Hard limit #### Hard limit (`native` and `jvm` packages)
The JVM can be configured to use a maximum amount of memory with the `-Xmx` parameter. The JVM can be configured to use a maximum amount of memory with the `-Xmx` parameter.
For example, to limit the JVM to 256MB of memory, use `-Xmx256m`. For example, to limit the JVM to 256MB of memory, use `-Xmx256m`.
#### Dynamic sizing #### Dynamic sizing (`jvm` package)
In addition to the previous setting, the JVM can be configured to release unused memory to the operating system with the In addition to the previous setting, the JVM can be configured to release unused memory to the operating system with the
following parameters: following parameters:
@@ -77,14 +137,15 @@ and [here](https://docs.oracle.com/en/java/javase/17/gctuning/factors-affecting-
more more
information. information.
#### OpenJ9 #### OpenJ9 (`jvm` package)
The [OpenJ9](https://eclipse.dev/openj9/) JVM is a more memory-efficient alternative to the HotSpot JVM, at the cost of The [OpenJ9](https://eclipse.dev/openj9/) JVM is a more memory-efficient alternative to the HotSpot JVM, at the cost of
slightly slower throughput. slightly slower throughput.
IBM provides precompiled binaries for OpenJ9 IBM provides precompiled binaries for OpenJ9
named [Semeru](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/). named [Semeru](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/).
This is the JVM used in the [Docker image](https://github.com/Athou/commafeed/blob/master/Dockerfile). This is the JVM used in
the [Docker image](https://github.com/Athou/commafeed/blob/master/commafeed-server/src/main/docker/Dockerfile.jvm).
## Translation ## Translation
@@ -108,7 +169,7 @@ two-letters [ISO-639-1 language code](http://en.wikipedia.org/wiki/List_of_ISO_6
- Open `commafeed-server` in your preferred Java IDE. - Open `commafeed-server` in your preferred Java IDE.
- CommaFeed uses Lombok, you need the Lombok plugin for your IDE. - CommaFeed uses Lombok, you need the Lombok plugin for your IDE.
- Start `CommaFeedApplication.java` in debug mode with `server config.dev.yml` as arguments - run `./mvnw quarkus:dev`
### Frontend ### Frontend

View File

@@ -1,52 +0,0 @@
{
"locales": [
"ar",
"ca",
"cs",
"cy",
"da",
"de",
"en",
"es",
"fa",
"fi",
"fr",
"gl",
"hu",
"id",
"it",
"ja",
"ko",
"ms",
"nb",
"nl",
"nn",
"pl",
"pt",
"ru",
"sk",
"sv",
"tr",
"zh"
],
"catalogs": [
{
"path": "src/locales/{locale}/messages",
"include": [
"src"
],
"exclude": [
"src/locales/**"
]
}
],
"format": "po",
"formatOptions": {
"origins": true,
"lineNumbers": false
},
"sourceLocale": "en",
"fallbackLocales": {
"default": "en"
}
}

View File

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

View File

@@ -1,11 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/x-icon" href="favicon.ico" /> <link rel="icon" type="image/x-icon" href="favicon.ico" />
<link rel="manifest" href="manifest.json" /> <link rel="manifest" href="manifest.json" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>CommaFeed</title>
<link rel="stylesheet" type="text/css" href="custom_css.css" />
<script type="text/javascript" src="custom_js.js"></script>
<title>CommaFeed</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@@ -0,0 +1,52 @@
import type { LinguiConfig } from "@lingui/conf"
const config: LinguiConfig = {
locales: [
"ar",
"ca",
"cs",
"cy",
"da",
"de",
"en",
"es",
"fa",
"fi",
"fr",
"gl",
"hu",
"id",
"it",
"ja",
"ko",
"ms",
"nb",
"nl",
"nn",
"pl",
"pt",
"ru",
"sk",
"sv",
"tr",
"zh",
],
catalogs: [
{
path: "src/locales/{locale}/messages",
include: ["src"],
exclude: ["src/locales/**"],
},
],
format: "po",
formatOptions: {
origins: true,
lineNumbers: false,
},
sourceLocale: "en",
fallbackLocales: {
default: "en",
},
}
export default config

File diff suppressed because it is too large Load Diff

View File

@@ -15,65 +15,71 @@
"i18n:extract": "lingui extract --clean" "i18n:extract": "lingui extract --clean"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.11.4", "@emotion/react": "^11.14.0",
"@fontsource/open-sans": "^5.0.28", "@fontsource/open-sans": "^5.1.1",
"@lingui/core": "^4.11.2", "@mantine/core": "^7.16.3",
"@lingui/macro": "^4.11.2", "@mantine/form": "^7.16.3",
"@lingui/react": "^4.11.2", "@mantine/hooks": "^7.16.3",
"@mantine/core": "^7.11.2", "@mantine/modals": "^7.16.3",
"@mantine/form": "^7.11.2", "@mantine/notifications": "^7.16.3",
"@mantine/hooks": "^7.11.2", "@mantine/spotlight": "^7.16.3",
"@mantine/modals": "^7.11.2", "@lingui/core": "^5.2.0",
"@mantine/notifications": "^7.11.2", "@lingui/react": "^5.2.0",
"@mantine/spotlight": "^7.11.2", "@monaco-editor/react": "^4.7.0-rc.0",
"@monaco-editor/react": "^4.6.0", "@reduxjs/toolkit": "^2.5.1",
"@reduxjs/toolkit": "^2.2.6", "axios": "^1.7.9",
"axios": "^1.7.2", "dayjs": "^1.11.13",
"dayjs": "^1.11.11",
"escape-string-regexp": "^5.0.0", "escape-string-regexp": "^5.0.0",
"interweave": "^13.1.0", "interweave": "^13.1.0",
"monaco-editor": "^0.50.0", "monaco-editor": "^0.52.2",
"mousetrap": "^1.6.5", "mousetrap": "^1.6.5",
"react": "^18.3.1", "react": "^19.0.0",
"react-async-hook": "^4.0.0", "react-async-hook": "^4.0.0",
"react-contexify": "^6.0.0", "react-contexify": "^6.0.0",
"react-device-detect": "^2.2.3", "react-device-detect": "^2.2.3",
"react-dom": "^18.3.1", "react-dom": "^19.0.0",
"react-draggable": "^4.4.6", "react-draggable": "^4.4.6",
"react-ga4": "^2.1.0", "react-ga4": "^2.1.0",
"react-helmet": "^6.1.0", "react-icons": "^5.4.0",
"react-icons": "^5.2.1",
"react-infinite-scroller": "^1.2.6", "react-infinite-scroller": "^1.2.6",
"react-redux": "^9.1.2", "react-redux": "^9.2.0",
"react-router-dom": "^6.24.1", "react-router-dom": "^7.1.5",
"react-swipeable": "^7.0.1", "react-swipeable": "^7.0.2",
"redoc": "^2.1.5", "redoc": "^2.4.0",
"style-to-object": "^1.0.8",
"throttle-debounce": "^5.0.2", "throttle-debounce": "^5.0.2",
"tinycon": "^0.6.8", "tinycon": "^0.6.8",
"tss-react": "^4.9.10", "tss-react": "^4.9.15",
"use-local-storage": "^3.0.0",
"vite-plugin-biome": "^1.0.12",
"websocket-heartbeat-js": "^1.1.3" "websocket-heartbeat-js": "^1.1.3"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^1.8.3", "@biomejs/biome": "^1.9.4",
"@lingui/cli": "^4.11.2", "@lingui/babel-plugin-lingui-macro": "^5.2.0",
"@lingui/vite-plugin": "^4.11.2", "@lingui/cli": "^5.2.0",
"@lingui/vite-plugin": "^5.2.0",
"@types/mousetrap": "^1.6.15", "@types/mousetrap": "^1.6.15",
"@types/react": "^18.3.3", "@types/react": "^19.0.8",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^19.0.3",
"@types/react-helmet": "^6.1.11",
"@types/react-infinite-scroller": "^1.2.5", "@types/react-infinite-scroller": "^1.2.5",
"@types/swagger-ui-react": "^4.18.3",
"@types/throttle-debounce": "^5.0.2", "@types/throttle-debounce": "^5.0.2",
"@types/tinycon": "^0.6.5", "@types/tinycon": "^0.6.7",
"@vitejs/plugin-react": "^4.3.1", "@vitejs/plugin-react": "^4.3.4",
"babel-plugin-macros": "^3.1.0", "babel-plugin-macros": "^3.1.0",
"rollup-plugin-visualizer": "^5.12.0", "jsdom": "^26.0.0",
"typescript": "^5.5.3", "rollup-plugin-visualizer": "^5.14.0",
"vite": "^5.3.3", "typescript": "^5.7.3",
"vite-tsconfig-paths": "^4.3.2", "vite": "^6.1.0",
"vitest": "^2.0.2", "vite-plugin-checker": "^0.8.0",
"vitest-mock-extended": "^1.3.1" "vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.0.5",
"vitest-mock-extended": "^2.0.2"
},
"overrides": {
"interweave": {
"react": "^19.0.0"
},
"react-infinite-scroller": {
"react": "^19.0.0"
}
} }
} }

View File

@@ -6,16 +6,16 @@
<parent> <parent>
<groupId>com.commafeed</groupId> <groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId> <artifactId>commafeed</artifactId>
<version>4.6.0</version> <version>5.5.0</version>
</parent> </parent>
<artifactId>commafeed-client</artifactId> <artifactId>commafeed-client</artifactId>
<name>CommaFeed Client</name> <name>CommaFeed Client</name>
<properties> <properties>
<!-- renovate: datasource=node-version depName=node --> <!-- renovate: datasource=node-version depName=node -->
<node.version>v20.15.1</node.version> <node.version>v22.13.1</node.version>
<!-- renovate: datasource=npm depName=npm --> <!-- renovate: datasource=npm depName=npm -->
<npm.version>10.8.2</npm.version> <npm.version>11.1.0</npm.version>
</properties> </properties>
<build> <build>
@@ -23,7 +23,7 @@
<plugin> <plugin>
<groupId>com.github.eirslett</groupId> <groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId> <artifactId>frontend-maven-plugin</artifactId>
<version>1.15.0</version> <version>1.15.1</version>
<?m2e ignore?> <?m2e ignore?>
<executions> <executions>
<execution> <execution>
@@ -80,7 +80,7 @@
<goal>copy-resources</goal> <goal>copy-resources</goal>
</goals> </goals>
<configuration> <configuration>
<outputDirectory>${project.build.directory}/classes/assets</outputDirectory> <outputDirectory>${project.build.directory}/classes/META-INF/resources</outputDirectory>
<resources> <resources>
<resource> <resource>
<directory>dist</directory> <directory>dist</directory>

View File

@@ -32,7 +32,6 @@ import { RegistrationPage } from "pages/auth/RegistrationPage"
import React, { useEffect } from "react" import React, { useEffect } from "react"
import { isSafari } from "react-device-detect" import { isSafari } from "react-device-detect"
import ReactGA from "react-ga4" import ReactGA from "react-ga4"
import { Helmet } from "react-helmet"
import { HashRouter, Navigate, Route, Routes, useLocation, useNavigate } from "react-router-dom" import { HashRouter, Navigate, Route, Routes, useLocation, useNavigate } from "react-router-dom"
import Tinycon from "tinycon" import Tinycon from "tinycon"
@@ -71,7 +70,7 @@ function Providers(props: { children: React.ReactNode }) {
) )
} }
// swagger-ui is very large, load only on-demand // api documentation page is very large, load only on-demand
const ApiDocumentationPage = React.lazy(async () => await import("pages/app/ApiDocumentationPage")) const ApiDocumentationPage = React.lazy(async () => await import("pages/app/ApiDocumentationPage"))
function AppRoutes() { function AppRoutes() {
@@ -142,16 +141,18 @@ function GoogleAnalyticsHandler() {
return null return null
} }
function FaviconHandler() { function UnreadCountTitleHandler({ unreadCount, enabled }: { unreadCount: number; enabled?: boolean }) {
const root = useAppSelector(state => state.tree.rootCategory) return <title>{enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"}</title>
}
function UnreadCountFaviconHandler({ unreadCount, enabled }: { unreadCount: number; enabled?: boolean }) {
useEffect(() => { useEffect(() => {
const unreadCount = categoryUnreadCount(root) if (enabled && unreadCount > 0) {
if (unreadCount === 0) {
Tinycon.reset()
} else {
Tinycon.setBubble(unreadCount) Tinycon.setBubble(unreadCount)
} else {
Tinycon.reset()
} }
}, [root]) }, [unreadCount, enabled])
return null return null
} }
@@ -168,19 +169,15 @@ function BrowserExtensionBadgeUnreadCountHandler() {
return null return null
} }
function CustomCode() {
return (
<Helmet>
<link rel="stylesheet" type="text/css" href="custom_css.css" />
<script type="text/javascript" src="custom_js.js" />
</Helmet>
)
}
export function App() { export function App() {
useI18n() useI18n()
const root = useAppSelector(state => state.tree.rootCategory)
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const unreadCount = categoryUnreadCount(root)
useEffect(() => { useEffect(() => {
dispatch(reloadServerInfos()) dispatch(reloadServerInfos())
}, [dispatch]) }, [dispatch])
@@ -188,13 +185,13 @@ export function App() {
return ( return (
<Providers> <Providers>
<> <>
<FaviconHandler /> <UnreadCountTitleHandler unreadCount={unreadCount} enabled={unreadCountTitle} />
<UnreadCountFaviconHandler unreadCount={unreadCount} enabled={unreadCountFavicon} />
<BrowserExtensionBadgeUnreadCountHandler /> <BrowserExtensionBadgeUnreadCountHandler />
<HashRouter> <HashRouter>
<GoogleAnalyticsHandler /> <GoogleAnalyticsHandler />
<RedirectHandler /> <RedirectHandler />
<AppRoutes /> <AppRoutes />
<CustomCode />
{/* disable pull-to-refresh as it messes with vertical scrolling {/* disable pull-to-refresh as it messes with vertical scrolling
safari behaves weirdly when overscroll-behavior is set to none so we disable it only for other browsers safari behaves weirdly when overscroll-behavior is set to none so we disable it only for other browsers
https://github.com/Athou/commafeed/issues/1168 https://github.com/Athou/commafeed/issues/1168

View File

@@ -81,7 +81,17 @@ export const client = {
}, },
}, },
user: { user: {
login: async (req: LoginRequest) => await axiosInstance.post("user/login", req), login: async (req: LoginRequest) => {
const formData = new URLSearchParams()
formData.append("j_username", req.name)
formData.append("j_password", req.password)
return await axiosInstance.post("j_security_check", formData, {
baseURL: ".",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
})
},
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req), register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req), passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
getSettings: async () => await axiosInstance.get<Settings>("user/settings"), getSettings: async () => await axiosInstance.get<Settings>("user/settings"),

View File

@@ -1,13 +1,11 @@
import { t } from "@lingui/macro"
import type { IconType } from "react-icons" import type { IconType } from "react-icons"
import { FaAt } from "react-icons/fa" import { FaAt } from "react-icons/fa"
import { SiBuffer, SiFacebook, SiGmail, SiInstapaper, SiPocket, SiTumblr, SiTwitter } from "react-icons/si" import { SiBuffer, SiFacebook, SiGmail, SiInstapaper, SiPocket, SiTumblr, SiX } from "react-icons/si"
import type { Category, Entry, SharingSettings } from "./types" import type { Category, Entry, SharingSettings } from "./types"
const categories: Record<string, Category> = { const categories: Record<string, Omit<Category, "name">> = {
all: { all: {
id: "all", id: "all",
name: t`All`,
expanded: false, expanded: false,
children: [], children: [],
feeds: [], feeds: [],
@@ -15,7 +13,6 @@ const categories: Record<string, Category> = {
}, },
starred: { starred: {
id: "starred", id: "starred",
name: t`Starred`,
expanded: false, expanded: false,
children: [], children: [],
feeds: [], feeds: [],
@@ -50,10 +47,10 @@ const sharing: {
url: url => `https://www.facebook.com/sharer/sharer.php?u=${url}`, url: url => `https://www.facebook.com/sharer/sharer.php?u=${url}`,
}, },
twitter: { twitter: {
label: "Twitter", label: "X",
icon: SiTwitter, icon: SiX,
color: "#1D9BF0", color: "#000000",
url: (url, desc) => `https://twitter.com/share?text=${desc}&url=${url}`, url: (url, desc) => `https://x.com/share?text=${desc}&url=${url}`,
}, },
tumblr: { tumblr: {
label: "Tumblr", label: "Tumblr",

View File

@@ -166,22 +166,34 @@ export const selectEntry = createAppAsyncThunk(
}) })
if (arg.scrollToEntry) { if (arg.scrollToEntry) {
const viewMode = state.user.localSettings.viewMode
const entryIndex = state.entries.entries.indexOf(entry)
const entriesToKeepOnTopWhenScrolling =
viewMode === "expanded" ? 0 : Math.min(state.user.settings?.entriesToKeepOnTopWhenScrolling ?? 0, entryIndex)
const entryToScrollTo = state.entries.entries[entryIndex - entriesToKeepOnTopWhenScrolling]
const entryElement = document.getElementById(Constants.dom.entryId(entry)) const entryElement = document.getElementById(Constants.dom.entryId(entry))
if (entryElement) { const entryElementToScrollTo = document.getElementById(Constants.dom.entryId(entryToScrollTo))
if (entryElement && entryElementToScrollTo) {
const scrollMode = state.user.settings?.scrollMode const scrollMode = state.user.settings?.scrollMode
const entryEntirelyVisible = Constants.layout.isTopVisible(entryElement) && Constants.layout.isBottomVisible(entryElement) const entryEntirelyVisible =
Constants.layout.isTopVisible(entryElementToScrollTo) && Constants.layout.isBottomVisible(entryElement)
if (scrollMode === "always" || (scrollMode === "if_needed" && !entryEntirelyVisible)) { if (scrollMode === "always" || (scrollMode === "if_needed" && !entryEntirelyVisible)) {
const scrollSpeed = state.user.settings?.scrollSpeed const scrollSpeed = state.user.settings?.scrollSpeed
const margin = viewMode === "detailed" ? 8 : 3
thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(true)) thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(true))
scrollToEntry(entryElement, scrollSpeed, () => thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(false))) scrollToEntry(entryElementToScrollTo, margin, scrollSpeed, () =>
thunkApi.dispatch(entriesSlice.actions.setScrollingToEntry(false))
)
} }
} }
} }
} }
) )
const scrollToEntry = (entryElement: HTMLElement, scrollSpeed: number | undefined, onScrollEnded: () => void) => { const scrollToEntry = (entryElement: HTMLElement, margin: number, scrollSpeed: number | undefined, onScrollEnded: () => void) => {
const header = document.getElementById(Constants.dom.headerId)?.getBoundingClientRect() const header = document.getElementById(Constants.dom.headerId)?.getBoundingClientRect()
const offset = (header?.bottom ?? 0) + 3 const offset = (header?.bottom ?? 0) + margin
scrollToWithCallback({ scrollToWithCallback({
options: { options: {
top: entryElement.offsetTop - offset, top: entryElement.offsetTop - offset,
@@ -218,7 +230,7 @@ export const selectPreviousEntry = createAppAsyncThunk(
) )
export const selectNextEntry = createAppAsyncThunk( export const selectNextEntry = createAppAsyncThunk(
"entries/entry/selectNext", "entries/entry/selectNext",
( async (
arg: { arg: {
expand: boolean expand: boolean
markAsRead: boolean markAsRead: boolean
@@ -227,12 +239,20 @@ export const selectNextEntry = createAppAsyncThunk(
thunkApi thunkApi
) => { ) => {
const state = thunkApi.getState() const state = thunkApi.getState()
const { entries } = state.entries const { entries, hasMore, loading } = state.entries
const nextIndex = entries.findIndex(e => e.id === state.entries.selectedEntryId) + 1 const nextIndex = entries.findIndex(e => e.id === state.entries.selectedEntryId) + 1
if (nextIndex < entries.length) {
// load more entries if needed
// this can happen if the last entry is too large to fit on the screen and the infinite loader doesn't trigger
if (nextIndex >= entries.length && hasMore && !loading) {
await thunkApi.dispatch(loadMoreEntries())
}
const entriesAfterLoading = thunkApi.getState().entries.entries
if (nextIndex < entriesAfterLoading.length) {
thunkApi.dispatch( thunkApi.dispatch(
selectEntry({ selectEntry({
entry: entries[nextIndex], entry: entriesAfterLoading[nextIndex],
expand: arg.expand, expand: arg.expand,
markAsRead: arg.markAsRead, markAsRead: arg.markAsRead,
scrollToEntry: arg.scrollToEntry, scrollToEntry: arg.scrollToEntry,

View File

@@ -3,7 +3,8 @@ import { entriesSlice } from "app/entries/slice"
import { redirectSlice } from "app/redirect/slice" import { redirectSlice } from "app/redirect/slice"
import { serverSlice } from "app/server/slice" import { serverSlice } from "app/server/slice"
import { treeSlice } from "app/tree/slice" import { treeSlice } from "app/tree/slice"
import { userSlice } from "app/user/slice" import type { LocalSettings } from "app/types"
import { initialLocalSettings, userSlice } from "app/user/slice"
import { type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux" import { type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"
export const reducers = { export const reducers = {
@@ -14,7 +15,36 @@ export const reducers = {
user: userSlice.reducer, user: userSlice.reducer,
} }
export const store = configureStore({ reducer: reducers }) const loadLocalSettings = (): LocalSettings => {
const json = localStorage.getItem("commafeed-local-settings")
if (json) {
return JSON.parse(json)
}
// load old settings
const viewMode = localStorage.getItem("view-mode")
const sidebarWidth = localStorage.getItem("sidebar-width")
const announcementHash = localStorage.getItem("announcement-hash")
return {
...initialLocalSettings,
viewMode: viewMode ? JSON.parse(viewMode) : initialLocalSettings.viewMode,
sidebarWidth: sidebarWidth ? JSON.parse(sidebarWidth) : initialLocalSettings.sidebarWidth,
announcementHash: announcementHash ? JSON.parse(announcementHash) : initialLocalSettings.announcementHash,
}
}
export const store = configureStore({
reducer: reducers,
preloadedState: {
user: {
localSettings: loadLocalSettings(),
},
},
})
store.subscribe(() => {
const localSettings = store.getState().user.localSettings
localStorage.setItem("commafeed-local-settings", JSON.stringify(localSettings))
})
export type RootState = ReturnType<typeof store.getState> export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch export type AppDispatch = typeof store.dispatch

View File

@@ -220,6 +220,7 @@ export interface ServerInfo {
websocketEnabled: boolean websocketEnabled: boolean
websocketPingInterval: number websocketPingInterval: number
treeReloadInterval: number treeReloadInterval: number
forceRefreshCooldownDuration: number
} }
export interface SharingSettings { export interface SharingSettings {
@@ -243,14 +244,23 @@ export interface Settings {
customJs?: string customJs?: string
scrollSpeed: number scrollSpeed: number
scrollMode: ScrollMode scrollMode: ScrollMode
entriesToKeepOnTopWhenScrolling: number
starIconDisplayMode: IconDisplayMode starIconDisplayMode: IconDisplayMode
externalLinkIconDisplayMode: IconDisplayMode externalLinkIconDisplayMode: IconDisplayMode
markAllAsReadConfirmation: boolean markAllAsReadConfirmation: boolean
customContextMenu: boolean customContextMenu: boolean
mobileFooter: boolean mobileFooter: boolean
unreadCountTitle: boolean
unreadCountFavicon: boolean
sharingSettings: SharingSettings sharingSettings: SharingSettings
} }
export interface LocalSettings {
viewMode: ViewMode
sidebarWidth: number
announcementHash: string
}
export interface StarRequest { export interface StarRequest {
id: string id: string
feedId: number feedId: number
@@ -278,6 +288,7 @@ export interface UserModel {
created: number created: number
lastLogin?: number lastLogin?: number
admin: boolean admin: boolean
lastForceRefresh?: number
} }
export interface AdminSaveUserRequest { export interface AdminSaveUserRequest {

View File

@@ -1,9 +1,10 @@
import { t } from "@lingui/macro" import { t } from "@lingui/core/macro"
import { showNotification } from "@mantine/notifications" import { showNotification } from "@mantine/notifications"
import { createSlice, isAnyOf } from "@reduxjs/toolkit" import { type PayloadAction, createSlice, isAnyOf } from "@reduxjs/toolkit"
import type { Settings, UserModel } from "app/types" import type { LocalSettings, Settings, UserModel, ViewMode } from "app/types"
import { import {
changeCustomContextMenu, changeCustomContextMenu,
changeEntriesToKeepOnTopWhenScrolling,
changeExternalLinkIconDisplayMode, changeExternalLinkIconDisplayMode,
changeLanguage, changeLanguage,
changeMarkAllAsReadConfirmation, changeMarkAllAsReadConfirmation,
@@ -16,6 +17,8 @@ import {
changeSharingSetting, changeSharingSetting,
changeShowRead, changeShowRead,
changeStarIconDisplayMode, changeStarIconDisplayMode,
changeUnreadCountFavicon,
changeUnreadCountTitle,
reloadProfile, reloadProfile,
reloadSettings, reloadSettings,
reloadTags, reloadTags,
@@ -23,16 +26,35 @@ import {
interface UserState { interface UserState {
settings?: Settings settings?: Settings
localSettings: LocalSettings
profile?: UserModel profile?: UserModel
tags?: string[] tags?: string[]
} }
const initialState: UserState = {} export const initialLocalSettings: LocalSettings = {
viewMode: "detailed",
sidebarWidth: 360,
announcementHash: "no-hash",
}
const initialState: UserState = {
localSettings: initialLocalSettings,
}
export const userSlice = createSlice({ export const userSlice = createSlice({
name: "user", name: "user",
initialState, initialState,
reducers: {}, reducers: {
setViewMode: (state, action: PayloadAction<ViewMode>) => {
state.localSettings.viewMode = action.payload
},
setSidebarWidth: (state, action: PayloadAction<number>) => {
state.localSettings.sidebarWidth = action.payload
},
setAnnouncementHash: (state, action: PayloadAction<string>) => {
state.localSettings.announcementHash = action.payload
},
},
extraReducers: builder => { extraReducers: builder => {
builder.addCase(reloadSettings.fulfilled, (state, action) => { builder.addCase(reloadSettings.fulfilled, (state, action) => {
state.settings = action.payload state.settings = action.payload
@@ -71,6 +93,10 @@ export const userSlice = createSlice({
if (!state.settings) return if (!state.settings) return
state.settings.scrollMode = action.meta.arg state.settings.scrollMode = action.meta.arg
}) })
builder.addCase(changeEntriesToKeepOnTopWhenScrolling.pending, (state, action) => {
if (!state.settings) return
state.settings.entriesToKeepOnTopWhenScrolling = action.meta.arg
})
builder.addCase(changeStarIconDisplayMode.pending, (state, action) => { builder.addCase(changeStarIconDisplayMode.pending, (state, action) => {
if (!state.settings) return if (!state.settings) return
state.settings.starIconDisplayMode = action.meta.arg state.settings.starIconDisplayMode = action.meta.arg
@@ -91,6 +117,14 @@ export const userSlice = createSlice({
if (!state.settings) return if (!state.settings) return
state.settings.mobileFooter = action.meta.arg state.settings.mobileFooter = action.meta.arg
}) })
builder.addCase(changeUnreadCountTitle.pending, (state, action) => {
if (!state.settings) return
state.settings.unreadCountTitle = action.meta.arg
})
builder.addCase(changeUnreadCountFavicon.pending, (state, action) => {
if (!state.settings) return
state.settings.unreadCountFavicon = action.meta.arg
})
builder.addCase(changeSharingSetting.pending, (state, action) => { builder.addCase(changeSharingSetting.pending, (state, action) => {
if (!state.settings) return if (!state.settings) return
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
@@ -102,11 +136,14 @@ export const userSlice = createSlice({
changeShowRead.fulfilled, changeShowRead.fulfilled,
changeScrollMarks.fulfilled, changeScrollMarks.fulfilled,
changeScrollMode.fulfilled, changeScrollMode.fulfilled,
changeEntriesToKeepOnTopWhenScrolling.fulfilled,
changeStarIconDisplayMode.fulfilled, changeStarIconDisplayMode.fulfilled,
changeExternalLinkIconDisplayMode.fulfilled, changeExternalLinkIconDisplayMode.fulfilled,
changeMarkAllAsReadConfirmation.fulfilled, changeMarkAllAsReadConfirmation.fulfilled,
changeCustomContextMenu.fulfilled, changeCustomContextMenu.fulfilled,
changeMobileFooter.fulfilled, changeMobileFooter.fulfilled,
changeUnreadCountTitle.fulfilled,
changeUnreadCountFavicon.fulfilled,
changeSharingSetting.fulfilled changeSharingSetting.fulfilled
), ),
() => { () => {
@@ -118,3 +155,5 @@ export const userSlice = createSlice({
) )
}, },
}) })
export const { setViewMode, setSidebarWidth, setAnnouncementHash } = userSlice.actions

View File

@@ -43,6 +43,14 @@ export const changeScrollMode = createAppAsyncThunk("settings/scrollMode", (scro
if (!settings) return if (!settings) return
client.user.saveSettings({ ...settings, scrollMode }) client.user.saveSettings({ ...settings, scrollMode })
}) })
export const changeEntriesToKeepOnTopWhenScrolling = createAppAsyncThunk(
"settings/entriesToKeepOnTopWhenScrolling",
(entriesToKeepOnTopWhenScrolling: number, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, entriesToKeepOnTopWhenScrolling })
}
)
export const changeStarIconDisplayMode = createAppAsyncThunk( export const changeStarIconDisplayMode = createAppAsyncThunk(
"settings/starIconDisplayMode", "settings/starIconDisplayMode",
(starIconDisplayMode: IconDisplayMode, thunkApi) => { (starIconDisplayMode: IconDisplayMode, thunkApi) => {
@@ -77,6 +85,16 @@ export const changeMobileFooter = createAppAsyncThunk("settings/mobileFooter", (
if (!settings) return if (!settings) return
client.user.saveSettings({ ...settings, mobileFooter }) client.user.saveSettings({ ...settings, mobileFooter })
}) })
export const changeUnreadCountTitle = createAppAsyncThunk("settings/unreadCountTitle", (unreadCountTitle: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, unreadCountTitle })
})
export const changeUnreadCountFavicon = createAppAsyncThunk("settings/unreadCountFavicon", (unreadCountFavicon: boolean, thunkApi) => {
const { settings } = thunkApi.getState().user
if (!settings) return
client.user.saveSettings({ ...settings, unreadCountFavicon })
})
export const changeSharingSetting = createAppAsyncThunk( export const changeSharingSetting = createAppAsyncThunk(
"settings/sharingSetting", "settings/sharingSetting",
( (

View File

@@ -1,3 +1,5 @@
import type { MessageDescriptor } from "@lingui/core"
import { useLingui } from "@lingui/react"
import { ActionIcon, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core" import { ActionIcon, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core"
import type { ActionIconVariant } from "@mantine/core/lib/components/ActionIcon/ActionIcon" import type { ActionIconVariant } from "@mantine/core/lib/components/ActionIcon/ActionIcon"
import { Constants } from "app/constants" import { Constants } from "app/constants"
@@ -7,7 +9,7 @@ import { type MouseEventHandler, type ReactNode, forwardRef } from "react"
interface ActionButtonProps { interface ActionButtonProps {
className?: string className?: string
icon?: ReactNode icon?: ReactNode
label: ReactNode label?: string | MessageDescriptor
onClick?: MouseEventHandler onClick?: MouseEventHandler
variant?: ActionIconVariant & ButtonVariant variant?: ActionIconVariant & ButtonVariant
hideLabelOnDesktop?: boolean hideLabelOnDesktop?: boolean
@@ -20,17 +22,35 @@ interface ActionButtonProps {
export const ActionButton = forwardRef<HTMLButtonElement, ActionButtonProps>((props: ActionButtonProps, ref) => { export const ActionButton = forwardRef<HTMLButtonElement, ActionButtonProps>((props: ActionButtonProps, ref) => {
const { mobile } = useActionButton() const { mobile } = useActionButton()
const theme = useMantineTheme() const theme = useMantineTheme()
const { _ } = useLingui()
const label = typeof props.label === "string" ? props.label : props.label && _(props.label)
const variant = props.variant ?? "subtle" const variant = props.variant ?? "subtle"
const iconOnly = (mobile && !props.showLabelOnMobile) || (!mobile && props.hideLabelOnDesktop) const iconOnly = (mobile && !props.showLabelOnMobile) || (!mobile && props.hideLabelOnDesktop)
return iconOnly ? ( return iconOnly ? (
<Tooltip label={props.label} openDelay={Constants.tooltip.delay}> <Tooltip label={label} openDelay={Constants.tooltip.delay}>
<ActionIcon ref={ref} color={theme.primaryColor} variant={variant} className={props.className} onClick={props.onClick}> <ActionIcon
ref={ref}
color={theme.primaryColor}
variant={variant}
className={props.className}
onClick={props.onClick}
aria-label={label}
>
{props.icon} {props.icon}
</ActionIcon> </ActionIcon>
</Tooltip> </Tooltip>
) : ( ) : (
<Button ref={ref} variant={variant} size="xs" className={props.className} leftSection={props.icon} onClick={props.onClick}> <Button
{props.label} ref={ref}
variant={variant}
size="xs"
className={props.className}
leftSection={props.icon}
onClick={props.onClick}
aria-label={label}
>
{label}
</Button> </Button>
) )
}) })

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Alert as MantineAlert } from "@mantine/core" import { Box, Alert as MantineAlert } from "@mantine/core"
import { Fragment } from "react" import { Fragment } from "react"
import { TbAlertCircle, TbAlertTriangle, TbCircleCheck } from "react-icons/tb" import { TbAlertCircle, TbAlertTriangle, TbCircleCheck } from "react-icons/tb"

View File

@@ -1,9 +1,9 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Dialog, Text } from "@mantine/core" import { Box, Dialog, Text } from "@mantine/core"
import { useAppSelector } from "app/store" import { useAppDispatch, useAppSelector } from "app/store"
import { setAnnouncementHash } from "app/user/slice"
import { Content } from "components/content/Content" import { Content } from "components/content/Content"
import { useAsync } from "react-async-hook" import { useAsync } from "react-async-hook"
import useLocalStorage from "use-local-storage"
const sha256Hex = async (input: string | undefined) => { const sha256Hex = async (input: string | undefined) => {
const data = new TextEncoder().encode(input) const data = new TextEncoder().encode(input)
@@ -15,10 +15,11 @@ const sha256Hex = async (input: string | undefined) => {
export function AnnouncementDialog() { export function AnnouncementDialog() {
const announcement = useAppSelector(state => state.server.serverInfos?.announcement) const announcement = useAppSelector(state => state.server.serverInfos?.announcement)
const announcementHash = useAsync(sha256Hex, [announcement]).result const announcementHash = useAsync(sha256Hex, [announcement]).result
const [localStorageHash, setLocalStorageHash] = useLocalStorage("announcement-hash", "no-hash") const existingAnnouncementHash = useAppSelector(state => state.user.localSettings.announcementHash)
const dispatch = useAppDispatch()
const opened = !!announcementHash && announcementHash !== localStorageHash const opened = !!announcementHash && announcementHash !== existingAnnouncementHash
const onClosed = () => setLocalStorageHash(announcementHash) const onClosed = () => announcementHash && dispatch(setAnnouncementHash(announcementHash))
if (!announcement) return null if (!announcement) return null
return ( return (

View File

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

View File

@@ -1,15 +1,4 @@
import { Helmet } from "react-helmet"
export const DisablePullToRefresh = () => { export const DisablePullToRefresh = () => {
return ( import("./DisablePullToRefresh.css")
<Helmet> return <></>
<style type="text/css">
{`
html, body {
overscroll-behavior: none;
}
`}
</style>
</Helmet>
)
} }

View File

@@ -9,6 +9,7 @@ interface ImageWithPlaceholderWhileLoadingProps {
title?: string title?: string
width?: number width?: number
height?: number | "auto" height?: number | "auto"
style?: React.CSSProperties
placeholderWidth?: number placeholderWidth?: number
placeholderHeight?: number placeholderHeight?: number
placeholderBackgroundColor?: string placeholderBackgroundColor?: string
@@ -42,6 +43,7 @@ export function ImageWithPlaceholderWhileLoading({
src, src,
title, title,
width, width,
style,
}: ImageWithPlaceholderWhileLoadingProps) { }: ImageWithPlaceholderWhileLoadingProps) {
const { classes } = useStyles({ const { classes } = useStyles({
placeholderWidth, placeholderWidth,
@@ -68,7 +70,11 @@ export function ImageWithPlaceholderWhileLoading({
width={width} width={width}
height={height} height={height}
onLoad={() => setLoading(false)} onLoad={() => setLoading(false)}
style={{ display: loading ? "none" : "block" }} style={{
...style,
display: loading ? "none" : (style?.display ?? "initial"),
height: style?.width ? "auto" : style?.height,
}}
/> />
</> </>
) )

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Kbd, Stack, Table } from "@mantine/core" import { Anchor, Box, Kbd, Stack, Table } from "@mantine/core"
import { useOs } from "@mantine/hooks" import { useOs } from "@mantine/hooks"
import { Constants } from "app/constants" import { Constants } from "app/constants"
@@ -150,9 +150,7 @@ export function KeyboardShortcutsHelp() {
<Trans>Navigate to a subscription by entering its name</Trans> <Trans>Navigate to a subscription by entering its name</Trans>
</Table.Td> </Table.Td>
<Table.Td> <Table.Td>
<Kbd> <Kbd>{isMacOS ? <Trans>Cmd</Trans> : <Trans>Ctrl</Trans>}</Kbd>
<Trans>{isMacOS ? "Cmd" : "Ctrl"}</Trans>
</Kbd>
<span> + </span> <span> + </span>
<Kbd>K</Kbd> <Kbd>K</Kbd>
<span>, </span> <span>, </span>

View File

@@ -1,15 +1,11 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Tooltip } from "@mantine/core" import { Tooltip } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import dayjs from "dayjs" import dayjs from "dayjs"
import { useEffect, useState } from "react" import { useNow } from "hooks/useNow"
export function RelativeDate(props: { date: Date | number | undefined }) { export function RelativeDate(props: { date: Date | number | undefined }) {
const [now, setNow] = useState(new Date()) const now = useNow(60 * 1000)
useEffect(() => {
const interval = setInterval(() => setNow(new Date()), 60 * 1000)
return () => clearInterval(interval)
}, [])
if (!props.date) return <Trans>N/A</Trans> if (!props.date) return <Trans>N/A</Trans>
const date = dayjs(props.date) const date = dayjs(props.date)

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Button, Checkbox, Group, PasswordInput, Stack, TextInput } from "@mantine/core" import { Box, Button, Checkbox, Group, PasswordInput, Stack, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"

View File

@@ -1,11 +1,24 @@
import { TypographyStylesProvider } from "@mantine/core" import { TypographyStylesProvider } from "@mantine/core"
import type { ReactNode } from "react" import type { ReactNode } from "react"
import { tss } from "tss"
/** /**
* This component is used to provide basic styles to html typography elements. * This component is used to provide basic styles to html typography elements.
* *
* see https://mantine.dev/core/typography-styles-provider/ * see https://mantine.dev/core/typography-styles-provider/
*/ */
const useStyles = tss.create(() => ({
// override mantine default typography styles
content: {
paddingLeft: 0,
"& img": {
marginBottom: 0,
},
},
}))
export const BasicHtmlStyles = (props: { children: ReactNode }) => { export const BasicHtmlStyles = (props: { children: ReactNode }) => {
return <TypographyStylesProvider pl={0}>{props.children}</TypographyStylesProvider> const { classes } = useStyles()
return <TypographyStylesProvider className={classes.content}>{props.children}</TypographyStylesProvider>
} }

View File

@@ -6,6 +6,7 @@ import { BasicHtmlStyles } from "components/content/BasicHtmlStyles"
import escapeStringRegexp from "escape-string-regexp" import escapeStringRegexp from "escape-string-regexp"
import { type ChildrenNode, Interweave, type MatchResponse, Matcher, type Node, type TransformCallback } from "interweave" import { type ChildrenNode, Interweave, type MatchResponse, Matcher, type Node, type TransformCallback } from "interweave"
import React from "react" import React from "react"
import styleToObject from "style-to-object"
import { tss } from "tss" import { tss } from "tss"
export interface ContentProps { export interface ContentProps {
@@ -42,6 +43,7 @@ const transform: TransformCallback = node => {
const nodeHeight = node.getAttribute("height") const nodeHeight = node.getAttribute("height")
const width = nodeWidth ? Number.parseInt(nodeWidth, 10) : undefined const width = nodeWidth ? Number.parseInt(nodeWidth, 10) : undefined
const height = nodeHeight ? Number.parseInt(nodeHeight, 10) : undefined const height = nodeHeight ? Number.parseInt(nodeHeight, 10) : undefined
const style = styleToObject(node.getAttribute("style") ?? "") ?? undefined
const placeholderSize = calculatePlaceholderSize({ const placeholderSize = calculatePlaceholderSize({
width, width,
height, height,
@@ -55,6 +57,7 @@ const transform: TransformCallback = node => {
title={title} title={title}
width={width} width={width}
height="auto" height="auto"
style={style}
placeholderWidth={placeholderSize.width} placeholderWidth={placeholderSize.width}
placeholderHeight={placeholderSize.height} placeholderHeight={placeholderSize.height}
/> />

View File

@@ -19,7 +19,7 @@ export function Enclosure(props: {
)} )}
{hasAudio && ( {hasAudio && (
// biome-ignore lint/a11y/useMediaCaption: we don't have any captions for audio // biome-ignore lint/a11y/useMediaCaption: we don't have any captions for audio
<audio controls> <audio controls style={{ width: "100%" }}>
<source src={props.enclosureUrl} type={props.enclosureType} /> <source src={props.enclosureUrl} type={props.enclosureType} />
</audio> </audio>
)} )}

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box } from "@mantine/core" import { Box } from "@mantine/core"
import { openModal } from "@mantine/modals" import { openModal } from "@mantine/modals"
import { Constants } from "app/constants" import { Constants } from "app/constants"
@@ -20,7 +20,6 @@ import { KeyboardShortcutsHelp } from "components/KeyboardShortcutsHelp"
import { Loader } from "components/Loader" import { Loader } from "components/Loader"
import { useBrowserExtension } from "hooks/useBrowserExtension" import { useBrowserExtension } from "hooks/useBrowserExtension"
import { useMousetrap } from "hooks/useMousetrap" import { useMousetrap } from "hooks/useMousetrap"
import { useViewMode } from "hooks/useViewMode"
import { useEffect } from "react" import { useEffect } from "react"
import { useContextMenu } from "react-contexify" import { useContextMenu } from "react-contexify"
import InfiniteScroll from "react-infinite-scroller" import InfiniteScroll from "react-infinite-scroller"
@@ -38,7 +37,7 @@ export function FeedEntries() {
const scrollingToEntry = useAppSelector(state => state.entries.scrollingToEntry) const scrollingToEntry = useAppSelector(state => state.entries.scrollingToEntry)
const sidebarVisible = useAppSelector(state => state.tree.sidebarVisible) const sidebarVisible = useAppSelector(state => state.tree.sidebarVisible)
const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu) const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu)
const { viewMode } = useViewMode() const viewMode = useAppSelector(state => state.user.localSettings.viewMode)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { openLinkInBackgroundTab } = useBrowserExtension() const { openLinkInBackgroundTab } = useBrowserExtension()
@@ -305,11 +304,12 @@ export function FeedEntries() {
loader={<Box key={0}>{loading && <Loader />}</Box>} loader={<Box key={0}>{loading && <Loader />}</Box>}
> >
{entries.map(entry => ( {entries.map(entry => (
<div <article
key={entry.id} key={entry.id}
ref={el => { ref={el => {
if (el) el.id = Constants.dom.entryId(entry) if (el) el.id = Constants.dom.entryId(entry)
}} }}
data-id={entry.id}
> >
<FeedEntry <FeedEntry
entry={entry} entry={entry}
@@ -322,7 +322,7 @@ export function FeedEntries() {
onBodyClick={() => bodyClicked(entry)} onBodyClick={() => bodyClicked(entry)}
onSwipedLeft={async () => await swipedLeft(entry)} onSwipedLeft={async () => await swipedLeft(entry)}
/> />
</div> </article>
))} ))}
</InfiniteScroll> </InfiniteScroll>
) )

View File

@@ -5,7 +5,6 @@ import type { Entry, ViewMode } from "app/types"
import { FeedEntryCompactHeader } from "components/content/header/FeedEntryCompactHeader" import { FeedEntryCompactHeader } from "components/content/header/FeedEntryCompactHeader"
import { FeedEntryHeader } from "components/content/header/FeedEntryHeader" import { FeedEntryHeader } from "components/content/header/FeedEntryHeader"
import { useMobile } from "hooks/useMobile" import { useMobile } from "hooks/useMobile"
import { useViewMode } from "hooks/useViewMode"
import type React from "react" import type React from "react"
import { useSwipeable } from "react-swipeable" import { useSwipeable } from "react-swipeable"
import { tss } from "tss" import { tss } from "tss"
@@ -95,7 +94,7 @@ const useStyles = tss
}) })
export function FeedEntry(props: FeedEntryProps) { export function FeedEntry(props: FeedEntryProps) {
const { viewMode } = useViewMode() const viewMode = useAppSelector(state => state.user.localSettings.viewMode)
const { classes, cx } = useStyles({ const { classes, cx } = useStyles({
read: props.entry.read, read: props.entry.read,
expanded: props.expanded, expanded: props.expanded,

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Group } from "@mantine/core" import { Group } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { markEntriesUpToEntry, markEntry, starEntry } from "app/entries/thunks" import { markEntriesUpToEntry, markEntry, starEntry } from "app/entries/thunks"
@@ -9,7 +9,7 @@ import { truncate } from "app/utils"
import { useBrowserExtension } from "hooks/useBrowserExtension" import { useBrowserExtension } from "hooks/useBrowserExtension"
import { useColorScheme } from "hooks/useColorScheme" import { useColorScheme } from "hooks/useColorScheme"
import { Item, Menu, Separator } from "react-contexify" import { Item, Menu, Separator } from "react-contexify"
import { TbArrowBarToDown, TbExternalLink, TbEyeCheck, TbEyeOff, TbRss, TbStar, TbStarOff } from "react-icons/tb" import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbRss, TbStar, TbStarOff } from "react-icons/tb"
import { tss } from "tss" import { tss } from "tss"
interface FeedEntryContextMenuProps { interface FeedEntryContextMenuProps {
@@ -70,7 +70,7 @@ export function FeedEntryContextMenu(props: FeedEntryContextMenuProps) {
{props.entry.markable && ( {props.entry.markable && (
<Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}> <Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}>
<Group> <Group>
{props.entry.read ? <TbEyeOff size={iconSize} /> : <TbEyeCheck size={iconSize} />} {props.entry.read ? <TbMail size={iconSize} /> : <TbMailOpened size={iconSize} />}
{props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>} {props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>}
</Group> </Group>
</Item> </Item>

View File

@@ -1,4 +1,5 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Group, Indicator, Popover, TagsInput } from "@mantine/core" import { Group, Indicator, Popover, TagsInput } from "@mantine/core"
import { markEntriesUpToEntry, markEntry, starEntry, tagEntry } from "app/entries/thunks" import { markEntriesUpToEntry, markEntry, starEntry, tagEntry } from "app/entries/thunks"
import { useAppDispatch, useAppSelector } from "app/store" import { useAppDispatch, useAppSelector } from "app/store"
@@ -6,7 +7,7 @@ import type { Entry } from "app/types"
import { ActionButton } from "components/ActionButton" import { ActionButton } from "components/ActionButton"
import { useActionButton } from "hooks/useActionButton" import { useActionButton } from "hooks/useActionButton"
import { useMobile } from "hooks/useMobile" import { useMobile } from "hooks/useMobile"
import { TbArrowBarToDown, TbExternalLink, TbEyeCheck, TbEyeOff, TbShare, TbStar, TbStarOff, TbTag } from "react-icons/tb" import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbShare, TbStar, TbStarOff, TbTag } from "react-icons/tb"
import { ShareButtons } from "./ShareButtons" import { ShareButtons } from "./ShareButtons"
interface FeedEntryFooterProps { interface FeedEntryFooterProps {
@@ -18,6 +19,7 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
const mobile = useMobile() const mobile = useMobile()
const { spacing } = useActionButton() const { spacing } = useActionButton()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const readStatusButtonClicked = async () => const readStatusButtonClicked = async () =>
await dispatch( await dispatch(
@@ -39,14 +41,14 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
<Group gap={spacing}> <Group gap={spacing}>
{props.entry.markable && ( {props.entry.markable && (
<ActionButton <ActionButton
icon={props.entry.read ? <TbEyeOff size={18} /> : <TbEyeCheck size={18} />} icon={props.entry.read ? <TbMail size={18} /> : <TbMailOpened size={18} />}
label={props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>} label={props.entry.read ? msg`Keep unread` : msg`Mark as read`}
onClick={readStatusButtonClicked} onClick={readStatusButtonClicked}
/> />
)} )}
<ActionButton <ActionButton
icon={props.entry.starred ? <TbStarOff size={18} /> : <TbStar size={18} />} icon={props.entry.starred ? <TbStarOff size={18} /> : <TbStar size={18} />}
label={props.entry.starred ? <Trans>Unstar</Trans> : <Trans>Star</Trans>} label={props.entry.starred ? msg`Unstar` : msg`Star`}
onClick={async () => onClick={async () =>
await dispatch( await dispatch(
starEntry({ starEntry({
@@ -59,7 +61,7 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
<Popover withArrow withinPortal shadow="md" closeOnClickOutside={!mobile}> <Popover withArrow withinPortal shadow="md" closeOnClickOutside={!mobile}>
<Popover.Target> <Popover.Target>
<ActionButton icon={<TbShare size={18} />} label={<Trans>Share</Trans>} /> <ActionButton icon={<TbShare size={18} />} label={msg`Share`} />
</Popover.Target> </Popover.Target>
<Popover.Dropdown> <Popover.Dropdown>
<ShareButtons url={props.entry.url} description={props.entry.title} /> <ShareButtons url={props.entry.url} description={props.entry.title} />
@@ -70,12 +72,12 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
<Popover withArrow shadow="md" closeOnClickOutside={!mobile}> <Popover withArrow shadow="md" closeOnClickOutside={!mobile}>
<Popover.Target> <Popover.Target>
<Indicator label={props.entry.tags.length} disabled={props.entry.tags.length === 0} inline size={16}> <Indicator label={props.entry.tags.length} disabled={props.entry.tags.length === 0} inline size={16}>
<ActionButton icon={<TbTag size={18} />} label={<Trans>Tags</Trans>} /> <ActionButton icon={<TbTag size={18} />} label={msg`Tags`} />
</Indicator> </Indicator>
</Popover.Target> </Popover.Target>
<Popover.Dropdown> <Popover.Dropdown>
<TagsInput <TagsInput
placeholder={t`Tags`} placeholder={_(msg`Tags`)}
data={tags} data={tags}
value={props.entry.tags} value={props.entry.tags}
onChange={onTagsChange} onChange={onTagsChange}
@@ -88,13 +90,13 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
)} )}
<a href={props.entry.url} target="_blank" rel="noreferrer"> <a href={props.entry.url} target="_blank" rel="noreferrer">
<ActionButton icon={<TbExternalLink size={18} />} label={<Trans>Open link</Trans>} /> <ActionButton icon={<TbExternalLink size={18} />} label={msg`Open link`} />
</a> </a>
</Group> </Group>
<ActionButton <ActionButton
icon={<TbArrowBarToDown size={18} />} icon={<TbArrowBarToDown size={18} />}
label={<Trans>Mark as read up to here</Trans>} label={msg`Mark as read up to here`}
onClick={async () => await dispatch(markEntriesUpToEntry(props.entry))} onClick={async () => await dispatch(markEntriesUpToEntry(props.entry))}
/> />
</Group> </Group>

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { ActionIcon, Box, CopyButton, Divider, SimpleGrid } from "@mantine/core" import { ActionIcon, Box, CopyButton, Divider, SimpleGrid } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { useAppSelector } from "app/store" import { useAppSelector } from "app/store"

View File

@@ -1,4 +1,6 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Box, Button, Group, Stack, TextInput } from "@mantine/core" import { Box, Button, Group, Stack, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"
@@ -13,6 +15,7 @@ import { CategorySelect } from "./CategorySelect"
export function AddCategory() { export function AddCategory() {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const form = useForm<AddCategoryRequest>() const form = useForm<AddCategoryRequest>()
@@ -33,7 +36,7 @@ export function AddCategory() {
<form onSubmit={form.onSubmit(addCategory.execute)}> <form onSubmit={form.onSubmit(addCategory.execute)}>
<Stack> <Stack>
<TextInput label={<Trans>Category</Trans>} placeholder={t`Category`} {...form.getInputProps("name")} required /> <TextInput label={<Trans>Category</Trans>} placeholder={_(msg`Category`)} {...form.getInputProps("name")} required />
<CategorySelect label={<Trans>Parent</Trans>} {...form.getInputProps("parentId")} clearable /> <CategorySelect label={<Trans>Parent</Trans>} {...form.getInputProps("parentId")} clearable />
<Group justify="center"> <Group justify="center">
<Button variant="default" onClick={async () => await dispatch(redirectToSelectedSource())}> <Button variant="default" onClick={async () => await dispatch(redirectToSelectedSource())}>

View File

@@ -1,4 +1,5 @@
import { t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Select, type SelectProps } from "@mantine/core" import { Select, type SelectProps } from "@mantine/core"
import type { ComboboxItem } from "@mantine/core/lib/components/Combobox/Combobox.types" import type { ComboboxItem } from "@mantine/core/lib/components/Combobox/Combobox.types"
import { Constants } from "app/constants" import { Constants } from "app/constants"
@@ -13,6 +14,8 @@ type CategorySelectProps = Partial<SelectProps> & {
export function CategorySelect(props: CategorySelectProps) { export function CategorySelect(props: CategorySelectProps) {
const rootCategory = useAppSelector(state => state.tree.rootCategory) const rootCategory = useAppSelector(state => state.tree.rootCategory)
const { _ } = useLingui()
const categories = rootCategory && flattenCategoryTree(rootCategory) const categories = rootCategory && flattenCategoryTree(rootCategory)
const categoriesById = categories?.reduce((map, c) => { const categoriesById = categories?.reduce((map, c) => {
map.set(c.id, c) map.set(c.id, c)
@@ -43,7 +46,7 @@ export function CategorySelect(props: CategorySelectProps) {
.sort((c1, c2) => c1.label.localeCompare(c2.label)) .sort((c1, c2) => c1.label.localeCompare(c2.label))
if (props.withAll) { if (props.withAll) {
selectData?.unshift({ selectData?.unshift({
label: t`All`, label: _(msg`All`),
value: Constants.categories.all.id, value: Constants.categories.all.id,
}) })
} }

View File

@@ -1,4 +1,6 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Box, Button, FileInput, Group, Stack } from "@mantine/core" import { Box, Button, FileInput, Group, Stack } from "@mantine/core"
import { isNotEmpty, useForm } from "@mantine/form" import { isNotEmpty, useForm } from "@mantine/form"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"
@@ -11,10 +13,11 @@ import { TbFileImport } from "react-icons/tb"
export function ImportOpml() { export function ImportOpml() {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const form = useForm<{ file: File }>({ const form = useForm<{ file: File }>({
validate: { validate: {
file: isNotEmpty(t`OPML file is required`), file: isNotEmpty(_(msg`OPML file is required`)),
}, },
}) })
@@ -38,7 +41,7 @@ export function ImportOpml() {
<FileInput <FileInput
label={<Trans>OPML file</Trans>} label={<Trans>OPML file</Trans>}
leftSection={<TbFileImport />} leftSection={<TbFileImport />}
placeholder={t`OPML file`} placeholder={_(msg`OPML file`)}
description={ description={
<Trans> <Trans>
An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Button, Group, Stack, Stepper, TextInput } from "@mantine/core" import { Box, Button, Group, Stack, Stepper, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { ActionIcon, Anchor, Tooltip } from "@mantine/core" import { ActionIcon, Anchor, Tooltip } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { markEntry } from "app/entries/thunks" import { markEntry } from "app/entries/thunks"

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { ActionIcon, Tooltip } from "@mantine/core" import { ActionIcon, Tooltip } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { starEntry } from "app/entries/thunks" import { starEntry } from "app/entries/thunks"

View File

@@ -1,4 +1,5 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Box, Center, CloseButton, Divider, Group, Indicator, Popover, TextInput } from "@mantine/core" import { Box, Center, CloseButton, Divider, Group, Indicator, Popover, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { reloadEntries, search, selectNextEntry, selectPreviousEntry } from "app/entries/thunks" import { reloadEntries, search, selectNextEntry, selectPreviousEntry } from "app/entries/thunks"
@@ -57,10 +58,11 @@ export function Header() {
const searchFromStore = useAppSelector(state => state.entries.search) const searchFromStore = useAppSelector(state => state.entries.search)
const { isBrowserExtensionPopup, openSettingsPage, openAppInNewTab } = useBrowserExtension() const { isBrowserExtensionPopup, openSettingsPage, openAppInNewTab } = useBrowserExtension()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const searchForm = useForm<{ search: string }>({ const searchForm = useForm<{ search: string }>({
validate: { validate: {
search: value => (value.length > 0 && value.length < 3 ? t`Search requires at least 3 characters` : null), search: value => (value.length > 0 && value.length < 3 ? _(msg`Search requires at least 3 characters`) : null),
}, },
}) })
const { setValues } = searchForm const { setValues } = searchForm
@@ -77,7 +79,7 @@ export function Header() {
<HeaderToolbar> <HeaderToolbar>
<ActionButton <ActionButton
icon={<TbArrowUp size={iconSize} />} icon={<TbArrowUp size={iconSize} />}
label={<Trans>Previous</Trans>} label={msg`Previous`}
onClick={async () => onClick={async () =>
await dispatch( await dispatch(
selectPreviousEntry({ selectPreviousEntry({
@@ -90,7 +92,7 @@ export function Header() {
/> />
<ActionButton <ActionButton
icon={<TbArrowDown size={iconSize} />} icon={<TbArrowDown size={iconSize} />}
label={<Trans>Next</Trans>} label={msg`Next`}
onClick={async () => onClick={async () =>
await dispatch( await dispatch(
selectNextEntry({ selectNextEntry({
@@ -106,7 +108,7 @@ export function Header() {
<ActionButton <ActionButton
icon={<TbRefresh size={iconSize} />} icon={<TbRefresh size={iconSize} />}
label={<Trans>Refresh</Trans>} label={msg`Refresh`}
onClick={async () => await dispatch(reloadEntries())} onClick={async () => await dispatch(reloadEntries())}
/> />
<MarkAllAsReadButton iconSize={iconSize} /> <MarkAllAsReadButton iconSize={iconSize} />
@@ -115,25 +117,25 @@ export function Header() {
<ActionButton <ActionButton
icon={settings.readingMode === "all" ? <TbEye size={iconSize} /> : <TbEyeOff size={iconSize} />} icon={settings.readingMode === "all" ? <TbEye size={iconSize} /> : <TbEyeOff size={iconSize} />}
label={settings.readingMode === "all" ? <Trans>All</Trans> : <Trans>Unread</Trans>} label={settings.readingMode === "all" ? msg`All` : msg`Unread`}
onClick={async () => await dispatch(changeReadingMode(settings.readingMode === "all" ? "unread" : "all"))} onClick={async () => await dispatch(changeReadingMode(settings.readingMode === "all" ? "unread" : "all"))}
/> />
<ActionButton <ActionButton
icon={settings.readingOrder === "asc" ? <TbSortAscending size={iconSize} /> : <TbSortDescending size={iconSize} />} icon={settings.readingOrder === "asc" ? <TbSortAscending size={iconSize} /> : <TbSortDescending size={iconSize} />}
label={settings.readingOrder === "asc" ? <Trans>Asc</Trans> : <Trans>Desc</Trans>} label={settings.readingOrder === "asc" ? msg`Asc` : msg`Desc`}
onClick={async () => await dispatch(changeReadingOrder(settings.readingOrder === "asc" ? "desc" : "asc"))} onClick={async () => await dispatch(changeReadingOrder(settings.readingOrder === "asc" ? "desc" : "asc"))}
/> />
<Popover> <Popover>
<Popover.Target> <Popover.Target>
<Indicator disabled={!searchFromStore}> <Indicator disabled={!searchFromStore}>
<ActionButton icon={<TbSearch size={iconSize} />} label={<Trans>Search</Trans>} /> <ActionButton icon={<TbSearch size={iconSize} />} label={msg`Search`} />
</Indicator> </Indicator>
</Popover.Target> </Popover.Target>
<Popover.Dropdown> <Popover.Dropdown>
<form onSubmit={searchForm.onSubmit(async values => await dispatch(search(values.search)))}> <form onSubmit={searchForm.onSubmit(async values => await dispatch(search(values.search)))}>
<TextInput <TextInput
placeholder={t`Search`} placeholder={_(msg`Search`)}
{...searchForm.getInputProps("search")} {...searchForm.getInputProps("search")}
leftSection={<TbSearch size={iconSize} />} leftSection={<TbSearch size={iconSize} />}
rightSection={<CloseButton onClick={async () => await (searchFromStore && dispatch(search("")))} />} rightSection={<CloseButton onClick={async () => await (searchFromStore && dispatch(search("")))} />}
@@ -153,12 +155,12 @@ export function Header() {
<ActionButton <ActionButton
icon={<TbSettings size={iconSize} />} icon={<TbSettings size={iconSize} />}
label={<Trans>Extension options</Trans>} label={msg`Extension options`}
onClick={() => openSettingsPage()} onClick={() => openSettingsPage()}
/> />
<ActionButton <ActionButton
icon={<TbExternalLink size={iconSize} />} icon={<TbExternalLink size={iconSize} />}
label={<Trans>Open CommaFeed</Trans>} label={msg`Open CommaFeed`}
onClick={() => openAppInNewTab()} onClick={() => openAppInNewTab()}
/> />
</> </>

View File

@@ -1,4 +1,5 @@
import { Trans } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { Trans } from "@lingui/react/macro"
import { Button, Code, Group, Modal, Slider, Stack, Text } from "@mantine/core" import { Button, Code, Group, Modal, Slider, Stack, Text } from "@mantine/core"
import { markAllEntries } from "app/entries/thunks" import { markAllEntries } from "app/entries/thunks"
@@ -91,7 +92,7 @@ export function MarkAllAsReadButton(props: { iconSize: number }) {
</Group> </Group>
</Stack> </Stack>
</Modal> </Modal>
<ActionButton icon={<TbChecks size={props.iconSize} />} label={<Trans>Mark all as read</Trans>} onClick={buttonClicked} /> <ActionButton icon={<TbChecks size={props.iconSize} />} label={msg`Mark all as read`} onClick={buttonClicked} />
</> </>
) )
} }

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { import {
Box, Box,
Divider, Divider,
@@ -14,7 +14,10 @@ import { client } from "app/client"
import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "app/redirect/thunks" import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "app/store" import { useAppDispatch, useAppSelector } from "app/store"
import type { ViewMode } from "app/types" import type { ViewMode } from "app/types"
import { useViewMode } from "hooks/useViewMode" import { setViewMode } from "app/user/slice"
import { reloadProfile } from "app/user/thunks"
import dayjs from "dayjs"
import { useNow } from "hooks/useNow"
import { type ReactNode, useState } from "react" import { type ReactNode, useState } from "react"
import { import {
TbChartLine, TbChartLine,
@@ -92,12 +95,19 @@ const viewModeData: ViewModeControlItem[] = [
export function ProfileMenu(props: ProfileMenuProps) { export function ProfileMenu(props: ProfileMenuProps) {
const [opened, setOpened] = useState(false) const [opened, setOpened] = useState(false)
const { viewMode, setViewMode } = useViewMode() const now = useNow()
const profile = useAppSelector(state => state.user.profile) const profile = useAppSelector(state => state.user.profile)
const admin = useAppSelector(state => state.user.profile?.admin) const admin = useAppSelector(state => state.user.profile?.admin)
const viewMode = useAppSelector(state => state.user.localSettings.viewMode)
const forceRefreshCooldownDuration = useAppSelector(state => state.server.serverInfos?.forceRefreshCooldownDuration)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { colorScheme, setColorScheme } = useMantineColorScheme() const { colorScheme, setColorScheme } = useMantineColorScheme()
const nextAvailableForceRefresh = profile?.lastForceRefresh
? profile.lastForceRefresh + (forceRefreshCooldownDuration ?? 0)
: now.getTime()
const forceRefreshEnabled = nextAvailableForceRefresh <= now.getTime()
const logout = () => { const logout = () => {
window.location.href = "logout" window.location.href = "logout"
} }
@@ -118,18 +128,32 @@ export function ProfileMenu(props: ProfileMenuProps) {
</Menu.Item> </Menu.Item>
<Menu.Item <Menu.Item
leftSection={<TbWorldDownload size={iconSize} />} leftSection={<TbWorldDownload size={iconSize} />}
onClick={async () => disabled={!forceRefreshEnabled}
await client.feed.refreshAll().then(() => { onClick={async () => {
setOpened(false)
try {
await client.feed.refreshAll()
// reload profile to update last force refresh timestamp
await dispatch(reloadProfile())
showNotification({ showNotification({
message: <Trans>Your feeds have been queued for refresh.</Trans>, message: <Trans>Your feeds have been queued for refresh.</Trans>,
color: "green", color: "green",
autoClose: 1000, autoClose: 1000,
}) })
setOpened(false) } catch (error) {
}) showNotification({
} message: <Trans>Force fetching feeds is not yet available.</Trans>,
color: "red",
autoClose: 2000,
})
}
}}
> >
<Trans>Fetch all my feeds now</Trans> <Trans>Fetch all my feeds now</Trans>
{!forceRefreshEnabled && <span> ({dayjs.duration(nextAvailableForceRefresh - now.getTime()).format("HH:mm:ss")})</span>}
</Menu.Item> </Menu.Item>
<Divider /> <Divider />
@@ -156,7 +180,7 @@ export function ProfileMenu(props: ProfileMenuProps) {
orientation="vertical" orientation="vertical"
data={viewModeData} data={viewModeData}
value={viewMode} value={viewMode}
onChange={e => setViewMode(e as ViewMode)} onChange={e => dispatch(setViewMode(e as ViewMode))}
mb="xs" mb="xs"
/> />

View File

@@ -1,3 +1,4 @@
import { NumberFormatter } from "@mantine/core"
import type { MetricGauge } from "app/types" import type { MetricGauge } from "app/types"
interface MeterProps { interface MeterProps {
@@ -5,5 +6,5 @@ interface MeterProps {
} }
export function Gauge(props: MeterProps) { export function Gauge(props: MeterProps) {
return <span>{props.gauge.value}</span> return <NumberFormatter value={props.gauge.value} thousandSeparator />
} }

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Button, Group, Stack } from "@mantine/core" import { Box, Button, Group, Stack } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"

View File

@@ -1,11 +1,14 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { Divider, Group, Radio, Select, SimpleGrid, Stack, Switch } from "@mantine/core" import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Divider, Group, NumberInput, Radio, Select, SimpleGrid, Stack, Switch } from "@mantine/core"
import type { ComboboxData } from "@mantine/core/lib/components/Combobox/Combobox.types" import type { ComboboxData } from "@mantine/core/lib/components/Combobox/Combobox.types"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { useAppDispatch, useAppSelector } from "app/store" import { useAppDispatch, useAppSelector } from "app/store"
import type { IconDisplayMode, ScrollMode, SharingSettings } from "app/types" import type { IconDisplayMode, ScrollMode, SharingSettings } from "app/types"
import { import {
changeCustomContextMenu, changeCustomContextMenu,
changeEntriesToKeepOnTopWhenScrolling,
changeExternalLinkIconDisplayMode, changeExternalLinkIconDisplayMode,
changeLanguage, changeLanguage,
changeMarkAllAsReadConfirmation, changeMarkAllAsReadConfirmation,
@@ -16,6 +19,8 @@ import {
changeSharingSetting, changeSharingSetting,
changeShowRead, changeShowRead,
changeStarIconDisplayMode, changeStarIconDisplayMode,
changeUnreadCountFavicon,
changeUnreadCountTitle,
} from "app/user/thunks" } from "app/user/thunks"
import { locales } from "i18n" import { locales } from "i18n"
import type { ReactNode } from "react" import type { ReactNode } from "react"
@@ -26,13 +31,17 @@ export function DisplaySettings() {
const showRead = useAppSelector(state => state.user.settings?.showRead) const showRead = useAppSelector(state => state.user.settings?.showRead)
const scrollMarks = useAppSelector(state => state.user.settings?.scrollMarks) const scrollMarks = useAppSelector(state => state.user.settings?.scrollMarks)
const scrollMode = useAppSelector(state => state.user.settings?.scrollMode) const scrollMode = useAppSelector(state => state.user.settings?.scrollMode)
const entriesToKeepOnTop = useAppSelector(state => state.user.settings?.entriesToKeepOnTopWhenScrolling)
const starIconDisplayMode = useAppSelector(state => state.user.settings?.starIconDisplayMode) const starIconDisplayMode = useAppSelector(state => state.user.settings?.starIconDisplayMode)
const externalLinkIconDisplayMode = useAppSelector(state => state.user.settings?.externalLinkIconDisplayMode) const externalLinkIconDisplayMode = useAppSelector(state => state.user.settings?.externalLinkIconDisplayMode)
const markAllAsReadConfirmation = useAppSelector(state => state.user.settings?.markAllAsReadConfirmation) const markAllAsReadConfirmation = useAppSelector(state => state.user.settings?.markAllAsReadConfirmation)
const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu) const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu)
const mobileFooter = useAppSelector(state => state.user.settings?.mobileFooter) const mobileFooter = useAppSelector(state => state.user.settings?.mobileFooter)
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings) const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const scrollModeOptions: Record<ScrollMode, ReactNode> = { const scrollModeOptions: Record<ScrollMode, ReactNode> = {
always: <Trans>Always</Trans>, always: <Trans>Always</Trans>,
@@ -43,19 +52,19 @@ export function DisplaySettings() {
const displayModeData: ComboboxData = [ const displayModeData: ComboboxData = [
{ {
value: "always", value: "always",
label: t`Always`, label: _(msg`Always`),
}, },
{ {
value: "on_desktop", value: "on_desktop",
label: t`On desktop`, label: _(msg`On desktop`),
}, },
{ {
value: "on_mobile", value: "on_mobile",
label: t`On mobile`, label: _(msg`On mobile`),
}, },
{ {
value: "never", value: "never",
label: t`Never`, label: _(msg`Never`),
}, },
] ]
@@ -89,6 +98,20 @@ export function DisplaySettings() {
onChange={async e => await dispatch(changeMobileFooter(e.currentTarget.checked))} onChange={async e => await dispatch(changeMobileFooter(e.currentTarget.checked))}
/> />
<Divider label={<Trans>Browser tab</Trans>} labelPosition="center" />
<Switch
label={<Trans>Show unread count in tab title</Trans>}
checked={unreadCountTitle}
onChange={async e => await dispatch(changeUnreadCountTitle(e.currentTarget.checked))}
/>
<Switch
label={<Trans>Show unread count in tab favicon</Trans>}
checked={unreadCountFavicon}
onChange={async e => await dispatch(changeUnreadCountFavicon(e.currentTarget.checked))}
/>
<Divider label={<Trans>Entry headers</Trans>} labelPosition="center" /> <Divider label={<Trans>Entry headers</Trans>} labelPosition="center" />
<Select <Select
@@ -125,6 +148,14 @@ export function DisplaySettings() {
</Group> </Group>
</Radio.Group> </Radio.Group>
<NumberInput
label={<Trans>Entries to keep above the selected entry when scrolling</Trans>}
description={<Trans>Only applies to compact, cozy and detailed modes</Trans>}
min={0}
value={entriesToKeepOnTop}
onChange={async value => await dispatch(changeEntriesToKeepOnTopWhenScrolling(+value))}
/>
<Switch <Switch
label={<Trans>Scroll smoothly when navigating between entries</Trans>} label={<Trans>Scroll smoothly when navigating between entries</Trans>}
checked={scrollSpeed ? scrollSpeed > 0 : false} checked={scrollSpeed ? scrollSpeed > 0 : false}

View File

@@ -1,4 +1,6 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core" import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { openConfirmModal } from "@mantine/modals" import { openConfirmModal } from "@mantine/modals"
@@ -19,10 +21,11 @@ interface FormData extends ProfileModificationRequest {
export function ProfileSettings() { export function ProfileSettings() {
const profile = useAppSelector(state => state.user.profile) const profile = useAppSelector(state => state.user.profile)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { _ } = useLingui()
const form = useForm<FormData>({ const form = useForm<FormData>({
validate: { validate: {
newPasswordConfirmation: (value, values) => (value !== values.newPassword ? t`Passwords do not match` : null), newPasswordConfirmation: (value, values) => (value !== values.newPassword ? _(msg`Passwords do not match`) : null),
}, },
}) })
const { setValues } = form const { setValues } = form

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Stack } from "@mantine/core" import { Box, Stack } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { import {
@@ -35,6 +35,21 @@ export function Tree() {
const showRead = useAppSelector(state => state.user.settings?.showRead) const showRead = useAppSelector(state => state.user.settings?.showRead)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const isFeedDisplayed = (feed: Subscription) => {
const isCurrentFeed = source.type === "feed" && source.id === String(feed.id)
return isCurrentFeed || feed.unread > 0 || showRead
}
const isCategoryDisplayed = (category: Category): boolean => {
const isCurrentCategory = source.type === "category" && source.id === category.id
return (
isCurrentCategory ||
showRead ||
category.children.some(c => isCategoryDisplayed(c)) ||
category.feeds.some(f => isFeedDisplayed(f))
)
}
const feedClicked = (e: React.MouseEvent, id: string) => { const feedClicked = (e: React.MouseEvent, id: string) => {
if (e.detail === 2) { if (e.detail === 2) {
dispatch(redirectToFeedDetails(id)) dispatch(redirectToFeedDetails(id))
@@ -70,6 +85,7 @@ export function Tree() {
const allCategoryNode = () => ( const allCategoryNode = () => (
<TreeNode <TreeNode
id={Constants.categories.all.id} id={Constants.categories.all.id}
type="category"
name={<Trans>All</Trans>} name={<Trans>All</Trans>}
icon={allIcon} icon={allIcon}
unread={categoryUnreadCount(root)} unread={categoryUnreadCount(root)}
@@ -83,6 +99,7 @@ export function Tree() {
const starredCategoryNode = () => ( const starredCategoryNode = () => (
<TreeNode <TreeNode
id={Constants.categories.starred.id} id={Constants.categories.starred.id}
type="category"
name={<Trans>Starred</Trans>} name={<Trans>Starred</Trans>}
icon={starredIcon} icon={starredIcon}
unread={0} unread={0}
@@ -95,16 +112,16 @@ export function Tree() {
) )
const categoryNode = (category: Category, level = 0) => { const categoryNode = (category: Category, level = 0) => {
const unreadCount = categoryUnreadCount(category) if (!isCategoryDisplayed(category)) return null
if (unreadCount === 0 && !showRead) return null
const hasError = !category.expanded && flattenCategoryTree(category).some(c => c.feeds.some(f => f.errorCount > errorThreshold)) const hasError = !category.expanded && flattenCategoryTree(category).some(c => c.feeds.some(f => f.errorCount > errorThreshold))
return ( return (
<TreeNode <TreeNode
id={category.id} id={category.id}
type="category"
name={category.name} name={category.name}
icon={category.expanded ? expandedIcon : collapsedIcon} icon={category.expanded ? expandedIcon : collapsedIcon}
unread={unreadCount} unread={categoryUnreadCount(category)}
selected={source.type === "category" && source.id === category.id} selected={source.type === "category" && source.id === category.id}
expanded={category.expanded} expanded={category.expanded}
level={level} level={level}
@@ -117,11 +134,12 @@ export function Tree() {
} }
const feedNode = (feed: Subscription, level = 0) => { const feedNode = (feed: Subscription, level = 0) => {
if (feed.unread === 0 && !showRead) return null if (!isFeedDisplayed(feed)) return null
return ( return (
<TreeNode <TreeNode
id={String(feed.id)} id={String(feed.id)}
type="feed"
name={feed.name} name={feed.name}
icon={feed.iconUrl} icon={feed.iconUrl}
unread={feed.unread} unread={feed.unread}
@@ -137,6 +155,7 @@ export function Tree() {
const tagNode = (tag: string) => ( const tagNode = (tag: string) => (
<TreeNode <TreeNode
id={tag} id={tag}
type="tag"
name={tag} name={tag}
icon={tagIcon} icon={tagIcon}
unread={0} unread={0}

View File

@@ -1,4 +1,5 @@
import { Box, Center } from "@mantine/core" import { Box, Center } from "@mantine/core"
import type { EntrySourceType } from "app/entries/slice"
import { FeedFavicon } from "components/content/FeedFavicon" import { FeedFavicon } from "components/content/FeedFavicon"
import type React from "react" import type React from "react"
import { tss } from "tss" import { tss } from "tss"
@@ -6,6 +7,7 @@ import { UnreadCount } from "./UnreadCount"
interface TreeNodeProps { interface TreeNodeProps {
id: string id: string
type: EntrySourceType
name: React.ReactNode name: React.ReactNode
icon: React.ReactNode icon: React.ReactNode
unread: number unread: number
@@ -63,7 +65,15 @@ export function TreeNode(props: TreeNodeProps) {
hasUnread: props.unread > 0, hasUnread: props.unread > 0,
}) })
return ( return (
<Box py={1} pl={props.level * 20} className={classes.node} onClick={(e: React.MouseEvent) => props.onClick(e, props.id)}> <Box
py={1}
pl={props.level * 20}
className={classes.node}
onClick={(e: React.MouseEvent) => props.onClick(e, props.id)}
data-id={props.id}
data-type={props.type}
data-unread-count={props.unread}
>
<Box mr={6} onClick={(e: React.MouseEvent) => props.onIconClick?.(e, props.id)}> <Box mr={6} onClick={(e: React.MouseEvent) => props.onIconClick?.(e, props.id)}>
<Center>{typeof props.icon === "string" ? <FeedFavicon url={props.icon} /> : props.icon}</Center> <Center>{typeof props.icon === "string" ? <FeedFavicon url={props.icon} /> : props.icon}</Center>
</Box> </Box>

View File

@@ -1,6 +1,7 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { Box, Center, Kbd, TextInput } from "@mantine/core" import { useLingui } from "@lingui/react"
import { useOs } from "@mantine/hooks" import { Trans } from "@lingui/react/macro"
import { TextInput } from "@mantine/core"
import { Spotlight, type SpotlightActionData, spotlight } from "@mantine/spotlight" import { Spotlight, type SpotlightActionData, spotlight } from "@mantine/spotlight"
import { redirectToFeed } from "app/redirect/thunks" import { redirectToFeed } from "app/redirect/thunks"
import { useAppDispatch } from "app/store" import { useAppDispatch } from "app/store"
@@ -15,7 +16,8 @@ export interface TreeSearchProps {
export function TreeSearch(props: TreeSearchProps) { export function TreeSearch(props: TreeSearchProps) {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const isMacOS = useOs() === "macos" const { _ } = useLingui()
const actions: SpotlightActionData[] = props.feeds const actions: SpotlightActionData[] = props.feeds
.map(f => ({ .map(f => ({
id: `${f.id}`, id: `${f.id}`,
@@ -26,13 +28,6 @@ export function TreeSearch(props: TreeSearchProps) {
.sort((f1, f2) => f1.label.localeCompare(f2.label)) .sort((f1, f2) => f1.label.localeCompare(f2.label))
const searchIcon = <TbSearch size={18} /> const searchIcon = <TbSearch size={18} />
const rightSection = (
<Center style={{ cursor: "pointer" }} onClick={() => spotlight.open()}>
<Kbd>{isMacOS ? "Cmd" : "Ctrl"}</Kbd>
<Box mx={5}>+</Box>
<Kbd>K</Kbd>
</Center>
)
// additional keyboard shortcut used by commafeed v1 // additional keyboard shortcut used by commafeed v1
useMousetrap("g u", () => spotlight.open()) useMousetrap("g u", () => spotlight.open())
@@ -40,10 +35,9 @@ export function TreeSearch(props: TreeSearchProps) {
return ( return (
<> <>
<TextInput <TextInput
placeholder={t`Search`} placeholder={_(msg`Search`)}
leftSection={searchIcon} leftSection={searchIcon}
rightSectionWidth={100} rightSectionWidth={100}
rightSection={rightSection}
styles={{ styles={{
input: { input: {
cursor: "pointer", cursor: "pointer",
@@ -60,7 +54,7 @@ export function TreeSearch(props: TreeSearchProps) {
shortcut="mod+k" shortcut="mod+k"
searchProps={{ searchProps={{
leftSection: searchIcon, leftSection: searchIcon,
placeholder: t`Search`, placeholder: _(msg`Search`),
}} }}
nothingFound={<Trans>Nothing found</Trans>} nothingFound={<Trans>Nothing found</Trans>}
/> />

View File

@@ -18,7 +18,7 @@ export function UnreadCount(props: { unreadCount: number }) {
const count = props.unreadCount >= 10000 ? "10k+" : props.unreadCount const count = props.unreadCount >= 10000 ? "10k+" : props.unreadCount
return ( return (
<Tooltip label={props.unreadCount} disabled={props.unreadCount === count} openDelay={Constants.tooltip.delay}> <Tooltip label={props.unreadCount} disabled={props.unreadCount === count} openDelay={Constants.tooltip.delay}>
<Badge className={classes.badge} variant="light"> <Badge className={classes.badge} variant="light" fullWidth>
{count} {count}
</Badge> </Badge>
</Tooltip> </Tooltip>

View File

@@ -1,4 +1,5 @@
import { t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { useAppSelector } from "app/store" import { useAppSelector } from "app/store"
interface Step { interface Step {
@@ -11,22 +12,23 @@ export const useAppLoading = () => {
const settings = useAppSelector(state => state.user.settings) const settings = useAppSelector(state => state.user.settings)
const rootCategory = useAppSelector(state => state.tree.rootCategory) const rootCategory = useAppSelector(state => state.tree.rootCategory)
const tags = useAppSelector(state => state.user.tags) const tags = useAppSelector(state => state.user.tags)
const { _ } = useLingui()
const steps: Step[] = [ const steps: Step[] = [
{ {
label: t`Loading settings...`, label: _(msg`Loading settings...`),
done: !!settings, done: !!settings,
}, },
{ {
label: t`Loading profile...`, label: _(msg`Loading profile...`),
done: !!profile, done: !!profile,
}, },
{ {
label: t`Loading subscriptions...`, label: _(msg`Loading subscriptions...`),
done: !!rootCategory, done: !!rootCategory,
}, },
{ {
label: t`Loading tags...`, label: _(msg`Loading tags...`),
done: !!tags, done: !!tags,
}, },
] ]

View File

@@ -0,0 +1,10 @@
import { useEffect, useState } from "react"
export const useNow = (interval = 1000): Date => {
const [time, setTime] = useState(new Date())
useEffect(() => {
const t = setInterval(() => setTime(new Date()), interval)
return () => clearInterval(t)
}, [interval])
return time
}

View File

@@ -1,7 +0,0 @@
import type { ViewMode } from "app/types"
import useLocalStorage from "use-local-storage"
export function useViewMode() {
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("view-mode", "detailed")
return { viewMode, setViewMode }
}

View File

@@ -10,7 +10,7 @@ interface Locale {
} }
// add an object to the array to add a new locale // add an object to the array to add a new locale
// don't forget to also add it to the 'locales' array in .linguirc // don't forget to also add it to the 'locales' array in lingui.config.ts
export const locales: Locale[] = [ export const locales: Locale[] = [
{ key: "ar", label: "العربية", dayjsImportFn: async () => await import("dayjs/locale/ar") }, { key: "ar", label: "العربية", dayjsImportFn: async () => await import("dayjs/locale/ar") },
{ key: "ca", label: "Català", dayjsImportFn: async () => await import("dayjs/locale/ca") }, { key: "ca", label: "Català", dayjsImportFn: async () => await import("dayjs/locale/ca") },

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "تأكد من عمل الخلاصة"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "دخول"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "أدخل كلمة المرور الحالية لتغيير إعدادات ملف التعريف" msgstr "أدخل كلمة المرور الحالية لتغيير إعدادات ملف التعريف"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "تصفية التعبير" msgstr "تصفية التعبير"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "هل نسيت كلمة المرور؟" msgstr "هل نسيت كلمة المرور؟"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "اوووه!" msgstr "اوووه!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "Extensió del navegador necessària per a Chrome"
msgid "Browser extention" msgid "Browser extention"
msgstr "Extensió del navegador" msgstr "Extensió del navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Comproveu que el canal funciona"
msgid "Close menu" msgid "Close menu"
msgstr "Tanca el menu" msgstr "Tanca el menu"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "Versió de l'extensió del navegador CommaFeed {browserExtensionVersion}." msgstr "Versió de l'extensió del navegador CommaFeed {browserExtensionVersion}."
@@ -313,6 +321,10 @@ msgstr "Entra"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "introduïu la vostra contrasenya actual per canviar la configuració del perfil" msgstr "introduïu la vostra contrasenya actual per canviar la configuració del perfil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Expressió de filtratge" msgstr "Expressió de filtratge"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Heu oblidat la contrasenya?" msgstr "Heu oblidat la contrasenya?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "Al mòbil, mostra els botons d'acció a la part inferior de la pantalla" msgstr "Al mòbil, mostra els botons d'acció a la part inferior de la pantalla"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Vaja!" msgstr "Vaja!"
@@ -822,6 +842,14 @@ msgstr "Mostra el menú natiu (escriptori)"
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Zkontrolujte, zda zdroj funguje"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Vstupte"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Zadejte své aktuální heslo pro změnu nastavení profilu" msgstr "Zadejte své aktuální heslo pro změnu nastavení profilu"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrování výrazu" msgstr "Filtrování výrazu"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Zapomněli jste heslo?" msgstr "Zapomněli jste heslo?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Jejda!" msgstr "Jejda!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Gwiriwch fod y porthiant yn gweithio"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Ewch i mewn"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Rhowch eich cyfrinair presennol i newid gosodiadau proffil" msgstr "Rhowch eich cyfrinair presennol i newid gosodiadau proffil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Hidlo mynegiant" msgstr "Hidlo mynegiant"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Wedi anghofio cyfrinair?" msgstr "Wedi anghofio cyfrinair?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Wps!" msgstr "Wps!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Tjek, at foderet virker"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Indtast din nuværende adgangskode for at ændre profilindstillinger" msgstr "Indtast din nuværende adgangskode for at ændre profilindstillinger"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrerende udtryk" msgstr "Filtrerende udtryk"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Glemt adgangskode?" msgstr "Glemt adgangskode?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Hovsa!" msgstr "Hovsa!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "Browser-Erweiterung für Chrome benötigt"
msgid "Browser extention" msgid "Browser extention"
msgstr "Browser-Erweiterung" msgstr "Browser-Erweiterung"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Überprüfe, ob der Feed funktioniert"
msgid "Close menu" msgid "Close menu"
msgstr "Menü schließen" msgstr "Menü schließen"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "CommaFeed Browser Erweiterung Version {browserExtensionVersion}." msgstr "CommaFeed Browser Erweiterung Version {browserExtensionVersion}."
@@ -313,6 +321,10 @@ msgstr "Eintreten"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Geben Sie Ihr aktuelles Passwort ein, um die Profileinstellungen zu ändern" msgstr "Geben Sie Ihr aktuelles Passwort ein, um die Profileinstellungen zu ändern"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filterausdruck" msgstr "Filterausdruck"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "Auf mobilen Geräten die Aktion-Buttons am unteren Ende des Bildschirms anzeigen" msgstr "Auf mobilen Geräten die Aktion-Buttons am unteren Ende des Bildschirms anzeigen"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ups!" msgstr "Ups!"
@@ -822,6 +842,14 @@ msgstr "Natives Menü anzeigen (Desktop)"
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "Browser extension required for Chrome"
msgid "Browser extention" msgid "Browser extention"
msgstr "Browser extention" msgstr "Browser extention"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Browser tab"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Check that the feed is working"
msgid "Close menu" msgid "Close menu"
msgstr "Close menu" msgstr "Close menu"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "CommaFeed browser extension version {browserExtensionVersion}." msgstr "CommaFeed browser extension version {browserExtensionVersion}."
@@ -313,6 +321,10 @@ msgstr "Enter"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Enter your current password to change profile settings" msgstr "Enter your current password to change profile settings"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr "Entries to keep above the selected entry when scrolling"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "Entry headers" msgstr "Entry headers"
@@ -364,6 +376,10 @@ msgstr "Fever API URL"
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtering expression" msgstr "Filtering expression"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr "Force fetching feeds is not yet available."
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Forgot password?" msgstr "Forgot password?"
@@ -600,6 +616,10 @@ msgstr "On mobile"
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "On mobile, show action buttons at the bottom of the screen" msgstr "On mobile, show action buttons at the bottom of the screen"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr "Only applies to compact, cozy and detailed modes"
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Oops!" msgstr "Oops!"
@@ -822,6 +842,14 @@ msgstr "Show native menu (desktop)"
msgid "Show star icon" msgid "Show star icon"
msgstr "Show star icon" msgstr "Show star icon"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr "Show unread count in tab favicon"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr "Show unread count in tab title"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -1,25 +1,26 @@
# SPDX-FileCopyrightText: 2024 victorhck <victorhck@mailbox.org>
msgid "" msgid ""
msgstr "" msgstr ""
"POT-Creation-Date: 2022-10-28 13:47+0200\n" "POT-Creation-Date: 2022-10-28 13:47+0200\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n" "X-Generator: Lokalize 24.08.0\n"
"Language: es\n" "Language: es\n"
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n" "PO-Revision-Date: 2024-09-13 17:17+0200\n"
"Last-Translator: \n" "Last-Translator: victorhck <victorhck@mailbox.org>\n"
"Language-Team: \n" "Language-Team: Spanish <kde-i18n-doc@kde.org>\n"
"Plural-Forms: \n" "Plural-Forms: \n"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>." msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "" msgstr "<0>CommaFeed es un proyecto de código abierto. El código fuente está hospedado en </0><1>GitHub</1>."
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1>." msgid "<0>Complete syntax is available </0><1>here</1>."
msgstr "" msgstr "<0>La sintaxis completa está disponible </0><1>aquí</1>."
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>" msgid "<0>Have an account?</0><1>Log in!</1>"
@@ -27,7 +28,7 @@ msgstr "<0>¿Tienes una cuenta?</0><1>¡Inicia sesión!</1>"
#: src/pages/app/DonatePage.tsx #: src/pages/app/DonatePage.tsx
msgid "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaFeed in my free time for over 10 years now. Thanks for taking an interest in helping me continue supporting CommaFeed.</1>" msgid "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaFeed in my free time for over 10 years now. Thanks for taking an interest in helping me continue supporting CommaFeed.</1>"
msgstr "" msgstr "<0>Hola,</0><1>Soy Jérémie de Bélgica y he estado trabajando en CommaFeed en mi tiempo libre desde hace 10 años. Gracias por interesarte en ayudarme a seguir apoyando a CommaFeed.</1>"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "<0>Need an account?</0><1>Sign up!</1>" msgid "<0>Need an account?</0><1>Sign up!</1>"
@@ -36,7 +37,7 @@ msgstr "<0>¿Necesitas una cuenta?</0><1>¡Regístrate!</1>"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "About" msgid "About"
msgstr "Sobre" msgstr "Acerca de"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Actions" msgid "Actions"
@@ -44,7 +45,7 @@ msgstr "Acciones"
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
msgid "Add" msgid "Add"
msgstr "Agregar" msgstr "Añadir"
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx
msgid "Add category" msgid "Add category"
@@ -70,55 +71,55 @@ msgstr "Todo"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Always" msgid "Always"
msgstr "" msgstr "Siempre"
#: src/pages/auth/PasswordRecoveryPage.tsx #: src/pages/auth/PasswordRecoveryPage.tsx
msgid "An email has been sent if this address was registered. Check your inbox." msgid "An email has been sent if this address was registered. Check your inbox."
msgstr "Se ha enviado un correo electrónico si se registró esta dirección. " msgstr "Se ha enviado un correo electrónico si esta dirección estaba registrada. Revisa tu bandeja de entrada."
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your data from other feed reading services." msgid "An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your data from other feed reading services."
msgstr "Un archivo opml es un archivo XML que contiene categorías y direcciones URL de fuentes. " msgstr "Un archivo opml es un archivo XML que contiene categorías y las URL de los feeds. Puedes obtener un archivo OPML exportando tus datos desde otros servicios de lectura de feeds."
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Analyze feed" msgid "Analyze feed"
msgstr "Analizar alimentación" msgstr "Analizar feed"
#: src/components/AnnouncementDialog.tsx #: src/components/AnnouncementDialog.tsx
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr "Anuncio"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "API key" msgid "API key"
msgstr "clave API" msgstr "Clave API"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?" msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "¿Está seguro de que desea eliminar la categoría <0>{categoryName}</0>?" msgstr "¿Estás seguro de que deseas eliminar la categoría <0>{categoryName}</0>?"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Are you sure you want to delete user <0>{userName}</0> ?" msgid "Are you sure you want to delete user <0>{userName}</0> ?"
msgstr "¿Está seguro de que desea eliminar el usuario <0>{userName}</0> ?" msgstr "¿Estás seguro de que deseas eliminar el usuario <0>{userName}</0> ?"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Are you sure you want to delete your account? There's no turning back!" msgid "Are you sure you want to delete your account? There's no turning back!"
msgstr "¿Está seguro de que desea eliminar su cuenta? " msgstr "¿Estás seguro de que quieres eliminar tu cuenta? ¡No hay vuelta atrás!"
#: src/components/header/MarkAllAsReadButton.tsx #: src/components/header/MarkAllAsReadButton.tsx
msgid "Are you sure you want to mark all entries of <0>{sourceLabel}</0> as read?" msgid "Are you sure you want to mark all entries of <0>{sourceLabel}</0> as read?"
msgstr "¿Está seguro de que desea marcar todas las entradas de <0>{sourceLabel}</0> como leídas?" msgstr "¿Estás seguro de que deseas marcar todas las entradas de <0>{sourceLabel}</0> como leídas?"
#: src/components/header/MarkAllAsReadButton.tsx #: src/components/header/MarkAllAsReadButton.tsx
msgid "Are you sure you want to mark entries older than {threshold} days of <0>{sourceLabel}</0> as read?" msgid "Are you sure you want to mark entries older than {threshold} days of <0>{sourceLabel}</0> as read?"
msgstr "¿Está seguro de que desea marcar las entradas anteriores a {threshold} días de <0>{sourceLabel}</0> como leídas?" msgstr "¿Estás seguro de que deseas marcar las entradas anteriores a {threshold} días de <0>{sourceLabel}</0> como leídas?"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?" msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
msgstr "¿Está seguro de que desea darse de baja de <0>{feedName}</0>?" msgstr "¿Estás seguro de que deseas darte de baja de <0>{feedName}</0>?"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Asc" msgid "Asc"
msgstr "ASC" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison." msgid "Available variables are 'title', 'content', 'url' 'author' and 'categories' and their content is converted to lower case to ease string comparison."
@@ -134,11 +135,15 @@ msgstr "Volver a iniciar sesión"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome" msgid "Browser extension required for Chrome"
msgstr "" msgstr "Se requiere extensión de navegador para Chrome"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr "Extensión del navegador"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Pestaña del navegador"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
@@ -170,19 +175,23 @@ msgstr "Cambiar la contraseña generará una nueva clave API"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Check that the feed is working" msgid "Check that the feed is working"
msgstr "Compruebe que el feed funciona" msgstr "Comprueba que el feed funciona"
#: src/pages/app/Layout.tsx #: src/pages/app/Layout.tsx
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr "Cerrar menú"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr "Versión de la extensión del navegador CommaFeed {browserExtensionVersion}."
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>." msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "" msgstr "CommaFeed es compatible con Fever API. Utilice la siguiente URL en su cliente móvil compatible con Fever. Inicie sesión con su nombre de usuario y su <0>clave API</0>."
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item" msgid "CommaFeed next unread item"
@@ -190,7 +199,7 @@ msgstr "CommaFeed siguiente elemento no leído"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed version {version} ({revision})." msgid "CommaFeed version {version} ({revision})."
msgstr "" msgstr "Versión de CommaFeed {version} ({revision})."
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Compact" msgid "Compact"
@@ -214,7 +223,7 @@ msgstr "Acogedor"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl" msgid "Ctrl"
msgstr "" msgstr "Ctrl"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Current password" msgid "Current password"
@@ -222,19 +231,19 @@ msgstr "Contraseña actual"
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
msgid "Custom code" msgid "Custom code"
msgstr "" msgstr "Código personalizado"
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
msgid "Custom CSS rules that will be applied" msgid "Custom CSS rules that will be applied"
msgstr "" msgstr "Reglas CSS personalizadas que se aplicarán"
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
msgid "Custom JS code that will be executed on page load" msgid "Custom JS code that will be executed on page load"
msgstr "" msgstr "Código JS personalizado que se ejecutará al cargar la página"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Dark" msgid "Dark"
msgstr "" msgstr "Oscuro"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Date created" msgid "Date created"
@@ -259,25 +268,25 @@ msgstr "Borrar usuario"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Desc" msgid "Desc"
msgstr "" msgstr "Desc"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Detailed" msgid "Detailed"
msgstr "" msgstr "Detallado"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
msgid "Display" msgid "Display"
msgstr "Pantalla" msgstr "Mostrar"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx #: src/pages/app/DonatePage.tsx
msgid "Donate" msgid "Donate"
msgstr "" msgstr "Donar"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Download" msgid "Download"
msgstr "descargar" msgstr "Descargar"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Drag link to bookmark bar" msgid "Drag link to bookmark bar"
@@ -294,7 +303,7 @@ msgstr "Correo electrónico"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
msgid "E-mail address" msgid "E-mail address"
msgstr "dirección de correo electrónico" msgstr "Dirección de correo electrónico"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Edit user" msgid "Edit user"
@@ -311,15 +320,19 @@ msgstr "Entrar"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Ingrese su contraseña actual para cambiar la configuración del perfil" msgstr "Ingresa tu contraseña actual para cambiar la configuración del perfil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr "Entradas para mantener encima de la entrada seleccionada al desplazarse"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr "Encabezados de las entradas"
#: src/components/Alert.tsx #: src/components/Alert.tsx
msgid "Error" msgid "Error"
msgstr "" msgstr "Error"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}." msgid "Example: {example}."
@@ -331,39 +344,43 @@ msgstr "Expandido"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services" msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
msgstr "Exporte sus suscripciones y categorías como un archivo OPML que se puede importar en otros servicios de lectura de feeds" msgstr "Exporta tus suscripciones y categorías como un archivo OPML que se puede importar en otros servicios de lectura de feeds"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Extension options" msgid "Extension options"
msgstr "" msgstr "Opciones de la extensión"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Feed name" msgid "Feed name"
msgstr "Nombre de alimentación" msgstr "Nombre del feed"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Feed URL" msgid "Feed URL"
msgstr "URL de fuente" msgstr "URL del feed"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now" msgid "Fetch all my feeds now"
msgstr "" msgstr "Obtener todos mis feeds ahora"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Fever API" msgid "Fever API"
msgstr "" msgstr "API de Fever"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Fever API URL" msgid "Fever API URL"
msgstr "" msgstr "URL de la API de Fever"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Expresión de filtrado" msgstr "Expresión de filtrado"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "¿Olvidaste la contraseña?" msgstr "¿Olvidaste la contraseña?"
@@ -386,7 +403,7 @@ msgstr "URL del feed generado"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Go to {0}" msgid "Go to {0}"
msgstr "" msgstr "Ir a {0}"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Go to the All view" msgid "Go to the All view"
@@ -398,7 +415,7 @@ msgstr "Ir a la documentación de la API."
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Goodies" msgid "Goodies"
msgstr "golosinas" msgstr "Golosinas"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Id" msgid "Id"
@@ -406,15 +423,15 @@ msgstr "Identificación"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically." msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Si no está vacío, una expresión que se evalúa como 'verdadero' o 'falso'. " msgstr "Si no está vacía, una expresión que se evalúa como \"verdadera\" o \"falso\". Si es falso, las nuevas entradas de este feed se marcarán como leídas automáticamente."
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen" msgid "If the entry doesn't entirely fit on the screen"
msgstr "" msgstr "Si la entrada no cabe completamente en la pantalla"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "If you encounter an issue, please report it on the issues page of the GitHub project." msgid "If you encounter an issue, please report it on the issues page of the GitHub project."
msgstr "Si encuentra un problema, infórmelo en la página de problemas del proyecto GitHub." msgstr "Si encuentras un problema, informa sobre ello en la página de problemas del proyecto en GitHub."
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "Import" msgid "Import"
@@ -422,7 +439,7 @@ msgstr "Importar"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "In expanded view, scrolling through entries mark them as read" msgid "In expanded view, scrolling through entries mark them as read"
msgstr "En la vista ampliada, al desplazarse por las entradas, márquelas como leídas" msgstr "En la vista ampliada, al desplazarse por las entradas marcarlas como leídas"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -432,7 +449,7 @@ msgstr "Mantener sin leer"
#: src/components/content/FeedEntries.tsx #: src/components/content/FeedEntries.tsx
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "atajos de teclado" msgstr "Atajos de teclado"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Language" msgid "Language"
@@ -440,7 +457,7 @@ msgstr "Idioma"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Last login date" msgid "Last login date"
msgstr "fecha del último inicio de sesión" msgstr "Fecha del último inicio de sesión"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Last refresh" msgid "Last refresh"
@@ -452,7 +469,7 @@ msgstr "Último mensaje de actualización"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Light" msgid "Light"
msgstr "" msgstr "Claro"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
@@ -484,11 +501,11 @@ msgstr "Iniciar sesión"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Logout" msgid "Logout"
msgstr "Salir" msgstr "Cerrar sesión"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Long press" msgid "Long press"
msgstr "" msgstr "Pulsación larga"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
@@ -520,7 +537,7 @@ msgstr "Métricas"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Middle click" msgid "Middle click"
msgstr "" msgstr "Clic central"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Move the page down" msgid "Move the page down"
@@ -544,12 +561,12 @@ msgstr "Nombre"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Navigate to a subscription by entering its name" msgid "Navigate to a subscription by entering its name"
msgstr "Navegar a una suscripción ingresando su nombre" msgstr "Navegar a una suscripción introduciendo su nombre"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Never" msgid "Never"
msgstr "" msgstr "Nunca"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "New password" msgid "New password"
@@ -557,7 +574,7 @@ msgstr "Nueva contraseña"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Newest first" msgid "Newest first"
msgstr "más reciente primero" msgstr "Las más recientes primero"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
@@ -570,7 +587,7 @@ msgstr "Próxima actualización"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Next unread item bookmarklet" msgid "Next unread item bookmarklet"
msgstr "Bookmarklet del siguiente elemento no leído" msgstr "Siguiente elemento no leído de los marcadores"
#: src/pages/app/FeedEntriesPage.tsx #: src/pages/app/FeedEntriesPage.tsx
msgid "No more entries" msgid "No more entries"
@@ -578,7 +595,7 @@ msgstr "No más entradas"
#: src/components/content/ShareButtons.tsx #: src/components/content/ShareButtons.tsx
msgid "No sharing options available." msgid "No sharing options available."
msgstr "" msgstr "No hay opciones para compartir disponibles."
#: src/components/sidebar/TreeSearch.tsx #: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found" msgid "Nothing found"
@@ -586,19 +603,23 @@ msgstr "Nada encontrado"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Oldest first" msgid "Oldest first"
msgstr "más antigua primero" msgstr "Las más antiguas primero"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On desktop" msgid "On desktop"
msgstr "" msgstr "En el escritorio"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile" msgid "On mobile"
msgstr "" msgstr "En dispositivos móviles"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr "En dispositivos móviles, mostrar los botones de acción en la parte inferior de la pantalla"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr "Sólo se aplica a los modos compacto, acogedor y detallado"
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
@@ -606,7 +627,7 @@ msgstr "¡Ups!"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Open CommaFeed" msgid "Open CommaFeed"
msgstr "" msgstr "Abrir Commafeed"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open current entry in a new tab" msgid "Open current entry in a new tab"
@@ -623,15 +644,15 @@ msgstr "Abrir enlace"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Open link in new background tab" msgid "Open link in new background tab"
msgstr "" msgstr "Abrir enlace en una nueva pestaña en segundo plano"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Open link in new tab" msgid "Open link in new tab"
msgstr "" msgstr "Abrir el enlace en una nueva pestaña"
#: src/pages/app/Layout.tsx #: src/pages/app/Layout.tsx
msgid "Open menu" msgid "Open menu"
msgstr "" msgstr "Abrir menú"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open next entry" msgid "Open next entry"
@@ -647,20 +668,20 @@ msgstr "Abrir/cerrar entrada actual"
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx
msgid "OPML" msgid "OPML"
msgstr "" msgstr "OPML"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "OPML export" msgid "OPML export"
msgstr "Exportación OPML" msgstr "Exportar OPML"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "OPML file" msgid "OPML file"
msgstr "archivo OPML" msgstr "Archivo OPML"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "OPML file is required" msgid "OPML file is required"
msgstr "" msgstr "Es necesario un archivo OPML"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Order" msgid "Order"
@@ -697,7 +718,7 @@ msgstr "Posición"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Previous" msgid "Previous"
msgstr "" msgstr "Previo"
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
msgid "Profile" msgid "Profile"
@@ -723,7 +744,7 @@ msgstr "API REST"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click" msgid "Right click"
msgstr "" msgstr "Clic derecho"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
@@ -735,7 +756,7 @@ msgstr "Guardar"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scroll selected entry to the top of the page" msgid "Scroll selected entry to the top of the page"
msgstr "" msgstr "Desplazar la entrada seleccionada hasta la parte superior de la página"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scroll smoothly when navigating between entries" msgid "Scroll smoothly when navigating between entries"
@@ -743,7 +764,7 @@ msgstr "Desplazarse suavemente al navegar entre entradas"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scrolling" msgid "Scrolling"
msgstr "" msgstr "Desplazarse"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
@@ -758,15 +779,15 @@ msgstr "La búsqueda requiere al menos 3 caracteres"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it" msgid "Set focus on next entry without opening it"
msgstr "Establezca el foco en la siguiente entrada sin abrirla" msgstr "Establecer el foco en la siguiente entrada sin abrirla"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on previous entry without opening it" msgid "Set focus on previous entry without opening it"
msgstr "Poner el foco en la entrada anterior sin abrirla" msgstr "Establecer el foco en la entrada anterior sin abrirla"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Settings" msgid "Settings"
msgstr "Configuraciones" msgstr "Ajustes"
#: src/app/user/slice.ts #: src/app/user/slice.ts
msgid "Settings saved." msgid "Settings saved."
@@ -784,27 +805,27 @@ msgstr "Compartir sitios"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift" msgid "Shift"
msgstr "Cambio" msgstr "Shift"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show CommaFeed's own context menu on right click" msgid "Show CommaFeed's own context menu on right click"
msgstr "" msgstr "Mostrar el menú contextual propio de CommaFeed al hacer clic derecho"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show confirmation when marking all entries as read" msgid "Show confirmation when marking all entries as read"
msgstr "" msgstr "Mostrar confirmación al marcar todas las entradas como leídas"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show entry menu (desktop)" msgid "Show entry menu (desktop)"
msgstr "" msgstr "Mostrar menú de entrada (escritorio)"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show entry menu (mobile)" msgid "Show entry menu (mobile)"
msgstr "" msgstr "Mostrar menú de entrada (móvil)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon" msgid "Show external link icon"
msgstr "" msgstr "Mostrar icono de enlace externo"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries" msgid "Show feeds and categories with no unread entries"
@@ -812,15 +833,23 @@ msgstr "Mostrar feeds y categorías sin entradas no leídas"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show keyboard shortcut help" msgid "Show keyboard shortcut help"
msgstr "Mostrar ayuda de atajo de teclado" msgstr "Mostrar la ayuda de los atajos de teclado"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show native menu (desktop)" msgid "Show native menu (desktop)"
msgstr "" msgstr "Mostrar menú nativo (escritorio)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr "Mostrar el icono de la estrella"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr "Mostrar recuento de no leídos en la pestaña favicon"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr "Mostrar recuento de no leídos en el título de la pestaña"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
@@ -841,7 +870,7 @@ msgstr "Espacio"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/Star.tsx #: src/components/content/header/Star.tsx
msgid "Star" msgid "Star"
msgstr "estrella" msgstr "Estrella"
#: src/app/constants.ts #: src/app/constants.ts
#: src/components/sidebar/Tree.tsx #: src/components/sidebar/Tree.tsx
@@ -856,7 +885,7 @@ msgstr "Suscribirse"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Subscribe to the feed" msgid "Subscribe to the feed"
msgstr "Suscríbete a la fuente" msgstr "Suscríbete al feed"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Subscribe URL" msgid "Subscribe URL"
@@ -868,7 +897,7 @@ msgstr "Éxito"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Swipe header to the left" msgid "Swipe header to the left"
msgstr "" msgstr "Desliza el encabezado hacia la izquierda"
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Switch to dark theme" msgid "Switch to dark theme"
@@ -880,7 +909,7 @@ msgstr "Cambiar a tema claro"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "System" msgid "System"
msgstr "" msgstr "Sistema"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -889,7 +918,7 @@ msgstr "Etiquetas"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page." msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "La URL de la fuente a la que desea suscribirse. " msgstr "La URL del feed al que desea suscribirse. También puede utilizar la URL del sitio web directamente y CommaFeed intentará encontrar el feed en la página."
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Theme" msgid "Theme"
@@ -897,7 +926,7 @@ msgstr "Tema"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key" 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 "" 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/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry" msgid "Toggle read status of current entry"
@@ -905,19 +934,19 @@ msgstr "Alternar estado de lectura de la entrada actual"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle sidebar" msgid "Toggle sidebar"
msgstr "" msgstr "Alternar barra lateral"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle starred status of current entry" msgid "Toggle starred status of current entry"
msgstr "" msgstr "Alternar estado destacado de la entrada actual"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo" msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Pruebe CommaFeed con la cuenta demo: demo/demo" msgstr "Prueba CommaFeed con la cuenta de demostración: demo/demo"
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Try the demo!" msgid "Try the demo!"
msgstr "" msgstr "¡Prueba la demostración!"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Unread" msgid "Unread"
@@ -953,8 +982,8 @@ msgstr "Sitio web"
#: src/pages/app/FeedEntriesPage.tsx #: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?" msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
msgstr "Todavía no tienes ninguna suscripción. " msgstr "Aún no tienes ninguna suscripción. ¿Por qué no intentas agregar una haciendo clic en el signo + en la parte superior de la página?"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh." msgid "Your feeds have been queued for refresh."
msgstr "" msgstr "Tus feeds se han puesto en cola para actualizarse."

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "بررسی کنید که خوراک کار می کند"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "وارد شوید"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "رمز عبور فعلی خود را برای تغییر تنظیمات نمایه وارد کنید" msgstr "رمز عبور فعلی خود را برای تغییر تنظیمات نمایه وارد کنید"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "بیان فیلتر" msgstr "بیان فیلتر"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "رمز عبور را فراموش کرده اید؟" msgstr "رمز عبور را فراموش کرده اید؟"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "اوه!" msgstr "اوه!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Tarkista, että syöttö toimii"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Anna nykyinen salasanasi muuttaaksesi profiiliasetuksia" msgstr "Anna nykyinen salasanasi muuttaaksesi profiiliasetuksia"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Suodattava lauseke" msgstr "Suodattava lauseke"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Unohditko salasanan?" msgstr "Unohditko salasanan?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Hups!" msgstr "Hups!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "L'extension navigateur est nécessaire sur Chrome"
msgid "Browser extention" msgid "Browser extention"
msgstr "Extension navigateur" msgstr "Extension navigateur"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "Onglet navigateur"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Vérifie que le flux fonctionne"
msgid "Close menu" msgid "Close menu"
msgstr "Fermer le menu" msgstr "Fermer le menu"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "Extension CommaFeed pour navigateur version {browserExtensionVersion}." msgstr "Extension CommaFeed pour navigateur version {browserExtensionVersion}."
@@ -313,9 +321,13 @@ msgstr "Entrer"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Entrez votre mot de passe actuel pour changer les paramètres du profil" msgstr "Entrez votre mot de passe actuel pour changer les paramètres du profil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr "Nombre d'entrées à conserver au-dessus de l'entrée sélectionnée lors d'un défilement"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr "En-têtes de l'entrée"
#: src/components/Alert.tsx #: src/components/Alert.tsx
msgid "Error" msgid "Error"
@@ -364,6 +376,10 @@ msgstr "URL API Fever"
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Expression de filtrage" msgstr "Expression de filtrage"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr "La récupération forcée des flux n'est pas encore disponible."
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Mot de passe oublié ?" msgstr "Mot de passe oublié ?"
@@ -578,7 +594,7 @@ msgstr "Fin de la liste"
#: src/components/content/ShareButtons.tsx #: src/components/content/ShareButtons.tsx
msgid "No sharing options available." msgid "No sharing options available."
msgstr "" msgstr "Aucune option de partage disponible"
#: src/components/sidebar/TreeSearch.tsx #: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found" msgid "Nothing found"
@@ -590,16 +606,20 @@ msgstr "Du plus ancien au plus récent"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On desktop" msgid "On desktop"
msgstr "" msgstr "Version PC"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile" msgid "On mobile"
msgstr "" msgstr "Version mobile"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "Sur mobile, afficher les boutons d'action en bas de l'écran" msgstr "Sur mobile, afficher les boutons d'action en bas de l'écran"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr "Ne fonctionne que dans les modes Compact, Cozy, et Vue détaillée"
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Oups !" msgstr "Oups !"
@@ -660,7 +680,7 @@ msgstr "Fichier OPML"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "OPML file is required" msgid "OPML file is required"
msgstr "" msgstr "Vous devez fournir un fichier OPML"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Order" msgid "Order"
@@ -804,7 +824,7 @@ msgstr "Afficher les options de l'entrée (mobile)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon" msgid "Show external link icon"
msgstr "" msgstr "Afficher l'icône du lien distant"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries" msgid "Show feeds and categories with no unread entries"
@@ -820,7 +840,15 @@ msgstr "Afficher les options du navigateur (ordinateur)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr "Afficher l'icône Favori"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr "Afficher le nombre d'entrées non lues dans la favicône de l'onglet"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr "Afficher le nombre d'entrées non lues dans le titre de l'onglet"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Comproba que a fonte funciona"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Entra"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Introduce o teu contrasinal actual para cambiar a configuración do perfil" msgstr "Introduce o teu contrasinal actual para cambiar a configuración do perfil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Expresión de filtrado" msgstr "Expresión de filtrado"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Esqueceches o contrasinal?" msgstr "Esqueceches o contrasinal?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Vaia!" msgstr "Vaia!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Ellenőrizze, hogy a feed működik-e"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Adja meg jelenlegi jelszavát a profilbeállítások módosításához" msgstr "Adja meg jelenlegi jelszavát a profilbeállítások módosításához"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Szűrő kifejezés" msgstr "Szűrő kifejezés"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Elfelejtette a jelszavát?" msgstr "Elfelejtette a jelszavát?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Hoppá!" msgstr "Hoppá!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Periksa apakah umpannya berfungsi"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Masuk"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Masukkan kata sandi Anda saat ini untuk mengubah pengaturan profil" msgstr "Masukkan kata sandi Anda saat ini untuk mengubah pengaturan profil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Memfilter ekspresi" msgstr "Memfilter ekspresi"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Lupa kata sandi?" msgstr "Lupa kata sandi?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ups!" msgstr "Ups!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Verifica che il feed funzioni"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Invio"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Inserisci la tua password attuale per modificare le impostazioni del profilo" msgstr "Inserisci la tua password attuale per modificare le impostazioni del profilo"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Espressione filtrante" msgstr "Espressione filtrante"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Password dimenticata?" msgstr "Password dimenticata?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ops!" msgstr "Ops!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -9,17 +9,17 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: https://github.com/dai\n"
"Language-Team: \n" "Language-Team: \n"
"Plural-Forms: \n" "Plural-Forms: \n"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>." msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
msgstr "" msgstr "<0>CommaFeed はオープンソースのプロジェクトです。 ソースは以下でホストされています </0><1>GitHub</1>。"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "<0>Complete syntax is available </0><1>here</1>." msgid "<0>Complete syntax is available </0><1>here</1>."
msgstr "" msgstr "<0>完全な syntax </0><1>こちら</1>で利用可能です。"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
msgid "<0>Have an account?</0><1>Log in!</1>" msgid "<0>Have an account?</0><1>Log in!</1>"
@@ -27,7 +27,7 @@ msgstr "<0>アカウントをお持ちですか?</0><1>ログインしてくだ
#: src/pages/app/DonatePage.tsx #: src/pages/app/DonatePage.tsx
msgid "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaFeed in my free time for over 10 years now. Thanks for taking an interest in helping me continue supporting CommaFeed.</1>" msgid "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaFeed in my free time for over 10 years now. Thanks for taking an interest in helping me continue supporting CommaFeed.</1>"
msgstr "" msgstr "<0>こんにちは、</0><1>私はベルギーのジェレミーです。私はこれまで 10 年以上、CommaFeed のオープンソースプロジェクトを無料で開発してきました。あなたの関心に感謝します。</1>"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "<0>Need an account?</0><1>Sign up!</1>" msgid "<0>Need an account?</0><1>Sign up!</1>"
@@ -36,7 +36,7 @@ msgstr "<0>アカウントが必要ですか?</0><1>サインアップ!</1>"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "About" msgid "About"
msgstr "" msgstr "About"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Actions" msgid "Actions"
@@ -44,7 +44,7 @@ msgstr "アクション"
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
msgid "Add" msgid "Add"
msgstr "追" msgstr "追"
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx
msgid "Add category" msgid "Add category"
@@ -58,27 +58,27 @@ msgstr "ユーザー追加"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Admin" msgid "Admin"
msgstr "管理" msgstr "管理"
#: src/app/constants.ts #: src/app/constants.ts
#: src/components/content/add/CategorySelect.tsx #: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx #: src/components/sidebar/Tree.tsx
msgid "All" msgid "All"
msgstr "全員" msgstr "すべて"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Always" msgid "Always"
msgstr "" msgstr "常に"
#: src/pages/auth/PasswordRecoveryPage.tsx #: src/pages/auth/PasswordRecoveryPage.tsx
msgid "An email has been sent if this address was registered. Check your inbox." msgid "An email has been sent if this address was registered. Check your inbox."
msgstr "このアドレスが登録されていれば、メール送信されました。" msgstr "このアドレスに確認メール送信ました。受信箱を確認してください。"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your data from other feed reading services." msgid "An opml file is an XML file containing feed URLs and categories. You can get an OPML file by exporting your data from other feed reading services."
msgstr "opml ファイルは、フィードの URL とカテゴリを含む XML ファイルです。" msgstr "opmlファイルは、フィードのURLとカテゴリを含むXMLファイルです。OPMLファイルは他のフィードサービスからエクスポートして取得することができます"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Analyze feed" msgid "Analyze feed"
@@ -86,7 +86,7 @@ msgstr "フィードを分析する"
#: src/components/AnnouncementDialog.tsx #: src/components/AnnouncementDialog.tsx
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr "お知らせ"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "API key" msgid "API key"
@@ -94,27 +94,27 @@ msgstr "APIキー"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Are you sure you want to delete category <0>{categoryName}</0>?" msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
msgstr "カテゴリ <0>{categoryName}</0> を削除してもよろしいですか?" msgstr "カテゴリ <0>{categoryName}</0> を削除してもよろしいですか"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Are you sure you want to delete user <0>{userName}</0> ?" msgid "Are you sure you want to delete user <0>{userName}</0> ?"
msgstr "ユーザー <0>{userName}</0> を削除してもよろしいですか?" msgstr "ユーザー <0>{userName}</0> を削除してもよろしいですか"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Are you sure you want to delete your account? There's no turning back!" msgid "Are you sure you want to delete your account? There's no turning back!"
msgstr "本当にアカウントを削除しますか?" msgstr "本当にアカウントを削除しますか?元には戻せません!"
#: src/components/header/MarkAllAsReadButton.tsx #: src/components/header/MarkAllAsReadButton.tsx
msgid "Are you sure you want to mark all entries of <0>{sourceLabel}</0> as read?" msgid "Are you sure you want to mark all entries of <0>{sourceLabel}</0> as read?"
msgstr "<0>{sourceLabel}</0> のすべてのエントリを既読にしますか?" msgstr "<0>{sourceLabel}</0> のすべてのエントリを既読にしますか"
#: src/components/header/MarkAllAsReadButton.tsx #: src/components/header/MarkAllAsReadButton.tsx
msgid "Are you sure you want to mark entries older than {threshold} days of <0>{sourceLabel}</0> as read?" msgid "Are you sure you want to mark entries older than {threshold} days of <0>{sourceLabel}</0> as read?"
msgstr "<0>{sourceLabel}</0> の {threshold} 日より前のエントリを既読としてマークしてもよろしいですか?" msgstr "<0>{sourceLabel}</0> の {threshold} 日より前のエントリを既読としてマークしてもよろしいですか"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?" msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
msgstr "<0>{feedName}</0> の登録を解除してもよろしいですか?" msgstr "<0>{feedName}</0> の登録を解除してもよろしいですか"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Asc" msgid "Asc"
@@ -126,7 +126,7 @@ msgstr "使用可能な変数は「title」、「content」、「url」、「aut
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "" msgstr "戻る"
#: src/pages/auth/PasswordRecoveryPage.tsx #: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Back to log in" msgid "Back to log in"
@@ -134,11 +134,15 @@ msgstr "ログインに戻る"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Browser extension required for Chrome" msgid "Browser extension required for Chrome"
msgstr "" msgstr "Chromeのブラウザー拡張が必要です"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr "ブラウザー拡張"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "ブラウザータブ"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
@@ -166,7 +170,7 @@ msgstr "カテゴリー"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Changing password will generate a new API key" msgid "Changing password will generate a new API key"
msgstr "パスワードを変更すると、新しい API キーが生成されます" msgstr "パスワードを変更すると、新しいAPIキーが生成されます"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Check that the feed is working" msgid "Check that the feed is working"
@@ -174,23 +178,27 @@ msgstr "フィードが動作していることを確認してください"
#: src/pages/app/Layout.tsx #: src/pages/app/Layout.tsx
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr "メニューを閉じる"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr "Cmd"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr "CommaFeed ブラウザー拡張機能のバージョンは {browserExtensionVersion} です。"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>." msgid "CommaFeed is compatible with the Fever API. Use the following URL in your Fever-compatible mobile client. Login with your username and your <0>API key</0>."
msgstr "" msgstr "CommaFeedはFever APIと互換性があります。Fever互換のモバイルクライアントで次のURLを使用してください。ユーザー名と <0>API キー</0> でログインしてください。"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed next unread item" msgid "CommaFeed next unread item"
msgstr "次の未読アイテムをカンマフィード" msgstr "CommaFeed 次の未読アイテム"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed version {version} ({revision})." msgid "CommaFeed version {version} ({revision})."
msgstr "" msgstr "CommaFeed バージョン {version} ({revision})。"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Compact" msgid "Compact"
@@ -210,11 +218,11 @@ msgstr "パスワード確認"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Cozy" msgid "Cozy"
msgstr "コージー" msgstr "Cozy"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl" msgid "Ctrl"
msgstr "コントロール" msgstr "Ctrl"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Current password" msgid "Current password"
@@ -222,19 +230,19 @@ msgstr "現在のパスワード"
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
msgid "Custom code" msgid "Custom code"
msgstr "" msgstr "カスタムコード"
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
msgid "Custom CSS rules that will be applied" msgid "Custom CSS rules that will be applied"
msgstr "" msgstr "適用されるカスタムCSSルール"
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
msgid "Custom JS code that will be executed on page load" msgid "Custom JS code that will be executed on page load"
msgstr "" msgstr "ページ読み込み時に実行されるカスタムJSコード"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Dark" msgid "Dark"
msgstr "" msgstr "ダーク"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Date created" msgid "Date created"
@@ -251,7 +259,7 @@ msgstr "アカウント削除"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete Category" msgid "Delete Category"
msgstr "カテゴリを削除" msgstr "カテゴリを削除"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Delete user" msgid "Delete user"
@@ -263,7 +271,7 @@ msgstr "説明"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Detailed" msgid "Detailed"
msgstr "" msgstr "詳細"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
@@ -273,7 +281,7 @@ msgstr "ディスプレイ"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/app/DonatePage.tsx #: src/pages/app/DonatePage.tsx
msgid "Donate" msgid "Donate"
msgstr "" msgstr "寄付"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Download" msgid "Download"
@@ -298,7 +306,7 @@ msgstr "メールアドレス"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Edit user" msgid "Edit user"
msgstr "ユーザー編集" msgstr "ユーザー編集"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
@@ -313,9 +321,13 @@ msgstr "入力"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "プロファイル設定を変更するには、現在のパスワードを入力してください" msgstr "プロファイル設定を変更するには、現在のパスワードを入力してください"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr "エントリーを選択したとき、読みやすさに応じたスクロール調整を行います。"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr "エントリーヘッダー"
#: src/components/Alert.tsx #: src/components/Alert.tsx
msgid "Error" msgid "Error"
@@ -323,7 +335,7 @@ msgstr "エラー"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Example: {example}." msgid "Example: {example}."
msgstr "例: {}." msgstr "例: {example}."
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Expanded" msgid "Expanded"
@@ -336,7 +348,7 @@ msgstr "サブスクリプションとカテゴリを、他のフィード読み
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Extension options" msgid "Extension options"
msgstr "" msgstr "拡張機能オプション"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Feed name" msgid "Feed name"
@@ -350,43 +362,47 @@ msgstr "フィード URL"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now" msgid "Fetch all my feeds now"
msgstr "" msgstr "すべてのフィードを今すぐ取得"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Fever API" msgid "Fever API"
msgstr "" msgstr "Fever API"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Fever API URL" msgid "Fever API URL"
msgstr "" msgstr "Fever API URL"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "Filtering expression" msgid "Filtering expression"
msgstr "フィルタリング式" msgstr "フィルタリング式"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr "フィードの強制フェッチはまだ利用できません。"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "パスワードをお忘れですか?" msgstr "パスワードをお忘れですか"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx #: src/pages/app/TagDetailsPage.tsx
msgid "Generate an API key in your profile first." msgid "Generate an API key in your profile first."
msgstr "最初にプロファイルで API キーを生成します。" msgstr "最初にプロファイルでAPIキーを生成します。"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "Generate new API key" msgid "Generate new API key"
msgstr "新しい API キーを生成する" msgstr "新しいAPIキーを生成する"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
#: src/pages/app/TagDetailsPage.tsx #: src/pages/app/TagDetailsPage.tsx
msgid "Generated feed url" msgid "Generated feed url"
msgstr "生成されたフィード URL" msgstr "生成されたフィードURL"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Go to {0}" msgid "Go to {0}"
msgstr "" msgstr "{0} に移動"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Go to the All view" msgid "Go to the All view"
@@ -394,11 +410,11 @@ msgstr "すべてのビューに移動"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Go to the API documentation." msgid "Go to the API documentation."
msgstr "API ドキュメントに移動します。" msgstr "APIドキュメントに移動します。"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Goodies" msgid "Goodies"
msgstr "グッディーズ" msgstr "グッズ"
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
msgid "Id" msgid "Id"
@@ -406,15 +422,15 @@ msgstr "ID"
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically." msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "空でない場合は、'true' または 'false' に評価される式。 " msgstr "空でない場合は、'true' または 'false' に評価される式。 'false' の場合、このフィードの新しいエントリーは自動的に既読としてマークされます。"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "If the entry doesn't entirely fit on the screen" msgid "If the entry doesn't entirely fit on the screen"
msgstr "" msgstr "エントリーが画面に完全に収まらない場合"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "If you encounter an issue, please report it on the issues page of the GitHub project." msgid "If you encounter an issue, please report it on the issues page of the GitHub project."
msgstr "問題が発生した場合は、GitHub プロジェクトの問題ページで報告してください。" msgstr "問題が発生した場合は、GitHubプロジェクトのissuesページで報告してください。"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "Import" msgid "Import"
@@ -422,7 +438,7 @@ msgstr "インポート"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "In expanded view, scrolling through entries mark them as read" msgid "In expanded view, scrolling through entries mark them as read"
msgstr "展開ビューでエントリをスクロールすると、それらが既読としてマークされます" msgstr "展開ビューでエントリをスクロールすると、それらが既読としてマークされます"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -452,7 +468,7 @@ msgstr "最終更新メッセージ"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Light" msgid "Light"
msgstr "" msgstr "ライト"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
@@ -488,7 +504,7 @@ msgstr "ログアウト"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Long press" msgid "Long press"
msgstr "" msgstr "長押し"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
#: src/pages/admin/AdminUsersPage.tsx #: src/pages/admin/AdminUsersPage.tsx
@@ -502,7 +518,7 @@ msgstr "すべて既読にする"
#: src/components/header/MarkAllAsReadButton.tsx #: src/components/header/MarkAllAsReadButton.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Mark all entries as read" msgid "Mark all entries as read"
msgstr "すべてのエントリを既読にする" msgstr "すべてのエントリを既読にする"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -516,11 +532,11 @@ msgstr "ここまで既読にする"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "メトリクス" msgstr "メトリクス"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Middle click" msgid "Middle click"
msgstr "" msgstr "中クリック"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Move the page down" msgid "Move the page down"
@@ -549,7 +565,7 @@ msgstr "名前を入力してサブスクリプションに移動します"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Never" msgid "Never"
msgstr "" msgstr "しない"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "New password" msgid "New password"
@@ -574,11 +590,11 @@ msgstr "次の未読アイテムのブックマークレット"
#: src/pages/app/FeedEntriesPage.tsx #: src/pages/app/FeedEntriesPage.tsx
msgid "No more entries" msgid "No more entries"
msgstr "これ以上エントリはありません" msgstr "これ以上エントリはありません"
#: src/components/content/ShareButtons.tsx #: src/components/content/ShareButtons.tsx
msgid "No sharing options available." msgid "No sharing options available."
msgstr "" msgstr "共有オプションは利用できません。"
#: src/components/sidebar/TreeSearch.tsx #: src/components/sidebar/TreeSearch.tsx
msgid "Nothing found" msgid "Nothing found"
@@ -590,15 +606,19 @@ msgstr "古い順"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On desktop" msgid "On desktop"
msgstr "" msgstr "デスクトップ"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile" msgid "On mobile"
msgstr "" msgstr "モバイル"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr "モバイルでは、画面の下部にアクションボタンを表示します"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr "これはコンパクト/cozy/詳細モードでのみ適用されます"
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
@@ -606,15 +626,15 @@ msgstr "おっと!"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Open CommaFeed" msgid "Open CommaFeed"
msgstr "" msgstr "CommaFeedを開く"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open current entry in a new tab" msgid "Open current entry in a new tab"
msgstr "現在のエントリを新しいタブで開く" msgstr "現在のエントリを新しいタブで開く"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open current entry in a new tab in the background" msgid "Open current entry in a new tab in the background"
msgstr "現在のエントリバックグラウンドで新しいタブで開く" msgstr "現在のエントリーを新しいバックグラウンドタブで開く"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
#: src/components/content/header/OpenExternalLink.tsx #: src/components/content/header/OpenExternalLink.tsx
@@ -623,31 +643,31 @@ msgstr "リンクを開く"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Open link in new background tab" msgid "Open link in new background tab"
msgstr "" msgstr "リンクを新しいバックグラウンドタブで開く"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
msgid "Open link in new tab" msgid "Open link in new tab"
msgstr "" msgstr "リンクを新しいタブで開く"
#: src/pages/app/Layout.tsx #: src/pages/app/Layout.tsx
msgid "Open menu" msgid "Open menu"
msgstr "" msgstr "メニューを開く"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open next entry" msgid "Open next entry"
msgstr "次のエントリを開く" msgstr "次のエントリを開く"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open previous entry" msgid "Open previous entry"
msgstr "前のエントリを開く" msgstr "前のエントリを開く"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Open/close current entry" msgid "Open/close current entry"
msgstr "現在のエントリを開く/閉じる" msgstr "現在のエントリを開く/閉じる"
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx
msgid "OPML" msgid "OPML"
msgstr "" msgstr "OPML"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "OPML export" msgid "OPML export"
@@ -660,7 +680,7 @@ msgstr "OPMLファイル"
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
msgid "OPML file is required" msgid "OPML file is required"
msgstr "" msgstr "OPMLファイルは必要です"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "Order" msgid "Order"
@@ -697,7 +717,7 @@ msgstr "位置"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Previous" msgid "Previous"
msgstr "" msgstr "前へ"
#: src/pages/app/SettingsPage.tsx #: src/pages/app/SettingsPage.tsx
msgid "Profile" msgid "Profile"
@@ -714,16 +734,16 @@ msgstr "リフレッシュ"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
msgid "Registrations are closed on this CommaFeed instance" msgid "Registrations are closed on this CommaFeed instance"
msgstr "この CommaFeed インスタンスの登録は終了しています" msgstr "このCommaFeedインスタンスの登録は終了しています"
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "REST API" msgid "REST API"
msgstr "" msgstr "REST API"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click" msgid "Right click"
msgstr "" msgstr "右クリック"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/settings/CustomCodeSettings.tsx #: src/components/settings/CustomCodeSettings.tsx
@@ -735,15 +755,15 @@ msgstr "保存"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scroll selected entry to the top of the page" msgid "Scroll selected entry to the top of the page"
msgstr "" msgstr "エントリーを選択したときのスクロール調整"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scroll smoothly when navigating between entries" msgid "Scroll smoothly when navigating between entries"
msgstr "エントリ間を移動するときにスムーズにスクロールする" msgstr "エントリ間を移動するときにスムーズにスクロールする"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Scrolling" msgid "Scrolling"
msgstr "" msgstr "スクロール"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
@@ -754,15 +774,15 @@ msgstr "検索"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Search requires at least 3 characters" msgid "Search requires at least 3 characters"
msgstr "検索には少なくとも 3 文字が必要です" msgstr "検索には少なくとも3文字が必要です"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on next entry without opening it" msgid "Set focus on next entry without opening it"
msgstr "次のエントリを開かずにフォーカスを設定する" msgstr "次のエントリを開かずにフォーカスする"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Set focus on previous entry without opening it" msgid "Set focus on previous entry without opening it"
msgstr "前のエントリを開かずにフォーカスを設定する" msgstr "前のエントリを開かずにフォーカスする"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Settings" msgid "Settings"
@@ -784,31 +804,31 @@ msgstr "共有サイト"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Shift" msgid "Shift"
msgstr "シフト" msgstr "Shift"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show CommaFeed's own context menu on right click" msgid "Show CommaFeed's own context menu on right click"
msgstr "" msgstr "右クリックでCommaFeedのコンテキストメニューを表示する"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show confirmation when marking all entries as read" msgid "Show confirmation when marking all entries as read"
msgstr "" msgstr "すべてのエントリーを既読にするときに確認を表示する"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show entry menu (desktop)" msgid "Show entry menu (desktop)"
msgstr "" msgstr "エントリーメニューを表示する(デスクトップ)"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show entry menu (mobile)" msgid "Show entry menu (mobile)"
msgstr "" msgstr "エントリーメニューを表示する(モバイル)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show external link icon" msgid "Show external link icon"
msgstr "" msgstr "外部リンクアイコンを表示する"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show feeds and categories with no unread entries" msgid "Show feeds and categories with no unread entries"
msgstr "未読エントリのないフィードとカテゴリを表示する" msgstr "未読エントリのないフィードとカテゴリを表示する"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show keyboard shortcut help" msgid "Show keyboard shortcut help"
@@ -816,11 +836,19 @@ msgstr "キーボード ショートカットのヘルプを表示"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Show native menu (desktop)" msgid "Show native menu (desktop)"
msgstr "" msgstr "ネイティブメニューを表示する(デスクトップ)"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr "スターアイコンを表示する"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr "未読数をタブのアイコンに表示する"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr "未読数をタブのタイトルに表示する"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
@@ -830,12 +858,12 @@ msgstr "サインアップ"
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Something bad just happened..." msgid "Something bad just happened..."
msgstr "何か悪いことが起こった..." msgstr "何か悪いことが起きました..."
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Space" msgid "Space"
msgstr "スペース" msgstr "Space"
#: src/components/content/FeedEntryContextMenu.tsx #: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -868,7 +896,7 @@ msgstr "成功"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Swipe header to the left" msgid "Swipe header to the left"
msgstr "" msgstr "ヘッダーを左にスワイプ"
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Switch to dark theme" msgid "Switch to dark theme"
@@ -880,7 +908,7 @@ msgstr "ライトテーマに切り替え"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "System" msgid "System"
msgstr "" msgstr "システム"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
@@ -889,7 +917,7 @@ msgstr "タグ"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page." msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
msgstr "購読したいフィードのURL。 " msgstr "購読したいフィードのURL。ウェブサイトのURLを直接使用して、CommaFeedはページ内のフィードを検索します。"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Theme" msgid "Theme"
@@ -897,27 +925,27 @@ msgstr "テーマ"
#: src/components/settings/ProfileSettings.tsx #: src/components/settings/ProfileSettings.tsx
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key" 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 "" msgstr "これはあなたのAPIキーです。いくつかの読み取り専用API操作に使用できます。これにより、Fever APIへのアクセスが可能になります。ページの下部のフォームを使用して新しいAPIキーを生成します。"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle read status of current entry" msgid "Toggle read status of current entry"
msgstr "現在のエントリの読み取りステータスを切り替えます" msgstr "現在のエントリの読み取りステータスを切り替えます"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle sidebar" msgid "Toggle sidebar"
msgstr "" msgstr "サイドバーを切り替える"
#: src/components/KeyboardShortcutsHelp.tsx #: src/components/KeyboardShortcutsHelp.tsx
msgid "Toggle starred status of current entry" msgid "Toggle starred status of current entry"
msgstr "" msgstr "現在のエントリーのスターステータスを切り替える"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo" msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "デモアカウントで CommaFeed を試す: demo/demo" msgstr "デモアカウントでCommaFeedを試す: demo/demo"
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx
msgid "Try the demo!" msgid "Try the demo!"
msgstr "" msgstr "デモを試す!"
#: src/components/header/Header.tsx #: src/components/header/Header.tsx
msgid "Unread" msgid "Unread"
@@ -953,8 +981,8 @@ msgstr "ウェブサイト"
#: src/pages/app/FeedEntriesPage.tsx #: src/pages/app/FeedEntriesPage.tsx
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?" msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
msgstr "まだサブスクリプションがありません。" msgstr "まだサブスクリプションがありません。上部の + 記号をクリックして1つ追加してみませんか"
#: src/components/header/ProfileMenu.tsx #: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh." msgid "Your feeds have been queued for refresh."
msgstr "" msgstr "フィードの更新がキューに登録されました。"

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "피드가 작동하는지 확인"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "입력"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "프로필 설정을 변경하려면 현재 비밀번호를 입력하세요." msgstr "프로필 설정을 변경하려면 현재 비밀번호를 입력하세요."
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "필터링 표현식" msgstr "필터링 표현식"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "비밀번호를 잊으셨나요?" msgstr "비밀번호를 잊으셨나요?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "앗!" msgstr "앗!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Semak sama ada suapan berfungsi"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Masuk"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Masukkan kata laluan semasa anda untuk menukar tetapan profil" msgstr "Masukkan kata laluan semasa anda untuk menukar tetapan profil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Ungkapan penapisan" msgstr "Ungkapan penapisan"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Lupa kata laluan?" msgstr "Lupa kata laluan?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Aduh!" msgstr "Aduh!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Sjekk at feeden fungerer"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Skriv inn ditt nåværende passord for å endre profilinnstillinger" msgstr "Skriv inn ditt nåværende passord for å endre profilinnstillinger"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrerende uttrykk" msgstr "Filtrerende uttrykk"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Glemt passord?" msgstr "Glemt passord?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Beklager!" msgstr "Beklager!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Controleer of de feed werkt"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Voer uw huidige wachtwoord in om de profielinstellingen te wijzigen" msgstr "Voer uw huidige wachtwoord in om de profielinstellingen te wijzigen"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Uitdrukking filteren" msgstr "Uitdrukking filteren"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Wachtwoord vergeten?" msgstr "Wachtwoord vergeten?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Oeps!" msgstr "Oeps!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Sjekk at feeden fungerer"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Skriv inn ditt nåværende passord for å endre profilinnstillinger" msgstr "Skriv inn ditt nåværende passord for å endre profilinnstillinger"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrerende uttrykk" msgstr "Filtrerende uttrykk"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Glemt passord?" msgstr "Glemt passord?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Beklager!" msgstr "Beklager!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Sprawdź, czy kanał działa"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Wprowadź"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Wprowadź swoje aktualne hasło, aby zmienić ustawienia profilu" msgstr "Wprowadź swoje aktualne hasło, aby zmienić ustawienia profilu"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Wyrażenie filtrujące" msgstr "Wyrażenie filtrujące"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Zapomniałeś hasła?" msgstr "Zapomniałeś hasła?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ups!" msgstr "Ups!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Verifique se o feed está funcionando"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Entrar"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Digite sua senha atual para alterar as configurações do perfil" msgstr "Digite sua senha atual para alterar as configurações do perfil"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrando expressão" msgstr "Filtrando expressão"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Esqueceu a senha?" msgstr "Esqueceu a senha?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Opa!" msgstr "Opa!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "Для браузера Chrome требуется расширение"
msgid "Browser extention" msgid "Browser extention"
msgstr "Расширение для браузера" msgstr "Расширение для браузера"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Проверьте, работает ли лента."
msgid "Close menu" msgid "Close menu"
msgstr "Закрыть меню" msgstr "Закрыть меню"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "Версия расширения браузера CommaFeed {browserExtensionVersion}." msgstr "Версия расширения браузера CommaFeed {browserExtensionVersion}."
@@ -313,6 +321,10 @@ msgstr "Ввод"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Введите текущий пароль, чтобы изменить настройки профиля." msgstr "Введите текущий пароль, чтобы изменить настройки профиля."
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr "Ссылка Fever API"
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Выражение фильтрации" msgstr "Выражение фильтрации"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Забыли пароль?" msgstr "Забыли пароль?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "На мобильных устройствах отображать кнопки действий в нижней части экрана" msgstr "На мобильных устройствах отображать кнопки действий в нижней части экрана"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ой!" msgstr "Ой!"
@@ -822,6 +842,14 @@ msgstr "Показать родное меню (ПК)"
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Skontrolujte, či feed funguje"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr "Vstúpte"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Ak chcete zmeniť nastavenia profilu, zadajte svoje aktuálne heslo" msgstr "Ak chcete zmeniť nastavenia profilu, zadajte svoje aktuálne heslo"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrovanie výrazu" msgstr "Filtrovanie výrazu"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Zabudli ste heslo?" msgstr "Zabudli ste heslo?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Ojoj!" msgstr "Ojoj!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Kontrollera att matningen fungerar"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "" msgstr ""
@@ -313,6 +321,10 @@ msgstr ""
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Ange ditt nuvarande lösenord för att ändra profilinställningar" msgstr "Ange ditt nuvarande lösenord för att ändra profilinställningar"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtrerande uttryck" msgstr "Filtrerande uttryck"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Glömt lösenord?" msgstr "Glömt lösenord?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Hoppsan!" msgstr "Hoppsan!"
@@ -822,6 +842,14 @@ msgstr ""
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr ""
msgid "Browser extention" msgid "Browser extention"
msgstr "Tarayıcı eklentisi" msgstr "Tarayıcı eklentisi"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr ""
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "Feed'in çalışıp çalışmadığını kontrol edin"
msgid "Close menu" msgid "Close menu"
msgstr "" msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "CommaFeed tarayıcı eklentisi sürüm {browserExtensionVersion}." msgstr "CommaFeed tarayıcı eklentisi sürüm {browserExtensionVersion}."
@@ -313,6 +321,10 @@ msgstr "Girin"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "Profil ayarlarını değiştirmek için mevcut şifrenizi girin" msgstr "Profil ayarlarını değiştirmek için mevcut şifrenizi girin"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr ""
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "" msgstr ""
@@ -364,6 +376,10 @@ msgstr ""
msgid "Filtering expression" msgid "Filtering expression"
msgstr "Filtreleme ifadesi" msgstr "Filtreleme ifadesi"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr ""
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "Parolanızı mı unuttunuz?" msgstr "Parolanızı mı unuttunuz?"
@@ -600,6 +616,10 @@ msgstr ""
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "Hata!" msgstr "Hata!"
@@ -822,6 +842,14 @@ msgstr "Orijinal tarayıcı menüsünü göster (masaüstü)"
msgid "Show star icon" msgid "Show star icon"
msgstr "" msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr ""
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr ""
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -140,6 +140,10 @@ msgstr "浏览器扩展"
msgid "Browser extention" msgid "Browser extention"
msgstr "浏览器扩展" msgstr "浏览器扩展"
#: src/components/settings/DisplaySettings.tsx
msgid "Browser tab"
msgstr "浏览器标签页"
#: src/components/admin/UserEdit.tsx #: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx #: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx #: src/components/content/add/ImportOpml.tsx
@@ -176,6 +180,10 @@ msgstr "检查信息流是否正常工作"
msgid "Close menu" msgid "Close menu"
msgstr "关闭菜单" msgstr "关闭菜单"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Cmd"
msgstr ""
#: src/pages/app/AboutPage.tsx #: src/pages/app/AboutPage.tsx
msgid "CommaFeed browser extension version {browserExtensionVersion}." msgid "CommaFeed browser extension version {browserExtensionVersion}."
msgstr "CommaFeed的浏览器扩展版本{browserExtensionVersion}。" msgstr "CommaFeed的浏览器扩展版本{browserExtensionVersion}。"
@@ -313,6 +321,10 @@ msgstr "回车"
msgid "Enter your current password to change profile settings" msgid "Enter your current password to change profile settings"
msgstr "输入您当前的密码以更改配置文件设置" msgstr "输入您当前的密码以更改配置文件设置"
#: src/components/settings/DisplaySettings.tsx
msgid "Entries to keep above the selected entry when scrolling"
msgstr "滚动时固定在顶部的条目"
#: src/components/settings/DisplaySettings.tsx #: src/components/settings/DisplaySettings.tsx
msgid "Entry headers" msgid "Entry headers"
msgstr "条目头部" msgstr "条目头部"
@@ -364,6 +376,10 @@ msgstr "Fever API 网址"
msgid "Filtering expression" msgid "Filtering expression"
msgstr "过滤表达式" msgstr "过滤表达式"
#: src/components/header/ProfileMenu.tsx
msgid "Force fetching feeds is not yet available."
msgstr "强制获取订阅源功能不可用。"
#: src/pages/auth/LoginPage.tsx #: src/pages/auth/LoginPage.tsx
msgid "Forgot password?" msgid "Forgot password?"
msgstr "忘记密码?" msgstr "忘记密码?"
@@ -600,6 +616,10 @@ msgstr "移动端"
msgid "On mobile, show action buttons at the bottom of the screen" msgid "On mobile, show action buttons at the bottom of the screen"
msgstr "在移动端,显示屏幕底部的操作按钮" msgstr "在移动端,显示屏幕底部的操作按钮"
#: src/components/settings/DisplaySettings.tsx
msgid "Only applies to compact, cozy and detailed modes"
msgstr ""
#: src/pages/ErrorPage.tsx #: src/pages/ErrorPage.tsx
msgid "Oops!" msgid "Oops!"
msgstr "哎呀!" msgstr "哎呀!"
@@ -822,6 +842,14 @@ msgstr "显示原生菜单(桌面端)"
msgid "Show star icon" msgid "Show star icon"
msgstr "显示星标图标" msgstr "显示星标图标"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab favicon"
msgstr "在标签页图标上显示未读数量"
#: src/components/settings/DisplaySettings.tsx
msgid "Show unread count in tab title"
msgstr "在标签页标题中显示未读数量"
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx #: src/pages/auth/RegistrationPage.tsx
#: src/pages/WelcomePage.tsx #: src/pages/WelcomePage.tsx

View File

@@ -6,11 +6,13 @@ import "react-contexify/ReactContexify.css"
import { App } from "App" import { App } from "App"
import { store } from "app/store" import { store } from "app/store"
import dayjs from "dayjs" import dayjs from "dayjs"
import duration from "dayjs/plugin/duration"
import relativeTime from "dayjs/plugin/relativeTime" import relativeTime from "dayjs/plugin/relativeTime"
import ReactDOM from "react-dom/client" import ReactDOM from "react-dom/client"
import { Provider } from "react-redux" import { Provider } from "react-redux"
dayjs.extend(relativeTime) dayjs.extend(relativeTime)
dayjs.extend(duration)
const root = document.getElementById("root") const root = document.getElementById("root")
root && root &&

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Box, Button, Container, Group, Text, Title } from "@mantine/core" import { Box, Button, Container, Group, Text, Title } from "@mantine/core"
import { TbRefresh } from "react-icons/tb" import { TbRefresh } from "react-icons/tb"
import { tss } from "tss" import { tss } from "tss"

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { Anchor, Box, Center, Container, Divider, Group, Image, Space, Title, useMantineColorScheme } from "@mantine/core" import { Anchor, Box, Center, Container, Divider, Group, Image, Space, Title, useMantineColorScheme } from "@mantine/core"
import { client } from "app/client" import { client } from "app/client"
import { redirectToApiDocumentation, redirectToLogin, redirectToRegistration, redirectToRootCategory } from "app/redirect/thunks" import { redirectToApiDocumentation, redirectToLogin, redirectToRegistration, redirectToRootCategory } from "app/redirect/thunks"
@@ -9,7 +9,7 @@ import { ActionButton } from "components/ActionButton"
import { useBrowserExtension } from "hooks/useBrowserExtension" import { useBrowserExtension } from "hooks/useBrowserExtension"
import { useMobile } from "hooks/useMobile" import { useMobile } from "hooks/useMobile"
import { useAsyncCallback } from "react-async-hook" import { useAsyncCallback } from "react-async-hook"
import { SiGithub, SiTwitter } from "react-icons/si" import { SiGithub, SiX } from "react-icons/si"
import { TbClock, TbKey, TbMoon, TbSettings, TbSun, TbUserPlus } from "react-icons/tb" import { TbClock, TbKey, TbMoon, TbSettings, TbSun, TbUserPlus } from "react-icons/tb"
import { PageTitle } from "./PageTitle" import { PageTitle } from "./PageTitle"
@@ -38,7 +38,7 @@ export function WelcomePage() {
{serverInfos?.demoAccountEnabled && ( {serverInfos?.demoAccountEnabled && (
<Center> <Center>
<ActionButton <ActionButton
label={<Trans>Try the demo!</Trans>} label={msg`Try the demo!`}
icon={<TbClock size={iconSize} />} icon={<TbClock size={iconSize} />}
variant="outline" variant="outline"
onClick={async () => await login.execute({ name: "demo", password: "demo" })} onClick={async () => await login.execute({ name: "demo", password: "demo" })}
@@ -96,7 +96,7 @@ function Buttons() {
return ( return (
<Group gap={14}> <Group gap={14}>
<ActionButton <ActionButton
label={<Trans>Log in</Trans>} label={msg`Log in`}
icon={<TbKey size={iconSize} />} icon={<TbKey size={iconSize} />}
variant="outline" variant="outline"
onClick={async () => await dispatch(redirectToLogin())} onClick={async () => await dispatch(redirectToLogin())}
@@ -104,7 +104,7 @@ function Buttons() {
/> />
{serverInfos?.allowRegistrations && ( {serverInfos?.allowRegistrations && (
<ActionButton <ActionButton
label={<Trans>Sign up</Trans>} label={msg`Sign up`}
icon={<TbUserPlus size={iconSize} />} icon={<TbUserPlus size={iconSize} />}
variant="filled" variant="filled"
onClick={async () => await dispatch(redirectToRegistration())} onClick={async () => await dispatch(redirectToRegistration())}
@@ -113,7 +113,7 @@ function Buttons() {
)} )}
<ActionButton <ActionButton
label={dark ? <Trans>Switch to light theme</Trans> : <Trans>Switch to dark theme</Trans>} label={dark ? msg`Switch to light theme` : msg`Switch to dark theme`}
icon={colorScheme === "dark" ? <TbSun size={18} /> : <TbMoon size={iconSize} />} icon={colorScheme === "dark" ? <TbSun size={18} /> : <TbMoon size={iconSize} />}
onClick={() => toggleColorScheme()} onClick={() => toggleColorScheme()}
hideLabelOnDesktop hideLabelOnDesktop
@@ -121,7 +121,7 @@ function Buttons() {
{isBrowserExtensionPopup && ( {isBrowserExtensionPopup && (
<ActionButton <ActionButton
label={<Trans>Extension options</Trans>} label={msg`Extension options`}
icon={<TbSettings size={iconSize} />} icon={<TbSettings size={iconSize} />}
onClick={() => openSettingsPage()} onClick={() => openSettingsPage()}
hideLabelOnDesktop hideLabelOnDesktop
@@ -140,8 +140,8 @@ function Footer() {
<Anchor variant="text" href="https://github.com/Athou/commafeed/" target="_blank" rel="noreferrer"> <Anchor variant="text" href="https://github.com/Athou/commafeed/" target="_blank" rel="noreferrer">
<SiGithub /> <SiGithub />
</Anchor> </Anchor>
<Anchor variant="text" href="https://twitter.com/CommaFeed" target="_blank" rel="noreferrer"> <Anchor variant="text" href="https://x.com/CommaFeed" target="_blank" rel="noreferrer">
<SiTwitter /> <SiX />
</Anchor> </Anchor>
</Group> </Group>
<Box> <Box>

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { ActionIcon, Box, Code, Container, Group, Table, Text, Title, useMantineTheme } from "@mantine/core" import { ActionIcon, Box, Code, Container, Group, Table, Text, Title, useMantineTheme } from "@mantine/core"
import { closeAllModals, openConfirmModal, openModal } from "@mantine/modals" import { closeAllModals, openConfirmModal, openModal } from "@mantine/modals"
import { client, errorToStrings } from "app/client" import { client, errorToStrings } from "app/client"

View File

@@ -1,74 +1,65 @@
import { Accordion, Box, Tabs } from "@mantine/core" import { Accordion, Box } from "@mantine/core"
import { client } from "app/client" import { client } from "app/client"
import { Loader } from "components/Loader" import { Loader } from "components/Loader"
import { Gauge } from "components/metrics/Gauge" import { Gauge } from "components/metrics/Gauge"
import { Meter } from "components/metrics/Meter" import { Meter } from "components/metrics/Meter"
import { MetricAccordionItem } from "components/metrics/MetricAccordionItem" import { MetricAccordionItem } from "components/metrics/MetricAccordionItem"
import { Timer } from "components/metrics/Timer" import { useEffect } from "react"
import { useAsync } from "react-async-hook" import { useAsync } from "react-async-hook"
import { TbChartAreaLine, TbClock } from "react-icons/tb"
const shownMeters: Record<string, string> = { const shownMeters: Record<string, string> = {
"com.commafeed.backend.feed.FeedRefreshEngine.refill": "Feed queue refill rate", "com.commafeed.backend.feed.FeedRefreshEngine.refill": "Feed queue refill rate",
"com.commafeed.backend.feed.FeedRefreshWorker.feedFetched": "Feed fetching rate", "com.commafeed.backend.feed.FeedRefreshWorker.feedFetched": "Feed fetching rate",
"com.commafeed.backend.feed.FeedRefreshUpdater.feedUpdated": "Feed update rate", "com.commafeed.backend.feed.FeedRefreshUpdater.feedUpdated": "Feed update rate",
"com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheHit": "Entry cache hit rate", "com.commafeed.backend.feed.FeedRefreshUpdater.entryInserted": "Entries inserted",
"com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheMiss": "Entry cache miss rate",
"com.commafeed.backend.service.db.DatabaseCleaningService.entriesDeleted": "Entries deleted", "com.commafeed.backend.service.db.DatabaseCleaningService.entriesDeleted": "Entries deleted",
} }
const shownGauges: Record<string, string> = { const shownGauges: Record<string, string> = {
"com.commafeed.backend.feed.FeedRefreshEngine.queue.size": "Queue size", "com.commafeed.backend.feed.FeedRefreshEngine.queue.size": "Feed Refresh Engine queue size",
"com.commafeed.backend.feed.FeedRefreshEngine.worker.active": "Feed Worker active", "com.commafeed.backend.feed.FeedRefreshEngine.worker.active": "Feed Refresh Engine active HTTP workers",
"com.commafeed.backend.feed.FeedRefreshEngine.updater.active": "Feed Updater active", "com.commafeed.backend.feed.FeedRefreshEngine.updater.active": "Feed Refresh Engine active database update workers",
"com.commafeed.backend.HttpGetter.pool.max": "HttpGetter max pool size",
"com.commafeed.backend.HttpGetter.pool.size": "HttpGetter current pool size",
"com.commafeed.backend.HttpGetter.pool.leased": "HttpGetter active connections",
"com.commafeed.backend.HttpGetter.pool.pending": "HttpGetter waiting for a connection",
"com.commafeed.backend.HttpGetter.cache.size": "HttpGetter cached entries",
"com.commafeed.backend.HttpGetter.cache.memoryUsage": "HttpGetter cache memory usage",
"com.commafeed.frontend.ws.WebSocketSessions.users": "WebSocket users", "com.commafeed.frontend.ws.WebSocketSessions.users": "WebSocket users",
"com.commafeed.frontend.ws.WebSocketSessions.sessions": "WebSocket sessions", "com.commafeed.frontend.ws.WebSocketSessions.sessions": "WebSocket sessions",
} }
export function MetricsPage() { export function MetricsPage() {
const query = useAsync(async () => await client.admin.getMetrics(), []) const query = useAsync(async () => await client.admin.getMetrics(), [], {
// keep previous results available while a new request is pending
setLoading: state => ({ ...state, loading: true }),
})
useEffect(() => {
const interval = setInterval(() => query.execute(), 2000)
return () => clearInterval(interval)
}, [query.execute])
if (!query.result) return <Loader /> if (!query.result) return <Loader />
const { meters, gauges, timers } = query.result.data const { meters, gauges } = query.result.data
return ( return (
<Tabs defaultValue="stats"> <>
<Tabs.List> <Accordion variant="contained" chevronPosition="left">
<Tabs.Tab value="stats" leftSection={<TbChartAreaLine size={14} />}> {Object.keys(shownMeters).map(m => (
Stats <MetricAccordionItem key={m} metricKey={m} name={shownMeters[m]} headerValue={meters[m].count}>
</Tabs.Tab> <Meter meter={meters[m]} />
<Tabs.Tab value="timers" leftSection={<TbClock size={14} />}> </MetricAccordionItem>
Timers ))}
</Tabs.Tab> </Accordion>
</Tabs.List>
<Tabs.Panel value="stats" pt="xs"> <Box pt="xs">
<Accordion variant="contained" chevronPosition="left"> {Object.keys(shownGauges).map(g => (
{Object.keys(shownMeters).map(m => ( <Box key={g}>
<MetricAccordionItem key={m} metricKey={m} name={shownMeters[m]} headerValue={meters[m].count}> <span>{shownGauges[g]}:&nbsp;</span>
<Meter meter={meters[m]} /> <Gauge gauge={gauges[g]} />
</MetricAccordionItem> </Box>
))} ))}
</Accordion> </Box>
</>
<Box pt="xs">
{Object.keys(shownGauges).map(g => (
<Box key={g}>
<span>{shownGauges[g]}&nbsp;</span>
<Gauge gauge={gauges[g]} />
</Box>
))}
</Box>
</Tabs.Panel>
<Tabs.Panel value="timers" pt="xs">
<Accordion variant="contained" chevronPosition="left">
{Object.keys(timers).map(key => (
<MetricAccordionItem key={key} metricKey={key} name={key} headerValue={timers[key].count}>
<Timer timer={timers[key]} />
</MetricAccordionItem>
))}
</Accordion>
</Tabs.Panel>
</Tabs>
) )
} }

View File

@@ -1,4 +1,6 @@
import { Trans, t } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Container, List, NativeSelect, SimpleGrid, Title } from "@mantine/core" import { Anchor, Box, Container, List, NativeSelect, SimpleGrid, Title } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import { redirectToApiDocumentation } from "app/redirect/thunks" import { redirectToApiDocumentation } from "app/redirect/thunks"
@@ -36,6 +38,8 @@ function Section(props: { title: React.ReactNode; icon: React.ReactNode; childre
function NextUnreadBookmarklet() { function NextUnreadBookmarklet() {
const [categoryId, setCategoryId] = useState(Constants.categories.all.id) const [categoryId, setCategoryId] = useState(Constants.categories.all.id)
const [order, setOrder] = useState("desc") const [order, setOrder] = useState("desc")
const { _ } = useLingui()
const baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf("#")) const baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf("#"))
const href = `javascript:window.location.href='${baseUrl}next?category=${categoryId}&order=${order}&t='+new Date().getTime();` const href = `javascript:window.location.href='${baseUrl}next?category=${categoryId}&order=${order}&t='+new Date().getTime();`
@@ -44,8 +48,8 @@ function NextUnreadBookmarklet() {
<CategorySelect value={categoryId} onChange={c => c && setCategoryId(c)} withAll description={<Trans>Category</Trans>} /> <CategorySelect value={categoryId} onChange={c => c && setCategoryId(c)} withAll description={<Trans>Category</Trans>} />
<NativeSelect <NativeSelect
data={[ data={[
{ value: "desc", label: t`Newest first` }, { value: "desc", label: _(msg`Newest first`) },
{ value: "asc", label: t`Oldest first` }, { value: "asc", label: _(msg`Oldest first`) },
]} ]}
value={order} value={order}
onChange={e => setOrder(e.target.value)} onChange={e => setOrder(e.target.value)}

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Container, Tabs } from "@mantine/core" import { Container, Tabs } from "@mantine/core"
import { AddCategory } from "components/content/add/AddCategory" import { AddCategory } from "components/content/add/AddCategory"
import { ImportOpml } from "components/content/add/ImportOpml" import { ImportOpml } from "components/content/add/ImportOpml"

View File

@@ -1,4 +1,6 @@
import { Trans } from "@lingui/macro" import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Code, Container, Divider, Group, Input, NumberInput, Stack, Text, TextInput, Title } from "@mantine/core" import { Anchor, Box, Button, Code, Container, Divider, Group, Input, NumberInput, Stack, Text, TextInput, Title } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { openConfirmModal } from "@mantine/modals" import { openConfirmModal } from "@mantine/modals"
@@ -19,6 +21,7 @@ import { useParams } from "react-router-dom"
export function CategoryDetailsPage() { export function CategoryDetailsPage() {
const { id = Constants.categories.all.id } = useParams() const { id = Constants.categories.all.id } = useParams()
const { _ } = useLingui()
const apiKey = useAppSelector(state => state.user.profile?.apiKey) const apiKey = useAppSelector(state => state.user.profile?.apiKey)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
@@ -26,7 +29,7 @@ export function CategoryDetailsPage() {
const query = useAsync(async () => await client.category.getRoot(), []) const query = useAsync(async () => await client.category.getRoot(), [])
const category = const category =
id === Constants.categories.starred.id id === Constants.categories.starred.id
? Constants.categories.starred ? { ...Constants.categories.starred, name: _(msg`Starred`) }
: query.result && flattenCategoryTree(query.result.data).find(c => c.id === id) : query.result && flattenCategoryTree(query.result.data).find(c => c.id === id)
const form = useForm<CategoryModificationRequest>() const form = useForm<CategoryModificationRequest>()
@@ -63,14 +66,14 @@ export function CategoryDetailsPage() {
} }
useEffect(() => { useEffect(() => {
if (!category) return if (!category?.id) return
setValues({ setValues({
id: +category.id, id: +category.id,
name: category.name, name: category.name,
parentId: category.parentId, parentId: category.parentId,
position: category.position, position: category.position,
}) })
}, [setValues, category]) }, [setValues, category?.id, category?.name, category?.parentId, category?.position])
const editable = id !== Constants.categories.all.id && id !== Constants.categories.starred.id const editable = id !== Constants.categories.all.id && id !== Constants.categories.starred.id
if (!category) return <Loader /> if (!category) return <Loader />

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Code, Container, Group, List, Title } from "@mantine/core" import { Anchor, Box, Code, Container, Group, List, Title } from "@mantine/core"
import { Constants } from "app/constants" import { Constants } from "app/constants"
import React from "react" import React from "react"

View File

@@ -1,4 +1,4 @@
import { Trans } from "@lingui/macro" import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Code, Container, Divider, Group, Input, NumberInput, Stack, Text, TextInput, Title } from "@mantine/core" import { Anchor, Box, Button, Code, Container, Divider, Group, Input, NumberInput, Stack, Text, TextInput, Title } from "@mantine/core"
import { useForm } from "@mantine/form" import { useForm } from "@mantine/form"
import { openConfirmModal } from "@mantine/modals" import { openConfirmModal } from "@mantine/modals"

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