forked from Archives/Athou_commafeed
Compare commits
77 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a28bc7334 | ||
|
|
00907e92ff | ||
|
|
5669798881 | ||
|
|
f3a62a5f75 | ||
|
|
3b20ed222c | ||
|
|
1f40f3f59c | ||
|
|
a8d890524f | ||
|
|
b635799e80 | ||
|
|
50ea66620d | ||
|
|
46581d0e22 | ||
|
|
a3562867a6 | ||
|
|
c0117ada93 | ||
|
|
a3dcb2c03e | ||
|
|
8f8aaa5a1d | ||
|
|
85482422fd | ||
|
|
643c969faf | ||
|
|
85f9469d6d | ||
|
|
0df0d50695 | ||
|
|
5e9256c197 | ||
|
|
b67e1a92f5 | ||
|
|
d250e4bc26 | ||
|
|
dcf1f41f2d | ||
|
|
3df6ba1457 | ||
|
|
b89928f6c6 | ||
|
|
2e014484e3 | ||
|
|
3b2b18fd2e | ||
|
|
ebf1e592ff | ||
|
|
88404b91d8 | ||
|
|
9cbb60313c | ||
|
|
b95d417f5e | ||
|
|
994f1fb121 | ||
|
|
e533c1fa4b | ||
|
|
d0d946ffe9 | ||
|
|
e3bcc824c7 | ||
|
|
357e4e207f | ||
|
|
2aee961600 | ||
|
|
3aa1987319 | ||
|
|
ae15f61fc2 | ||
|
|
e58f92a812 | ||
|
|
46383924b1 | ||
|
|
071920e864 | ||
|
|
012238e6a9 | ||
|
|
a565566c50 | ||
|
|
550804c666 | ||
|
|
f7a4a33f5e | ||
|
|
f1b19ebae3 | ||
|
|
4049fa2e17 | ||
|
|
28808cf4f5 | ||
|
|
870b46cf9d | ||
|
|
9c20dea99c | ||
|
|
63c7679067 | ||
|
|
764c1a6430 | ||
|
|
bb6578bdd0 | ||
|
|
748c8531ad | ||
|
|
a734fe68d2 | ||
|
|
cc5ebc55a4 | ||
|
|
aa396c1e1c | ||
|
|
fbf87ff291 | ||
|
|
e9f3ffddf4 | ||
|
|
695518d68b | ||
|
|
5d96c1e12b | ||
|
|
3a72a1cc04 | ||
|
|
54f5714108 | ||
|
|
04811c7eca | ||
|
|
6856736ddb | ||
|
|
db6c43993a | ||
|
|
508a22576a | ||
|
|
8fb012b3a1 | ||
|
|
133781d314 | ||
|
|
50cb12896e | ||
|
|
79a4315941 | ||
|
|
33a2f76521 | ||
|
|
d4041a1d88 | ||
|
|
09f2f56446 | ||
|
|
a0c3eda506 | ||
|
|
84de3199cc | ||
|
|
a7e8309d63 |
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -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]:
|
||||||
|
|
||||||
|
|||||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,5 +1,17 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [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]
|
## [5.0.2]
|
||||||
|
|
||||||
- Fix favicon fetching for Youtube channels in native mode when Google auth key is set
|
- Fix favicon fetching for Youtube channels in native mode when Google auth key is set
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ All other Quarkus settings can be found [here](https://quarkus.io/guides/all-con
|
|||||||
When started, the server will listen on http://localhost:8082.
|
When started, the server will listen on http://localhost:8082.
|
||||||
The default user is `admin` and the default password is `admin`.
|
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 (`jvm` package only)
|
### Memory management (`jvm` package only)
|
||||||
|
|
||||||
The Java Virtual Machine (JVM) is rather greedy by default and will not release unused memory to the
|
The Java Virtual Machine (JVM) is rather greedy by default and will not release unused memory to the
|
||||||
@@ -140,7 +144,8 @@ 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
|
||||||
|
|
||||||
|
|||||||
565
commafeed-client/package-lock.json
generated
565
commafeed-client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -15,24 +15,24 @@
|
|||||||
"i18n:extract": "lingui extract --clean"
|
"i18n:extract": "lingui extract --clean"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.13.0",
|
"@emotion/react": "^11.13.3",
|
||||||
"@fontsource/open-sans": "^5.0.29",
|
"@fontsource/open-sans": "^5.0.29",
|
||||||
"@lingui/core": "^4.11.3",
|
"@lingui/core": "^4.11.4",
|
||||||
"@lingui/macro": "^4.11.3",
|
"@lingui/macro": "^4.11.4",
|
||||||
"@lingui/react": "^4.11.3",
|
"@lingui/react": "^4.11.4",
|
||||||
"@mantine/core": "^7.12.1",
|
"@mantine/core": "^7.12.2",
|
||||||
"@mantine/form": "^7.12.1",
|
"@mantine/form": "^7.12.2",
|
||||||
"@mantine/hooks": "^7.12.1",
|
"@mantine/hooks": "^7.12.2",
|
||||||
"@mantine/modals": "^7.12.1",
|
"@mantine/modals": "^7.12.2",
|
||||||
"@mantine/notifications": "^7.12.1",
|
"@mantine/notifications": "^7.12.2",
|
||||||
"@mantine/spotlight": "^7.12.1",
|
"@mantine/spotlight": "^7.12.2",
|
||||||
"@monaco-editor/react": "^4.6.0",
|
"@monaco-editor/react": "^4.6.0",
|
||||||
"@reduxjs/toolkit": "^2.2.7",
|
"@reduxjs/toolkit": "^2.2.7",
|
||||||
"axios": "^1.7.4",
|
"axios": "^1.7.7",
|
||||||
"dayjs": "^1.11.12",
|
"dayjs": "^1.11.13",
|
||||||
"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.51.0",
|
||||||
"mousetrap": "^1.6.5",
|
"mousetrap": "^1.6.5",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-async-hook": "^4.0.0",
|
"react-async-hook": "^4.0.0",
|
||||||
@@ -50,17 +50,17 @@
|
|||||||
"redoc": "^2.1.5",
|
"redoc": "^2.1.5",
|
||||||
"throttle-debounce": "^5.0.2",
|
"throttle-debounce": "^5.0.2",
|
||||||
"tinycon": "^0.6.8",
|
"tinycon": "^0.6.8",
|
||||||
"tss-react": "^4.9.12",
|
"tss-react": "^4.9.13",
|
||||||
"use-local-storage": "^3.0.0",
|
"use-local-storage": "^3.0.0",
|
||||||
"vite-plugin-biome": "^1.0.12",
|
"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.8.3",
|
||||||
"@lingui/cli": "^4.11.3",
|
"@lingui/cli": "^4.11.4",
|
||||||
"@lingui/vite-plugin": "^4.11.3",
|
"@lingui/vite-plugin": "^4.11.4",
|
||||||
"@types/mousetrap": "^1.6.15",
|
"@types/mousetrap": "^1.6.15",
|
||||||
"@types/react": "^18.3.3",
|
"@types/react": "^18.3.5",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@types/react-helmet": "^6.1.11",
|
"@types/react-helmet": "^6.1.11",
|
||||||
"@types/react-infinite-scroller": "^1.2.5",
|
"@types/react-infinite-scroller": "^1.2.5",
|
||||||
@@ -71,9 +71,9 @@
|
|||||||
"babel-plugin-macros": "^3.1.0",
|
"babel-plugin-macros": "^3.1.0",
|
||||||
"rollup-plugin-visualizer": "^5.12.0",
|
"rollup-plugin-visualizer": "^5.12.0",
|
||||||
"typescript": "^5.5.4",
|
"typescript": "^5.5.4",
|
||||||
"vite": "^5.4.1",
|
"vite": "^5.4.3",
|
||||||
"vite-tsconfig-paths": "^5.0.1",
|
"vite-tsconfig-paths": "^5.0.1",
|
||||||
"vitest": "^2.0.5",
|
"vitest": "^2.0.5",
|
||||||
"vitest-mock-extended": "^2.0.0"
|
"vitest-mock-extended": "^2.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,16 +6,16 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.commafeed</groupId>
|
<groupId>com.commafeed</groupId>
|
||||||
<artifactId>commafeed</artifactId>
|
<artifactId>commafeed</artifactId>
|
||||||
<version>5.0.2</version>
|
<version>5.1.1</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.16.0</node.version>
|
<node.version>v20.17.0</node.version>
|
||||||
<!-- renovate: datasource=npm depName=npm -->
|
<!-- renovate: datasource=npm depName=npm -->
|
||||||
<npm.version>10.8.2</npm.version>
|
<npm.version>10.8.3</npm.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -71,7 +71,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 +142,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 <Helmet title={enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"} />
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
}
|
}
|
||||||
@@ -179,8 +181,13 @@ function CustomCode() {
|
|||||||
|
|
||||||
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,7 +195,8 @@ export function App() {
|
|||||||
return (
|
return (
|
||||||
<Providers>
|
<Providers>
|
||||||
<>
|
<>
|
||||||
<FaviconHandler />
|
<UnreadCountTitleHandler unreadCount={unreadCount} enabled={unreadCountTitle} />
|
||||||
|
<UnreadCountFaviconHandler unreadCount={unreadCount} enabled={unreadCountFavicon} />
|
||||||
<BrowserExtensionBadgeUnreadCountHandler />
|
<BrowserExtensionBadgeUnreadCountHandler />
|
||||||
<HashRouter>
|
<HashRouter>
|
||||||
<GoogleAnalyticsHandler />
|
<GoogleAnalyticsHandler />
|
||||||
|
|||||||
@@ -248,6 +248,8 @@ export interface Settings {
|
|||||||
markAllAsReadConfirmation: boolean
|
markAllAsReadConfirmation: boolean
|
||||||
customContextMenu: boolean
|
customContextMenu: boolean
|
||||||
mobileFooter: boolean
|
mobileFooter: boolean
|
||||||
|
unreadCountTitle: boolean
|
||||||
|
unreadCountFavicon: boolean
|
||||||
sharingSettings: SharingSettings
|
sharingSettings: SharingSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import {
|
|||||||
changeSharingSetting,
|
changeSharingSetting,
|
||||||
changeShowRead,
|
changeShowRead,
|
||||||
changeStarIconDisplayMode,
|
changeStarIconDisplayMode,
|
||||||
|
changeUnreadCountFavicon,
|
||||||
|
changeUnreadCountTitle,
|
||||||
reloadProfile,
|
reloadProfile,
|
||||||
reloadSettings,
|
reloadSettings,
|
||||||
reloadTags,
|
reloadTags,
|
||||||
@@ -91,6 +93,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
|
||||||
@@ -107,6 +117,8 @@ export const userSlice = createSlice({
|
|||||||
changeMarkAllAsReadConfirmation.fulfilled,
|
changeMarkAllAsReadConfirmation.fulfilled,
|
||||||
changeCustomContextMenu.fulfilled,
|
changeCustomContextMenu.fulfilled,
|
||||||
changeMobileFooter.fulfilled,
|
changeMobileFooter.fulfilled,
|
||||||
|
changeUnreadCountTitle.fulfilled,
|
||||||
|
changeUnreadCountFavicon.fulfilled,
|
||||||
changeSharingSetting.fulfilled
|
changeSharingSetting.fulfilled
|
||||||
),
|
),
|
||||||
() => {
|
() => {
|
||||||
|
|||||||
@@ -77,6 +77,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",
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -17,6 +17,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"
|
||||||
@@ -32,6 +34,8 @@ export function DisplaySettings() {
|
|||||||
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 { _ } = useLingui()
|
||||||
@@ -91,6 +95,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
|
||||||
|
|||||||
@@ -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))
|
||||||
@@ -97,8 +112,7 @@ 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 (
|
||||||
@@ -107,7 +121,7 @@ export function Tree() {
|
|||||||
type="category"
|
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}
|
||||||
@@ -120,7 +134,7 @@ 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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -178,7 +182,7 @@ msgstr "Fermer le menu"
|
|||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Cmd"
|
msgid "Cmd"
|
||||||
msgstr ""
|
msgstr "Cmd"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "CommaFeed browser extension version {browserExtensionVersion}."
|
msgid "CommaFeed browser extension version {browserExtensionVersion}."
|
||||||
@@ -319,7 +323,7 @@ msgstr "Entrez votre mot de passe actuel pour changer les paramètres du profil"
|
|||||||
|
|
||||||
#: 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"
|
||||||
@@ -582,7 +586,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"
|
||||||
@@ -594,11 +598,11 @@ 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"
|
||||||
@@ -664,7 +668,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"
|
||||||
@@ -808,7 +812,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"
|
||||||
@@ -824,7 +828,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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,8 @@ 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 +37,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 +45,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"
|
||||||
@@ -65,20 +66,20 @@ msgstr "管理人"
|
|||||||
#: 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 +87,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 +95,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 +127,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 +135,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 +171,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,27 +179,27 @@ msgstr "フィードが動作していることを確認してください"
|
|||||||
|
|
||||||
#: src/pages/app/Layout.tsx
|
#: src/pages/app/Layout.tsx
|
||||||
msgid "Close menu"
|
msgid "Close menu"
|
||||||
msgstr ""
|
msgstr "メニューを閉じる"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Cmd"
|
msgid "Cmd"
|
||||||
msgstr ""
|
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"
|
||||||
@@ -214,11 +219,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"
|
||||||
@@ -226,19 +231,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"
|
||||||
@@ -255,7 +260,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"
|
||||||
@@ -267,7 +272,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
|
||||||
@@ -277,7 +282,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"
|
||||||
@@ -302,7 +307,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
|
||||||
@@ -319,7 +324,7 @@ 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"
|
||||||
@@ -327,7 +332,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"
|
||||||
@@ -340,7 +345,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"
|
||||||
@@ -354,15 +359,15 @@ 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"
|
||||||
@@ -370,27 +375,27 @@ 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 "Go to {0}"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Go to the All view"
|
msgid "Go to the All view"
|
||||||
@@ -398,11 +403,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"
|
||||||
@@ -410,15 +415,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"
|
||||||
@@ -426,7 +431,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
|
||||||
@@ -456,7 +461,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
|
||||||
@@ -492,7 +497,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
|
||||||
@@ -506,7 +511,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
|
||||||
@@ -520,11 +525,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"
|
||||||
@@ -553,7 +558,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"
|
||||||
@@ -578,11 +583,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"
|
||||||
@@ -594,15 +599,15 @@ 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/pages/ErrorPage.tsx
|
#: src/pages/ErrorPage.tsx
|
||||||
msgid "Oops!"
|
msgid "Oops!"
|
||||||
@@ -610,15 +615,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
|
||||||
@@ -627,31 +632,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"
|
||||||
@@ -664,7 +669,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"
|
||||||
@@ -701,7 +706,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"
|
||||||
@@ -718,16 +723,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
|
||||||
@@ -739,15 +744,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
|
||||||
@@ -758,15 +763,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"
|
||||||
@@ -788,31 +793,32 @@ 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"
|
||||||
@@ -820,11 +826,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
|
||||||
@@ -834,12 +848,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
|
||||||
@@ -872,7 +886,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"
|
||||||
@@ -884,7 +898,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
|
||||||
@@ -893,7 +907,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"
|
||||||
@@ -901,27 +915,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"
|
||||||
@@ -957,8 +971,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 "フィードの更新がキューに登録されました。"
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -826,6 +830,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
|
||||||
|
|||||||
@@ -1,370 +1,373 @@
|
|||||||
|
:summaryTableId: commafeed-server_commafeed
|
||||||
:summaryTableId: commafeed
|
|
||||||
[.configuration-legend]
|
[.configuration-legend]
|
||||||
icon:lock[title=Fixed at build time] Configuration property fixed at build time - All other configuration properties are overridable at runtime
|
icon:lock[title=Fixed at build time] Configuration property fixed at build time - All other configuration properties are overridable at runtime
|
||||||
[.configuration-reference.searchable, cols="80,.^10,.^10"]
|
[.configuration-reference.searchable, cols="80,.^10,.^10"]
|
||||||
|===
|
|===
|
||||||
|
|
||||||
h|[[commafeed_configuration]]link:#commafeed_configuration[Configuration property]
|
h|[.header-title]##Configuration property##
|
||||||
|
|
||||||
h|Type
|
h|Type
|
||||||
h|Default
|
h|Default
|
||||||
|
|
||||||
a| [[commafeed_commafeed-hide-from-web-crawlers]]`link:#commafeed_commafeed-hide-from-web-crawlers[commafeed.hide-from-web-crawlers]`
|
a| [[commafeed-server_commafeed-hide-from-web-crawlers]] [.property-path]##`commafeed.hide-from-web-crawlers`##
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Whether to expose a robots.txt file that disallows web crawlers and search engine indexers.
|
Whether to expose a robots.txt file that disallows web crawlers and search engine indexers.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HIDE_FROM_WEB_CRAWLERS+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HIDE_FROM_WEB_CRAWLERS+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HIDE_FROM_WEB_CRAWLERS+++`
|
Environment variable: `+++COMMAFEED_HIDE_FROM_WEB_CRAWLERS+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`true`
|
|`true`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-image-proxy-enabled]] [.property-path]##`commafeed.image-proxy-enabled`##
|
||||||
a| [[commafeed_commafeed-image-proxy-enabled]]`link:#commafeed_commafeed-image-proxy-enabled[commafeed.image-proxy-enabled]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
If enabled, images in feed entries will be proxied through the server instead of accessed directly by the browser. This is useful if commafeed is accessed through a restricting proxy that blocks some feeds that are followed.
|
If enabled, images in feed entries will be proxied through the server instead of accessed directly by the browser. This is useful if commafeed is accessed through a restricting proxy that blocks some feeds that are followed.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_IMAGE_PROXY_ENABLED+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_IMAGE_PROXY_ENABLED+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_IMAGE_PROXY_ENABLED+++`
|
Environment variable: `+++COMMAFEED_IMAGE_PROXY_ENABLED+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`false`
|
|`false`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-password-recovery-enabled]] [.property-path]##`commafeed.password-recovery-enabled`##
|
||||||
a| [[commafeed_commafeed-password-recovery-enabled]]`link:#commafeed_commafeed-password-recovery-enabled[commafeed.password-recovery-enabled]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Enable password recovery via email. Quarkus mailer will need to be configured.
|
Enable password recovery via email. Quarkus mailer will need to be configured.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_PASSWORD_RECOVERY_ENABLED+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_PASSWORD_RECOVERY_ENABLED+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_PASSWORD_RECOVERY_ENABLED+++`
|
Environment variable: `+++COMMAFEED_PASSWORD_RECOVERY_ENABLED+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`false`
|
|`false`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-announcement]] [.property-path]##`commafeed.announcement`##
|
||||||
a| [[commafeed_commafeed-announcement]]`link:#commafeed_commafeed-announcement[commafeed.announcement]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Message displayed in a notification at the bottom of the page.
|
Message displayed in a notification at the bottom of the page.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_ANNOUNCEMENT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_ANNOUNCEMENT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_ANNOUNCEMENT+++`
|
Environment variable: `+++COMMAFEED_ANNOUNCEMENT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|string
|
--
|
||||||
|
|string
|
||||||
|
|
|
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-google-analytics-tracking-code]] [.property-path]##`commafeed.google-analytics-tracking-code`##
|
||||||
a| [[commafeed_commafeed-google-analytics-tracking-code]]`link:#commafeed_commafeed-google-analytics-tracking-code[commafeed.google-analytics-tracking-code]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Google Analytics tracking code.
|
Google Analytics tracking code.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_GOOGLE_ANALYTICS_TRACKING_CODE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_GOOGLE_ANALYTICS_TRACKING_CODE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_GOOGLE_ANALYTICS_TRACKING_CODE+++`
|
Environment variable: `+++COMMAFEED_GOOGLE_ANALYTICS_TRACKING_CODE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|string
|
--
|
||||||
|
|string
|
||||||
|
|
|
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-google-auth-key]] [.property-path]##`commafeed.google-auth-key`##
|
||||||
a| [[commafeed_commafeed-google-auth-key]]`link:#commafeed_commafeed-google-auth-key[commafeed.google-auth-key]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Google Auth key for fetching Youtube channel favicons.
|
Google Auth key for fetching Youtube channel favicons.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_GOOGLE_AUTH_KEY+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_GOOGLE_AUTH_KEY+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_GOOGLE_AUTH_KEY+++`
|
Environment variable: `+++COMMAFEED_GOOGLE_AUTH_KEY+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|string
|
--
|
||||||
|
|string
|
||||||
|
|
|
|
||||||
|
|
||||||
|
h|[[commafeed-server_section_commafeed-http-client]] [.section-name.section-level0]##HTTP client configuration##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
a| [[commafeed_commafeed-http-client-user-agent]]`link:#commafeed_commafeed-http-client-user-agent[commafeed.http-client.user-agent]`
|
a| [[commafeed-server_commafeed-http-client-user-agent]] [.property-path]##`commafeed.http-client.user-agent`##
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
User-Agent string that will be used by the http client, leave empty for the default one.
|
User-Agent string that will be used by the http client, leave empty for the default one.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_USER_AGENT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_USER_AGENT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_USER_AGENT+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_USER_AGENT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|string
|
--
|
||||||
|
|string
|
||||||
|
|
|
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-connect-timeout]] [.property-path]##`commafeed.http-client.connect-timeout`##
|
||||||
a| [[commafeed_commafeed-http-client-connect-timeout]]`link:#commafeed_commafeed-http-client-connect-timeout[commafeed.http-client.connect-timeout]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time to wait for a connection to be established.
|
Time to wait for a connection to be established.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_CONNECT_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_CONNECT_TIMEOUT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_CONNECT_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_CONNECT_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`5S`
|
|`5S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-ssl-handshake-timeout]] [.property-path]##`commafeed.http-client.ssl-handshake-timeout`##
|
||||||
a| [[commafeed_commafeed-http-client-ssl-handshake-timeout]]`link:#commafeed_commafeed-http-client-ssl-handshake-timeout[commafeed.http-client.ssl-handshake-timeout]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time to wait for SSL handshake to complete.
|
Time to wait for SSL handshake to complete.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_SSL_HANDSHAKE_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_SSL_HANDSHAKE_TIMEOUT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_SSL_HANDSHAKE_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_SSL_HANDSHAKE_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`5S`
|
|`5S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-socket-timeout]] [.property-path]##`commafeed.http-client.socket-timeout`##
|
||||||
a| [[commafeed_commafeed-http-client-socket-timeout]]`link:#commafeed_commafeed-http-client-socket-timeout[commafeed.http-client.socket-timeout]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time to wait between two packets before timeout.
|
Time to wait between two packets before timeout.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_SOCKET_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_SOCKET_TIMEOUT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_SOCKET_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_SOCKET_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`10S`
|
|`10S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-response-timeout]] [.property-path]##`commafeed.http-client.response-timeout`##
|
||||||
a| [[commafeed_commafeed-http-client-response-timeout]]`link:#commafeed_commafeed-http-client-response-timeout[commafeed.http-client.response-timeout]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time to wait for the full response to be received.
|
Time to wait for the full response to be received.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_RESPONSE_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_RESPONSE_TIMEOUT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_RESPONSE_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_RESPONSE_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`10S`
|
|`10S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-connection-time-to-live]] [.property-path]##`commafeed.http-client.connection-time-to-live`##
|
||||||
a| [[commafeed_commafeed-http-client-connection-time-to-live]]`link:#commafeed_commafeed-http-client-connection-time-to-live[commafeed.http-client.connection-time-to-live]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time to live for a connection in the pool.
|
Time to live for a connection in the pool.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_CONNECTION_TIME_TO_LIVE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_CONNECTION_TIME_TO_LIVE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_CONNECTION_TIME_TO_LIVE+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_CONNECTION_TIME_TO_LIVE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`30S`
|
|`30S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-idle-connections-eviction-interval]] [.property-path]##`commafeed.http-client.idle-connections-eviction-interval`##
|
||||||
a| [[commafeed_commafeed-http-client-idle-connections-eviction-interval]]`link:#commafeed_commafeed-http-client-idle-connections-eviction-interval[commafeed.http-client.idle-connections-eviction-interval]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Time between eviction runs for idle connections.
|
Time between eviction runs for idle connections.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_IDLE_CONNECTIONS_EVICTION_INTERVAL+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_IDLE_CONNECTIONS_EVICTION_INTERVAL+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_IDLE_CONNECTIONS_EVICTION_INTERVAL+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_IDLE_CONNECTIONS_EVICTION_INTERVAL+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`1M`
|
|`1M`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-http-client-max-response-size]] [.property-path]##`commafeed.http-client.max-response-size`##
|
||||||
a| [[commafeed_commafeed-http-client-max-response-size]]`link:#commafeed_commafeed-http-client-max-response-size[commafeed.http-client.max-response-size]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
If a feed is larger than this, it will be discarded to prevent memory issues while parsing the feed.
|
If a feed is larger than this, it will be discarded to prevent memory issues while parsing the feed.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_MAX_RESPONSE_SIZE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_HTTP_CLIENT_MAX_RESPONSE_SIZE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_HTTP_CLIENT_MAX_RESPONSE_SIZE+++`
|
Environment variable: `+++COMMAFEED_HTTP_CLIENT_MAX_RESPONSE_SIZE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|MemorySize link:#memory-size-note-anchor[icon:question-circle[title=More information about the MemorySize format]]
|
--
|
||||||
|
|MemorySize link:#memory-size-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the MemorySize format]]
|
||||||
|`5M`
|
|`5M`
|
||||||
|
|
||||||
|
|
||||||
a| [[commafeed_commafeed-feed-refresh-interval]]`link:#commafeed_commafeed-feed-refresh-interval[commafeed.feed-refresh.interval]`
|
h|[[commafeed-server_section_commafeed-feed-refresh]] [.section-name.section-level0]##Feed refresh engine settings##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-interval]] [.property-path]##`commafeed.feed-refresh.interval`##
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Amount of time CommaFeed will wait before refreshing the same feed.
|
Amount of time CommaFeed will wait before refreshing the same feed.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_INTERVAL+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_INTERVAL+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_INTERVAL+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_INTERVAL+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`5M`
|
|`5M`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-interval-empirical]] [.property-path]##`commafeed.feed-refresh.interval-empirical`##
|
||||||
a| [[commafeed_commafeed-feed-refresh-interval-empirical]]`link:#commafeed_commafeed-feed-refresh-interval-empirical[commafeed.feed-refresh.interval-empirical]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
If true, CommaFeed will calculate the next refresh time based on the feed's average time between entries and the time since the last entry was published. The interval will be somewhere between the default refresh interval and 24h. See `FeedRefreshIntervalCalculator` for details.
|
If true, CommaFeed will calculate the next refresh time based on the feed's average time between entries and the time since the last entry was published. The interval will be somewhere between the default refresh interval and 24h. See `FeedRefreshIntervalCalculator` for details.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_INTERVAL_EMPIRICAL+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_INTERVAL_EMPIRICAL+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_INTERVAL_EMPIRICAL+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_INTERVAL_EMPIRICAL+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`false`
|
|`false`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-http-threads]] [.property-path]##`commafeed.feed-refresh.http-threads`##
|
||||||
a| [[commafeed_commafeed-feed-refresh-http-threads]]`link:#commafeed_commafeed-feed-refresh-http-threads[commafeed.feed-refresh.http-threads]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Amount of http threads used to fetch feeds.
|
Amount of http threads used to fetch feeds.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_HTTP_THREADS+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_HTTP_THREADS+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_HTTP_THREADS+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_HTTP_THREADS+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|@jakarta.validation.constraints.Min(1L) int
|
--
|
||||||
|
|int
|
||||||
|`3`
|
|`3`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-database-threads]] [.property-path]##`commafeed.feed-refresh.database-threads`##
|
||||||
a| [[commafeed_commafeed-feed-refresh-database-threads]]`link:#commafeed_commafeed-feed-refresh-database-threads[commafeed.feed-refresh.database-threads]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Amount of threads used to insert new entries in the database.
|
Amount of threads used to insert new entries in the database.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_DATABASE_THREADS+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_DATABASE_THREADS+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_DATABASE_THREADS+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_DATABASE_THREADS+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|@jakarta.validation.constraints.Min(1L) int
|
--
|
||||||
|
|int
|
||||||
|`1`
|
|`1`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-user-inactivity-period]] [.property-path]##`commafeed.feed-refresh.user-inactivity-period`##
|
||||||
a| [[commafeed_commafeed-feed-refresh-user-inactivity-period]]`link:#commafeed_commafeed-feed-refresh-user-inactivity-period[commafeed.feed-refresh.user-inactivity-period]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Duration after which a user is considered inactive. Feeds for inactive users are not refreshed until they log in again. 0 to disable.
|
Duration after which a user is considered inactive. Feeds for inactive users are not refreshed until they log in again. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_USER_INACTIVITY_PERIOD+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_USER_INACTIVITY_PERIOD+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_USER_INACTIVITY_PERIOD+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_USER_INACTIVITY_PERIOD+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`0S`
|
|`0S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-feed-refresh-filtering-expression-evaluation-timeout]] [.property-path]##`commafeed.feed-refresh.filtering-expression-evaluation-timeout`##
|
||||||
a| [[commafeed_commafeed-feed-refresh-filtering-expression-evaluation-timeout]]`link:#commafeed_commafeed-feed-refresh-filtering-expression-evaluation-timeout[commafeed.feed-refresh.filtering-expression-evaluation-timeout]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Duration after which the evaluation of a filtering expresion to mark an entry as read is considered to have timed out.
|
Duration after which the evaluation of a filtering expresion to mark an entry as read is considered to have timed out.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_FILTERING_EXPRESSION_EVALUATION_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_FEED_REFRESH_FILTERING_EXPRESSION_EVALUATION_TIMEOUT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_FEED_REFRESH_FILTERING_EXPRESSION_EVALUATION_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_FEED_REFRESH_FILTERING_EXPRESSION_EVALUATION_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`500MS`
|
|`500MS`
|
||||||
|
|
||||||
|
|
||||||
a| [[commafeed_commafeed-database-query-timeout]]`link:#commafeed_commafeed-database-query-timeout[commafeed.database.query-timeout]`
|
h|[[commafeed-server_section_commafeed-database]] [.section-name.section-level0]##Database settings##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-database-query-timeout]] [.property-path]##`commafeed.database.query-timeout`##
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Database query timeout. 0 to disable.
|
Timeout applied to all database queries. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_QUERY_TIMEOUT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_QUERY_TIMEOUT+++[]
|
||||||
@@ -372,205 +375,218 @@ endif::add-copy-button-to-env-var[]
|
|||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_QUERY_TIMEOUT+++`
|
Environment variable: `+++COMMAFEED_DATABASE_QUERY_TIMEOUT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`0S`
|
|`0S`
|
||||||
|
|
||||||
|
h|[[commafeed-server_section_commafeed-database-cleanup]] [.section-name.section-level1]##Database cleanup settings##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
a| [[commafeed_commafeed-database-cleanup-entries-max-age]]`link:#commafeed_commafeed-database-cleanup-entries-max-age[commafeed.database.cleanup.entries-max-age]`
|
a| [[commafeed-server_commafeed-database-cleanup-entries-max-age]] [.property-path]##`commafeed.database.cleanup.entries-max-age`##
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Maximum age of feed entries in the database. Older entries will be deleted. 0 to disable.
|
Maximum age of feed entries in the database. Older entries will be deleted. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_ENTRIES_MAX_AGE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_ENTRIES_MAX_AGE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_ENTRIES_MAX_AGE+++`
|
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_ENTRIES_MAX_AGE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`365D`
|
|`365D`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-database-cleanup-statuses-max-age]] [.property-path]##`commafeed.database.cleanup.statuses-max-age`##
|
||||||
a| [[commafeed_commafeed-database-cleanup-statuses-max-age]]`link:#commafeed_commafeed-database-cleanup-statuses-max-age[commafeed.database.cleanup.statuses-max-age]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Maximum age of feed entry statuses (read/unread) in the database. Older statuses will be deleted. 0 to disable.
|
Maximum age of feed entry statuses (read/unread) in the database. Older statuses will be deleted. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_STATUSES_MAX_AGE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_STATUSES_MAX_AGE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_STATUSES_MAX_AGE+++`
|
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_STATUSES_MAX_AGE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`0S`
|
|`0S`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-database-cleanup-max-feed-capacity]] [.property-path]##`commafeed.database.cleanup.max-feed-capacity`##
|
||||||
a| [[commafeed_commafeed-database-cleanup-max-feed-capacity]]`link:#commafeed_commafeed-database-cleanup-max-feed-capacity[commafeed.database.cleanup.max-feed-capacity]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Maximum number of entries per feed to keep in the database. 0 to disable.
|
Maximum number of entries per feed to keep in the database. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_MAX_FEED_CAPACITY+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_MAX_FEED_CAPACITY+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_MAX_FEED_CAPACITY+++`
|
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_MAX_FEED_CAPACITY+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|int
|
--
|
||||||
|
|int
|
||||||
|`500`
|
|`500`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-database-cleanup-max-feeds-per-user]] [.property-path]##`commafeed.database.cleanup.max-feeds-per-user`##
|
||||||
a| [[commafeed_commafeed-database-cleanup-max-feeds-per-user]]`link:#commafeed_commafeed-database-cleanup-max-feeds-per-user[commafeed.database.cleanup.max-feeds-per-user]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Limit the number of feeds a user can subscribe to. 0 to disable.
|
Limit the number of feeds a user can subscribe to. 0 to disable.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_MAX_FEEDS_PER_USER+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_MAX_FEEDS_PER_USER+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_MAX_FEEDS_PER_USER+++`
|
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_MAX_FEEDS_PER_USER+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|int
|
--
|
||||||
|
|int
|
||||||
|`0`
|
|`0`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-database-cleanup-batch-size]] [.property-path]##`commafeed.database.cleanup.batch-size`##
|
||||||
a| [[commafeed_commafeed-database-cleanup-batch-size]]`link:#commafeed_commafeed-database-cleanup-batch-size[commafeed.database.cleanup.batch-size]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Rows to delete per query while cleaning up old entries.
|
Rows to delete per query while cleaning up old entries.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_BATCH_SIZE+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_DATABASE_CLEANUP_BATCH_SIZE+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_BATCH_SIZE+++`
|
Environment variable: `+++COMMAFEED_DATABASE_CLEANUP_BATCH_SIZE+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|@jakarta.validation.constraints.Positive int
|
--
|
||||||
|
|int
|
||||||
|`100`
|
|`100`
|
||||||
|
|
||||||
|
|
||||||
a| [[commafeed_commafeed-users-allow-registrations]]`link:#commafeed_commafeed-users-allow-registrations[commafeed.users.allow-registrations]`
|
|
||||||
|
|
||||||
|
h|[[commafeed-server_section_commafeed-users]] [.section-name.section-level0]##Users settings##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-users-allow-registrations]] [.property-path]##`commafeed.users.allow-registrations`##
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Whether to let users create accounts for themselves.
|
Whether to let users create accounts for themselves.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_ALLOW_REGISTRATIONS+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_ALLOW_REGISTRATIONS+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_USERS_ALLOW_REGISTRATIONS+++`
|
Environment variable: `+++COMMAFEED_USERS_ALLOW_REGISTRATIONS+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`false`
|
|`false`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-users-strict-password-policy]] [.property-path]##`commafeed.users.strict-password-policy`##
|
||||||
a| [[commafeed_commafeed-users-strict-password-policy]]`link:#commafeed_commafeed-users-strict-password-policy[commafeed.users.strict-password-policy]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Whether to enable strict password validation (1 uppercase char, 1 lowercase char, 1 digit, 1 special char).
|
Whether to enable strict password validation (1 uppercase char, 1 lowercase char, 1 digit, 1 special char).
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_STRICT_PASSWORD_POLICY+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_STRICT_PASSWORD_POLICY+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_USERS_STRICT_PASSWORD_POLICY+++`
|
Environment variable: `+++COMMAFEED_USERS_STRICT_PASSWORD_POLICY+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`true`
|
|`true`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-users-create-demo-account]] [.property-path]##`commafeed.users.create-demo-account`##
|
||||||
a| [[commafeed_commafeed-users-create-demo-account]]`link:#commafeed_commafeed-users-create-demo-account[commafeed.users.create-demo-account]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Whether to create a demo account the first time the app starts.
|
Whether to create a demo account the first time the app starts.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_CREATE_DEMO_ACCOUNT+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_USERS_CREATE_DEMO_ACCOUNT+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_USERS_CREATE_DEMO_ACCOUNT+++`
|
Environment variable: `+++COMMAFEED_USERS_CREATE_DEMO_ACCOUNT+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`false`
|
|`false`
|
||||||
|
|
||||||
|
|
||||||
a| [[commafeed_commafeed-websocket-enabled]]`link:#commafeed_commafeed-websocket-enabled[commafeed.websocket.enabled]`
|
h|[[commafeed-server_section_commafeed-websocket]] [.section-name.section-level0]##Websocket settings##
|
||||||
|
h|Type
|
||||||
|
h|Default
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-websocket-enabled]] [.property-path]##`commafeed.websocket.enabled`##
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Enable websocket connection so the server can notify web clients that there are new entries for feeds.
|
Enable websocket connection so the server can notify web clients that there are new entries for feeds.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_ENABLED+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_ENABLED+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_WEBSOCKET_ENABLED+++`
|
Environment variable: `+++COMMAFEED_WEBSOCKET_ENABLED+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|boolean
|
--
|
||||||
|
|boolean
|
||||||
|`true`
|
|`true`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-websocket-ping-interval]] [.property-path]##`commafeed.websocket.ping-interval`##
|
||||||
a| [[commafeed_commafeed-websocket-ping-interval]]`link:#commafeed_commafeed-websocket-ping-interval[commafeed.websocket.ping-interval]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
Interval at which the client will send a ping message on the websocket to keep the connection alive.
|
Interval at which the client will send a ping message on the websocket to keep the connection alive.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_PING_INTERVAL+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_PING_INTERVAL+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_WEBSOCKET_PING_INTERVAL+++`
|
Environment variable: `+++COMMAFEED_WEBSOCKET_PING_INTERVAL+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`15M`
|
|`15M`
|
||||||
|
|
||||||
|
a| [[commafeed-server_commafeed-websocket-tree-reload-interval]] [.property-path]##`commafeed.websocket.tree-reload-interval`##
|
||||||
a| [[commafeed_commafeed-websocket-tree-reload-interval]]`link:#commafeed_commafeed-websocket-tree-reload-interval[commafeed.websocket.tree-reload-interval]`
|
|
||||||
|
|
||||||
|
|
||||||
[.description]
|
[.description]
|
||||||
--
|
--
|
||||||
If the websocket connection is disabled or the connection is lost, the client will reload the feed tree at this interval.
|
If the websocket connection is disabled or the connection is lost, the client will reload the feed tree at this interval.
|
||||||
|
|
||||||
|
|
||||||
ifdef::add-copy-button-to-env-var[]
|
ifdef::add-copy-button-to-env-var[]
|
||||||
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_TREE_RELOAD_INTERVAL+++[]
|
Environment variable: env_var_with_copy_button:+++COMMAFEED_WEBSOCKET_TREE_RELOAD_INTERVAL+++[]
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
ifndef::add-copy-button-to-env-var[]
|
ifndef::add-copy-button-to-env-var[]
|
||||||
Environment variable: `+++COMMAFEED_WEBSOCKET_TREE_RELOAD_INTERVAL+++`
|
Environment variable: `+++COMMAFEED_WEBSOCKET_TREE_RELOAD_INTERVAL+++`
|
||||||
endif::add-copy-button-to-env-var[]
|
endif::add-copy-button-to-env-var[]
|
||||||
--|link:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html[Duration]
|
--
|
||||||
link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
|link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html[Duration] link:#duration-note-anchor-{summaryTableId}[icon:question-circle[title=More information about the Duration format]]
|
||||||
|`30S`
|
|`30S`
|
||||||
|
|
||||||
|
|
||||||
|===
|
|===
|
||||||
|
|
||||||
ifndef::no-duration-note[]
|
ifndef::no-duration-note[]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
[id='duration-note-anchor-{summaryTableId}']
|
[id=duration-note-anchor-commafeed-server_commafeed]
|
||||||
.About the Duration format
|
.About the Duration format
|
||||||
====
|
====
|
||||||
To write duration values, use the standard `java.time.Duration` format.
|
To write duration values, use the standard `java.time.Duration` format.
|
||||||
@@ -587,11 +603,15 @@ In other cases, the simplified format is translated to the `java.time.Duration`
|
|||||||
* If the value is a number followed by `d`, it is prefixed with `P`.
|
* If the value is a number followed by `d`, it is prefixed with `P`.
|
||||||
====
|
====
|
||||||
endif::no-duration-note[]
|
endif::no-duration-note[]
|
||||||
|
ifndef::no-memory-size-note[]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
[[memory-size-note-anchor]]
|
[id=memory-size-note-anchor-commafeed-server_commafeed]
|
||||||
.About the MemorySize format
|
.About the MemorySize format
|
||||||
====
|
====
|
||||||
A size configuration option recognises string in this format (shown as a regular expression): `[0-9]+[KkMmGgTtPpEeZzYy]?`.
|
A size configuration option recognizes strings in this format (shown as a regular expression): `[0-9]+[KkMmGgTtPpEeZzYy]?`.
|
||||||
|
|
||||||
If no suffix is given, assume bytes.
|
If no suffix is given, assume bytes.
|
||||||
====
|
====
|
||||||
|
ifndef::no-memory-size-note[]
|
||||||
|
|
||||||
|
:!summaryTableId:
|
||||||
@@ -6,15 +6,16 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.commafeed</groupId>
|
<groupId>com.commafeed</groupId>
|
||||||
<artifactId>commafeed</artifactId>
|
<artifactId>commafeed</artifactId>
|
||||||
<version>5.0.2</version>
|
<version>5.1.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>commafeed-server</artifactId>
|
<artifactId>commafeed-server</artifactId>
|
||||||
<name>CommaFeed Server</name>
|
<name>CommaFeed Server</name>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<quarkus.version>3.13.2</quarkus.version>
|
<quarkus.version>3.14.2</quarkus.version>
|
||||||
<querydsl.version>6.6</querydsl.version>
|
<querydsl.version>6.7</querydsl.version>
|
||||||
<rome.version>2.1.0</rome.version>
|
<rome.version>2.1.0</rome.version>
|
||||||
|
<swagger.version>2.2.23</swagger.version>
|
||||||
<properties-plugin.version>1.2.1</properties-plugin.version>
|
<properties-plugin.version>1.2.1</properties-plugin.version>
|
||||||
|
|
||||||
<build.database>h2</build.database>
|
<build.database>h2</build.database>
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-help-plugin</artifactId>
|
<artifactId>maven-help-plugin</artifactId>
|
||||||
<version>3.4.1</version>
|
<version>3.5.0</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>initialize</phase>
|
<phase>initialize</phase>
|
||||||
@@ -78,6 +79,21 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-config-doc-maven-plugin</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>default-generate-asciidoc</id>
|
||||||
|
<phase>process-test-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>generate-asciidoc</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
@@ -101,7 +117,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>3.4.0</version>
|
<version>3.5.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemPropertyVariables>
|
<systemPropertyVariables>
|
||||||
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
@@ -111,7 +127,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
<version>3.4.0</version>
|
<version>3.5.0</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<goals>
|
<goals>
|
||||||
@@ -150,7 +166,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>io.swagger.core.v3</groupId>
|
<groupId>io.swagger.core.v3</groupId>
|
||||||
<artifactId>swagger-maven-plugin-jakarta</artifactId>
|
<artifactId>swagger-maven-plugin-jakarta</artifactId>
|
||||||
<version>2.2.22</version>
|
<version>${swagger.version}</version>
|
||||||
<?m2e ignore?>
|
<?m2e ignore?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<outputPath>${project.build.directory}/classes/META-INF/resources</outputPath>
|
<outputPath>${project.build.directory}/classes/META-INF/resources</outputPath>
|
||||||
@@ -174,7 +190,14 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
<version>3.4.0</version>
|
<version>3.5.0</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.puppycrawl.tools</groupId>
|
||||||
|
<artifactId>checkstyle</artifactId>
|
||||||
|
<version>10.18.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>validate</id>
|
<id>validate</id>
|
||||||
@@ -228,7 +251,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.commafeed</groupId>
|
<groupId>com.commafeed</groupId>
|
||||||
<artifactId>commafeed-client</artifactId>
|
<artifactId>commafeed-client</artifactId>
|
||||||
<version>5.0.2</version>
|
<version>5.1.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -311,7 +334,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.swagger.core.v3</groupId>
|
<groupId>io.swagger.core.v3</groupId>
|
||||||
<artifactId>swagger-annotations</artifactId>
|
<artifactId>swagger-annotations</artifactId>
|
||||||
<version>2.2.22</version>
|
<version>${swagger.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -330,7 +353,6 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>33.3.0-jre</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
@@ -356,7 +378,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.passay</groupId>
|
<groupId>org.passay</groupId>
|
||||||
<artifactId>passay</artifactId>
|
<artifactId>passay</artifactId>
|
||||||
<version>1.6.4</version>
|
<version>1.6.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -425,17 +447,7 @@
|
|||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.quarkus</groupId>
|
<groupId>io.quarkus</groupId>
|
||||||
<artifactId>quarkus-junit5</artifactId>
|
<artifactId>quarkus-junit5-mockito</artifactId>
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mockito</groupId>
|
|
||||||
<artifactId>mockito-core</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mockito</groupId>
|
|
||||||
<artifactId>mockito-junit-jupiter</artifactId>
|
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM debian:12.6
|
FROM debian:12.7
|
||||||
EXPOSE 8082
|
EXPOSE 8082
|
||||||
|
|
||||||
RUN mkdir -p /commafeed/data
|
RUN mkdir -p /commafeed/data
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ services:
|
|||||||
## Advanced
|
## Advanced
|
||||||
|
|
||||||
While using the H2 embedded database is perfectly fine for small instances, you may want to have more control over the
|
While using the H2 embedded database is perfectly fine for small instances, you may want to have more control over the
|
||||||
database. Here's an example that uses postgresql (note image tag change from `latest-h2` to `latest-postgresql`):
|
database. Here's an example that uses PostgreSQL (note the image tag change from `latest-h2` to `latest-postgresql`):
|
||||||
|
|
||||||
```
|
```
|
||||||
services:
|
services:
|
||||||
@@ -59,6 +59,13 @@ services:
|
|||||||
- /path/to/commafeed/db:/var/lib/postgresql/data
|
- /path/to/commafeed/db:/var/lib/postgresql/data
|
||||||
```
|
```
|
||||||
|
|
||||||
|
CommaFeed also supports:
|
||||||
|
|
||||||
|
- MySQL:
|
||||||
|
`QUARKUS_DATASOURCE_JDBC_URL=jdbc:mysql://localhost/commafeed?autoReconnect=true&failOverReadOnly=false&maxReconnects=20&rewriteBatchedStatements=true&timezone=UTC`
|
||||||
|
- MariaDB:
|
||||||
|
`QUARKUS_DATASOURCE_JDBC_URL=jdbc:mariadb://localhost/commafeed?autoReconnect=true&failOverReadOnly=false&maxReconnects=20&rewriteBatchedStatements=true&timezone=UTC`
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
All [CommaFeed settings](https://github.com/Athou/commafeed/blob/master/commafeed-server/doc/commafeed.adoc) are
|
All [CommaFeed settings](https://github.com/Athou/commafeed/blob/master/commafeed-server/doc/commafeed.adoc) are
|
||||||
@@ -72,6 +79,10 @@ meaning that you will have to log back in after each restart of the application.
|
|||||||
`QUARKUS_HTTP_AUTH_SESSION_ENCRYPTION_KEY` variable to a fixed value (min. 16 characters).
|
`QUARKUS_HTTP_AUTH_SESSION_ENCRYPTION_KEY` variable to a fixed value (min. 16 characters).
|
||||||
All other Quarkus settings can be found [here](https://quarkus.io/guides/all-config).
|
All other Quarkus settings can be found [here](https://quarkus.io/guides/all-config).
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
## Docker tags
|
## Docker tags
|
||||||
|
|
||||||
Tags are of the form `<version>-<database>[-jvm]` where:
|
Tags are of the form `<version>-<database>[-jvm]` where:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
import com.commafeed.backend.feed.FeedRefreshIntervalCalculator;
|
import com.commafeed.backend.feed.FeedRefreshIntervalCalculator;
|
||||||
|
|
||||||
|
import io.quarkus.runtime.annotations.ConfigDocSection;
|
||||||
import io.quarkus.runtime.annotations.ConfigPhase;
|
import io.quarkus.runtime.annotations.ConfigPhase;
|
||||||
import io.quarkus.runtime.annotations.ConfigRoot;
|
import io.quarkus.runtime.annotations.ConfigRoot;
|
||||||
import io.quarkus.runtime.configuration.MemorySize;
|
import io.quarkus.runtime.configuration.MemorySize;
|
||||||
@@ -62,26 +63,31 @@ public interface CommaFeedConfiguration {
|
|||||||
/**
|
/**
|
||||||
* HTTP client configuration
|
* HTTP client configuration
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
HttpClient httpClient();
|
HttpClient httpClient();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Feed refresh engine settings.
|
* Feed refresh engine settings.
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
FeedRefresh feedRefresh();
|
FeedRefresh feedRefresh();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database settings.
|
* Database settings.
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
Database database();
|
Database database();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Users settings.
|
* Users settings.
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
Users users();
|
Users users();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Websocket settings.
|
* Websocket settings.
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
Websocket websocket();
|
Websocket websocket();
|
||||||
|
|
||||||
interface HttpClient {
|
interface HttpClient {
|
||||||
@@ -180,7 +186,7 @@ public interface CommaFeedConfiguration {
|
|||||||
|
|
||||||
interface Database {
|
interface Database {
|
||||||
/**
|
/**
|
||||||
* Database query timeout.
|
* Timeout applied to all database queries.
|
||||||
*
|
*
|
||||||
* 0 to disable.
|
* 0 to disable.
|
||||||
*/
|
*/
|
||||||
@@ -190,6 +196,7 @@ public interface CommaFeedConfiguration {
|
|||||||
/**
|
/**
|
||||||
* Database cleanup settings.
|
* Database cleanup settings.
|
||||||
*/
|
*/
|
||||||
|
@ConfigDocSection
|
||||||
Cleanup cleanup();
|
Cleanup cleanup();
|
||||||
|
|
||||||
interface Cleanup {
|
interface Cleanup {
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.commafeed.backend.model;
|
package com.commafeed.backend.model;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.JdbcTypeCode;
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Lob;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -18,7 +22,9 @@ public class Feed extends AbstractModel {
|
|||||||
/**
|
/**
|
||||||
* The url of the feed
|
* The url of the feed
|
||||||
*/
|
*/
|
||||||
@Column(length = 2048, nullable = false)
|
@Lob
|
||||||
|
@Column(length = Integer.MAX_VALUE, nullable = false)
|
||||||
|
@JdbcTypeCode(Types.LONGVARCHAR)
|
||||||
private String url;
|
private String url;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +42,9 @@ public class Feed extends AbstractModel {
|
|||||||
/**
|
/**
|
||||||
* The url of the website, extracted from the feed
|
* The url of the website, extracted from the feed
|
||||||
*/
|
*/
|
||||||
@Column(length = 2048)
|
@Lob
|
||||||
|
@Column(length = Integer.MAX_VALUE)
|
||||||
|
@JdbcTypeCode(Types.LONGVARCHAR)
|
||||||
private String link;
|
private String link;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,7 +68,9 @@ public class Feed extends AbstractModel {
|
|||||||
/**
|
/**
|
||||||
* error message while retrieving the feed
|
* error message while retrieving the feed
|
||||||
*/
|
*/
|
||||||
@Column(length = 1024)
|
@Lob
|
||||||
|
@Column(length = Integer.MAX_VALUE)
|
||||||
|
@JdbcTypeCode(Types.LONGVARCHAR)
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.commafeed.backend.model;
|
package com.commafeed.backend.model;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.JdbcTypeCode;
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Lob;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -21,13 +25,17 @@ public class User extends AbstractModel {
|
|||||||
@Column(length = 255, unique = true)
|
@Column(length = 255, unique = true)
|
||||||
private String email;
|
private String email;
|
||||||
|
|
||||||
@Column(length = 256, nullable = false)
|
@Lob
|
||||||
|
@Column(length = Integer.MAX_VALUE, nullable = false)
|
||||||
|
@JdbcTypeCode(Types.LONGVARBINARY)
|
||||||
private byte[] password;
|
private byte[] password;
|
||||||
|
|
||||||
@Column(length = 40, unique = true)
|
@Column(length = 40, unique = true)
|
||||||
private String apiKey;
|
private String apiKey;
|
||||||
|
|
||||||
@Column(length = 8, nullable = false)
|
@Lob
|
||||||
|
@Column(length = Integer.MAX_VALUE, nullable = false)
|
||||||
|
@JdbcTypeCode(Types.LONGVARBINARY)
|
||||||
private byte[] salt;
|
private byte[] salt;
|
||||||
|
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ public class UserSettings extends AbstractModel {
|
|||||||
private boolean markAllAsReadConfirmation;
|
private boolean markAllAsReadConfirmation;
|
||||||
private boolean customContextMenu;
|
private boolean customContextMenu;
|
||||||
private boolean mobileFooter;
|
private boolean mobileFooter;
|
||||||
|
private boolean unreadCountTitle;
|
||||||
|
private boolean unreadCountFavicon;
|
||||||
|
|
||||||
private boolean email;
|
private boolean email;
|
||||||
private boolean gmail;
|
private boolean gmail;
|
||||||
|
|||||||
@@ -59,12 +59,12 @@ public class DatabaseCleaningService {
|
|||||||
entriesDeleted = unitOfWork.call(() -> feedEntryDAO.delete(feed.getId(), batchSize));
|
entriesDeleted = unitOfWork.call(() -> feedEntryDAO.delete(feed.getId(), batchSize));
|
||||||
entriesDeletedMeter.mark(entriesDeleted);
|
entriesDeletedMeter.mark(entriesDeleted);
|
||||||
entriesTotal += entriesDeleted;
|
entriesTotal += entriesDeleted;
|
||||||
log.info("removed {} entries for feeds without subscriptions", entriesTotal);
|
log.debug("removed {} entries for feeds without subscriptions", entriesTotal);
|
||||||
} while (entriesDeleted > 0);
|
} while (entriesDeleted > 0);
|
||||||
}
|
}
|
||||||
deleted = unitOfWork.call(() -> feedDAO.delete(feedDAO.findByIds(feeds.stream().map(AbstractModel::getId).toList())));
|
deleted = unitOfWork.call(() -> feedDAO.delete(feedDAO.findByIds(feeds.stream().map(AbstractModel::getId).toList())));
|
||||||
total += deleted;
|
total += deleted;
|
||||||
log.info("removed {} feeds without subscriptions", total);
|
log.debug("removed {} feeds without subscriptions", total);
|
||||||
} while (deleted != 0);
|
} while (deleted != 0);
|
||||||
log.info("cleanup done: {} feeds without subscriptions deleted", total);
|
log.info("cleanup done: {} feeds without subscriptions deleted", total);
|
||||||
}
|
}
|
||||||
@@ -76,7 +76,7 @@ public class DatabaseCleaningService {
|
|||||||
do {
|
do {
|
||||||
deleted = unitOfWork.call(() -> feedEntryContentDAO.deleteWithoutEntries(batchSize));
|
deleted = unitOfWork.call(() -> feedEntryContentDAO.deleteWithoutEntries(batchSize));
|
||||||
total += deleted;
|
total += deleted;
|
||||||
log.info("removed {} contents without entries", total);
|
log.debug("removed {} contents without entries", total);
|
||||||
} while (deleted != 0);
|
} while (deleted != 0);
|
||||||
log.info("cleanup done: {} contents without entries deleted", total);
|
log.info("cleanup done: {} contents without entries deleted", total);
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ public class DatabaseCleaningService {
|
|||||||
entriesDeletedMeter.mark(deleted);
|
entriesDeletedMeter.mark(deleted);
|
||||||
total += deleted;
|
total += deleted;
|
||||||
remaining -= deleted;
|
remaining -= deleted;
|
||||||
log.info("removed {} entries for feeds exceeding capacity", total);
|
log.debug("removed {} entries for feeds exceeding capacity", total);
|
||||||
} while (remaining > 0);
|
} while (remaining > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +113,7 @@ public class DatabaseCleaningService {
|
|||||||
deleted = unitOfWork.call(() -> feedEntryDAO.deleteEntriesOlderThan(olderThan, batchSize));
|
deleted = unitOfWork.call(() -> feedEntryDAO.deleteEntriesOlderThan(olderThan, batchSize));
|
||||||
entriesDeletedMeter.mark(deleted);
|
entriesDeletedMeter.mark(deleted);
|
||||||
total += deleted;
|
total += deleted;
|
||||||
log.info("removed {} old entries", total);
|
log.debug("removed {} old entries", total);
|
||||||
} while (deleted != 0);
|
} while (deleted != 0);
|
||||||
log.info("cleanup done: {} old entries deleted", total);
|
log.info("cleanup done: {} old entries deleted", total);
|
||||||
}
|
}
|
||||||
@@ -125,7 +125,7 @@ public class DatabaseCleaningService {
|
|||||||
do {
|
do {
|
||||||
deleted = unitOfWork.call(() -> feedEntryStatusDAO.deleteOldStatuses(olderThan, batchSize));
|
deleted = unitOfWork.call(() -> feedEntryStatusDAO.deleteOldStatuses(olderThan, batchSize));
|
||||||
total += deleted;
|
total += deleted;
|
||||||
log.info("removed {} old read statuses", total);
|
log.debug("removed {} old read statuses", total);
|
||||||
} while (deleted != 0);
|
} while (deleted != 0);
|
||||||
log.info("cleanup done: {} old read statuses deleted", total);
|
log.info("cleanup done: {} old read statuses deleted", total);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,12 @@ public class Settings implements Serializable {
|
|||||||
@Schema(description = "on mobile, show action buttons at the bottom of the screen", requiredMode = RequiredMode.REQUIRED)
|
@Schema(description = "on mobile, show action buttons at the bottom of the screen", requiredMode = RequiredMode.REQUIRED)
|
||||||
private boolean mobileFooter;
|
private boolean mobileFooter;
|
||||||
|
|
||||||
|
@Schema(description = "show unread count in the title", requiredMode = RequiredMode.REQUIRED)
|
||||||
|
private boolean unreadCountTitle;
|
||||||
|
|
||||||
|
@Schema(description = "show unread count in the favicon", requiredMode = RequiredMode.REQUIRED)
|
||||||
|
private boolean unreadCountFavicon;
|
||||||
|
|
||||||
@Schema(description = "sharing settings", requiredMode = RequiredMode.REQUIRED)
|
@Schema(description = "sharing settings", requiredMode = RequiredMode.REQUIRED)
|
||||||
private SharingSettings sharingSettings = new SharingSettings();
|
private SharingSettings sharingSettings = new SharingSettings();
|
||||||
|
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ public class FeedREST {
|
|||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.debug(e.getMessage(), e);
|
log.debug(e.getMessage(), e);
|
||||||
throw new WebApplicationException(e, Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build());
|
throw new WebApplicationException(e.getMessage(), Status.INTERNAL_SERVER_ERROR);
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import io.swagger.v3.oas.annotations.servers.Server;
|
|||||||
|
|
||||||
@OpenAPIDefinition(
|
@OpenAPIDefinition(
|
||||||
info = @Info(title = "CommaFeed API"),
|
info = @Info(title = "CommaFeed API"),
|
||||||
servers = { @Server(description = "CommaFeed API", url = "rest") },
|
servers = { @Server(description = "CommaFeed API", url = "/") },
|
||||||
security = { @SecurityRequirement(name = "basicAuth") })
|
security = { @SecurityRequirement(name = "basicAuth") })
|
||||||
@SecurityScheme(name = "basicAuth", type = SecuritySchemeType.HTTP, scheme = "basic")
|
@SecurityScheme(name = "basicAuth", type = SecuritySchemeType.HTTP, scheme = "basic")
|
||||||
public class OpenAPI {
|
public class OpenAPI {
|
||||||
|
|||||||
@@ -119,6 +119,8 @@ public class UserREST {
|
|||||||
s.setMarkAllAsReadConfirmation(settings.isMarkAllAsReadConfirmation());
|
s.setMarkAllAsReadConfirmation(settings.isMarkAllAsReadConfirmation());
|
||||||
s.setCustomContextMenu(settings.isCustomContextMenu());
|
s.setCustomContextMenu(settings.isCustomContextMenu());
|
||||||
s.setMobileFooter(settings.isMobileFooter());
|
s.setMobileFooter(settings.isMobileFooter());
|
||||||
|
s.setUnreadCountTitle(settings.isUnreadCountTitle());
|
||||||
|
s.setUnreadCountFavicon(settings.isUnreadCountFavicon());
|
||||||
} else {
|
} else {
|
||||||
s.setReadingMode(ReadingMode.unread.name());
|
s.setReadingMode(ReadingMode.unread.name());
|
||||||
s.setReadingOrder(ReadingOrder.desc.name());
|
s.setReadingOrder(ReadingOrder.desc.name());
|
||||||
@@ -142,6 +144,8 @@ public class UserREST {
|
|||||||
s.setMarkAllAsReadConfirmation(true);
|
s.setMarkAllAsReadConfirmation(true);
|
||||||
s.setCustomContextMenu(true);
|
s.setCustomContextMenu(true);
|
||||||
s.setMobileFooter(false);
|
s.setMobileFooter(false);
|
||||||
|
s.setUnreadCountTitle(false);
|
||||||
|
s.setUnreadCountFavicon(true);
|
||||||
}
|
}
|
||||||
return Response.ok(s).build();
|
return Response.ok(s).build();
|
||||||
}
|
}
|
||||||
@@ -173,6 +177,8 @@ public class UserREST {
|
|||||||
s.setMarkAllAsReadConfirmation(settings.isMarkAllAsReadConfirmation());
|
s.setMarkAllAsReadConfirmation(settings.isMarkAllAsReadConfirmation());
|
||||||
s.setCustomContextMenu(settings.isCustomContextMenu());
|
s.setCustomContextMenu(settings.isCustomContextMenu());
|
||||||
s.setMobileFooter(settings.isMobileFooter());
|
s.setMobileFooter(settings.isMobileFooter());
|
||||||
|
s.setUnreadCountTitle(settings.isUnreadCountTitle());
|
||||||
|
s.setUnreadCountFavicon(settings.isUnreadCountFavicon());
|
||||||
|
|
||||||
s.setEmail(settings.getSharingSettings().isEmail());
|
s.setEmail(settings.getSharingSettings().isEmail());
|
||||||
s.setGmail(settings.getSharingSettings().isGmail());
|
s.setGmail(settings.getSharingSettings().isGmail());
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package com.commafeed.frontend.servlet;
|
package com.commafeed.frontend.servlet;
|
||||||
|
|
||||||
import com.commafeed.backend.dao.UnitOfWork;
|
|
||||||
import com.commafeed.backend.dao.UserSettingsDAO;
|
import com.commafeed.backend.dao.UserSettingsDAO;
|
||||||
import com.commafeed.backend.model.User;
|
import com.commafeed.backend.model.User;
|
||||||
import com.commafeed.backend.model.UserSettings;
|
import com.commafeed.backend.model.UserSettings;
|
||||||
import com.commafeed.security.AuthenticationContext;
|
import com.commafeed.security.AuthenticationContext;
|
||||||
|
|
||||||
import jakarta.inject.Singleton;
|
import jakarta.inject.Singleton;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
import jakarta.ws.rs.GET;
|
import jakarta.ws.rs.GET;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
import jakarta.ws.rs.Produces;
|
import jakarta.ws.rs.Produces;
|
||||||
@@ -20,16 +20,16 @@ public class CustomCssServlet {
|
|||||||
|
|
||||||
private final AuthenticationContext authenticationContext;
|
private final AuthenticationContext authenticationContext;
|
||||||
private final UserSettingsDAO userSettingsDAO;
|
private final UserSettingsDAO userSettingsDAO;
|
||||||
private final UnitOfWork unitOfWork;
|
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@Transactional
|
||||||
public String get() {
|
public String get() {
|
||||||
User user = authenticationContext.getCurrentUser();
|
User user = authenticationContext.getCurrentUser();
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
UserSettings settings = unitOfWork.call(() -> userSettingsDAO.findByUser(user));
|
UserSettings settings = userSettingsDAO.findByUser(user);
|
||||||
if (settings == null) {
|
if (settings == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package com.commafeed.frontend.servlet;
|
package com.commafeed.frontend.servlet;
|
||||||
|
|
||||||
import com.commafeed.backend.dao.UnitOfWork;
|
|
||||||
import com.commafeed.backend.dao.UserSettingsDAO;
|
import com.commafeed.backend.dao.UserSettingsDAO;
|
||||||
import com.commafeed.backend.model.User;
|
import com.commafeed.backend.model.User;
|
||||||
import com.commafeed.backend.model.UserSettings;
|
import com.commafeed.backend.model.UserSettings;
|
||||||
import com.commafeed.security.AuthenticationContext;
|
import com.commafeed.security.AuthenticationContext;
|
||||||
|
|
||||||
import jakarta.inject.Singleton;
|
import jakarta.inject.Singleton;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
import jakarta.ws.rs.GET;
|
import jakarta.ws.rs.GET;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
import jakarta.ws.rs.Produces;
|
import jakarta.ws.rs.Produces;
|
||||||
@@ -20,16 +20,16 @@ public class CustomJsServlet {
|
|||||||
|
|
||||||
private final AuthenticationContext authenticationContext;
|
private final AuthenticationContext authenticationContext;
|
||||||
private final UserSettingsDAO userSettingsDAO;
|
private final UserSettingsDAO userSettingsDAO;
|
||||||
private final UnitOfWork unitOfWork;
|
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@Transactional
|
||||||
public String get() {
|
public String get() {
|
||||||
User user = authenticationContext.getCurrentUser();
|
User user = authenticationContext.getCurrentUser();
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
UserSettings settings = unitOfWork.call(() -> userSettingsDAO.findByUser(user));
|
UserSettings settings = userSettingsDAO.findByUser(user);
|
||||||
if (settings == null) {
|
if (settings == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import com.commafeed.backend.dao.FeedCategoryDAO;
|
import com.commafeed.backend.dao.FeedCategoryDAO;
|
||||||
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
||||||
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
||||||
import com.commafeed.backend.dao.UnitOfWork;
|
|
||||||
import com.commafeed.backend.model.FeedCategory;
|
import com.commafeed.backend.model.FeedCategory;
|
||||||
import com.commafeed.backend.model.FeedEntryStatus;
|
import com.commafeed.backend.model.FeedEntryStatus;
|
||||||
import com.commafeed.backend.model.FeedSubscription;
|
import com.commafeed.backend.model.FeedSubscription;
|
||||||
@@ -20,6 +19,7 @@ import com.commafeed.security.AuthenticationContext;
|
|||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
import jakarta.inject.Singleton;
|
import jakarta.inject.Singleton;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
import jakarta.ws.rs.DefaultValue;
|
import jakarta.ws.rs.DefaultValue;
|
||||||
import jakarta.ws.rs.GET;
|
import jakarta.ws.rs.GET;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
@@ -33,7 +33,6 @@ import lombok.RequiredArgsConstructor;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class NextUnreadServlet {
|
public class NextUnreadServlet {
|
||||||
|
|
||||||
private final UnitOfWork unitOfWork;
|
|
||||||
private final FeedSubscriptionDAO feedSubscriptionDAO;
|
private final FeedSubscriptionDAO feedSubscriptionDAO;
|
||||||
private final FeedEntryStatusDAO feedEntryStatusDAO;
|
private final FeedEntryStatusDAO feedEntryStatusDAO;
|
||||||
private final FeedCategoryDAO feedCategoryDAO;
|
private final FeedCategoryDAO feedCategoryDAO;
|
||||||
@@ -42,36 +41,34 @@ public class NextUnreadServlet {
|
|||||||
private final UriInfo uri;
|
private final UriInfo uri;
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@Transactional
|
||||||
public Response get(@QueryParam("category") String categoryId, @QueryParam("order") @DefaultValue("desc") ReadingOrder order) {
|
public Response get(@QueryParam("category") String categoryId, @QueryParam("order") @DefaultValue("desc") ReadingOrder order) {
|
||||||
User user = authenticationContext.getCurrentUser();
|
User user = authenticationContext.getCurrentUser();
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return Response.temporaryRedirect(uri.getBaseUri()).build();
|
return Response.temporaryRedirect(uri.getBaseUri()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
FeedEntryStatus status = unitOfWork.call(() -> {
|
FeedEntryStatus s = null;
|
||||||
FeedEntryStatus s = null;
|
if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) {
|
||||||
if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) {
|
List<FeedSubscription> subs = feedSubscriptionDAO.findAll(user);
|
||||||
List<FeedSubscription> subs = feedSubscriptionDAO.findAll(user);
|
List<FeedEntryStatus> statuses = feedEntryStatusDAO.findBySubscriptions(user, subs, true, null, null, 0, 1, order, true, null,
|
||||||
List<FeedEntryStatus> statuses = feedEntryStatusDAO.findBySubscriptions(user, subs, true, null, null, 0, 1, order, true,
|
null, null);
|
||||||
null, null, null);
|
s = Iterables.getFirst(statuses, null);
|
||||||
|
} else {
|
||||||
|
FeedCategory category = feedCategoryDAO.findById(user, Long.valueOf(categoryId));
|
||||||
|
if (category != null) {
|
||||||
|
List<FeedCategory> children = feedCategoryDAO.findAllChildrenCategories(user, category);
|
||||||
|
List<FeedSubscription> subscriptions = feedSubscriptionDAO.findByCategories(user, children);
|
||||||
|
List<FeedEntryStatus> statuses = feedEntryStatusDAO.findBySubscriptions(user, subscriptions, true, null, null, 0, 1, order,
|
||||||
|
true, null, null, null);
|
||||||
s = Iterables.getFirst(statuses, null);
|
s = Iterables.getFirst(statuses, null);
|
||||||
} else {
|
|
||||||
FeedCategory category = feedCategoryDAO.findById(user, Long.valueOf(categoryId));
|
|
||||||
if (category != null) {
|
|
||||||
List<FeedCategory> children = feedCategoryDAO.findAllChildrenCategories(user, category);
|
|
||||||
List<FeedSubscription> subscriptions = feedSubscriptionDAO.findByCategories(user, children);
|
|
||||||
List<FeedEntryStatus> statuses = feedEntryStatusDAO.findBySubscriptions(user, subscriptions, true, null, null, 0, 1,
|
|
||||||
order, true, null, null, null);
|
|
||||||
s = Iterables.getFirst(statuses, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (s != null) {
|
}
|
||||||
feedEntryService.markEntry(user, s.getEntry().getId(), true);
|
if (s != null) {
|
||||||
}
|
feedEntryService.markEntry(user, s.getEntry().getId(), true);
|
||||||
return s;
|
}
|
||||||
});
|
|
||||||
|
|
||||||
String url = status == null ? uri.getBaseUri().toString() : status.getEntry().getUrl();
|
String url = s == null ? uri.getBaseUri().toString() : s.getEntry().getUrl();
|
||||||
return Response.temporaryRedirect(URI.create(url)).build();
|
return Response.temporaryRedirect(URI.create(url)).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
package com.commafeed.security.mechanism;
|
package com.commafeed.security.mechanism;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
import io.quarkus.security.identity.IdentityProviderManager;
|
||||||
import java.util.Base64;
|
import io.quarkus.security.identity.SecurityIdentity;
|
||||||
|
|
||||||
import io.quarkus.vertx.http.runtime.FormAuthConfig;
|
|
||||||
import io.quarkus.vertx.http.runtime.FormAuthRuntimeConfig;
|
|
||||||
import io.quarkus.vertx.http.runtime.HttpBuildTimeConfig;
|
|
||||||
import io.quarkus.vertx.http.runtime.HttpConfiguration;
|
import io.quarkus.vertx.http.runtime.HttpConfiguration;
|
||||||
import io.quarkus.vertx.http.runtime.security.FormAuthenticationMechanism;
|
import io.quarkus.vertx.http.runtime.security.FormAuthenticationMechanism;
|
||||||
import io.quarkus.vertx.http.runtime.security.HttpAuthenticationMechanism;
|
import io.quarkus.vertx.http.runtime.security.HttpAuthenticationMechanism;
|
||||||
import io.quarkus.vertx.http.runtime.security.PersistentLoginManager;
|
import io.smallrye.mutiny.Uni;
|
||||||
import io.vertx.core.http.Cookie;
|
import io.vertx.core.http.Cookie;
|
||||||
import io.vertx.core.http.impl.ServerCookie;
|
import io.vertx.core.http.impl.ServerCookie;
|
||||||
import io.vertx.ext.web.RoutingContext;
|
import io.vertx.ext.web.RoutingContext;
|
||||||
import jakarta.annotation.Priority;
|
import jakarta.annotation.Priority;
|
||||||
import jakarta.inject.Singleton;
|
import jakarta.inject.Singleton;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.experimental.Delegate;
|
import lombok.experimental.Delegate;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@@ -24,67 +21,24 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
* This is a workaround for https://github.com/quarkusio/quarkus/issues/42463
|
* This is a workaround for https://github.com/quarkusio/quarkus/issues/42463
|
||||||
*/
|
*/
|
||||||
@Priority(1)
|
@Priority(1)
|
||||||
|
@RequiredArgsConstructor
|
||||||
@Singleton
|
@Singleton
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class CookieMaxAgeFormAuthenticationMechanism implements HttpAuthenticationMechanism {
|
public class CookieMaxAgeFormAuthenticationMechanism implements HttpAuthenticationMechanism {
|
||||||
|
|
||||||
// the temp encryption key, persistent across dev mode restarts
|
|
||||||
static volatile String encryptionKey;
|
|
||||||
|
|
||||||
@Delegate
|
@Delegate
|
||||||
private final FormAuthenticationMechanism delegate;
|
private final FormAuthenticationMechanism delegate;
|
||||||
|
private final HttpConfiguration config;
|
||||||
|
|
||||||
public CookieMaxAgeFormAuthenticationMechanism(HttpConfiguration httpConfiguration, HttpBuildTimeConfig buildTimeConfig) {
|
@Override
|
||||||
String key;
|
public Uni<SecurityIdentity> authenticate(RoutingContext context, IdentityProviderManager identityProviderManager) {
|
||||||
if (httpConfiguration.encryptionKey.isEmpty()) {
|
context.addHeadersEndHandler(v -> {
|
||||||
if (encryptionKey != null) {
|
Cookie cookie = context.request().getCookie(config.auth.form.cookieName);
|
||||||
// persist across dev mode restarts
|
if (cookie instanceof ServerCookie sc && sc.isChanged()) {
|
||||||
key = encryptionKey;
|
cookie.setMaxAge(config.auth.form.timeout.toSeconds());
|
||||||
} else {
|
|
||||||
byte[] data = new byte[32];
|
|
||||||
new SecureRandom().nextBytes(data);
|
|
||||||
key = encryptionKey = Base64.getEncoder().encodeToString(data);
|
|
||||||
log.warn("Encryption key was not specified for persistent FORM auth, using temporary key {}", key);
|
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
key = httpConfiguration.encryptionKey.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
FormAuthConfig form = buildTimeConfig.auth.form;
|
return delegate.authenticate(context, identityProviderManager);
|
||||||
FormAuthRuntimeConfig runtimeForm = httpConfiguration.auth.form;
|
|
||||||
String loginPage = startWithSlash(runtimeForm.loginPage.orElse(null));
|
|
||||||
String errorPage = startWithSlash(runtimeForm.errorPage.orElse(null));
|
|
||||||
String landingPage = startWithSlash(runtimeForm.landingPage.orElse(null));
|
|
||||||
String postLocation = startWithSlash(form.postLocation);
|
|
||||||
String usernameParameter = runtimeForm.usernameParameter;
|
|
||||||
String passwordParameter = runtimeForm.passwordParameter;
|
|
||||||
String locationCookie = runtimeForm.locationCookie;
|
|
||||||
String cookiePath = runtimeForm.cookiePath.orElse(null);
|
|
||||||
boolean redirectAfterLogin = landingPage != null;
|
|
||||||
String cookieSameSite = runtimeForm.cookieSameSite.name();
|
|
||||||
|
|
||||||
PersistentLoginManager loginManager = new PersistentLoginManager(key, runtimeForm.cookieName, runtimeForm.timeout.toMillis(),
|
|
||||||
runtimeForm.newCookieInterval.toMillis(), runtimeForm.httpOnlyCookie, cookieSameSite, cookiePath) {
|
|
||||||
@Override
|
|
||||||
public void save(String value, RoutingContext context, String cookieName, RestoreResult restoreResult, boolean secureCookie) {
|
|
||||||
super.save(value, context, cookieName, restoreResult, secureCookie);
|
|
||||||
|
|
||||||
// add max age to the cookie
|
|
||||||
Cookie cookie = context.request().getCookie(cookieName);
|
|
||||||
if (cookie instanceof ServerCookie sc && sc.isChanged()) {
|
|
||||||
cookie.setMaxAge(runtimeForm.timeout.toSeconds());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.delegate = new FormAuthenticationMechanism(loginPage, postLocation, usernameParameter, passwordParameter, errorPage,
|
|
||||||
landingPage, redirectAfterLogin, locationCookie, cookieSameSite, cookiePath, loginManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String startWithSlash(String page) {
|
|
||||||
if (page == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return page.startsWith("/") ? page : "/" + page;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,14 @@
|
|||||||
quarkus.http.port=8082
|
quarkus.http.port=8082
|
||||||
quarkus.http.test-port=8085
|
quarkus.http.test-port=8085
|
||||||
|
|
||||||
|
# static files
|
||||||
|
## make sure the webapp is always up to date
|
||||||
|
quarkus.http.filter.index-html.header."Cache-Control"=no-cache
|
||||||
|
quarkus.http.filter.index-html.matches=/
|
||||||
|
## make sure the openapi documentation is always up to date
|
||||||
|
quarkus.http.filter.openapi.header."Cache-Control"=no-cache
|
||||||
|
quarkus.http.filter.openapi.matches=/openapi[.](json|yaml)
|
||||||
|
|
||||||
# security
|
# security
|
||||||
quarkus.http.auth.basic=true
|
quarkus.http.auth.basic=true
|
||||||
quarkus.http.auth.form.enabled=true
|
quarkus.http.auth.form.enabled=true
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
|
||||||
|
|
||||||
|
<changeSet id="add-unread-count-settings" author="athou">
|
||||||
|
<validCheckSum>9:b4a4044ca0f7d9987536083943d4f1b4</validCheckSum>
|
||||||
|
<addColumn tableName="USERSETTINGS">
|
||||||
|
<column name="unreadCountTitle" type="BOOLEAN" valueBoolean="false">
|
||||||
|
<constraints nullable="false" />
|
||||||
|
</column>
|
||||||
|
<column name="unreadCountFavicon" type="BOOLEAN" valueBoolean="true">
|
||||||
|
<constraints nullable="false" />
|
||||||
|
</column>
|
||||||
|
</addColumn>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
<changeSet id="add-missing-fk-on-statuses-user" author="athou">
|
||||||
|
<delete tableName="FEEDENTRYSTATUSES">
|
||||||
|
<where>user_id not in (select id from USERS)</where>
|
||||||
|
</delete>
|
||||||
|
<addForeignKeyConstraint baseTableName="FEEDENTRYSTATUSES"
|
||||||
|
baseColumnNames="user_id"
|
||||||
|
constraintName="fk_feedentrystatuses_user"
|
||||||
|
referencedTableName="USERS"
|
||||||
|
referencedColumnNames="id" />
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -31,5 +31,6 @@
|
|||||||
<include file="changelogs/db.changelog-4.2.xml" />
|
<include file="changelogs/db.changelog-4.2.xml" />
|
||||||
<include file="changelogs/db.changelog-4.3.xml" />
|
<include file="changelogs/db.changelog-4.3.xml" />
|
||||||
<include file="changelogs/db.changelog-4.4.xml" />
|
<include file="changelogs/db.changelog-4.4.xml" />
|
||||||
|
<include file="changelogs/db.changelog-5.1.xml" />
|
||||||
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -13,8 +13,8 @@ class CommaFeedConfigurationTest {
|
|||||||
@Test
|
@Test
|
||||||
void verifyAsciiDocIsUpToDate() throws IOException {
|
void verifyAsciiDocIsUpToDate() throws IOException {
|
||||||
String versionedDocumentationFile = FileUtils.readFileToString(new File("doc/commafeed.adoc"), StandardCharsets.UTF_8);
|
String versionedDocumentationFile = FileUtils.readFileToString(new File("doc/commafeed.adoc"), StandardCharsets.UTF_8);
|
||||||
String generatedDocumentationFile = FileUtils.readFileToString(new File("../target/asciidoc/generated/config/commafeed.adoc"),
|
String generatedDocumentationFile = FileUtils
|
||||||
StandardCharsets.UTF_8);
|
.readFileToString(new File("target/quarkus-generated-doc/config/commafeed-server.adoc"), StandardCharsets.UTF_8);
|
||||||
|
|
||||||
Assertions.assertLinesMatch(versionedDocumentationFile.lines(), generatedDocumentationFile.lines());
|
Assertions.assertLinesMatch(versionedDocumentationFile.lines(), generatedDocumentationFile.lines());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,12 +4,10 @@ import org.kohsuke.MetaInfServices;
|
|||||||
|
|
||||||
import com.commafeed.backend.service.db.DatabaseStartupService;
|
import com.commafeed.backend.service.db.DatabaseStartupService;
|
||||||
|
|
||||||
import io.quarkus.liquibase.LiquibaseFactory;
|
import io.quarkus.liquibase.runtime.LiquibaseSchemaProvider;
|
||||||
import io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback;
|
import io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback;
|
||||||
import io.quarkus.test.junit.callback.QuarkusTestMethodContext;
|
import io.quarkus.test.junit.callback.QuarkusTestMethodContext;
|
||||||
import jakarta.enterprise.inject.spi.CDI;
|
import jakarta.enterprise.inject.spi.CDI;
|
||||||
import liquibase.Liquibase;
|
|
||||||
import liquibase.exception.LiquibaseException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets database between tests
|
* Resets database between tests
|
||||||
@@ -17,18 +15,9 @@ import liquibase.exception.LiquibaseException;
|
|||||||
@MetaInfServices
|
@MetaInfServices
|
||||||
public class DatabaseReset implements QuarkusTestBeforeEachCallback {
|
public class DatabaseReset implements QuarkusTestBeforeEachCallback {
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeEach(QuarkusTestMethodContext context) {
|
public void beforeEach(QuarkusTestMethodContext context) {
|
||||||
LiquibaseFactory liquibaseFactory = CDI.current().select(LiquibaseFactory.class).get();
|
new LiquibaseSchemaProvider().resetAllDatabases();
|
||||||
try (Liquibase liquibase = liquibaseFactory.createLiquibase()) {
|
CDI.current().select(DatabaseStartupService.class).get().populateInitialData();
|
||||||
liquibase.dropAll();
|
|
||||||
liquibase.update(liquibaseFactory.createContexts(), liquibaseFactory.createLabels());
|
|
||||||
} catch (LiquibaseException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseStartupService databaseStartupService = CDI.current().select(DatabaseStartupService.class).get();
|
|
||||||
databaseStartupService.populateInitialData();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,25 @@
|
|||||||
package com.commafeed.backend;
|
package com.commafeed.backend;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.zip.DeflaterOutputStream;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.hc.client5.http.ConnectTimeoutException;
|
import org.apache.hc.client5.http.ConnectTimeoutException;
|
||||||
import org.apache.hc.core5.http.HttpStatus;
|
import org.apache.hc.core5.http.HttpStatus;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Nested;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
@@ -183,23 +189,6 @@ class HttpGetterTest {
|
|||||||
Assertions.assertEquals(2, calls.get());
|
Assertions.assertEquals(2, calls.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
void supportsCompression() {
|
|
||||||
this.mockServerClient.when(HttpRequest.request().withMethod("GET")).respond(req -> {
|
|
||||||
String acceptEncodingHeader = req.getFirstHeader(HttpHeaders.ACCEPT_ENCODING);
|
|
||||||
if (!acceptEncodingHeader.contains("deflate")) {
|
|
||||||
throw new Exception("deflate should be in the Accept-Encoding header");
|
|
||||||
}
|
|
||||||
if (!acceptEncodingHeader.contains("gzip")) {
|
|
||||||
throw new Exception("gzip should be in the Accept-Encoding header");
|
|
||||||
}
|
|
||||||
|
|
||||||
return HttpResponse.response().withBody("ok");
|
|
||||||
});
|
|
||||||
|
|
||||||
Assertions.assertDoesNotThrow(() -> getter.getBinary(this.feedUrl));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void largeFeedWithContentLengthHeader() {
|
void largeFeedWithContentLengthHeader() {
|
||||||
byte[] bytes = new byte[100000];
|
byte[] bytes = new byte[100000];
|
||||||
@@ -231,4 +220,46 @@ class HttpGetterTest {
|
|||||||
Assertions.assertEquals("ok", new String(result.getContent()));
|
Assertions.assertEquals("ok", new String(result.getContent()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class Compression {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void deflate() throws IOException, NotModifiedException {
|
||||||
|
supportsCompression("deflate", DeflaterOutputStream::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void gzip() throws IOException, NotModifiedException {
|
||||||
|
supportsCompression("gzip", GZIPOutputStream::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
void supportsCompression(String encoding, CompressionOutputStreamFunction compressionOutputStreamFunction)
|
||||||
|
throws IOException, NotModifiedException {
|
||||||
|
String body = "my body";
|
||||||
|
|
||||||
|
HttpGetterTest.this.mockServerClient.when(HttpRequest.request().withMethod("GET")).respond(req -> {
|
||||||
|
String acceptEncodingHeader = req.getFirstHeader(HttpHeaders.ACCEPT_ENCODING);
|
||||||
|
if (!Set.of(acceptEncodingHeader.split(", ")).contains(encoding)) {
|
||||||
|
throw new Exception(encoding + " should be in the Accept-Encoding header");
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||||
|
try (OutputStream compressionOutputStream = compressionOutputStreamFunction.apply(output)) {
|
||||||
|
compressionOutputStream.write(body.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse.response().withBody(output.toByteArray()).withHeader(HttpHeaders.CONTENT_ENCODING, encoding);
|
||||||
|
});
|
||||||
|
|
||||||
|
HttpResult result = getter.getBinary(HttpGetterTest.this.feedUrl);
|
||||||
|
Assertions.assertEquals(body, new String(result.getContent()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface CompressionOutputStreamFunction {
|
||||||
|
OutputStream apply(OutputStream input) throws IOException;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.commafeed.integration;
|
||||||
|
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
|
||||||
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
|
import io.restassured.RestAssured;
|
||||||
|
|
||||||
|
@QuarkusTest
|
||||||
|
class StaticFilesIT {
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(strings = { "/", "/openapi.json", "/openapi.yaml" })
|
||||||
|
void servedWithoutCache(String path) {
|
||||||
|
RestAssured.given().when().get(path).then().statusCode(200).header("Cache-Control", "no-cache");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(strings = { "/favicon.ico" })
|
||||||
|
void servedWithCache(String path) {
|
||||||
|
RestAssured.given().when().get(path).then().statusCode(200).header("Cache-Control", "public, immutable, max-age=86400");
|
||||||
|
}
|
||||||
|
}
|
||||||
2
pom.xml
2
pom.xml
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>com.commafeed</groupId>
|
<groupId>com.commafeed</groupId>
|
||||||
<artifactId>commafeed</artifactId>
|
<artifactId>commafeed</artifactId>
|
||||||
<version>5.0.2</version>
|
<version>5.1.1</version>
|
||||||
<name>CommaFeed</name>
|
<name>CommaFeed</name>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,23 @@
|
|||||||
],
|
],
|
||||||
"packageRules": [
|
"packageRules": [
|
||||||
{
|
{
|
||||||
|
"description": "ignore our client because it's not published on maven central",
|
||||||
"matchManagers": "maven",
|
"matchManagers": "maven",
|
||||||
"matchPackagePatterns": "commafeed-client",
|
"matchPackagePatterns": "commafeed-client",
|
||||||
"enabled": false
|
"enabled": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "io.quarkus.platform artifacts are released a week after io.quarkus artifacts",
|
||||||
|
"matchManagers": "maven",
|
||||||
|
"matchPackageNames": "io.quarkus:**",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"matchManagers": "npm",
|
"matchManagers": "npm",
|
||||||
"rangeStrategy": "bump"
|
"rangeStrategy": "bump"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"description": "IBM Semeru Runtimes uses a custom versioning scheme",
|
||||||
"matchDatasources": "docker",
|
"matchDatasources": "docker",
|
||||||
"matchPackageNames": "ibm-semeru-runtimes",
|
"matchPackageNames": "ibm-semeru-runtimes",
|
||||||
"versioning": "regex:^open-(?<major>\\d+)?(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?([\\._+](?<build>(\\d\\.?)+))?(-(?<compatibility>.*))?$",
|
"versioning": "regex:^open-(?<major>\\d+)?(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?([\\._+](?<build>(\\d\\.?)+))?(-(?<compatibility>.*))?$",
|
||||||
|
|||||||
Reference in New Issue
Block a user