Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e195565630 | ||
|
|
520f9abcf7 | ||
|
|
bfbe8de98a | ||
|
|
d5cd3002a1 | ||
|
|
77a092a3cf | ||
|
|
613bae9033 | ||
|
|
2e692241c5 | ||
|
|
1e96011793 |
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,3 +1,14 @@
|
|||||||
|
## [1.2.1](https://github.com/stonith404/pingvin-share/compare/v1.2.0...v1.2.1) (2024-10-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* disallow passwort reset if it's a ldap user ([2e69224](https://github.com/stonith404/pingvin-share/commit/2e692241c57b001c9312302523c6374c0c24ea0c))
|
||||||
|
* error message for invalid max use count of reverse share ([613bae9](https://github.com/stonith404/pingvin-share/commit/613bae90330a76c0964352a3fe927df3697309eb))
|
||||||
|
* **oauth:** add `post_logout_redirect_uri` to OAuth logout redirect URI ([#638](https://github.com/stonith404/pingvin-share/issues/638)) ([bfbe8de](https://github.com/stonith404/pingvin-share/commit/bfbe8de98a6a7a2d32dd8d4dddbcc1d4ce6388f4))
|
||||||
|
* share can't be created if an invalid email is entered in mail recipients ([d5cd300](https://github.com/stonith404/pingvin-share/commit/d5cd3002a1661e58d584e12280be36f17948c38c))
|
||||||
|
* trim username, email and password on sign in and sign up page ([77a092a](https://github.com/stonith404/pingvin-share/commit/77a092a3cf089a4aa8b9897b5ad14e5500181d10))
|
||||||
|
|
||||||
## [1.2.0](https://github.com/stonith404/pingvin-share/compare/v1.1.3...v1.2.0) (2024-10-14)
|
## [1.2.0](https://github.com/stonith404/pingvin-share/compare/v1.1.3...v1.2.0) (2024-10-14)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
backend/package-lock.json
generated
4
backend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nestjs/cache-manager": "^2.2.2",
|
"@nestjs/cache-manager": "^2.2.2",
|
||||||
"@nestjs/common": "^10.4.3",
|
"@nestjs/common": "^10.4.3",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-backend",
|
"name": "pingvin-share-backend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nest build",
|
"build": "nest build",
|
||||||
"dev": "cross-env NODE_ENV=development nest start --watch",
|
"dev": "cross-env NODE_ENV=development nest start --watch",
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export class AuthController {
|
|||||||
})
|
})
|
||||||
@HttpCode(202)
|
@HttpCode(202)
|
||||||
async requestResetPassword(@Param("email") email: string) {
|
async requestResetPassword(@Param("email") email: string) {
|
||||||
this.authService.requestResetPassword(email);
|
await this.authService.requestResetPassword(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Post("resetPassword")
|
@Post("resetPassword")
|
||||||
@@ -172,7 +172,9 @@ export class AuthController {
|
|||||||
@Req() request: Request,
|
@Req() request: Request,
|
||||||
@Res({ passthrough: true }) response: Response,
|
@Res({ passthrough: true }) response: Response,
|
||||||
) {
|
) {
|
||||||
const redirectURI = await this.authService.signOut(request.cookies.access_token);
|
const redirectURI = await this.authService.signOut(
|
||||||
|
request.cookies.access_token,
|
||||||
|
);
|
||||||
|
|
||||||
const isSecure = this.config.get("general.appUrl").startsWith("https");
|
const isSecure = this.config.get("general.appUrl").startsWith("https");
|
||||||
response.cookie("access_token", "", {
|
response.cookie("access_token", "", {
|
||||||
|
|||||||
@@ -16,12 +16,12 @@ import * as moment from "moment";
|
|||||||
import { ConfigService } from "src/config/config.service";
|
import { ConfigService } from "src/config/config.service";
|
||||||
import { EmailService } from "src/email/email.service";
|
import { EmailService } from "src/email/email.service";
|
||||||
import { PrismaService } from "src/prisma/prisma.service";
|
import { PrismaService } from "src/prisma/prisma.service";
|
||||||
|
import { OAuthService } from "../oauth/oauth.service";
|
||||||
|
import { GenericOidcProvider } from "../oauth/provider/genericOidc.provider";
|
||||||
|
import { UserSevice } from "../user/user.service";
|
||||||
import { AuthRegisterDTO } from "./dto/authRegister.dto";
|
import { AuthRegisterDTO } from "./dto/authRegister.dto";
|
||||||
import { AuthSignInDTO } from "./dto/authSignIn.dto";
|
import { AuthSignInDTO } from "./dto/authSignIn.dto";
|
||||||
import { LdapService } from "./ldap.service";
|
import { LdapService } from "./ldap.service";
|
||||||
import { GenericOidcProvider } from "../oauth/provider/genericOidc.provider";
|
|
||||||
import { OAuthService } from "../oauth/oauth.service";
|
|
||||||
import { UserSevice } from "../user/user.service";
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AuthService {
|
export class AuthService {
|
||||||
@@ -120,10 +120,7 @@ export class AuthService {
|
|||||||
async generateToken(user: User, oauth?: { idToken?: string }) {
|
async generateToken(user: User, oauth?: { idToken?: string }) {
|
||||||
// TODO: Make all old loginTokens invalid when a new one is created
|
// TODO: Make all old loginTokens invalid when a new one is created
|
||||||
// Check if the user has TOTP enabled
|
// Check if the user has TOTP enabled
|
||||||
if (
|
if (user.totpVerified && !(oauth && this.config.get("oauth.ignoreTotp"))) {
|
||||||
user.totpVerified &&
|
|
||||||
!(oauth && this.config.get("oauth.ignoreTotp"))
|
|
||||||
) {
|
|
||||||
const loginToken = await this.createLoginToken(user.id);
|
const loginToken = await this.createLoginToken(user.id);
|
||||||
|
|
||||||
return { loginToken };
|
return { loginToken };
|
||||||
@@ -149,6 +146,15 @@ export class AuthService {
|
|||||||
|
|
||||||
if (!user) return;
|
if (!user) return;
|
||||||
|
|
||||||
|
if (user.ldapDN) {
|
||||||
|
this.logger.log(
|
||||||
|
`Failed password reset request for user ${email} because it is an LDAP user`,
|
||||||
|
);
|
||||||
|
throw new BadRequestException(
|
||||||
|
"This account can't reset its password here. Please contact your administrator.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Delete old reset password token
|
// Delete old reset password token
|
||||||
if (user.resetPasswordToken) {
|
if (user.resetPasswordToken) {
|
||||||
await this.prisma.resetPasswordToken.delete({
|
await this.prisma.resetPasswordToken.delete({
|
||||||
@@ -163,7 +169,7 @@ export class AuthService {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.emailService.sendResetPasswordEmail(user.email, token);
|
this.emailService.sendResetPasswordEmail(user.email, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
async resetPassword(token: string, newPassword: string) {
|
async resetPassword(token: string, newPassword: string) {
|
||||||
@@ -231,7 +237,10 @@ export class AuthService {
|
|||||||
|
|
||||||
if (refreshTokenId) {
|
if (refreshTokenId) {
|
||||||
const oauthIDToken = await this.prisma.refreshToken
|
const oauthIDToken = await this.prisma.refreshToken
|
||||||
.findFirst({ select: { oauthIDToken: true }, where: { id: refreshTokenId } })
|
.findFirst({
|
||||||
|
select: { oauthIDToken: true },
|
||||||
|
where: { id: refreshTokenId },
|
||||||
|
})
|
||||||
.then((refreshToken) => refreshToken?.oauthIDToken)
|
.then((refreshToken) => refreshToken?.oauthIDToken)
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
// Ignore error if refresh token doesn't exist
|
// Ignore error if refresh token doesn't exist
|
||||||
@@ -249,16 +258,28 @@ export class AuthService {
|
|||||||
const provider = this.oAuthService.availableProviders()[providerName];
|
const provider = this.oAuthService.availableProviders()[providerName];
|
||||||
let signOutFromProviderSupportedAndActivated = false;
|
let signOutFromProviderSupportedAndActivated = false;
|
||||||
try {
|
try {
|
||||||
signOutFromProviderSupportedAndActivated = this.config.get(`oauth.${providerName}-signOut`);
|
signOutFromProviderSupportedAndActivated = this.config.get(
|
||||||
|
`oauth.${providerName}-signOut`,
|
||||||
|
);
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
// Ignore error if the provider is not supported or if the provider sign out is not activated
|
// Ignore error if the provider is not supported or if the provider sign out is not activated
|
||||||
}
|
}
|
||||||
if (provider instanceof GenericOidcProvider && signOutFromProviderSupportedAndActivated) {
|
if (
|
||||||
const configuration = await provider.getConfiguration();
|
provider instanceof GenericOidcProvider &&
|
||||||
if (configuration.frontchannel_logout_supported && URL.canParse(configuration.end_session_endpoint)) {
|
signOutFromProviderSupportedAndActivated
|
||||||
|
) {
|
||||||
|
const configuration = await provider.getConfiguration();
|
||||||
|
if (
|
||||||
|
configuration.frontchannel_logout_supported &&
|
||||||
|
URL.canParse(configuration.end_session_endpoint)
|
||||||
|
) {
|
||||||
const redirectURI = new URL(configuration.end_session_endpoint);
|
const redirectURI = new URL(configuration.end_session_endpoint);
|
||||||
|
redirectURI.searchParams.append("post_logout_redirect_uri", this.config.get("general.appUrl"));
|
||||||
redirectURI.searchParams.append("id_token_hint", idTokenHint);
|
redirectURI.searchParams.append("id_token_hint", idTokenHint);
|
||||||
redirectURI.searchParams.append("client_id", this.config.get(`oauth.${providerName}-clientId`));
|
redirectURI.searchParams.append(
|
||||||
|
"client_id",
|
||||||
|
this.config.get(`oauth.${providerName}-clientId`),
|
||||||
|
);
|
||||||
return redirectURI.toString();
|
return redirectURI.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ export class OAuthService {
|
|||||||
private config: ConfigService,
|
private config: ConfigService,
|
||||||
@Inject(forwardRef(() => AuthService)) private auth: AuthService,
|
@Inject(forwardRef(() => AuthService)) private auth: AuthService,
|
||||||
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
@Inject("OAUTH_PLATFORMS") private platforms: string[],
|
||||||
@Inject("OAUTH_PROVIDERS") private oAuthProviders: Record<string, OAuthProvider<unknown>>,
|
@Inject("OAUTH_PROVIDERS")
|
||||||
|
private oAuthProviders: Record<string, OAuthProvider<unknown>>,
|
||||||
) {}
|
) {}
|
||||||
private readonly logger = new Logger(OAuthService.name);
|
private readonly logger = new Logger(OAuthService.name);
|
||||||
|
|
||||||
@@ -30,13 +31,15 @@ export class OAuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
availableProviders(): Record<string, OAuthProvider<unknown>> {
|
availableProviders(): Record<string, OAuthProvider<unknown>> {
|
||||||
return Object.fromEntries(Object.entries(this.oAuthProviders)
|
return Object.fromEntries(
|
||||||
.map(([providerName, provider]) => [
|
Object.entries(this.oAuthProviders)
|
||||||
[providerName, provider],
|
.map(([providerName, provider]) => [
|
||||||
this.config.get(`oauth.${providerName}-enabled`),
|
[providerName, provider],
|
||||||
])
|
this.config.get(`oauth.${providerName}-enabled`),
|
||||||
.filter(([_, enabled]) => enabled)
|
])
|
||||||
.map(([provider, _]) => provider));
|
.filter(([_, enabled]) => enabled)
|
||||||
|
.map(([provider, _]) => provider),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async status(user: User) {
|
async status(user: User) {
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ Redirect URL: `https://<your-domain>/api/oauth/callback/discord`
|
|||||||
|
|
||||||
Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik and Casdoor.
|
Generic OpenID Connect provider is also supported, we have tested it on Keycloak, Authentik and Casdoor.
|
||||||
|
|
||||||
Redirect URL: `https://<your-domain>/api/oauth/callback/oidc`
|
Redirect URI: `https://<your-domain>/api/oauth/callback/oidc`
|
||||||
|
|
||||||
|
Post Logout Redirect URI: `https://<your-domain>`
|
||||||
|
|
||||||
## Custom your OAuth 2 Provider
|
## Custom your OAuth 2 Provider
|
||||||
|
|
||||||
|
|||||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.13.3",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/server": "^11.11.0",
|
"@emotion/server": "^11.11.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share-frontend",
|
"name": "pingvin-share-frontend",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ const SignInForm = ({ redirectPath }: { redirectPath: string }) => {
|
|||||||
|
|
||||||
const signIn = async (email: string, password: string) => {
|
const signIn = async (email: string, password: string) => {
|
||||||
await authService
|
await authService
|
||||||
.signIn(email, password)
|
.signIn(email.trim(), password.trim())
|
||||||
.then(async (response) => {
|
.then(async (response) => {
|
||||||
if (response.data["loginToken"]) {
|
if (response.data["loginToken"]) {
|
||||||
// Prompt the user to enter their totp code
|
// Prompt the user to enter their totp code
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ const SignUpForm = () => {
|
|||||||
|
|
||||||
const signUp = async (email: string, username: string, password: string) => {
|
const signUp = async (email: string, username: string, password: string) => {
|
||||||
await authService
|
await authService
|
||||||
.signUp(email, username, password)
|
.signUp(email.trim(), username.trim(), password.trim())
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
const user = await refreshUser();
|
const user = await refreshUser();
|
||||||
if (user?.isAdmin) {
|
if (user?.isAdmin) {
|
||||||
|
|||||||
@@ -9,11 +9,13 @@ import {
|
|||||||
Switch,
|
Switch,
|
||||||
Text,
|
Text,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import { useForm } from "@mantine/form";
|
import { useForm, yupResolver } from "@mantine/form";
|
||||||
import { useModals } from "@mantine/modals";
|
import { useModals } from "@mantine/modals";
|
||||||
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
||||||
|
import { getCookie, setCookie } from "cookies-next";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
|
import * as yup from "yup";
|
||||||
import useTranslate, {
|
import useTranslate, {
|
||||||
translateOutsideContext,
|
translateOutsideContext,
|
||||||
} from "../../../hooks/useTranslate.hook";
|
} from "../../../hooks/useTranslate.hook";
|
||||||
@@ -22,7 +24,6 @@ import { getExpirationPreview } from "../../../utils/date.util";
|
|||||||
import toast from "../../../utils/toast.util";
|
import toast from "../../../utils/toast.util";
|
||||||
import FileSizeInput from "../FileSizeInput";
|
import FileSizeInput from "../FileSizeInput";
|
||||||
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
import showCompletedReverseShareModal from "./showCompletedReverseShareModal";
|
||||||
import { getCookie, setCookie } from "cookies-next";
|
|
||||||
|
|
||||||
const showCreateReverseShareModal = (
|
const showCreateReverseShareModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
@@ -65,6 +66,16 @@ const Body = ({
|
|||||||
simplified: !!(getCookie("reverse-share.simplified") ?? false),
|
simplified: !!(getCookie("reverse-share.simplified") ?? false),
|
||||||
publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
|
publicAccess: !!(getCookie("reverse-share.public-access") ?? true),
|
||||||
},
|
},
|
||||||
|
validate: yupResolver(
|
||||||
|
yup.object().shape({
|
||||||
|
maxUseCount: yup
|
||||||
|
.number()
|
||||||
|
.typeError(t("common.error.invalid-number"))
|
||||||
|
.min(1, t("common.error.number-too-small", { min: 1 }))
|
||||||
|
.max(1000, t("common.error.number-too-large", { max: 1000 }))
|
||||||
|
.required(t("common.error.field-required")),
|
||||||
|
}),
|
||||||
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
const onSubmit = form.onSubmit(async (values) => {
|
const onSubmit = form.onSubmit(async (values) => {
|
||||||
|
|||||||
@@ -371,7 +371,7 @@ const CreateUploadModalBody = ({
|
|||||||
searchable
|
searchable
|
||||||
creatable
|
creatable
|
||||||
id="recipient-emails"
|
id="recipient-emails"
|
||||||
type="email"
|
inputMode="email"
|
||||||
getCreateLabel={(query) => `+ ${query}`}
|
getCreateLabel={(query) => `+ ${query}`}
|
||||||
onCreate={(query) => {
|
onCreate={(query) => {
|
||||||
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
if (!query.match(/^\S+@\S+\.\S+$/)) {
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "عنوان البريد غير صحيح",
|
"common.error.invalid-email": "عنوان البريد غير صحيح",
|
||||||
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
|
"common.error.too-short": "يجب أن يكون على الأقل {length} حرفًا",
|
||||||
"common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا",
|
"common.error.too-long": "يجب أن يكون على الأكثر {length} حرفًا",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
|
"common.error.exact-length": "يجب أن يكون بالضبط {length} حرفًا",
|
||||||
"common.error.invalid-number": "يجب أن يكون رقماً",
|
"common.error.invalid-number": "يجب أن يكون رقماً",
|
||||||
"common.error.field-required": "هذا الحقل مطلوب"
|
"common.error.field-required": "هذا الحقل مطلوب"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {length} characters",
|
"common.error.too-long": "Must be at most {length} characters",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Must be exactly {length} characters",
|
"common.error.exact-length": "Must be exactly {length} characters",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "Must be a number",
|
||||||
"common.error.field-required": "This field is required"
|
"common.error.field-required": "This field is required"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Musí mít alespoň {length} znaků",
|
"common.error.too-short": "Musí mít alespoň {length} znaků",
|
||||||
"common.error.too-long": "Musí mít maximálně {length} znaků",
|
"common.error.too-long": "Musí mít maximálně {length} znaků",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Musí mít přesně {length} znaků",
|
"common.error.exact-length": "Musí mít přesně {length} znaků",
|
||||||
"common.error.invalid-number": "Musí být číslo",
|
"common.error.invalid-number": "Musí být číslo",
|
||||||
"common.error.field-required": "Toto pole je povinné"
|
"common.error.field-required": "Toto pole je povinné"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ugyldig e-mail",
|
"common.error.invalid-email": "Ugyldig e-mail",
|
||||||
"common.error.too-short": "Skal være på mindst {length} tegn",
|
"common.error.too-short": "Skal være på mindst {length} tegn",
|
||||||
"common.error.too-long": "Må højst være {length} tegn",
|
"common.error.too-long": "Må højst være {length} tegn",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Skal være præcis {length} tegn",
|
"common.error.exact-length": "Skal være præcis {length} tegn",
|
||||||
"common.error.invalid-number": "Skal være et tal",
|
"common.error.invalid-number": "Skal være et tal",
|
||||||
"common.error.field-required": "Dette felt er påkrævet"
|
"common.error.field-required": "Dette felt er påkrævet"
|
||||||
|
|||||||
@@ -396,9 +396,9 @@ export default {
|
|||||||
"admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
|
"admin.config.oauth.oidc-sign-out.description": "Wenn aktiviert, wird der Benutzer mit der „Abmelden“-Schaltfläche vom OpenID-Connect-Provider abgemeldet.",
|
||||||
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
|
"admin.config.oauth.oidc-username-claim": "OpenID Connect Benutzername anfordern",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
"admin.config.oauth.oidc-username-claim.description": "Benutzername im OpenID Token. Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Pfad zu den Rollen im OpenID Verbindungs-Token",
|
||||||
"admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
"admin.config.oauth.oidc-role-path.description": "Muss ein valider JMES-Pfad sein, der zu einem Array an Rollen führt. " + "Die Zugangsverwaltung über Rollen in OpenID Connect ist nur empfohlen, wenn kein anderer Identitätsprovider konfiguriert und die Anmeldung per Password deaktiviert ist. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
"admin.config.oauth.oidc-role-general-access": "OpenID Connect Rolle für allgemeinen Zugriff",
|
||||||
"admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
"admin.config.oauth.oidc-role-general-access.description": "Rolle für generellen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser sich anmelden kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect Rolle für Admin-Zugriff",
|
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect Rolle für Admin-Zugriff",
|
||||||
"admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
"admin.config.oauth.oidc-role-admin-access.description": "Rolle für administrativen Zugriff. Muss Teil der Rollen eines Benutzers sein, damit dieser auf das Administrator-Panel zugreifen kann. " + "Leer lassen, wenn du nicht weißt, was diese Konfiguration bedeutet.",
|
||||||
@@ -407,10 +407,10 @@ export default {
|
|||||||
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
|
"admin.config.oauth.oidc-client-secret": "OpenID Connect Client-Secret",
|
||||||
"admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
|
"admin.config.oauth.oidc-client-secret.description": "Client-Secret der OpenID Connect OAuth-App",
|
||||||
"admin.config.category.ldap": "LDAP",
|
"admin.config.category.ldap": "LDAP",
|
||||||
"admin.config.ldap.enabled": "Enabled LDAP",
|
"admin.config.ldap.enabled": "LDAP aktivieren",
|
||||||
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
"admin.config.ldap.enabled.description": "LDAP-Authentifizierung für die Benutzeranmeldung verwenden",
|
||||||
"admin.config.ldap.url": "Server URL",
|
"admin.config.ldap.url": "Server-URL",
|
||||||
"admin.config.ldap.url.description": "URL of the LDAP server",
|
"admin.config.ldap.url.description": "URL des LDAP-Servers",
|
||||||
"admin.config.ldap.bind-dn": "Bind DN",
|
"admin.config.ldap.bind-dn": "Bind DN",
|
||||||
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search",
|
"admin.config.ldap.bind-dn.description": "Default user which will be used to execute the user search",
|
||||||
"admin.config.ldap.bind-password": "Bind password",
|
"admin.config.ldap.bind-password": "Bind password",
|
||||||
@@ -462,7 +462,7 @@ export default {
|
|||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Link öffnen",
|
"common.text.navigate-to-link": "Link öffnen",
|
||||||
"common.text.or": "oder",
|
"common.text.or": "oder",
|
||||||
"common.text.redirecting": "Redirecting...",
|
"common.text.redirecting": "Umleitung...",
|
||||||
"common.button.go-back": "Zurück",
|
"common.button.go-back": "Zurück",
|
||||||
"common.button.go-home": "Zur Startseite",
|
"common.button.go-home": "Zur Startseite",
|
||||||
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
"common.notify.copied": "Dein Link wurde in die Zwischenablage kopiert",
|
||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
|
"common.error.invalid-email": "Ungültige E-Mail-Adresse",
|
||||||
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
|
"common.error.too-short": "Muss mindestens {length} Zeichen enthalten",
|
||||||
"common.error.too-long": "Muss maximal {length} Zeichen enthalten",
|
"common.error.too-long": "Muss maximal {length} Zeichen enthalten",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Muss genau {length} Zeichen lang sein",
|
"common.error.exact-length": "Muss genau {length} Zeichen lang sein",
|
||||||
"common.error.invalid-number": "Muss eine Zahl sein",
|
"common.error.invalid-number": "Muss eine Zahl sein",
|
||||||
"common.error.field-required": "Dieses Feld ist erforderlich"
|
"common.error.field-required": "Dieses Feld ist erforderlich"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
"common.error.invalid-email": "Μη έγκυρη διεύθυνση e-mail",
|
||||||
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
|
"common.error.too-short": "Πρέπει να αποτελείται τουλάχιστον {length} χαρακτήρες",
|
||||||
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες",
|
"common.error.too-long": "Πρέπει να αποτελείται το πολύ από {length} χαρακτήρες",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
|
"common.error.exact-length": "Πρέπει να αποτελείται ακριβώς από {length} χαρακτήρες",
|
||||||
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
|
"common.error.invalid-number": "Πρέπει να είναι αριθμός",
|
||||||
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"
|
"common.error.field-required": "Αυτό το πεδίο είναι υποχρεωτικό"
|
||||||
|
|||||||
@@ -649,6 +649,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {length} characters",
|
"common.error.too-long": "Must be at most {length} characters",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Must be exactly {length} characters",
|
"common.error.exact-length": "Must be exactly {length} characters",
|
||||||
"common.error.invalid-number": "Must be a number",
|
"common.error.invalid-number": "Must be a number",
|
||||||
"common.error.field-required": "This field is required",
|
"common.error.field-required": "This field is required",
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Correo electrónico no válido",
|
"common.error.invalid-email": "Correo electrónico no válido",
|
||||||
"common.error.too-short": "Debe tener al menos {length} caracteres",
|
"common.error.too-short": "Debe tener al menos {length} caracteres",
|
||||||
"common.error.too-long": "Debe tener como máximo {length} caracteres",
|
"common.error.too-long": "Debe tener como máximo {length} caracteres",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Debe tener exactamente {length} caracteres",
|
"common.error.exact-length": "Debe tener exactamente {length} caracteres",
|
||||||
"common.error.invalid-number": "Debe ser un número",
|
"common.error.invalid-number": "Debe ser un número",
|
||||||
"common.error.field-required": "Este campo es requerido"
|
"common.error.field-required": "Este campo es requerido"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Virheellinen sähköpostiosoite",
|
"common.error.invalid-email": "Virheellinen sähköpostiosoite",
|
||||||
"common.error.too-short": "Täytyy olla vähintään {length} merkkiä",
|
"common.error.too-short": "Täytyy olla vähintään {length} merkkiä",
|
||||||
"common.error.too-long": "Täytyy olla enintään {length} merkkiä",
|
"common.error.too-long": "Täytyy olla enintään {length} merkkiä",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "On oltava tarkasti {length} merkkiä pitkä",
|
"common.error.exact-length": "On oltava tarkasti {length} merkkiä pitkä",
|
||||||
"common.error.invalid-number": "Pitää olla luku",
|
"common.error.invalid-number": "Pitää olla luku",
|
||||||
"common.error.field-required": "Tämä kenttä on pakollinen"
|
"common.error.field-required": "Tämä kenttä on pakollinen"
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ export default {
|
|||||||
"account.reverseShares.modal.simplified.description": "Simplifiez la tâche de la personne qui télécharge le fichier pour le partager avec vous. Ils ne pourront personnaliser que le nom et la description du partage.",
|
"account.reverseShares.modal.simplified.description": "Simplifiez la tâche de la personne qui télécharge le fichier pour le partager avec vous. Ils ne pourront personnaliser que le nom et la description du partage.",
|
||||||
"account.reverseShares.modal.public-access": "Accès public",
|
"account.reverseShares.modal.public-access": "Accès public",
|
||||||
"account.reverseShares.modal.public-access.description": "Rendre les partages créés avec ce partage inversé public. Si désactivé, seul vous et le créateur du partage pouvez le voir.",
|
"account.reverseShares.modal.public-access.description": "Rendre les partages créés avec ce partage inversé public. Si désactivé, seul vous et le créateur du partage pouvez le voir.",
|
||||||
"account.reverseShares.modal.max-use.label": "Nombre d'utilisation max",
|
"account.reverseShares.modal.max-use.label": "Nombre d'utilisations max",
|
||||||
"account.reverseShares.modal.max-use.description": "Le nombre maximal de fois que cette URL peut être utilisée pour créer un partage.",
|
"account.reverseShares.modal.max-use.description": "Le nombre maximal de fois que cette URL peut être utilisée pour créer un partage.",
|
||||||
"account.reverseShare.never-expires": "Ce partage inversé n'expirera jamais.",
|
"account.reverseShare.never-expires": "Ce partage inversé n'expirera jamais.",
|
||||||
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
|
"account.reverseShare.expires-on": "Ce partage inversé expirera le {expiration}.",
|
||||||
@@ -326,7 +326,7 @@ export default {
|
|||||||
"admin.config.email.invite-message": "Message d’une invitation",
|
"admin.config.email.invite-message": "Message d’une invitation",
|
||||||
"admin.config.email.invite-message.description": "Message qui est envoyé lorsqu'un administrateur invite un utilisateur. {url} sera remplacé avec l'URL d'invitation, {email} avec le courriel et {password} avec le mot de passe de l'utilisateur.",
|
"admin.config.email.invite-message.description": "Message qui est envoyé lorsqu'un administrateur invite un utilisateur. {url} sera remplacé avec l'URL d'invitation, {email} avec le courriel et {password} avec le mot de passe de l'utilisateur.",
|
||||||
"admin.config.share.allow-registration": "Autoriser les inscriptions",
|
"admin.config.share.allow-registration": "Autoriser les inscriptions",
|
||||||
"admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte.",
|
"admin.config.share.allow-registration.description": "Permet aux visiteurs de créer un compte",
|
||||||
"admin.config.share.allow-unauthenticated-shares": "Autoriser les partages anonymes",
|
"admin.config.share.allow-unauthenticated-shares": "Autoriser les partages anonymes",
|
||||||
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
|
"admin.config.share.allow-unauthenticated-shares.description": "Permet aux visiteurs de créer des partages",
|
||||||
"admin.config.share.max-expiration": "Échéance",
|
"admin.config.share.max-expiration": "Échéance",
|
||||||
@@ -381,7 +381,7 @@ export default {
|
|||||||
"admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft",
|
"admin.config.oauth.microsoft-client-secret": "Secret du client Microsoft",
|
||||||
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de l’application Microsoft OAuth",
|
"admin.config.oauth.microsoft-client-secret.description": "Le secret du client de l’application Microsoft OAuth",
|
||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord.",
|
"admin.config.oauth.discord-enabled.description": "Permettre la connexion via Discord",
|
||||||
"admin.config.oauth.discord-limited-guild": "ID de serveur restreint Discord",
|
"admin.config.oauth.discord-limited-guild": "ID de serveur restreint Discord",
|
||||||
"admin.config.oauth.discord-limited-guild.description": "Limiter la connexion aux utilisateurs sur un serveur spécifique. Laissez vide pour désactiver.",
|
"admin.config.oauth.discord-limited-guild.description": "Limiter la connexion aux utilisateurs sur un serveur spécifique. Laissez vide pour désactiver.",
|
||||||
"admin.config.oauth.discord-client-id": "ID du client Discord",
|
"admin.config.oauth.discord-client-id": "ID du client Discord",
|
||||||
@@ -392,8 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
|
"admin.config.oauth.oidc-enabled.description": "Permettre la connexion via OpenID",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID",
|
"admin.config.oauth.oidc-discovery-uri": "URI de découverte OpenID",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
"admin.config.oauth.oidc-discovery-uri.description": "L’URI de découverte de la connexion à l'application OpenID OAuth",
|
||||||
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
|
"admin.config.oauth.oidc-sign-out": "Déconnexion du fournisseur OpenID Connect",
|
||||||
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
|
"admin.config.oauth.oidc-sign-out.description": "Si activé, le bouton \"Déconnexion\" vous déconnectera également du fournisseur d'identité OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim": "Revendication du nom d’utilisateur OpenID",
|
"admin.config.oauth.oidc-username-claim": "Revendication du nom d’utilisateur OpenID",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
|
"admin.config.oauth.oidc-username-claim.description": "Le champ contenant la revendication du nom d’utilisateur dans le jeton OpenID Connect. Laissez vide si vous ne savez pas quoi indiquer.",
|
||||||
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
|
"admin.config.oauth.oidc-role-path": "Chemin vers les rôles dans le jeton OpenID Connect",
|
||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Adresse courriel invalide",
|
"common.error.invalid-email": "Adresse courriel invalide",
|
||||||
"common.error.too-short": "Doit comporter au moins {length} caractères",
|
"common.error.too-short": "Doit comporter au moins {length} caractères",
|
||||||
"common.error.too-long": "Doit comporter au plus {length} caractères",
|
"common.error.too-long": "Doit comporter au plus {length} caractères",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Doit comporter exactement {length} caractères",
|
"common.error.exact-length": "Doit comporter exactement {length} caractères",
|
||||||
"common.error.invalid-number": "Doit être un nombre",
|
"common.error.invalid-number": "Doit être un nombre",
|
||||||
"common.error.field-required": "Ce champ est obligatoire"
|
"common.error.field-required": "Ce champ est obligatoire"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Érvénytelen emailcím",
|
"common.error.invalid-email": "Érvénytelen emailcím",
|
||||||
"common.error.too-short": "Legalább {length} karakter kell",
|
"common.error.too-short": "Legalább {length} karakter kell",
|
||||||
"common.error.too-long": "Legfejlebb {length} karakter adható meg",
|
"common.error.too-long": "Legfejlebb {length} karakter adható meg",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Pontosan {length} karakter szükséges",
|
"common.error.exact-length": "Pontosan {length} karakter szükséges",
|
||||||
"common.error.invalid-number": "Számot kell megadnia",
|
"common.error.invalid-number": "Számot kell megadnia",
|
||||||
"common.error.field-required": "Ez egy kötelező mező"
|
"common.error.field-required": "Ez egy kötelező mező"
|
||||||
|
|||||||
@@ -392,8 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato",
|
"admin.config.oauth.oidc-enabled.description": "Se il login tramite OpenID Connect è abilitato",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
"admin.config.oauth.oidc-discovery-uri": "OpenID Connect Discovery URI",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "URI di scoperta dell'app OAuth di OpenID Connect",
|
||||||
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
|
"admin.config.oauth.oidc-sign-out": "Esci da OpenID Connect",
|
||||||
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
|
"admin.config.oauth.oidc-sign-out.description": "Se premuto, il pulsante “Disconnettersi” disconnetterà dal provider OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Richiesta nome utente OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
|
"admin.config.oauth.oidc-username-claim.description": "Nome utente nel token OpenID Connect. Lascialo vuoto se non sai cos'è questa configurazione.",
|
||||||
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Percorso verso i ruoli in OpenID Connect token",
|
||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Indirizzo email non valido",
|
"common.error.invalid-email": "Indirizzo email non valido",
|
||||||
"common.error.too-short": "Deve contenere almeno {length} caratteri",
|
"common.error.too-short": "Deve contenere almeno {length} caratteri",
|
||||||
"common.error.too-long": "Deve contenere al massimo {length} caratteri",
|
"common.error.too-long": "Deve contenere al massimo {length} caratteri",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Deve essere esattamente {length} caratteri",
|
"common.error.exact-length": "Deve essere esattamente {length} caratteri",
|
||||||
"common.error.invalid-number": "Deve essere un numero",
|
"common.error.invalid-number": "Deve essere un numero",
|
||||||
"common.error.field-required": "Questo campo è obbligatorio"
|
"common.error.field-required": "Questo campo è obbligatorio"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "無効なメールアドレス",
|
"common.error.invalid-email": "無効なメールアドレス",
|
||||||
"common.error.too-short": "最低{length} 文字である必要があります",
|
"common.error.too-short": "最低{length} 文字である必要があります",
|
||||||
"common.error.too-long": "最大{length} 文字である必要があります",
|
"common.error.too-long": "最大{length} 文字である必要があります",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "{length} 文字である必要があります",
|
"common.error.exact-length": "{length} 文字である必要があります",
|
||||||
"common.error.invalid-number": "数字でなければなりません",
|
"common.error.invalid-number": "数字でなければなりません",
|
||||||
"common.error.field-required": "これは必須項目です"
|
"common.error.field-required": "これは必須項目です"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "이메일 주소가 틀립니다",
|
"common.error.invalid-email": "이메일 주소가 틀립니다",
|
||||||
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
|
"common.error.too-short": "최소 {length} 자 이상이어야 합니다",
|
||||||
"common.error.too-long": "최대 {length} 자 까지 입력가능합니다.",
|
"common.error.too-long": "최대 {length} 자 까지 입력가능합니다.",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "{length} 자 이어야 합니다.",
|
"common.error.exact-length": "{length} 자 이어야 합니다.",
|
||||||
"common.error.invalid-number": "숫자만 가능합니다.",
|
"common.error.invalid-number": "숫자만 가능합니다.",
|
||||||
"common.error.field-required": "이 필드는 필수입니다"
|
"common.error.field-required": "이 필드는 필수입니다"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ongeldig e-mailadres",
|
"common.error.invalid-email": "Ongeldig e-mailadres",
|
||||||
"common.error.too-short": "Moet ten minste {length} tekens bevatten",
|
"common.error.too-short": "Moet ten minste {length} tekens bevatten",
|
||||||
"common.error.too-long": "Moet maximaal {length} tekens bevatten",
|
"common.error.too-long": "Moet maximaal {length} tekens bevatten",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Moet precies {length} tekens bevatten",
|
"common.error.exact-length": "Moet precies {length} tekens bevatten",
|
||||||
"common.error.invalid-number": "Moet een getal zijn",
|
"common.error.invalid-number": "Moet een getal zijn",
|
||||||
"common.error.field-required": "Dit veld is verplicht"
|
"common.error.field-required": "Dit veld is verplicht"
|
||||||
|
|||||||
@@ -392,8 +392,8 @@ export default {
|
|||||||
"admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
|
"admin.config.oauth.oidc-enabled.description": "Czy jest włączony login OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri": "Wykrywanie URI OpenID Connect",
|
||||||
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
"admin.config.oauth.oidc-discovery-uri.description": "Wykrywanie URI OAuth aplikacji OpenID Connect",
|
||||||
"admin.config.oauth.oidc-sign-out": "Sign out from OpenID Connect",
|
"admin.config.oauth.oidc-sign-out": "Wylogowanie z OpenID Connect",
|
||||||
"admin.config.oauth.oidc-sign-out.description": "Whether the “Sign out” button will sign out from the OpenID Connect provider",
|
"admin.config.oauth.oidc-sign-out.description": "Czy przycisk „Wyloguj się” spowoduje wylogowanie z dostawcy OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
|
"admin.config.oauth.oidc-username-claim": "Żądanie nazwy użytkownika OpenID Connect",
|
||||||
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
|
"admin.config.oauth.oidc-username-claim.description": "Żądanie nazwy użytkownika w tokenie identyfikatora OpenID Connect. Jeśli nie wiesz, czym jest ta konfiguracja, pozostaw pustą.",
|
||||||
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
"admin.config.oauth.oidc-role-path": "Path to roles in OpenID Connect token",
|
||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
|
"common.error.invalid-email": "Adres e-mail jest nieprawidłowy",
|
||||||
"common.error.too-short": "Musi mieć co najmniej {length} znaków",
|
"common.error.too-short": "Musi mieć co najmniej {length} znaków",
|
||||||
"common.error.too-long": "Musi mieć co najmniej {length} znaków",
|
"common.error.too-long": "Musi mieć co najmniej {length} znaków",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Musi mieć dokładnie {length} znaków",
|
"common.error.exact-length": "Musi mieć dokładnie {length} znaków",
|
||||||
"common.error.invalid-number": "Musi być liczbą",
|
"common.error.invalid-number": "Musi być liczbą",
|
||||||
"common.error.field-required": "To pole jest wymagane"
|
"common.error.field-required": "To pole jest wymagane"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Endereço de e-mail inválido",
|
"common.error.invalid-email": "Endereço de e-mail inválido",
|
||||||
"common.error.too-short": "Deve ter no mínimo {length} caracteres",
|
"common.error.too-short": "Deve ter no mínimo {length} caracteres",
|
||||||
"common.error.too-long": "Deve ter no máximo {length} caracteres",
|
"common.error.too-long": "Deve ter no máximo {length} caracteres",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Deve ter exatamente {length} caracteres",
|
"common.error.exact-length": "Deve ter exatamente {length} caracteres",
|
||||||
"common.error.invalid-number": "Tem que ser um número",
|
"common.error.invalid-number": "Tem que ser um número",
|
||||||
"common.error.field-required": "Este campo é obrigatório"
|
"common.error.field-required": "Este campo é obrigatório"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Недопустимый адрес электронной почты",
|
"common.error.invalid-email": "Недопустимый адрес электронной почты",
|
||||||
"common.error.too-short": "Должно быть не менее {length} символов",
|
"common.error.too-short": "Должно быть не менее {length} символов",
|
||||||
"common.error.too-long": "Должно быть не больше {length} символов",
|
"common.error.too-long": "Должно быть не больше {length} символов",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Должно быть ровно {length} символов",
|
"common.error.exact-length": "Должно быть ровно {length} символов",
|
||||||
"common.error.invalid-number": "Должно быть числом",
|
"common.error.invalid-number": "Должно быть числом",
|
||||||
"common.error.field-required": "Поле обязательно для заполнения"
|
"common.error.field-required": "Поле обязательно для заполнения"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Neveljaven e-poštni naslov",
|
"common.error.invalid-email": "Neveljaven e-poštni naslov",
|
||||||
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
|
"common.error.too-short": "Vsebovati mora vsaj {length} znakov",
|
||||||
"common.error.too-long": "Vsebuje lahko največ {length} znakov",
|
"common.error.too-long": "Vsebuje lahko največ {length} znakov",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Dolžina mora biti točno {length} znakov",
|
"common.error.exact-length": "Dolžina mora biti točno {length} znakov",
|
||||||
"common.error.invalid-number": "Mora biti številka",
|
"common.error.invalid-number": "Mora biti številka",
|
||||||
"common.error.field-required": "To polje je obvezno"
|
"common.error.field-required": "To polje je obvezno"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Неисправна адреса е-поште",
|
"common.error.invalid-email": "Неисправна адреса е-поште",
|
||||||
"common.error.too-short": "Мора да има најмање {length} знакова",
|
"common.error.too-short": "Мора да има најмање {length} знакова",
|
||||||
"common.error.too-long": "Мора да има највише {length} знакова",
|
"common.error.too-long": "Мора да има највише {length} знакова",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Мора да има тачно {length} знакова",
|
"common.error.exact-length": "Мора да има тачно {length} знакова",
|
||||||
"common.error.invalid-number": "Мора бити број",
|
"common.error.invalid-number": "Мора бити број",
|
||||||
"common.error.field-required": "Поље је обавезно"
|
"common.error.field-required": "Поље је обавезно"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Ogiltig e-postadress",
|
"common.error.invalid-email": "Ogiltig e-postadress",
|
||||||
"common.error.too-short": "Måste minst vara {length} tecken långt",
|
"common.error.too-short": "Måste minst vara {length} tecken långt",
|
||||||
"common.error.too-long": "Får högst innehålla {length} tecken",
|
"common.error.too-long": "Får högst innehålla {length} tecken",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Måste vara exakt {length} tecken långt",
|
"common.error.exact-length": "Måste vara exakt {length} tecken långt",
|
||||||
"common.error.invalid-number": "Måste vara ett tal",
|
"common.error.invalid-number": "Måste vara ett tal",
|
||||||
"common.error.field-required": "Obligatoriskt fält"
|
"common.error.field-required": "Obligatoriskt fält"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
"common.error.invalid-email": "ที่อยู่อีเมล์ไม่ถูกต้อง",
|
||||||
"common.error.too-short": "ต้องมีอย่างน้อย {length} ตัวอักษร",
|
"common.error.too-short": "ต้องมีอย่างน้อย {length} ตัวอักษร",
|
||||||
"common.error.too-long": "ต้องมีไม่เกิน {length} ตัวอักษร",
|
"common.error.too-long": "ต้องมีไม่เกิน {length} ตัวอักษร",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "ต้องมีความยาว {length} ตัวอักษร",
|
"common.error.exact-length": "ต้องมีความยาว {length} ตัวอักษร",
|
||||||
"common.error.invalid-number": "ต้องเป็นตัวเลข",
|
"common.error.invalid-number": "ต้องเป็นตัวเลข",
|
||||||
"common.error.field-required": "ต้องกรอกข้อมูลนี้"
|
"common.error.field-required": "ต้องกรอกข้อมูลนี้"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Geçersiz E-Posta adresi",
|
"common.error.invalid-email": "Geçersiz E-Posta adresi",
|
||||||
"common.error.too-short": "En azından {length} karakter olmalı",
|
"common.error.too-short": "En azından {length} karakter olmalı",
|
||||||
"common.error.too-long": "En fazla {length} karakter olmalı",
|
"common.error.too-long": "En fazla {length} karakter olmalı",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Tam tamına {length} karakter olmalı",
|
"common.error.exact-length": "Tam tamına {length} karakter olmalı",
|
||||||
"common.error.invalid-number": "Bir sayı olmalı",
|
"common.error.invalid-number": "Bir sayı olmalı",
|
||||||
"common.error.field-required": "Bu alan gerekli"
|
"common.error.field-required": "Bu alan gerekli"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
|
"common.error.invalid-email": "Неприпустима адреса електронної пошти",
|
||||||
"common.error.too-short": "Повинно бути не менше {length} символів",
|
"common.error.too-short": "Повинно бути не менше {length} символів",
|
||||||
"common.error.too-long": "Повинно бути не більше {length} символів",
|
"common.error.too-long": "Повинно бути не більше {length} символів",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Повинно бути рівно {length} символів",
|
"common.error.exact-length": "Повинно бути рівно {length} символів",
|
||||||
"common.error.invalid-number": "Повинно бути числом",
|
"common.error.invalid-number": "Повинно бути числом",
|
||||||
"common.error.field-required": "Поле обов'язкове для заповнення"
|
"common.error.field-required": "Поле обов'язкове для заповнення"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Invalid email address",
|
"common.error.invalid-email": "Invalid email address",
|
||||||
"common.error.too-short": "Must be at least {length} characters",
|
"common.error.too-short": "Must be at least {length} characters",
|
||||||
"common.error.too-long": "Must be at most {length} characters",
|
"common.error.too-long": "Must be at most {length} characters",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "Bằng {length} kí tự",
|
"common.error.exact-length": "Bằng {length} kí tự",
|
||||||
"common.error.invalid-number": "Phải là số",
|
"common.error.invalid-number": "Phải là số",
|
||||||
"common.error.field-required": "Trường bắt buộc"
|
"common.error.field-required": "Trường bắt buộc"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "邮件地址不可用",
|
"common.error.invalid-email": "邮件地址不可用",
|
||||||
"common.error.too-short": "必须不少于 {length} 个字符",
|
"common.error.too-short": "必须不少于 {length} 个字符",
|
||||||
"common.error.too-long": "必须不超过 {length} 个字符",
|
"common.error.too-long": "必须不超过 {length} 个字符",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "必须为 {length} 个字符",
|
"common.error.exact-length": "必须为 {length} 个字符",
|
||||||
"common.error.invalid-number": "必须为数字",
|
"common.error.invalid-number": "必须为数字",
|
||||||
"common.error.field-required": "必填项"
|
"common.error.field-required": "必填项"
|
||||||
|
|||||||
@@ -472,6 +472,8 @@ export default {
|
|||||||
"common.error.invalid-email": "Email地址不可用",
|
"common.error.invalid-email": "Email地址不可用",
|
||||||
"common.error.too-short": "必須不少於 {length} 個字元",
|
"common.error.too-short": "必須不少於 {length} 個字元",
|
||||||
"common.error.too-long": "必須不超過 {length} 個字元",
|
"common.error.too-long": "必須不超過 {length} 個字元",
|
||||||
|
"common.error.number-too-small": "Must be at least {min}",
|
||||||
|
"common.error.number-too-large": "Must be at most {max}",
|
||||||
"common.error.exact-length": "必須為 {length} 個字元",
|
"common.error.exact-length": "必須為 {length} 個字元",
|
||||||
"common.error.invalid-number": "必須為數字",
|
"common.error.invalid-number": "必須為數字",
|
||||||
"common.error.field-required": "必填"
|
"common.error.field-required": "必填"
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ const signUp = async (email: string, username: string, password: string) => {
|
|||||||
const signOut = async () => {
|
const signOut = async () => {
|
||||||
const response = await api.post("/auth/signOut");
|
const response = await api.post("/auth/signOut");
|
||||||
|
|
||||||
if (URL.canParse(response.data?.redirectURI)) window.location.href = response.data.redirectURI;
|
if (URL.canParse(response.data?.redirectURI))
|
||||||
|
window.location.href = response.data.redirectURI;
|
||||||
else window.location.reload();
|
else window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"conventional-changelog-cli": "^3.0.0"
|
"conventional-changelog-cli": "^3.0.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"format": "cd frontend && npm run format && cd ../backend && npm run format",
|
"format": "cd frontend && npm run format && cd ../backend && npm run format",
|
||||||
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint",
|
"lint": "cd frontend && npm run lint && cd ../backend && npm run lint",
|
||||||
|
|||||||
Reference in New Issue
Block a user