Compare commits

..

46 Commits
6.0.0 ... 6.1.0

Author SHA1 Message Date
Athou
2a0d935471 release 6.1.0 2026-01-25 10:58:32 +01:00
Athou
6c68fda572 make "disable pull to refresh" false by default (#2030) 2026-01-25 10:49:11 +01:00
Jérémie Panzer
861c1fc3dc Merge pull request #2029 from Athou/renovate/npm-11.x
chore(deps): update dependency npm to v11.8.0
2026-01-25 05:04:32 +01:00
renovate[bot]
5971bb4255 chore(deps): update dependency npm to v11.8.0 2026-01-25 01:59:43 +00:00
renovate[bot]
76ba360631 chore(deps): update dependency @types/react to ^19.2.9 2026-01-23 19:59:17 +00:00
renovate[bot]
89d3ff3c90 fix(deps): update quarkus.version to v3.30.8 2026-01-23 12:23:43 +00:00
renovate[bot]
34024a913d fix(deps): update mantine monorepo to ^8.3.13 2026-01-23 10:50:58 +00:00
Athou
a858380121 cleanup 2026-01-23 08:34:10 +01:00
Jérémie Panzer
e1dc870005 Merge pull request #2028 from Athou/renovate/com.diffplug.spotless-spotless-maven-plugin-3.x
chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.2.0
2026-01-23 02:04:25 +01:00
renovate[bot]
2fc1cac869 chore(deps): update dependency com.diffplug.spotless:spotless-maven-plugin to v3.2.0 2026-01-23 00:39:57 +00:00
renovate[bot]
f627ff4958 chore(deps): update dependency @testing-library/react to ^16.3.2 2026-01-22 13:07:35 +00:00
renovate[bot]
5ff8e51948 chore(deps): update dependency io.quarkiverse.playwright:quarkus-playwright to v2.3.2 2026-01-21 22:06:21 +00:00
renovate[bot]
538f25c6bb fix(deps): update quarkus.version to v3.30.7 2026-01-21 15:56:51 +00:00
Jérémie Panzer
65100ba279 Merge pull request #2026 from WangLei1993/master
add Chinese translation for new entry
2026-01-20 20:55:40 +01:00
WangLei1993
79fd470bbf add Chinese translation for new entry 2026-01-21 01:32:16 +08:00
Jérémie Panzer
866d74665b Merge pull request #2025 from canoine/patch-8
Update fr/messages.po
2026-01-20 14:13:04 +01:00
canoine
29da74f038 Update fr/messages.po
New etries translated
2026-01-20 13:56:59 +01:00
Athou
3c8ac35a46 make password match rule reusable 2026-01-20 08:54:48 +01:00
Athou
afe957ba59 create a dedicated password reset page (#2023) 2026-01-19 20:55:26 +01:00
renovate[bot]
7e50e99351 fix(deps): update linguijs monorepo to ^5.8.0 2026-01-19 10:48:25 +00:00
renovate[bot]
62ce462cc8 chore(deps): lock file maintenance 2026-01-19 03:48:36 +00:00
Jérémie Panzer
108cb06f43 Merge pull request #2024 from Athou/renovate/org.codehaus.mojo-properties-maven-plugin-1.x
chore(deps): update dependency org.codehaus.mojo:properties-maven-plugin to v1.3.0
2026-01-19 04:47:18 +01:00
renovate[bot]
95a38675bc chore(deps): update dependency org.codehaus.mojo:properties-maven-plugin to v1.3.0 2026-01-19 00:35:24 +00:00
Athou
714681bc50 don't set "en" as the default language, use the preferred language of the browser (#2018) 2026-01-17 20:09:23 +01:00
Athou
0f8d91d997 close profile menu on scroll (#2019) 2026-01-16 15:53:40 +01:00
Jérémie Panzer
562297a82f Merge pull request #2022 from WangLei1993/master
add Chinese translation for new entry
2026-01-16 15:40:53 +01:00
WangLei1993
b108bf06e5 add Chinese translation for new entry 2026-01-16 22:21:00 +08:00
renovate[bot]
3c819066fd chore(deps): update ibm-semeru-runtimes:open-jdk-25.0.1_8-jre docker digest to e12d5f2 2026-01-16 02:15:00 +00:00
Athou
5f30cb7e2e reuse validation rule 2026-01-16 01:08:25 +01:00
Athou
5a95b95801 validate password in the frontend too (#2017) 2026-01-15 21:36:00 +01:00
renovate[bot]
eb573fdc8b chore(deps): update dependency vitest to ^4.0.17 2026-01-15 14:58:31 +00:00
Jérémie Panzer
238ea54e98 Merge pull request #2020 from canoine/patch-7
Update fr/messages.po
2026-01-15 08:56:05 +01:00
canoine
e4dfc47fb8 Update fr/messages.po
Translation of the new entries.
2026-01-15 07:28:50 +01:00
Jérémie Panzer
a1491c779a Merge pull request #2015 from WangLei1993/master
add Chinese translation for new entry
2026-01-14 20:08:02 +01:00
WangLei1993
dabd7552be add Chinese translation for new entry 2026-01-15 01:06:19 +08:00
Jérémie Panzer
0a4c56af1f Merge pull request #2014 from Athou/renovate/node-24.x
chore(deps): update node.js to v24.13.0
2026-01-13 19:44:55 +01:00
renovate[bot]
c3dae5b92c chore(deps): update node.js to v24.13.0 2026-01-13 14:11:32 +00:00
renovate[bot]
2c3105b526 chore(deps): update debian:13.3 docker digest to 5cf544f 2026-01-13 14:11:28 +00:00
renovate[bot]
20f5081ac8 chore(deps): update dependency @types/react to ^19.2.8 2026-01-13 10:49:24 +00:00
Jérémie Panzer
3091eb9d14 Merge pull request #2013 from Athou/renovate/debian-13.x
chore(deps): update debian docker tag to v13.3
2026-01-13 06:52:42 +01:00
renovate[bot]
5bdda42239 chore(deps): update debian docker tag to v13.3 2026-01-13 04:51:00 +00:00
renovate[bot]
7eda8b7662 chore(deps): update dependency vite-tsconfig-paths to ^6.0.4 2026-01-13 02:08:08 +00:00
renovate[bot]
fc94ce5d2b fix(deps): update mantine monorepo to ^8.3.12 2026-01-12 14:23:32 +00:00
renovate[bot]
e5d7161ab7 chore(deps): lock file maintenance 2026-01-12 01:10:34 +00:00
Jérémie Panzer
f725cb7fa4 Merge pull request #2012 from Athou/renovate/react-router-monorepo
fix(deps): update dependency react-router-dom to ^7.12.0
2026-01-10 21:35:47 +01:00
renovate[bot]
830e689fe8 fix(deps): update dependency react-router-dom to ^7.12.0 2026-01-10 20:02:47 +00:00
55 changed files with 1550 additions and 607 deletions

View File

@@ -1,5 +1,12 @@
# Changelog
## [6.1.0]
- When clicking on the password reset link, a random password is no longer generated automatically. The user is now redirected to a page where they can set their own password (#2023)
- Use browser preferred language instead of English when using CommaFeed for the first time (#2018)
- The profile menu is now closed when scrolling the page (#2019)
- The "disable pull to refresh" feature is now disabled by default (#2030)
## [6.0.0]
- When booting CommaFeed for the first time, the default "admin" account is no longer created automatically. A setup wizard will guide you through the creation of an admin account

File diff suppressed because it is too large Load Diff

View File

@@ -17,14 +17,14 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@fontsource/open-sans": "^5.2.7",
"@lingui/core": "^5.7.0",
"@lingui/react": "^5.7.0",
"@mantine/core": "^8.3.11",
"@mantine/form": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/modals": "^8.3.11",
"@mantine/notifications": "^8.3.11",
"@mantine/spotlight": "^8.3.11",
"@lingui/core": "^5.8.0",
"@lingui/react": "^5.8.0",
"@mantine/core": "^8.3.13",
"@mantine/form": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/modals": "^8.3.13",
"@mantine/notifications": "^8.3.13",
"@mantine/spotlight": "^8.3.13",
"@monaco-editor/react": "^4.7.0",
"@reduxjs/toolkit": "^2.11.2",
"axios": "^1.13.2",
@@ -41,7 +41,7 @@
"react-icons": "^5.5.0",
"react-infinite-scroller": "^1.2.6",
"react-redux": "^9.2.0",
"react-router-dom": "^7.11.0",
"react-router-dom": "^7.12.0",
"react-swipeable": "^7.0.2",
"style-to-object": "^1.0.14",
"throttle-debounce": "^5.0.2",
@@ -51,14 +51,14 @@
},
"devDependencies": {
"@biomejs/biome": "^2.3.11",
"@lingui/babel-plugin-lingui-macro": "^5.7.0",
"@lingui/cli": "^5.7.0",
"@lingui/vite-plugin": "^5.7.0",
"@lingui/babel-plugin-lingui-macro": "^5.8.0",
"@lingui/cli": "^5.8.0",
"@lingui/vite-plugin": "^5.8.0",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1",
"@types/mousetrap": "^1.6.15",
"@types/react": "^19.2.7",
"@types/react": "^19.2.9",
"@types/react-dom": "^19.2.3",
"@types/react-infinite-scroller": "^1.2.5",
"@types/throttle-debounce": "^5.0.2",
@@ -69,8 +69,8 @@
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vite-plugin-checker": "^0.12.0",
"vite-tsconfig-paths": "^6.0.3",
"vitest": "^4.0.16",
"vite-tsconfig-paths": "^6.0.4",
"vitest": "^4.0.17",
"yaml": "^2.8.2"
},
"overrides": {

View File

@@ -6,16 +6,16 @@
<parent>
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>6.0.0</version>
<version>6.1.0</version>
</parent>
<artifactId>commafeed-client</artifactId>
<name>CommaFeed Client</name>
<properties>
<!-- renovate: datasource=node-version depName=node -->
<node.version>v24.12.0</node.version>
<node.version>v24.13.0</node.version>
<!-- renovate: datasource=npm depName=npm -->
<npm.version>11.7.0</npm.version>
<npm.version>11.8.0</npm.version>
</properties>
<build>

View File

@@ -34,6 +34,7 @@ import { TagDetailsPage } from "@/pages/app/TagDetailsPage"
import { InitialSetupPage } from "@/pages/auth/InitialSetupPage"
import { LoginPage } from "@/pages/auth/LoginPage"
import { PasswordRecoveryPage } from "@/pages/auth/PasswordRecoveryPage"
import { PasswordResetPage } from "@/pages/auth/PasswordResetPage"
import { RegistrationPage } from "@/pages/auth/RegistrationPage"
import { WelcomePage } from "@/pages/WelcomePage"
@@ -88,6 +89,7 @@ function AppRoutes() {
<Route path="login" element={<LoginPage />} />
<Route path="register" element={<RegistrationPage />} />
<Route path="passwordRecovery" element={<PasswordRecoveryPage />} />
<Route path="passwordReset" element={<PasswordResetPage />} />
<Route path="app" element={<Layout header={<Header />} sidebar={<Tree />} sidebarVisible={sidebarVisible} />}>
<Route path="category">
<Route path=":id" element={<FeedEntriesPage sourceType="category" />} />
@@ -193,6 +195,8 @@ function CustomJsHandler() {
document.body.appendChild(script)
setScriptLoaded(true)
return () => script.remove()
}, [scriptLoaded, loading])
return null
@@ -205,6 +209,8 @@ function CustomCssHandler() {
link.type = "text/css"
link.href = "custom_css.css"
document.head.appendChild(link)
return () => link.remove()
}, [])
return null

View File

@@ -17,6 +17,7 @@ import type {
MarkRequest,
Metrics,
MultipleMarkRequest,
PasswordResetConfirmationRequest,
PasswordResetRequest,
ProfileModificationRequest,
RegistrationRequest,
@@ -97,6 +98,7 @@ export const client = {
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
initialSetup: async (req: InitialSetupRequest) => await axiosInstance.post("user/initialSetup", req),
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
passwordResetCallback: async (req: PasswordResetConfirmationRequest) => await axiosInstance.post("user/passwordResetCallback", req),
getSettings: async () => await axiosInstance.get<Settings>("user/settings"),
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),
getProfile: async () => await axiosInstance.get<UserModel>("user/profile"),

View File

@@ -196,6 +196,12 @@ export interface PasswordResetRequest {
email: string
}
export interface PasswordResetConfirmationRequest {
email: string
token: string
password: string
}
export interface ProfileModificationRequest {
currentPassword: string
email: string
@@ -228,6 +234,7 @@ export interface ServerInfo {
treeReloadInterval: number
forceRefreshCooldownDuration: number
initialSetupRequired: boolean
minimumPasswordLength: number
}
export interface SharingSettings {
@@ -242,7 +249,7 @@ export interface SharingSettings {
}
export interface Settings {
language: string
language?: string
readingMode: ReadingMode
readingOrder: ReadingOrder
showRead: boolean

View File

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

View File

@@ -143,6 +143,47 @@ export function DisplaySettings() {
onChange={async e => await dispatch(changeMobileFooter(e.currentTarget.checked))}
/>
<Divider label={<Trans>Scrolling</Trans>} labelPosition="center" />
<Switch
label={<Trans>Disable "Pull to refresh" browser behavior</Trans>}
description={<Trans>This setting can cause scrolling issues on some browsers (e.g. Safari)</Trans>}
checked={disablePullToRefresh}
onChange={async e => await dispatch(changeDisablePullToRefresh(e.currentTarget.checked))}
/>
<Radio.Group
label={<Trans>Scroll selected entry to the top of the page</Trans>}
value={scrollMode}
onChange={async value => await dispatch(changeScrollMode(value as ScrollMode))}
>
<Group mt="xs">
{Object.entries(scrollModeOptions).map(e => (
<Radio key={e[0]} value={e[0]} label={e[1]} />
))}
</Group>
</Radio.Group>
<NumberInput
label={<Trans>Entries to keep above the selected entry when scrolling</Trans>}
description={<Trans>Only applies to compact, cozy and detailed modes</Trans>}
min={0}
value={entriesToKeepOnTop}
onChange={async value => await dispatch(changeEntriesToKeepOnTopWhenScrolling(+value))}
/>
<Switch
label={<Trans>Scroll smoothly when navigating between entries</Trans>}
checked={scrollSpeed ? scrollSpeed > 0 : false}
onChange={async e => await dispatch(changeScrollSpeed(e.currentTarget.checked))}
/>
<Switch
label={<Trans>In expanded view, scrolling through entries mark them as read</Trans>}
checked={scrollMarks}
onChange={async e => await dispatch(changeScrollMarks(e.currentTarget.checked))}
/>
<Divider label={<Trans>Browser tab</Trans>} labelPosition="center" />
<Switch
@@ -179,47 +220,6 @@ export function DisplaySettings() {
onChange={async e => await dispatch(changeCustomContextMenu(e.currentTarget.checked))}
/>
<Divider label={<Trans>Scrolling</Trans>} labelPosition="center" />
<Radio.Group
label={<Trans>Scroll selected entry to the top of the page</Trans>}
value={scrollMode}
onChange={async value => await dispatch(changeScrollMode(value as ScrollMode))}
>
<Group mt="xs">
{Object.entries(scrollModeOptions).map(e => (
<Radio key={e[0]} value={e[0]} label={e[1]} />
))}
</Group>
</Radio.Group>
<NumberInput
label={<Trans>Entries to keep above the selected entry when scrolling</Trans>}
description={<Trans>Only applies to compact, cozy and detailed modes</Trans>}
min={0}
value={entriesToKeepOnTop}
onChange={async value => await dispatch(changeEntriesToKeepOnTopWhenScrolling(+value))}
/>
<Switch
label={<Trans>Scroll smoothly when navigating between entries</Trans>}
checked={scrollSpeed ? scrollSpeed > 0 : false}
onChange={async e => await dispatch(changeScrollSpeed(e.currentTarget.checked))}
/>
<Switch
label={<Trans>In expanded view, scrolling through entries mark them as read</Trans>}
checked={scrollMarks}
onChange={async e => await dispatch(changeScrollMarks(e.currentTarget.checked))}
/>
<Switch
label={<Trans>Disable "Pull to refresh" browser behavior</Trans>}
description={<Trans>This setting can cause scrolling issues on some browsers (e.g. Safari)</Trans>}
checked={disablePullToRefresh}
onChange={async e => await dispatch(changeDisablePullToRefresh(e.currentTarget.checked))}
/>
<Divider label={<Trans>Sharing sites</Trans>} labelPosition="center" />
<SimpleGrid cols={2}>

View File

@@ -1,4 +1,3 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro"
import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core"
@@ -13,6 +12,7 @@ import { useAppDispatch, useAppSelector } from "@/app/store"
import type { ProfileModificationRequest } from "@/app/types"
import { reloadProfile } from "@/app/user/thunks"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
interface FormData extends ProfileModificationRequest {
newPasswordConfirmation?: string
@@ -23,11 +23,14 @@ export function ProfileSettings() {
const serverInfos = useAppSelector(state => state.server.serverInfos)
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<FormData>({
validate: {
newPasswordConfirmation: (value, values) => (value !== values.newPassword ? _(msg`Passwords do not match`) : null),
newPassword: validationRules.password,
newPasswordConfirmation: (value, values) => validationRules.passwordConfirmation(value, values.newPassword),
},
validateInputOnChange: true,
})
const { setValues } = form

View File

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

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "العودة"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "العودة لتسجيل الدخول"
@@ -226,6 +227,11 @@ msgstr "تأكيد"
msgid "Confirm password"
msgstr "تأكيد كلمة المرور"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "دافئ"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "كلمة مرور جديدة"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "الأحدث أولاً"
@@ -771,11 +786,15 @@ msgstr "الفئة الأصل"
msgid "Password"
msgstr "كلمة المرور"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "استعادة كلمة المرور"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "كلمات المرور غير متطابقة"
@@ -817,6 +836,11 @@ msgstr "تحديث"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "تم إغلاق التسجيلات في مثيل CommaFeed هذا"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "إلغاء النجم"
msgid "Unsubscribe"
msgstr "إلغاء الاشتراك"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "اسم المستخدم"
@@ -1096,3 +1116,7 @@ msgstr "ليس لديك أي اشتراكات حتى الآن. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Enrere"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Torna a iniciar sessió"
@@ -226,6 +227,11 @@ msgstr "Confirma"
msgid "Confirm password"
msgstr "Confirmeu la contrasenya"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acollidor"
@@ -491,6 +497,10 @@ msgstr "Indi"
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Mai"
msgid "New password"
msgstr "Contrasenya nova"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "El més nou primer"
@@ -771,11 +786,15 @@ msgstr "Categoria pare"
msgid "Password"
msgstr "Contrasenya"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperació de contrasenya"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Les contrasenyes no coincideixen"
@@ -817,6 +836,11 @@ msgstr "Actualitzar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Els registres estan tancats en aquesta instància de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1056,10 +1080,6 @@ msgstr "Desestrellar"
msgid "Unsubscribe"
msgstr "Donar-se de baixa"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom d'usuari"
@@ -1096,3 +1116,7 @@ msgstr "Encara no teniu cap subscripció. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Els vostres feeds s'han posat a la cua per actualitzar-los."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Zpět"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Zpět k přihlášení"
@@ -226,6 +227,11 @@ msgstr "Potvrdit"
msgid "Confirm password"
msgstr "Potvrďte heslo"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Útulný"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nové heslo"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nejnovější jako první"
@@ -771,11 +786,15 @@ msgstr "Rodičovská kategorie"
msgid "Password"
msgstr "Heslo"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Obnovení hesla"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Hesla se neshodují"
@@ -817,6 +836,11 @@ msgstr "Obnovit"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V této instanci CommaFeed jsou registrace uzavřeny"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Odstranit hvězdu"
msgid "Unsubscribe"
msgstr "Odhlásit odběr"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Uživatelské jméno"
@@ -1096,3 +1116,7 @@ msgstr "Zatím nemáte žádné předplatné. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Yn ôl"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Yn ôl i fewngofnodi"
@@ -226,6 +227,11 @@ msgstr "Cadarnhau"
msgid "Confirm password"
msgstr "Cadarnhau'r cyfrinair"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "clyd"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Cyfrinair newydd"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Y diweddaraf yn gyntaf"
@@ -771,11 +786,15 @@ msgstr "Categori Rhiant"
msgid "Password"
msgstr "cyfrinair"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Adfer Cyfrinair"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Nid yw cyfrineiriau yn cyfateb"
@@ -817,6 +836,11 @@ msgstr "Adnewyddu"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Mae cofrestriadau ar gau ar yr achos CommaFeed hwn"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "dad-seren"
msgid "Unsubscribe"
msgstr "Dad-danysgrifio"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Enw defnyddiwr"
@@ -1096,3 +1116,7 @@ msgstr "Nid oes gennych unrhyw danysgrifiadau eto. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbage"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbage for at logge ind"
@@ -226,6 +227,11 @@ msgstr "Bekræft"
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Hyggeligt"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Ny adgangskode"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -771,11 +786,15 @@ msgstr "Forældrekategori"
msgid "Password"
msgstr "Adgangskode"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Gendannelse af adgangskode"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Adgangskoder stemmer ikke overens"
@@ -817,6 +836,11 @@ msgstr "Opdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er lukket på denne CommaFeed-instans"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Afmeld"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brugernavn"
@@ -1096,3 +1116,7 @@ msgstr "Du har ingen abonnementer endnu. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Zurück"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Zurück zum Login"
@@ -226,6 +227,11 @@ msgstr "Bestätigen"
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Gemütlich"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Niemals"
msgid "New password"
msgstr "Neues Passwort"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Neueste zuerst"
@@ -771,11 +786,15 @@ msgstr "Übergeordnete Kategorie"
msgid "Password"
msgstr "Passwort"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Passwortwiederherstellung"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein"
@@ -817,6 +836,11 @@ msgstr "Aktualisieren"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrierungen sind für diese CommaFeed-Instanz geschlossen"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST-API"
@@ -1056,10 +1080,6 @@ msgstr "Stern entfernen"
msgid "Unsubscribe"
msgstr "Abbestellen"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Benutzername"
@@ -1096,3 +1116,7 @@ msgstr "Sie haben noch keine Abonnements."
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ihr Feed wurde für die Aktualisierung eingereiht."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Back"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Back to log in"
@@ -226,6 +227,11 @@ msgstr "Confirm"
msgid "Confirm password"
msgstr "Confirm password"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirm Password"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
@@ -491,6 +497,10 @@ msgstr "Indigo"
msgid "Initial Setup"
msgstr "Initial Setup"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Invalid password reset link. Please request a new one."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Never"
msgid "New password"
msgstr "New password"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "New Password"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Newest first"
@@ -771,11 +786,15 @@ msgstr "Parent Category"
msgid "Password"
msgstr "Password"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Password must be at least {minimumPasswordLength} characters"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Password Recovery"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passwords do not match"
@@ -817,6 +836,11 @@ msgstr "Refresh"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrations are closed on this CommaFeed instance"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Reset Password"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1056,10 +1080,6 @@ msgstr "Unstar"
msgid "Unsubscribe"
msgstr "Unsubscribe"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr "User created."
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "User name"
@@ -1096,3 +1116,7 @@ msgstr "You don't have any subscriptions yet. Why not try adding one by clicking
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Your feeds have been queued for refresh."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Your password has been changed. You can now log in with your new password."

View File

@@ -136,6 +136,7 @@ msgid "Back"
msgstr "Atrás"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Volver a iniciar sesión"
@@ -227,6 +228,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acogedor"
@@ -492,6 +498,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -635,6 +645,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nueva contraseña"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Las más recientes primero"
@@ -772,11 +787,15 @@ msgstr "Categoría principal"
msgid "Password"
msgstr "Contraseña"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperación de contraseña"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
@@ -818,6 +837,11 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Los registros están cerrados en esta instancia de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1057,10 +1081,6 @@ msgstr "Desmarcar"
msgid "Unsubscribe"
msgstr "Cancelar suscripción"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nombre de usuario"
@@ -1097,3 +1117,7 @@ msgstr "Aún no tienes ninguna suscripción. ¿Por qué no intentas agregar una
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Tus feeds se han puesto en cola para actualizarse."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "برگشت"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "بازگشت برای ورود به سیستم"
@@ -226,6 +227,11 @@ msgstr "تأیید کنید"
msgid "Confirm password"
msgstr "رمز عبور را تأیید کنید"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "دنج"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "رمز عبور جدید"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "ابتدا جدیدترین"
@@ -771,11 +786,15 @@ msgstr "دسته والد"
msgid "Password"
msgstr "رمز عبور"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "بازیابی رمز عبور"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "گذرواژه ها مطابقت ندارند"
@@ -817,6 +836,11 @@ msgstr "تازه کردن"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "ثبت نام در این نمونه CommaFeed بسته شده است"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr ""
msgid "Unsubscribe"
msgstr "لغو اشتراک"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "نام کاربری"
@@ -1096,3 +1116,7 @@ msgstr "شما هنوز هیچ اشتراکی ندارید. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Takaisin"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Takaisin sisäänkirjautumiseen"
@@ -226,6 +227,11 @@ msgstr "Vahvista"
msgid "Confirm password"
msgstr "Vahvista salasana"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Viihtyisä"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Uusi salasana"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Uusin ensin"
@@ -771,11 +786,15 @@ msgstr "Pääluokka"
msgid "Password"
msgstr "Salasana"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Salasanan palautus"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Salasanat eivät täsmää"
@@ -817,6 +836,11 @@ msgstr "Päivitä"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Tämän CommaFeed-esiintymän rekisteröinnit on suljettu"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Poista tähti"
msgid "Unsubscribe"
msgstr "Peruuta tilaus"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Käyttäjänimi"
@@ -1096,3 +1116,7 @@ msgstr "Sinulla ei ole vielä tilauksia. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -63,7 +63,7 @@ msgstr "Administrateur"
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr ""
msgstr "Nom de l'administrateur"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Retour"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Retour à la connexion"
@@ -226,13 +227,18 @@ msgstr "Confirmer"
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "Confirmer le mot de passe"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
msgstr "Créer un compte adminstrateur"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
@@ -489,7 +495,11 @@ msgstr "Indigo"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
msgstr "Configuration initiale"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "Lien de réinitialisation de mot de passse invalide. Recommencez la procédure."
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
@@ -634,6 +644,11 @@ msgstr "Jamais"
msgid "New password"
msgstr "Nouveau mot de passe"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "Nouveau mot de passe"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Plus récent en premier"
@@ -771,11 +786,15 @@ msgstr "Catégorie parente"
msgid "Password"
msgstr "Mot de passe"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "Le mot de passe doit mesurer au moins {minimumPasswordLength} caractères"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Récupération de mot de passe"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
@@ -817,6 +836,11 @@ msgstr "Rafraîchir"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Les inscriptions sont fermées sur cette instance de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1056,10 +1080,6 @@ msgstr "Retirer des favoris"
msgid "Unsubscribe"
msgstr "Se désabonner"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nom"
@@ -1083,7 +1103,7 @@ msgstr "Site web"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr ""
msgstr "Bienvenue ! Il semble que ce soit le premier démarrage de Commafeed. Avant tout, vous devez créer un compte administrateur."
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
@@ -1096,3 +1116,7 @@ msgstr "Vous n'avez pas encore d'abonnements. Pourquoi ne pas essayer d'en ajout
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Vos flux sont en cours de rafraîchissement"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "Votre mot de passe a été modifié. Vous pouvez vous connecter avec votre nouveau mot de passe."

View File

@@ -136,6 +136,7 @@ msgid "Back"
msgstr "Volver"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Volver para iniciar sesión"
@@ -227,6 +228,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar contrasinal"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acolledor"
@@ -492,6 +498,10 @@ msgstr "Índigo"
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -635,6 +645,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Novo contrasinal"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Primeiro o máis recente"
@@ -772,11 +787,15 @@ msgstr "Categoría superior"
msgid "Password"
msgstr "Contrasinal"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperación do contrasinal"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Os contrasinais non coinciden"
@@ -818,6 +837,11 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Non se admiten novas contas nesta instancia de CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1057,10 +1081,6 @@ msgstr "Retirar estrela"
msgid "Unsubscribe"
msgstr "Cancelar a subscrición"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Identificador"
@@ -1097,3 +1117,7 @@ msgstr "Aínda non tes ningunha subscrición. Por que non engades unha premendo
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "As túas canles están na cola para ser actualizadas."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Vissza"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Vissza a bejelentkezéshez"
@@ -226,6 +227,11 @@ msgstr "Erősítse meg"
msgid "Confirm password"
msgstr "Erősítse meg a jelszót"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Hangulatos"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Új jelszó"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "A legújabbak először"
@@ -771,11 +786,15 @@ msgstr "Szülő kategória"
msgid "Password"
msgstr "Jelszó"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Jelszó helyreállítás"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "A jelszavak nem egyeznek"
@@ -817,6 +836,11 @@ 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/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Leiratkozás"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Felhasználónév"
@@ -1096,3 +1116,7 @@ msgstr "Még nincs előfizetése. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Kembali"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Kembali untuk masuk"
@@ -226,6 +227,11 @@ msgstr "Konfirmasi"
msgid "Confirm password"
msgstr "Konfirmasi kata sandi"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Nyaman"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Kata sandi baru"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Terbaru dulu"
@@ -771,11 +786,15 @@ msgstr "Kategori Induk"
msgid "Password"
msgstr "Kata Sandi"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Pemulihan Kata Sandi"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Kata sandi tidak cocok"
@@ -817,6 +836,11 @@ msgstr "Segarkan"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada instans CommaFeed ini"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Hapus bintang"
msgid "Unsubscribe"
msgstr "Berhenti berlangganan"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nama pengguna"
@@ -1096,3 +1116,7 @@ msgstr "Anda belum memiliki langganan. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Indietro"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Torna per accedere"
@@ -226,6 +227,11 @@ msgstr "Conferma"
msgid "Confirm password"
msgstr "Conferma password"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Accogliente"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nuova password"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Il più recente prima"
@@ -771,11 +786,15 @@ msgstr "Categoria padre"
msgid "Password"
msgstr ""
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recupero password"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Le password non corrispondono"
@@ -817,6 +836,11 @@ msgstr "Aggiorna"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Le registrazioni sono chiuse su questa istanza CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1056,10 +1080,6 @@ msgstr "Elimina le stelle"
msgid "Unsubscribe"
msgstr "Annulla iscrizione"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nome utente"
@@ -1096,3 +1116,7 @@ msgstr "Non hai ancora abbonamenti. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "戻る"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "ログインに戻る"
@@ -226,6 +227,11 @@ msgstr "確認"
msgid "Confirm password"
msgstr "パスワード確認"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "しない"
msgid "New password"
msgstr "新しいパスワード"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新順"
@@ -771,11 +786,15 @@ msgstr "親カテゴリ"
msgid "Password"
msgstr "パスワード"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "パスワード回復"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "パスワードが一致しません"
@@ -817,6 +836,11 @@ msgstr "リフレッシュ"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "このCommaFeedインスタンスの登録は終了しています"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1056,10 +1080,6 @@ msgstr "スターを外す"
msgid "Unsubscribe"
msgstr "退会"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "ユーザー名"
@@ -1096,3 +1116,7 @@ msgstr "まだサブスクリプションがありません。上部の + 記号
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "フィードの更新がキューに登録されました。"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "뒤로"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "로그인으로 돌아가기"
@@ -226,6 +227,11 @@ msgstr "확인"
msgid "Confirm password"
msgstr "비밀번호 확인"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "코지"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "새 비밀번호"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "최신순"
@@ -771,11 +786,15 @@ msgstr "부모 카테고리"
msgid "Password"
msgstr "비밀번호"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "비밀번호 복구"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "비밀번호가 일치하지 않습니다"
@@ -817,6 +836,11 @@ msgstr "새로 고침"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "이 CommaFeed 인스턴스에 대한 등록이 마감되었습니다."
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "별표 제거"
msgid "Unsubscribe"
msgstr "구독 취소"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "사용자 이름"
@@ -1096,3 +1116,7 @@ msgstr "아직 구독이 없습니다. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Kembali"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Kembali untuk log masuk"
@@ -226,6 +227,11 @@ msgstr "Sahkan"
msgid "Confirm password"
msgstr "Sahkan kata laluan"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Nyaman"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Kata laluan baharu"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Terbaharu dahulu"
@@ -771,11 +786,15 @@ msgstr "Kategori Induk"
msgid "Password"
msgstr "Kata Laluan"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Pemulihan Kata Laluan"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Kata laluan tidak sepadan"
@@ -817,6 +836,11 @@ msgstr "Muat semula"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada contoh CommaFeed ini"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REHAT API"
@@ -1056,10 +1080,6 @@ msgstr "Nyahbintang"
msgid "Unsubscribe"
msgstr "Nyahlanggan"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nama pengguna"
@@ -1096,3 +1116,7 @@ msgstr "Anda belum mempunyai sebarang langganan lagi. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbake"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbake for å logge inn"
@@ -226,6 +227,11 @@ msgstr "Bekreft"
msgid "Confirm password"
msgstr "Bekreft passord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Koselig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt passord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -771,11 +786,15 @@ msgstr "Overordnet kategori"
msgid "Password"
msgstr "Passord"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Passordgjenoppretting"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passordene samsvarer ikke"
@@ -817,6 +836,11 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Fjern stjerne"
msgid "Unsubscribe"
msgstr "Avslutt abonnementet"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brukernavn"
@@ -1096,3 +1116,7 @@ msgstr "Du har ingen abonnementer ennå. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Terug"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Terug naar inloggen"
@@ -226,6 +227,11 @@ msgstr "Bevestigen"
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Gezellig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nieuw wachtwoord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nieuwste eerst"
@@ -771,11 +786,15 @@ msgstr "Oudercategorie"
msgid "Password"
msgstr "Wachtwoord"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Wachtwoordherstel"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
@@ -817,6 +836,11 @@ msgstr "Vernieuwen"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registraties zijn gesloten op deze CommaFeed-instantie"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST-API"
@@ -1056,10 +1080,6 @@ msgstr "Sterren uit"
msgid "Unsubscribe"
msgstr "Afmelden"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Gebruikersnaam"
@@ -1096,3 +1116,7 @@ msgstr "Je hebt nog geen abonnementen. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbake"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbake for å logge inn"
@@ -226,6 +227,11 @@ msgstr "Bekreft"
msgid "Confirm password"
msgstr "Bekreft passord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Koselig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt passord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -771,11 +786,15 @@ msgstr "Overordnet kategori"
msgid "Password"
msgstr "Passord"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Passordgjenoppretting"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Passordene samsvarer ikke"
@@ -817,6 +836,11 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Fjern stjerne"
msgid "Unsubscribe"
msgstr "Avslutt abonnementet"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Brukernavn"
@@ -1096,3 +1116,7 @@ msgstr "Du har ingen abonnementer ennå. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Powrót"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Powrót do logowania"
@@ -226,6 +227,11 @@ msgstr "Potwierdź"
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Przytulny"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nowe hasło"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Najnowsze jako pierwsze"
@@ -771,11 +786,15 @@ msgstr "Kategoria nadrzędna"
msgid "Password"
msgstr "Hasło"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Odzyskiwanie hasła"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Hasła nie pasują"
@@ -817,6 +836,11 @@ msgstr "Odśwież"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Rejestracje są zamknięte w tej instancji CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Anuluj subskrypcję"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nazwa użytkownika"
@@ -1096,3 +1116,7 @@ msgstr "Nie masz jeszcze żadnych subskrypcji. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Voltar"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Voltar para logar"
@@ -226,6 +227,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Aconchegante"
@@ -491,6 +497,10 @@ msgstr "Índigo"
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nova senha"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Mais novo primeiro"
@@ -771,11 +786,15 @@ msgstr "Categoria Pai"
msgid "Password"
msgstr "Senha"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Recuperação de Senha"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Senhas não coincidem"
@@ -817,6 +836,11 @@ msgstr "Atualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Os registros estão fechados nesta instância do CommaFeed"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1056,10 +1080,6 @@ msgstr "Desestrelar"
msgid "Unsubscribe"
msgstr "Cancelar inscrição"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Nome de usuário"
@@ -1096,3 +1116,7 @@ msgstr "Você ainda não tem nenhuma assinatura. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Seus feed foram enfileirados para atualização"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Назад"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Вернуться к входу"
@@ -226,6 +227,11 @@ msgstr "Подтвердить"
msgid "Confirm password"
msgstr "Подтвердить пароль"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Уютно"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Никогда"
msgid "New password"
msgstr "Новый пароль"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Сначала новые"
@@ -771,11 +786,15 @@ msgstr "Родительская категория"
msgid "Password"
msgstr "Пароль"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Восстановление пароля"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Пароли не совпадают"
@@ -817,6 +836,11 @@ msgstr "Обновить"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Регистрация закрыта для этого экземпляра CommaFeed."
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1056,10 +1080,6 @@ msgstr "Удалить из избранного"
msgid "Unsubscribe"
msgstr "Отписаться"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Имя пользователя"
@@ -1096,3 +1116,7 @@ msgstr "У вас еще нет подписок. Почему бы не поп
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ваши каналы были поставлены в очередь на обновление."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Späť"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Späť na prihlásenie"
@@ -226,6 +227,11 @@ msgstr "Potvrdiť"
msgid "Confirm password"
msgstr "Potvrďte heslo"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Útulný"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nové heslo"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Najnovšie ako prvé"
@@ -771,11 +786,15 @@ msgstr "Rodičovská kategória"
msgid "Password"
msgstr "Heslo"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Obnovenie hesla"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Heslá sa nezhodujú"
@@ -817,6 +836,11 @@ msgstr "Obnoviť"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V tejto inštancii CommaFeed sú registrácie uzavreté"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr "Odobrať hviezdičku"
msgid "Unsubscribe"
msgstr "Zrušte odber"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Meno používateľa"
@@ -1096,3 +1116,7 @@ msgstr "Zatiaľ nemáte žiadne odbery. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tillbaka"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tillbaka för att logga in"
@@ -226,6 +227,11 @@ msgstr "Bekräfta"
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Mysigt"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt lösenord"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyast först"
@@ -771,11 +786,15 @@ msgstr "Föräldrakategori"
msgid "Password"
msgstr "Lösenord"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Lösenordsåterställning"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Lösenorden matchar inte"
@@ -817,6 +836,11 @@ msgstr "Uppdatera"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringar är stängda på denna CommaFeed-instans"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1056,10 +1080,6 @@ msgstr ""
msgid "Unsubscribe"
msgstr "Avregistrera"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Användarnamn"
@@ -1096,3 +1116,7 @@ msgstr "Du har inga prenumerationer än. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Geri"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Giriş yapmak için geri dön"
@@ -226,6 +227,11 @@ msgstr "Onayla"
msgid "Confirm password"
msgstr "Şifreyi onayla"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr ""
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Rahat"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr ""
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Yeni şifre"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Önce en yenisi"
@@ -771,11 +786,15 @@ msgstr "Üst Kategori"
msgid "Password"
msgstr "Şifre"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr ""
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "Parola Kurtarma"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "Parolalar eşleşmiyor"
@@ -817,6 +836,11 @@ msgstr "Yenile"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Bu CommaFeed örneğinde kayıtlar kapalı"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr ""
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1056,10 +1080,6 @@ msgstr "Yıldızı kaldır"
msgid "Unsubscribe"
msgstr "Aboneliği iptal et"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "Kullanıcı adı"
@@ -1096,3 +1116,7 @@ msgstr "Henüz aboneliğiniz yok. Sayfanın üstündeki + işaretiyle feed ekley
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Feed'leriniz yenileme için sıraya alındı."
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr ""

View File

@@ -63,7 +63,7 @@ msgstr "管理员"
#: src/pages/auth/InitialSetupPage.tsx
#: src/pages/auth/InitialSetupPage.tsx
msgid "Admin user name"
msgstr ""
msgstr "管理员用户名"
#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "返回"
#: src/pages/auth/PasswordRecoveryPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "返回登录"
@@ -226,13 +227,18 @@ msgstr "确认"
msgid "Confirm password"
msgstr "确认密码"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Confirm Password"
msgstr "确认密码"
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "宽松"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Create Admin Account"
msgstr ""
msgstr "创建管理员帐号"
#: src/components/KeyboardShortcutsHelp.tsx
msgid "Ctrl"
@@ -489,7 +495,11 @@ msgstr "靛蓝"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Initial Setup"
msgstr ""
msgstr "初始化设置"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Invalid password reset link. Please request a new one."
msgstr "密码重置链接无效,请重新申请。"
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
@@ -634,6 +644,11 @@ msgstr "从不"
msgid "New password"
msgstr "新密码"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "New Password"
msgstr "新密码"
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新的优先"
@@ -771,11 +786,15 @@ msgstr "父类别"
msgid "Password"
msgstr "密码"
#: src/hooks/useValidationRules.ts
msgid "Password must be at least {minimumPasswordLength} characters"
msgstr "密码最少需要 {minimumPasswordLength} 个字符"
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Password Recovery"
msgstr "密码恢复"
#: src/components/settings/ProfileSettings.tsx
#: src/hooks/useValidationRules.ts
msgid "Passwords do not match"
msgstr "密码不匹配"
@@ -817,6 +836,11 @@ msgstr "刷新"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "此 CommaFeed 实例上的注册已关闭"
#: src/pages/auth/PasswordResetPage.tsx
#: src/pages/auth/PasswordResetPage.tsx
msgid "Reset Password"
msgstr "重置密码"
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1056,10 +1080,6 @@ msgstr "取消星标"
msgid "Unsubscribe"
msgstr "取消订阅"
#: src/pages/auth/InitialSetupPage.tsx
msgid "User created."
msgstr ""
#: src/components/settings/ProfileSettings.tsx
msgid "User name"
msgstr "用户名"
@@ -1083,7 +1103,7 @@ msgstr "网站"
#: src/pages/auth/InitialSetupPage.tsx
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
msgstr ""
msgstr "欢迎当前页仅当您第一次使用CommaFeed时出现请创建一个管理员帐号以开始使用。"
#: src/components/settings/DisplaySettings.tsx
msgid "Yellow"
@@ -1096,3 +1116,7 @@ msgstr "您还没有任何订阅。"
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "您的订阅已经进入刷新队列。"
#: src/pages/auth/PasswordResetPage.tsx
msgid "Your password has been changed. You can now log in with your new password."
msgstr "您的密码已更改。您现在可以使用新密码登录。"

View File

@@ -9,11 +9,13 @@ import { redirectToRootCategory } from "@/app/redirect/thunks"
import { useAppDispatch } from "@/app/store"
import type { InitialSetupRequest } from "@/app/types"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
import { PageTitle } from "@/pages/PageTitle"
export function InitialSetupPage() {
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<InitialSetupRequest>({
initialValues: {
@@ -21,6 +23,10 @@ export function InitialSetupPage() {
password: "",
email: "",
},
validate: {
password: validationRules.password,
},
validateInputOnChange: true,
})
const login = useAsyncCallback(client.user.login, {

View File

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

View File

@@ -10,12 +10,14 @@ import { redirectToRootCategory } from "@/app/redirect/thunks"
import { useAppDispatch, useAppSelector } from "@/app/store"
import type { RegistrationRequest } from "@/app/types"
import { Alert } from "@/components/Alert"
import { useValidationRules } from "@/hooks/useValidationRules"
import { PageTitle } from "@/pages/PageTitle"
export function RegistrationPage() {
const serverInfos = useAppSelector(state => state.server.serverInfos)
const dispatch = useAppDispatch()
const { _ } = useLingui()
const validationRules = useValidationRules()
const form = useForm<RegistrationRequest>({
initialValues: {
@@ -23,6 +25,10 @@ export function RegistrationPage() {
password: "",
email: "",
},
validate: {
password: validationRules.password,
},
validateInputOnChange: true,
})
const login = useAsyncCallback(client.user.login, {

View File

@@ -6,13 +6,13 @@
<parent>
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>6.0.0</version>
<version>6.1.0</version>
</parent>
<artifactId>commafeed-server</artifactId>
<name>CommaFeed Server</name>
<properties>
<quarkus.version>3.30.6</quarkus.version>
<quarkus.version>3.30.8</quarkus.version>
<querydsl.version>7.1</querydsl.version>
<rome.version>2.1.0</rome.version>
@@ -55,7 +55,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.2.1</version>
<version>1.3.0</version>
<executions>
<execution>
<goals>
@@ -330,7 +330,7 @@
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>3.1.0</version>
<version>3.2.0</version>
<?m2e ignore?>
<executions>
<execution>
@@ -359,7 +359,7 @@
<dependency>
<groupId>com.commafeed</groupId>
<artifactId>commafeed-client</artifactId>
<version>6.0.0</version>
<version>6.1.0</version>
</dependency>
<!-- compile-time processors -->
@@ -541,7 +541,7 @@
<dependency>
<groupId>io.quarkiverse.playwright</groupId>
<artifactId>quarkus-playwright</artifactId>
<version>2.3.1</version>
<version>2.3.2</version>
<scope>test</scope>
</dependency>
<dependency>

View File

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

View File

@@ -1,4 +1,4 @@
FROM debian:13.2@sha256:c71b05eac0b20adb4cdcc9f7b052227efd7da381ad10bb92f972e8eae7c6cdc9
FROM debian:13.3@sha256:5cf544fad978371b3df255b61e209b373583cb88b733475c86e49faa15ac2104
ARG TARGETARCH
EXPOSE 8082

View File

@@ -1,6 +1,5 @@
package com.commafeed.backend.service;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -18,11 +17,10 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
// taken from http://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html
@SuppressWarnings("serial")
@Slf4j
@RequiredArgsConstructor
@Singleton
public class PasswordEncryptionService implements Serializable {
public class PasswordEncryptionService {
public boolean authenticate(String attemptedPassword, byte[] encryptedPassword, byte[] salt) {
if (StringUtils.isBlank(attemptedPassword)) {

View File

@@ -49,4 +49,7 @@ public class ServerInfo implements Serializable {
@Schema(required = true)
private boolean initialSetupRequired;
@Schema(required = true)
private int minimumPasswordLength;
}

View File

@@ -18,7 +18,7 @@ import lombok.Data;
@RegisterForReflection
public class Settings implements Serializable {
@Schema(description = "user's preferred language, english if none", required = true)
@Schema(description = "user's preferred language, english if none")
private String language;
@Schema(description = "user reads all entries or unread entries only", required = true)

View File

@@ -0,0 +1,34 @@
package com.commafeed.frontend.model.request;
import java.io.Serializable;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import com.commafeed.security.password.ValidPassword;
import lombok.Data;
@SuppressWarnings("serial")
@Data
@Schema
public class PasswordResetConfirmationRequest implements Serializable {
@Schema(description = "email address for password recovery", required = true)
@Email
@NotEmpty
@Size(max = 255)
private String email;
@Schema(description = "password recovery token", required = true)
@NotEmpty
private String token;
@Schema(description = "new password", required = true)
@NotEmpty
@ValidPassword
private String password;
}

View File

@@ -61,6 +61,7 @@ public class ServerREST {
infos.setTreeReloadInterval(config.websocket().treeReloadInterval().toMillis());
infos.setForceRefreshCooldownDuration(config.feedRefresh().forceRefreshCooldownDuration().toMillis());
infos.setInitialSetupRequired(databaseStartupService.isInitialSetupRequired());
infos.setMinimumPasswordLength(config.users().minimumPasswordLength());
return infos;
}

View File

@@ -1,6 +1,5 @@
package com.commafeed.frontend.resource;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
@@ -21,13 +20,11 @@ import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.UriInfo;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.core5.net.URIBuilder;
import org.eclipse.microprofile.openapi.annotations.Operation;
@@ -38,7 +35,6 @@ import com.commafeed.CommaFeedConfiguration;
import com.commafeed.CommaFeedConstants;
import com.commafeed.backend.Digests;
import com.commafeed.backend.Urls;
import com.commafeed.backend.dao.UnitOfWork;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.dao.UserRoleDAO;
import com.commafeed.backend.dao.UserSettingsDAO;
@@ -57,6 +53,7 @@ import com.commafeed.backend.service.db.DatabaseStartupService;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.InitialSetupRequest;
import com.commafeed.frontend.model.request.PasswordResetConfirmationRequest;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.frontend.model.request.ProfileModificationRequest;
import com.commafeed.frontend.model.request.RegistrationRequest;
@@ -87,7 +84,6 @@ public class UserREST {
private final MailService mailService;
private final CommaFeedConfiguration config;
private final UriInfo uri;
private final UnitOfWork unitOfWork;
@Path("/settings")
@GET
@@ -144,7 +140,6 @@ public class UserREST {
s.getSharingSettings().setBuffer(true);
s.setScrollMarks(true);
s.setLanguage("en");
s.setScrollSpeed(400);
s.setScrollMode(ScrollMode.IF_NEEDED);
s.setEntriesToKeepOnTopWhenScrolling(1);
@@ -156,7 +151,7 @@ public class UserREST {
s.setMobileFooter(false);
s.setUnreadCountTitle(false);
s.setUnreadCountFavicon(true);
s.setDisablePullToRefresh(true);
s.setDisablePullToRefresh(false);
}
return s;
}
@@ -335,45 +330,44 @@ public class UserREST {
}
}
private String buildEmailContent(User user) throws URISyntaxException, MalformedURLException {
private String buildEmailContent(User user) throws URISyntaxException {
String publicUrl = Urls.removeTrailingSlash(uri.getBaseUri().toString());
publicUrl += "/rest/user/passwordResetCallback";
return String.format(
"You asked for password recovery for account '%s', <a href='%s'>follow this link</a> to change your password. Ignore this if you didn't request a password recovery.",
user.getName(), callbackUrl(user, publicUrl));
}
private String callbackUrl(User user, String publicUrl) throws URISyntaxException, MalformedURLException {
return new URIBuilder(publicUrl).addParameter("email", user.getEmail())
.addParameter("token", user.getRecoverPasswordToken())
.build()
.toURL()
.toString();
private String callbackUrl(User user, String publicUrl) throws URISyntaxException {
URIBuilder queryBuilder = new URIBuilder();
queryBuilder.addParameter("email", user.getEmail());
queryBuilder.addParameter("token", user.getRecoverPasswordToken());
String queryString = queryBuilder.build().getRawQuery();
return publicUrl + "/#/passwordReset?" + queryString;
}
@Path("/passwordResetCallback")
@PermitAll
@GET
@POST
@Transactional
@Produces(MediaType.TEXT_HTML)
public Response passwordRecoveryCallback(@Parameter(required = true) @QueryParam("email") String email,
@Parameter(required = true) @QueryParam("token") String token) {
@Operation(summary = "confirm password reset with new password")
public Response passwordRecoveryCallback(@Valid @Parameter(required = true) PasswordResetConfirmationRequest req) {
String email = req.getEmail();
String token = req.getToken();
String password = req.getPassword();
Preconditions.checkNotNull(email);
Preconditions.checkNotNull(token);
Preconditions.checkNotNull(password);
User user = userDAO.findByEmail(email);
if (user == null) {
return Response.status(Status.UNAUTHORIZED).entity("Email not found.").build();
if (user == null || user.getRecoverPasswordToken() == null || !user.getRecoverPasswordToken().equals(token)) {
return Response.status(Status.UNAUTHORIZED).entity("Email not found or invalid token.").build();
}
if (user.getRecoverPasswordToken() == null || !user.getRecoverPasswordToken().equals(token)) {
return Response.status(Status.UNAUTHORIZED).entity("Invalid token.").build();
}
if (ChronoUnit.DAYS.between(user.getRecoverPasswordTokenDate(), Instant.now()) >= 2) {
return Response.status(Status.UNAUTHORIZED).entity("token expired.").build();
if (ChronoUnit.MINUTES.between(user.getRecoverPasswordTokenDate(), Instant.now()) >= 30) {
return Response.status(Status.UNAUTHORIZED).entity("Token expired.").build();
}
String passwd = RandomStringUtils.secure().nextAlphanumeric(10);
byte[] encryptedPassword = encryptionService.getEncryptedPassword(passwd, user.getSalt());
byte[] encryptedPassword = encryptionService.getEncryptedPassword(password, user.getSalt());
user.setPassword(encryptedPassword);
if (StringUtils.isNotBlank(user.getApiKey())) {
user.setApiKey(userService.generateApiKey(user));
@@ -381,10 +375,7 @@ public class UserREST {
user.setRecoverPasswordToken(null);
user.setRecoverPasswordTokenDate(null);
String message = "Your new password is: " + passwd;
message += "<br />";
message += String.format("<a href=\"%s\">Back to Homepage</a>", uri.getBaseUri());
return Response.ok(message).build();
return Response.ok().build();
}
@Path("/profile/deleteAccount")

View File

@@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.assertions.PlaywrightAssertions;
import com.microsoft.playwright.options.AriaRole;
@@ -48,17 +47,6 @@ class AuthentificationIT {
PlaywrightAssertions.assertThat(page).hasURL("http://localhost:8085/#/app/category/all");
}
@Test
void registerFailPasswordTooSimple() {
Page page = context.newPage();
page.navigate(getLoginPageUrl());
page.getByText("Sign up!").click();
PlaywrightTestUtils.register(page, "user", "user@domain.com", "p");
Locator alert = page.getByRole(AriaRole.ALERT);
PlaywrightAssertions.assertThat(alert).containsText("Password must be 4 or more characters in length.");
}
@Test
void registerSuccess() {
Page page = context.newPage();

View File

@@ -22,6 +22,7 @@ class ServerIT extends BaseIT {
Assertions.assertEquals(900000, serverInfos.getWebsocketPingInterval());
Assertions.assertEquals(30000, serverInfos.getTreeReloadInterval());
Assertions.assertEquals(60000, serverInfos.getForceRefreshCooldownDuration());
Assertions.assertEquals(4, serverInfos.getMinimumPasswordLength());
}
}

View File

@@ -1,5 +1,7 @@
package com.commafeed.integration.rest;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import jakarta.inject.Inject;
@@ -13,6 +15,7 @@ import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.request.PasswordResetConfirmationRequest;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.integration.BaseIT;
@@ -57,8 +60,32 @@ class UserIT extends BaseIT {
Element a = Jsoup.parse(message.getHtml()).select("a").getFirst();
String link = a.attr("href");
String newPasswordResponse = RestAssured.given().urlEncodingEnabled(false).get(link).then().statusCode(200).extract().asString();
Assertions.assertTrue(newPasswordResponse.contains("Your new password is:"));
String email = null;
String token = null;
String queryString = link.substring(link.indexOf('?') + 1);
for (String param : queryString.split("&")) {
String[] keyValue = param.split("=");
if ("email".equals(keyValue[0])) {
email = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
} else if ("token".equals(keyValue[0])) {
token = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
}
}
Assertions.assertNotNull(email);
Assertions.assertNotNull(token);
Assertions.assertTrue(link.contains("#/passwordReset?"));
String newPassword = "MyNewPassword123!";
PasswordResetConfirmationRequest confirmReq = new PasswordResetConfirmationRequest();
confirmReq.setEmail(email);
confirmReq.setToken(token);
confirmReq.setPassword(newPassword);
RestAssured.given().body(confirmReq).contentType(ContentType.JSON).post("rest/user/passwordResetCallback").then().statusCode(200);
RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, newPassword);
RestAssured.given().get("rest/user/settings").then().statusCode(200);
}
@Test

View File

@@ -5,7 +5,7 @@
<groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId>
<version>6.0.0</version>
<version>6.1.0</version>
<name>CommaFeed</name>
<packaging>pom</packaging>