Compare commits

...

20 Commits

Author SHA1 Message Date
Athou
99130d0181 combine EnvironmentSubstitutor and SubstitutingSourceProvider (#1050) 2023-04-25 10:40:14 +02:00
Athou
90e2036cbe build for armv7 too 2023-04-25 10:24:22 +02:00
Athou
c2f3e42867 Readme update 2023-04-25 08:57:55 +02:00
Athou
bd33369a41 Merge branch 'develop' 2023-04-25 08:48:49 +02:00
Athou
4f625d8ed5 add docker support 2023-04-25 07:48:52 +02:00
Athou
866fe56dd2 remove warning "HV000254: Missing parameter metadata" 2023-04-25 07:48:11 +02:00
Athou
5f37dbca4c fix env variables support, now works without having to change yml file 2023-04-24 20:28:58 +02:00
Athou
c49e617dfe lombok update 2023-04-24 18:56:47 +02:00
Athou
e763ffd4cf allow access to entries in json format with api key (fixes #1049) 2023-04-22 07:27:59 +02:00
Athou
20ab7dd3e1 readd bitcoin address 2023-03-16 17:09:12 +01:00
Jérémie Panzer
55741c6332 Merge pull request #1046 from dayuer/patch-1
Update zh.js
2023-03-13 16:41:01 +01:00
dayuer
42d85336a8 Update zh.js
Added some entry translations.
2023-03-13 23:33:05 +08:00
Athou
639b82f494 add goal to start typescript in watch mode, helps during big refactorings 2023-03-10 11:37:29 +01:00
Athou
5003c176a2 display parent category name in category selects (fixes #1045) 2023-03-07 08:40:02 +01:00
Athou
10bfbbec17 restore one-click list refresh (#1040) 2023-03-06 14:08:48 +01:00
Athou
3da900db7f add missing parenthesis in feed entry filtering example 2023-03-01 13:50:07 +01:00
Jérémie Panzer
274c5ae165 Merge pull request #1039 from bartschinski/patch-1
Update german translation in de.js
2023-02-10 10:35:31 +01:00
Phillip Bartschinski
39c4012a1a Update de.js
Add missing translations
2023-02-10 10:28:21 +01:00
Jérémie Panzer
754ac166e0 Merge pull request #1017 from tristianc/bugfix/builddir
Determine build directory from variable instead of hardcoding it.
2022-09-29 15:54:14 +02:00
Tristian Celestin
0b18334236 Determine build directory from variable instead of hardcoding it. 2022-09-29 09:49:20 -04:00
48 changed files with 454 additions and 292 deletions

6
.dockerignore Normal file
View File

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

View File

@@ -1,28 +1,57 @@
name: Java CI
on: [push]
on: [ push ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: ["8", "11", "17"]
java: [ "8", "11", "17" ]
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
# Setup
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Set up Java
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java }}
distribution: "temurin"
cache: "maven"
# Build
- name: Build with Maven
run: mvn --batch-mode --update-snapshots verify
- uses: actions/upload-artifact@v3
if: ${{ matrix.java == '8' }}
with:
name: commafeed.jar
path: commafeed-server/target/commafeed.jar
# Docker
- name: Login to Container Registry
if: ${{ github.ref_type == 'tag' && matrix.java == '8' }}
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm/v7
push: ${{ github.ref_type == 'tag' && matrix.java == '8' }}
tags: |
athou/commafeed:latest
athou/commafeed:${{ github.ref_name }}

12
Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM eclipse-temurin:17-jre
RUN mkdir -p /commafeed/data
VOLUME /commafeed/data
ENV CF_SESSION_PATH=/commafeed/data/sessions
COPY commafeed-server/target/commafeed.jar .
COPY commafeed-server/config.yml.example config.yml
EXPOSE 8082
CMD ["java", "-Djava.net.preferIPv4Stack=true", "-jar", "commafeed.jar", "server", "config.yml"]

View File

@@ -16,7 +16,11 @@ Browser extensions:
## Deployment on your own server
### The very short version (download precompiled package)
### Docker
Docker images are built automatically and are available at https://hub.docker.com/r/athou/commafeed
### Download precompiled package
mkdir commafeed && cd commafeed
wget https://github.com/Athou/commafeed/releases/download/3.0.0/commafeed.jar
@@ -24,7 +28,10 @@ Browser extensions:
vi config.yml
java -Djava.net.preferIPv4Stack=true -jar commafeed.jar server config.yml
### The short version (build from sources)
The server will listen on http://localhost:8082. The default
user is `admin` and the default password is `admin`.
### Build from sources
git clone https://github.com/Athou/commafeed.git
cd commafeed
@@ -33,67 +40,33 @@ Browser extensions:
vi config.yml
java -Djava.net.preferIPv4Stack=true -jar commafeed-server/target/commafeed.jar server config.yml
### The long version (same as the short version, but more detailed)
The server will listen on http://localhost:8082. The default
user is `admin` and the default password is `admin`.
CommaFeed 2.0 has been rewritten to use Dropwizard and gulp instead of using tomee and wro4j. The latest version of the 1.x branch is available [here](https://github.com/Athou/commafeed/tree/1.x).
## Translation
For storage, you can either use an embedded file-based H2 database or an external MySQL, PostgreSQL or SQLServer database.
You also need the Java 1.8+ JDK in order to build the application.
To install the required packages to build CommaFeed on Ubuntu, issue the following commands
# if this commands works and returns a version >= 1.8.0 you're good to go and you can skip JDK installation
javac -version
# if openjdk-8-jdk is not available on your ubuntu version (14.04 LTS), add the following repo first
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install g++ build-essential openjdk-8-jdk
# Make sure java8 is the selected java version
sudo update-alternatives --config java
sudo update-alternatives --config javac
Clone this repository. If you don't have git you can download the sources as a zip file from [here](https://github.com/Athou/commafeed/archive/master.zip)
git clone https://github.com/Athou/commafeed.git
cd commafeed
Now build the application
./mvnw clean package
Copy `commafeed-server/config.yml.example` to `./config.yml` then edit the file to your liking.
Issue the following command to run the app, the server will listen by default on `http://localhost:8082`. The default user is `admin` and the default password is `admin`.
java -Djava.net.preferIPv4Stack=true -jar commafeed-server/target/commafeed.jar server config.yml
You can use a proxy http server such as nginx or apache.
## Translate CommaFeed into your language
Files for internationalization are located [here](https://github.com/Athou/commafeed/tree/master/commafeed-client/src/locales).
Files for internationalization are
located [here](https://github.com/Athou/commafeed/tree/master/commafeed-client/src/locales).
To add a new language:
- edit `commafeed-client/src/i18n.ts`
- add the new locale to the `locales` array.
- import the dayjs locale
- add the new locale to the `locales` array.
- import the dayjs locale
- edit `commafeed-client/.linguirc` and add the new locale to the `locales` array.
- run `npm run i18n` and add translations to the newly created `commafeed-client/src/locales/[locale]/messages.po` file
The name of the locale should be the two-letters [ISO-639-1 language code](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).
The name of the locale should be the
two-letters [ISO-639-1 language code](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).
## Local development
- `git clone https://github.com/Athou/CommaFeed`
### Backend
- Open `commafeed-server` in your preferred Java IDE.
- CommaFeed uses Lombok, you need the Lombok plugin for your IDE.
- If using Eclipse, Go to Window → Preferences → Maven → Annotation Processing and check "Automatically configure JDT APT"
- CommaFeed uses Lombok, you need the Lombok plugin for your IDE.
- If using Eclipse, Go to Window → Preferences → Maven → Annotation Processing and check "Automatically configure
JDT APT"
- Start `CommaFeedApplication.java` in debug mode with `server config.dev.yml` as arguments
### Frontend
@@ -101,11 +74,12 @@ The name of the locale should be the two-letters [ISO-639-1 language code](http:
- Open `commafeed-client` in your preferred JavaScript IDE.
- run `npm install`
- run `npm run dev`
- the frontend server is now running at http://localhost:8082 and is proxying REST requests to the backend running on port 8083
- the frontend server is now running at http://localhost:8082 and is proxying REST requests to the backend running on
port 8083
## Copyright and license
Copyright 2013-2022 CommaFeed.
Copyright 2013-2023 CommaFeed.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this work except in compliance with the License.

View File

@@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite --host",
"dev:typescript": "tsc --watch",
"build": "npm run i18n:compile && tsc && vite build",
"preview": "vite preview",
"test": "vitest",

View File

@@ -97,4 +97,5 @@ export const Constants = {
mainScrollAreaId: "main-scroll-area-id",
entryId: (entry: Entry) => `entry-id-${entry.id}`,
},
bitcoinWalletAddress: "1dymfUxqCWpyD7a6rQSqNy4rLVDBsAr5e",
}

View File

@@ -38,6 +38,7 @@ export interface ApplicationSettings {
export interface Category {
id: string
parentId?: string
parentName?: string
name: string
children: Category[]
feeds: Subscription[]

View File

@@ -4,16 +4,20 @@ import { Constants } from "app/constants"
import { useAppSelector } from "app/store"
import { flattenCategoryTree } from "app/utils"
type CategorySelectProps = Partial<SelectProps> & { withAll?: boolean }
type CategorySelectProps = Partial<SelectProps> & {
withAll?: boolean
withoutCategoryIds?: string[]
}
export function CategorySelect(props: CategorySelectProps) {
const rootCategory = useAppSelector(state => state.tree.rootCategory)
const categories = rootCategory && flattenCategoryTree(rootCategory)
const selectData: SelectItem[] | undefined = categories
?.filter(c => c.id !== Constants.categories.all.id)
.filter(c => !props.withoutCategoryIds || !props.withoutCategoryIds.includes(c.id))
.sort((c1, c2) => c1.name.localeCompare(c2.name))
.map(c => ({
label: c.name,
label: c.parentName ? t`${c.name} (in ${c.parentName})` : c.name,
value: c.id,
}))
if (props.withAll) {

View File

@@ -1,7 +1,7 @@
import { t } from "@lingui/macro"
import { ActionIcon, Center, Divider, Indicator, Popover, TextInput } from "@mantine/core"
import { useForm } from "@mantine/form"
import { search } from "app/slices/entries"
import { reloadEntries, search } from "app/slices/entries"
import { changeReadingMode, changeReadingOrder } from "app/slices/user"
import { useAppDispatch, useAppSelector } from "app/store"
import { ActionButton } from "components/ActionButtton"
@@ -11,7 +11,6 @@ import { useEffect } from "react"
import { TbArrowDown, TbArrowUp, TbEye, TbEyeOff, TbRefresh, TbSearch, TbUser, TbX } from "react-icons/tb"
import { MarkAllAsReadButton } from "./MarkAllAsReadButton"
import { ProfileMenu } from "./ProfileMenu"
import { RefreshMenu } from "./RefreshMenu"
function HeaderDivider() {
return <Divider orientation="vertical" />
@@ -41,7 +40,7 @@ export function Header() {
return (
<Center>
<ButtonToolbar>
<RefreshMenu control={<ActionButton icon={<TbRefresh size={iconSize} />} label={t`Refresh`} />} />
<ActionButton icon={<TbRefresh size={iconSize} />} label={t`Refresh`} onClick={() => dispatch(reloadEntries())} />
<MarkAllAsReadButton iconSize={iconSize} />
<HeaderDivider />

View File

@@ -1,11 +1,25 @@
import { Trans } from "@lingui/macro"
import { t, Trans } from "@lingui/macro"
import { Box, Divider, Group, Menu, SegmentedControl, SegmentedControlItem, useMantineColorScheme } from "@mantine/core"
import { showNotification } from "@mantine/notifications"
import { client } from "app/client"
import { redirectToAbout, redirectToAdminUsers, redirectToMetrics, redirectToSettings } from "app/slices/redirect"
import { changeViewMode } from "app/slices/user"
import { useAppDispatch, useAppSelector } from "app/store"
import { ViewMode } from "app/types"
import { useState } from "react"
import { TbChartLine, TbHelp, TbLayoutList, TbList, TbMoon, TbNotes, TbPower, TbSettings, TbSun, TbUsers } from "react-icons/tb"
import {
TbChartLine,
TbHelp,
TbLayoutList,
TbList,
TbMoon,
TbNotes,
TbPower,
TbSettings,
TbSun,
TbUsers,
TbWorldDownload,
} from "react-icons/tb"
interface ProfileMenuProps {
control: React.ReactElement
@@ -56,6 +70,7 @@ const viewModeData: ViewModeControlItem[] = [
export function ProfileMenu(props: ProfileMenuProps) {
const [opened, setOpened] = useState(false)
const viewMode = useAppSelector(state => state.user.settings?.viewMode)
const profile = useAppSelector(state => state.user.profile)
const admin = useAppSelector(state => state.user.profile?.admin)
const dispatch = useAppDispatch()
const { colorScheme, toggleColorScheme } = useMantineColorScheme()
@@ -69,6 +84,7 @@ export function ProfileMenu(props: ProfileMenuProps) {
<Menu position="bottom-end" closeOnItemClick={false} opened={opened} onChange={setOpened}>
<Menu.Target>{props.control}</Menu.Target>
<Menu.Dropdown>
{profile && <Menu.Label>{profile.name}</Menu.Label>}
<Menu.Item
icon={<TbSettings size={iconSize} />}
onClick={() => {
@@ -78,6 +94,21 @@ export function ProfileMenu(props: ProfileMenuProps) {
>
<Trans>Settings</Trans>
</Menu.Item>
<Menu.Item
icon={<TbWorldDownload size={iconSize} />}
onClick={() =>
client.feed.refreshAll().then(() => {
showNotification({
message: t`Your feeds have been queued for refresh.`,
color: "green",
autoClose: 1000,
})
setOpened(false)
})
}
>
<Trans>Fetch all my feeds now</Trans>
</Menu.Item>
<Divider />
<Menu.Label>

View File

@@ -1,41 +0,0 @@
import { t, Trans } from "@lingui/macro"
import { Menu } from "@mantine/core"
import { showNotification } from "@mantine/notifications"
import { client } from "app/client"
import { reloadEntries } from "app/slices/entries"
import { useAppDispatch } from "app/store"
import { TbRotateClockwise, TbWorldDownload } from "react-icons/tb"
interface RefreshMenuProps {
control: React.ReactElement
}
const iconSize = 16
export function RefreshMenu(props: RefreshMenuProps) {
const dispatch = useAppDispatch()
return (
<Menu>
<Menu.Target>{props.control}</Menu.Target>
<Menu.Dropdown>
<Menu.Item icon={<TbRotateClockwise size={iconSize} />} onClick={() => dispatch(reloadEntries())}>
<Trans>Reload</Trans>
</Menu.Item>
<Menu.Item
icon={<TbWorldDownload size={iconSize} />}
onClick={() =>
client.feed.refreshAll().then(() =>
showNotification({
message: t`Your feeds have been queued for refresh.`,
color: "green",
})
)
}
>
<Trans>Fetch all my feeds now</Trans>
</Menu.Item>
</Menu.Dropdown>
</Menu>
)
}

View File

@@ -288,7 +288,7 @@ msgstr "موجز URL"
msgid "Feed name"
msgstr "اسم الخلاصة"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "تصفية التعبير"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "هل نسيت كلمة المرور؟"
@@ -608,10 +612,6 @@ msgstr "تحديث"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "تم إغلاق التسجيلات في مثيل CommaFeed هذا"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "موقع الكتروني"
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 "ليس لديك أي اشتراكات حتى الآن. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "الملف مطلوب"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL del canal"
msgid "Feed name"
msgstr "Nom del canal"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Expressió de filtratge"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Heu oblidat la contrasenya?"
@@ -608,10 +612,6 @@ msgstr "Actualitzar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Els registres estan tancats en aquesta instància de CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Lloc web"
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 "Encara no teniu cap subscripció. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "el fitxer és necessari"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL zdroje"
msgid "Feed name"
msgstr "Název zdroje"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrování výrazu"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Zapomněli jste heslo?"
@@ -608,10 +612,6 @@ msgstr "Obnovit"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V této instanci CommaFeed jsou registrace uzavřeny"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Webové stránky"
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 "Zatím nemáte žádné předplatné. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr ""
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL porthiant"
msgid "Feed name"
msgstr "Enw porthiant"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Hidlo mynegiant"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Wedi anghofio cyfrinair?"
@@ -608,10 +612,6 @@ msgstr "Adnewyddu"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Mae cofrestriadau ar gau ar yr achos CommaFeed hwn"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Gwefan"
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 "Nid oes gennych unrhyw danysgrifiadau eto. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "mae angen y ffeil"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr ""
msgid "Feed name"
msgstr "Feednavn"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrerende udtryk"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Glemt adgangskode?"
@@ -608,10 +612,6 @@ msgstr "Opdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er lukket på denne CommaFeed-instans"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Hjemmeside"
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 "Du har ingen abonnementer endnu. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fil er påkrævet"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed-URL"
msgid "Feed name"
msgstr "Feedname"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filterausdruck"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Passwort vergessen?"
@@ -608,10 +612,6 @@ msgstr "Aktualisieren"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrierungen sind für diese CommaFeed-Instanz geschlossen"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Webseite"
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 "Sie haben noch keine Abonnements. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "Datei ist erforderlich"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed URL"
msgid "Feed name"
msgstr "Feed name"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr "Fetch all my feeds now"
@@ -296,6 +296,10 @@ msgstr "Fetch all my feeds now"
msgid "Filtering expression"
msgstr "Filtering expression"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Forgot password?"
@@ -608,10 +612,6 @@ msgstr "Refresh"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrations are closed on this CommaFeed instance"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr "Reload"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr "Right click"
@@ -792,10 +792,14 @@ msgstr "Website"
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 "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Your feeds have been queued for refresh."
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "file is required"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr "{0} (in {1})"

View File

@@ -288,7 +288,7 @@ msgstr "URL de fuente"
msgid "Feed name"
msgstr "Nombre de alimentación"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Expresión de filtrado"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "¿Olvidaste la contraseña?"
@@ -608,10 +612,6 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Los registros están cerrados en esta instancia de CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Sitio web"
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
msgstr "Todavía no tienes ninguna suscripción. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "archivo requerido"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL فید"
msgid "Feed name"
msgstr "نام فید"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "بیان فیلتر"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "رمز عبور را فراموش کرده اید؟"
@@ -608,10 +612,6 @@ msgstr "تازه کردن"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "ثبت نام در این نمونه CommaFeed بسته شده است"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "وب سایت"
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 "شما هنوز هیچ اشتراکی ندارید. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "فایل مورد نیاز است"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Syötteen URL-osoite"
msgid "Feed name"
msgstr "Syötteen nimi"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Suodattava lauseke"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Unohditko salasanan?"
@@ -608,10 +612,6 @@ msgstr "Päivitä"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Tämän CommaFeed-esiintymän rekisteröinnit on suljettu"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Verkkosivusto"
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 "Sinulla ei ole vielä tilauksia. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "tiedosto vaaditaan"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL du flux"
msgid "Feed name"
msgstr "Nom du flux"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Expression de filtrage"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Mot de passe oublié ?"
@@ -608,10 +612,6 @@ msgstr "Rafraîchir"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Les inscriptions sont fermées sur cette instance de CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Site web"
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 "Vous n'avez pas encore d'abonnements. Pourquoi ne pas essayer d'en ajouter un en cliquant sur le signe + en haut de la page ?"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fichier requis"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL da fonte"
msgid "Feed name"
msgstr "Nome do feed"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Expresión de filtrado"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Esqueceches o contrasinal?"
@@ -608,10 +612,6 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Os rexistros están pechados nesta instancia de CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Páxina web"
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 "Aínda non tes ningunha subscrición. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "é necesario o ficheiro"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr ""
msgid "Feed name"
msgstr "Hírcsatorna neve"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Szűrő kifejezés"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Elfelejtette a jelszavát?"
@@ -608,10 +612,6 @@ msgstr "Frissítés"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "A regisztrációk le vannak zárva ezen a CommaFeed példányon"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Webhely"
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 "Még nincs előfizetése. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fájl szükséges"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL Umpan"
msgid "Feed name"
msgstr "Nama umpan"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Memfilter ekspresi"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Lupa kata sandi?"
@@ -608,10 +612,6 @@ msgstr "Segarkan"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada instans CommaFeed ini"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Situs Web"
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 "Anda belum memiliki langganan. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "file diperlukan"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL feed"
msgid "Feed name"
msgstr "Nome del feed"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Espressione filtrante"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Password dimenticata?"
@@ -608,10 +612,6 @@ msgstr "Aggiorna"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Le registrazioni sono chiuse su questa istanza CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Sito web"
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 "Non hai ancora abbonamenti. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "è richiesto il file"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "フィード URL"
msgid "Feed name"
msgstr "フィード名"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "フィルタリング式"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "パスワードをお忘れですか?"
@@ -608,10 +612,6 @@ msgstr "リフレッシュ"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "この CommaFeed インスタンスの登録は終了しています"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "ウェブサイト"
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 "まだサブスクリプションがありません。"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "ファイルが必要です"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "피드 URL"
msgid "Feed name"
msgstr "피드 이름"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "필터링 표현식"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "비밀번호를 잊으셨나요?"
@@ -608,10 +612,6 @@ msgstr "새로 고침"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "이 CommaFeed 인스턴스에 대한 등록이 마감되었습니다."
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "웹사이트"
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 "아직 구독이 없습니다. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "파일이 필요합니다"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL Suapan"
msgid "Feed name"
msgstr "Nama suapan"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Ungkapan penapisan"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Lupa kata laluan?"
@@ -608,10 +612,6 @@ msgstr "Muat semula"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada contoh CommaFeed ini"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Laman web"
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 "Anda belum mempunyai sebarang langganan lagi. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fail diperlukan"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed-URL"
msgid "Feed name"
msgstr "Feednavn"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrerende uttrykk"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Glemt passord?"
@@ -608,10 +612,6 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Nettsted"
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 "Du har ingen abonnementer ennå. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fil kreves"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed-URL"
msgid "Feed name"
msgstr "Feednaam"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Uitdrukking filteren"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Wachtwoord vergeten?"
@@ -608,10 +612,6 @@ msgstr "Vernieuwen"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registraties zijn gesloten op deze CommaFeed-instantie"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr ""
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 "Je hebt nog geen abonnementen. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "bestand is vereist"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed-URL"
msgid "Feed name"
msgstr "Feednavn"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrerende uttrykk"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Glemt passord?"
@@ -608,10 +612,6 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Nettsted"
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 "Du har ingen abonnementer ennå. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fil kreves"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL kanału"
msgid "Feed name"
msgstr "nazwa kanału"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Wyrażenie filtrujące"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Zapomniałeś hasła?"
@@ -608,10 +612,6 @@ msgstr "Odśwież"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Rejestracje są zamknięte w tej instancji CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Strona internetowa"
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 "Nie masz jeszcze żadnych subskrypcji. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "plik jest wymagany"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL do feed"
msgid "Feed name"
msgstr "Nome do feed"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrando expressão"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Esqueceu a senha?"
@@ -608,10 +612,6 @@ msgstr "Atualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Os registros estão fechados nesta instância do CommaFeed"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Site"
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 "Você ainda não tem nenhuma assinatura. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "o arquivo é obrigatório"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL-адрес фида"
msgid "Feed name"
msgstr "Имя фида"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Выражение фильтрации"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Забыли пароль?"
@@ -608,10 +612,6 @@ msgstr "Обновить"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Регистрация закрыта для этого экземпляра CommaFeed."
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Веб-сайт"
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 "У вас пока нет подписок. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "требуется файл"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "URL informačného kanála"
msgid "Feed name"
msgstr "Názov informačného kanála"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrovanie výrazu"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Zabudli ste heslo?"
@@ -608,10 +612,6 @@ msgstr "Obnoviť"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V tejto inštancii CommaFeed sú registrácie uzavreté"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Webová stránka"
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 "Zatiaľ nemáte žiadne odbery. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr ""
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Flödes-URL"
msgid "Feed name"
msgstr "Flödesnamn"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtrerande uttryck"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Glömt lösenord?"
@@ -608,10 +612,6 @@ msgstr "Uppdatera"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringar är stängda på denna CommaFeed-instans"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Webbplats"
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 "Du har inga prenumerationer än. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "fil krävs"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "Feed URL'si"
msgid "Feed name"
msgstr "Yayın adı"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "Filtreleme ifadesi"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "Parolanızı mı unuttunuz?"
@@ -608,10 +612,6 @@ msgstr "Yenile"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Bu CommaFeed örneğinde kayıtlar kapalı"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "Web sitesi"
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 "Henüz aboneliğiniz yok. "
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "dosya gerekli"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -288,7 +288,7 @@ msgstr "供稿网址"
msgid "Feed name"
msgstr "提要名称"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Fetch all my feeds now"
msgstr ""
@@ -296,6 +296,10 @@ msgstr ""
msgid "Filtering expression"
msgstr "过滤表达式"
#: src/pages/app/AboutPage.tsx
msgid "For those of you who prefer bitcoin, here is the address: {bitcoinAddress}"
msgstr ""
#: src/pages/auth/LoginPage.tsx
msgid "Forgot password?"
msgstr "忘记密码?"
@@ -608,10 +612,6 @@ msgstr "刷新"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "此 CommaFeed 实例上的注册已关闭"
#: src/components/header/RefreshMenu.tsx
msgid "Reload"
msgstr ""
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Right click"
msgstr ""
@@ -792,10 +792,14 @@ msgstr "网站"
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 "您还没有任何订阅。"
#: src/components/header/RefreshMenu.tsx
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/components/content/add/ImportOpml.tsx
msgid "file is required"
msgstr "文件是必需的"
#: src/components/content/add/CategorySelect.tsx
msgid "{0} (in {1})"
msgstr ""

View File

@@ -1,5 +1,5 @@
import { t, Trans } from "@lingui/macro"
import { Anchor, Box, Center, Container, createStyles, List, NativeSelect, SimpleGrid, Title } from "@mantine/core"
import { Anchor, Box, Center, Code, Container, createStyles, List, NativeSelect, SimpleGrid, Title } from "@mantine/core"
import { Constants } from "app/constants"
import { redirectToApiDocumentation } from "app/slices/redirect"
import { useAppDispatch, useAppSelector } from "app/store"
@@ -57,6 +57,7 @@ function NextUnreadBookmarklet() {
)
}
const bitcoinAddress = <Code>{Constants.bitcoinWalletAddress}</Code>
export function AboutPage() {
const version = useAppSelector(state => state.server.serverInfos?.version)
const revision = useAppSelector(state => state.server.serverInfos?.gitCommit)
@@ -70,7 +71,7 @@ export function AboutPage() {
CommaFeed version {version} ({revision})
</Trans>
</Box>
<Box>
<Box mt="md">
<Trans>
CommaFeed is an open-source project. Sources are hosted on&nbsp;
<Anchor href="https://github.com/Athou/commafeed" target="_blank" rel="noreferrer">
@@ -114,6 +115,9 @@ export function AboutPage() {
</Center>
</form>
</Box>
<Box mt="xs">
<Trans>For those of you who prefer bitcoin, here is the address: {bitcoinAddress}</Trans>
</Box>
</Section>
<Section title={t`Goodies`} icon={<TbPuzzle size={24} />}>
<List>

View File

@@ -109,7 +109,12 @@ export function CategoryDetailsPage() {
{editable && (
<>
<TextInput label={t`Name`} {...form.getInputProps("name")} required />
<CategorySelect label={t`Parent Category`} {...form.getInputProps("parentId")} clearable />
<CategorySelect
label={t`Parent Category`}
{...form.getInputProps("parentId")}
clearable
withoutCategoryIds={[id]}
/>
<NumberInput label={t`Position`} {...form.getInputProps("position")} required min={0} />
</>
)}

View File

@@ -17,7 +17,7 @@ import { TbDeviceFloppy, TbTrash } from "react-icons/tb"
import { useParams } from "react-router-dom"
function FilteringExpressionDescription() {
const example = <Code>url.contains('youtube') or (author eq 'athou' and title.contains('github')</Code>
const example = <Code>url.contains('youtube') or (author eq 'athou' and title.contains('github'))</Code>
return (
<div>
<div>

View File

@@ -87,7 +87,7 @@ app:
database:
driverClass: org.h2.Driver
url: jdbc:h2:/home/commafeed/db
url: jdbc:h2:/commafeed/data/db
user: sa
password: sa
properties:

View File

@@ -38,6 +38,13 @@
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
@@ -229,7 +236,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -285,6 +292,11 @@
<artifactId>dropwizard-websocket-jee7-bundle</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>io.whitfin</groupId>
<artifactId>dropwizard-environment-substitutor</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>

View File

@@ -50,6 +50,8 @@ import com.commafeed.frontend.servlet.NextUnreadServlet;
import com.commafeed.frontend.session.SessionHelperFactoryProvider;
import com.commafeed.frontend.ws.WebSocketConfigurator;
import com.commafeed.frontend.ws.WebSocketEndpoint;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
@@ -58,6 +60,7 @@ import com.google.inject.TypeLiteral;
import be.tomcools.dropwizard.websocket.WebsocketBundle;
import io.dropwizard.Application;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.configuration.DefaultConfigurationFactoryFactory;
import io.dropwizard.configuration.EnvironmentVariableSubstitutor;
import io.dropwizard.configuration.SubstitutingSourceProvider;
import io.dropwizard.db.DataSourceFactory;
@@ -69,6 +72,7 @@ import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.dropwizard.web.WebBundle;
import io.dropwizard.web.conf.WebConfiguration;
import io.whitfin.dropwizard.configuration.EnvironmentSubstitutor;
public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
@@ -87,6 +91,23 @@ public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
@Override
public void initialize(Bootstrap<CommaFeedConfiguration> bootstrap) {
bootstrap.setConfigurationFactoryFactory(new DefaultConfigurationFactoryFactory<CommaFeedConfiguration>() {
@Override
protected ObjectMapper configureObjectMapper(ObjectMapper objectMapper) {
// disable case sensitivity because EnvironmentSubstitutor maps MYPROPERTY to myproperty and not to myProperty
return objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
}
});
// enable config.yml string substitution
// e.g. having a custom config.yml file with app.session.path=${SOME_ENV_VAR} will substitute SOME_ENV_VAR
SubstitutingSourceProvider substitutingSourceProvider = new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(),
new EnvironmentVariableSubstitutor(false));
// enable config.yml properties override with env variables prefixed with CF_
// e.g. setting CF_APP_ALLOWREGISTRATIONS=true will set app.allowRegistrations to true
EnvironmentSubstitutor environmentSubstitutor = new EnvironmentSubstitutor("CF", substitutingSourceProvider);
bootstrap.setConfigurationSourceProvider(environmentSubstitutor);
bootstrap.getObjectMapper().registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.SECONDS, false));
bootstrap.addBundle(websocketBundle = new WebsocketBundle<>());
@@ -124,10 +145,6 @@ public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
bootstrap.addBundle(new AssetsBundle("/assets/", "/", "index.html"));
bootstrap.addBundle(new MultiPartBundle());
// Enable variable substitution with environment variables
bootstrap.setConfigurationSourceProvider(
new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), new EnvironmentVariableSubstitutor(false)));
}
@Override

View File

@@ -19,6 +19,9 @@ public class Category implements Serializable {
@ApiModelProperty(value = "parent category id")
private String parentId;
@ApiModelProperty(value = "parent category name")
private String parentName;
@ApiModelProperty(value = "category id", required = true)
private String name;

View File

@@ -95,7 +95,7 @@ public class CategoryREST {
@UnitOfWork
@ApiOperation(value = "Get category entries", notes = "Get a list of category entries", response = Entries.class)
@Timed
public Response getCategoryEntries(@ApiParam(hidden = true) @SecurityCheck User user,
public Response getCategoryEntries(@ApiParam(hidden = true) @SecurityCheck(apiKeyAllowed = true) User user,
@ApiParam(value = "id of the category, 'all' or 'starred'", required = true) @QueryParam("id") String id,
@ApiParam(
value = "all entries or only unread ones",
@@ -454,17 +454,13 @@ public class CategoryREST {
child.setPosition(c.getPosition());
if (c.getParent() != null && c.getParent().getId() != null) {
child.setParentId(String.valueOf(c.getParent().getId()));
child.setParentName(c.getParent().getName());
}
child.setExpanded(!c.isCollapsed());
category.getChildren().add(child);
}
}
Collections.sort(category.getChildren(), new Comparator<Category>() {
@Override
public int compare(Category o1, Category o2) {
return ObjectUtils.compare(o1.getPosition(), o2.getPosition());
}
});
Collections.sort(category.getChildren(), (o1, o2) -> ObjectUtils.compare(o1.getPosition(), o2.getPosition()));
for (FeedSubscription subscription : subscriptions) {
if (id == null && subscription.getCategory() == null
@@ -474,12 +470,8 @@ public class CategoryREST {
category.getFeeds().add(sub);
}
}
Collections.sort(category.getFeeds(), new Comparator<Subscription>() {
@Override
public int compare(Subscription o1, Subscription o2) {
return ObjectUtils.compare(o1.getPosition(), o2.getPosition());
}
});
Collections.sort(category.getFeeds(), (o1, o2) -> ObjectUtils.compare(o1.getPosition(), o2.getPosition()));
return category;
}

View File

@@ -132,7 +132,7 @@ public class FeedREST {
@UnitOfWork
@ApiOperation(value = "Get feed entries", notes = "Get a list of feed entries", response = Entries.class)
@Timed
public Response getFeedEntries(@ApiParam(hidden = true) @SecurityCheck User user,
public Response getFeedEntries(@ApiParam(hidden = true) @SecurityCheck(apiKeyAllowed = true) User user,
@ApiParam(value = "id of the feed", required = true) @QueryParam("id") String id,
@ApiParam(
value = "all entries or only unread ones",