Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08079744a0 | ||
|
|
558dd2fb15 | ||
|
|
fe085b58a5 | ||
|
|
958b79d787 | ||
|
|
ede9c2a816 | ||
|
|
e195565630 | ||
|
|
520f9abcf7 | ||
|
|
bfbe8de98a | ||
|
|
d5cd3002a1 | ||
|
|
77a092a3cf | ||
|
|
613bae9033 | ||
|
|
2e692241c5 | ||
|
|
1e96011793 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,6 +7,9 @@ node_modules
|
|||||||
/frontend/.next/
|
/frontend/.next/
|
||||||
/frontend/out/
|
/frontend/out/
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn.lock
|
||||||
|
|
||||||
# build
|
# build
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
|
|||||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,3 +1,22 @@
|
|||||||
|
## [1.2.2](https://github.com/stonith404/pingvin-share/compare/v1.2.1...v1.2.2) (2024-10-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **admin:** change general config icon to gear ([#649](https://github.com/stonith404/pingvin-share/issues/649)) ([958b79d](https://github.com/stonith404/pingvin-share/commit/958b79d787585c367a693872fd105a326e6e8d38))
|
||||||
|
* environment variable `API_URL` can't be changed ([fe085b5](https://github.com/stonith404/pingvin-share/commit/fe085b58a5f3c0152df12957aa150c0876c2a074))
|
||||||
|
|
||||||
|
## [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.2",
|
||||||
"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.2",
|
||||||
"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.2",
|
||||||
"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
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,4 @@ module.exports = withPWA({
|
|||||||
output: "standalone", env: {
|
output: "standalone", env: {
|
||||||
VERSION: version,
|
VERSION: version,
|
||||||
},
|
},
|
||||||
serverRuntimeConfig: {
|
|
||||||
apiURL: process.env.API_URL ?? 'http://localhost:8080',
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|||||||
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.2",
|
||||||
"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.2",
|
||||||
"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.2",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
|
|||||||
@@ -18,11 +18,12 @@ import {
|
|||||||
TbSocial,
|
TbSocial,
|
||||||
TbSquare,
|
TbSquare,
|
||||||
TbBinaryTree,
|
TbBinaryTree,
|
||||||
|
TbSettings,
|
||||||
} from "react-icons/tb";
|
} from "react-icons/tb";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
|
|
||||||
const categories = [
|
const categories = [
|
||||||
{ name: "General", icon: <TbSquare /> },
|
{ name: "General", icon: <TbSettings /> },
|
||||||
{ name: "Email", icon: <TbMail /> },
|
{ name: "Email", icon: <TbMail /> },
|
||||||
{ name: "Share", icon: <TbShare /> },
|
{ name: "Share", icon: <TbShare /> },
|
||||||
{ name: "SMTP", icon: <TbAt /> },
|
{ name: "SMTP", icon: <TbAt /> },
|
||||||
|
|||||||
@@ -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": "Αυτό το πεδίο είναι υποχρεωτικό"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ export default {
|
|||||||
"navbar.upload": "Upload",
|
"navbar.upload": "Upload",
|
||||||
"navbar.signin": "Sign in",
|
"navbar.signin": "Sign in",
|
||||||
"navbar.home": "Home",
|
"navbar.home": "Home",
|
||||||
"navbar.signup": "Sign Up",
|
"navbar.signup": "Sign up",
|
||||||
|
|
||||||
"navbar.links.shares": "My shares",
|
"navbar.links.shares": "My shares",
|
||||||
"navbar.links.reverse": "Reverse shares",
|
"navbar.links.reverse": "Reverse shares",
|
||||||
@@ -22,10 +22,10 @@ export default {
|
|||||||
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
"home.bullet.a.description": "Host Pingvin Share on your own machine.",
|
||||||
"home.bullet.b.name": "Privacy",
|
"home.bullet.b.name": "Privacy",
|
||||||
"home.bullet.b.description":
|
"home.bullet.b.description":
|
||||||
"Your files are your files and should never get into the hands of third parties.",
|
"Your files are yours and will never be accessed by third parties.",
|
||||||
"home.bullet.c.name": "No annoying file size limit",
|
"home.bullet.c.name": "No annoying file size limit",
|
||||||
"home.bullet.c.description":
|
"home.bullet.c.description":
|
||||||
"Upload as big files as you want. Only your hard drive will be your limit.",
|
"Upload files as big as you want. Only your hard drive will be your limit.",
|
||||||
|
|
||||||
"home.button.start": "Get started",
|
"home.button.start": "Get started",
|
||||||
"home.button.source": "Source code",
|
"home.button.source": "Source code",
|
||||||
@@ -75,13 +75,13 @@ export default {
|
|||||||
"resetPassword.title": "Forgot your password?",
|
"resetPassword.title": "Forgot your password?",
|
||||||
"resetPassword.description": "Enter your email to reset your password.",
|
"resetPassword.description": "Enter your email to reset your password.",
|
||||||
"resetPassword.notify.success":
|
"resetPassword.notify.success":
|
||||||
"A message with a link to reset your password has been sent if the email exists.",
|
"A message with a link to reset your password has been sent if the provided email exists.",
|
||||||
"resetPassword.button.back": "Back to sign in page",
|
"resetPassword.button.back": "Back to sign in page",
|
||||||
"resetPassword.text.resetPassword": "Reset password",
|
"resetPassword.text.resetPassword": "Reset password",
|
||||||
"resetPassword.text.enterNewPassword": "Enter your new password",
|
"resetPassword.text.enterNewPassword": "Enter your new password",
|
||||||
"resetPassword.input.password": "New password",
|
"resetPassword.input.password": "New password",
|
||||||
"resetPassword.notify.passwordReset":
|
"resetPassword.notify.passwordReset":
|
||||||
"Your password has been reset successfully.",
|
"Your password has been successfully reset.",
|
||||||
|
|
||||||
// /account
|
// /account
|
||||||
"account.title": "My account",
|
"account.title": "My account",
|
||||||
@@ -95,7 +95,7 @@ export default {
|
|||||||
"account.card.password.old": "Old password",
|
"account.card.password.old": "Old password",
|
||||||
"account.card.password.new": "New password",
|
"account.card.password.new": "New password",
|
||||||
"account.card.password.noPasswordSet":
|
"account.card.password.noPasswordSet":
|
||||||
"You don't have a password set. If you want to sign in with email and password you need to set a password.",
|
"You do not have a password set. To sign in using your email and password, you need to create a password.",
|
||||||
"account.notify.password.success": "Password changed successfully",
|
"account.notify.password.success": "Password changed successfully",
|
||||||
|
|
||||||
"account.card.oauth.title": "Social login",
|
"account.card.oauth.title": "Social login",
|
||||||
@@ -109,7 +109,7 @@ export default {
|
|||||||
"account.card.oauth.unlinked": "Unlinked",
|
"account.card.oauth.unlinked": "Unlinked",
|
||||||
"account.modal.unlink.title": "Unlink account",
|
"account.modal.unlink.title": "Unlink account",
|
||||||
"account.modal.unlink.description":
|
"account.modal.unlink.description":
|
||||||
"Unlinking your social accounts may cause you to lose your account if you don't remember your username and password.",
|
"Unlinking your social accounts may cause you to lose your account if you don't remember your login credentials",
|
||||||
"account.notify.oauth.unlinked.success": "Unlinked successfully",
|
"account.notify.oauth.unlinked.success": "Unlinked successfully",
|
||||||
|
|
||||||
"account.card.security.title": "Security",
|
"account.card.security.title": "Security",
|
||||||
@@ -155,14 +155,14 @@ export default {
|
|||||||
"account.shares.table.name": "Name",
|
"account.shares.table.name": "Name",
|
||||||
"account.shares.table.description": "Description",
|
"account.shares.table.description": "Description",
|
||||||
"account.shares.table.visitors": "Visitors",
|
"account.shares.table.visitors": "Visitors",
|
||||||
"account.shares.table.expiresAt": "Expires at",
|
"account.shares.table.expiresAt": "Expires on",
|
||||||
"account.shares.table.createdAt": "Created at",
|
"account.shares.table.createdAt": "Created on",
|
||||||
"account.shares.table.size": "Size",
|
"account.shares.table.size": "Size",
|
||||||
|
|
||||||
"account.shares.modal.share-informations": "Share informations",
|
"account.shares.modal.share-informations": "Share informations",
|
||||||
"account.shares.modal.share-link": "Share link",
|
"account.shares.modal.share-link": "Share link",
|
||||||
|
|
||||||
"account.shares.modal.delete.title": "Delete share {share}",
|
"account.shares.modal.delete.title": "Delete share: {share}",
|
||||||
"account.shares.modal.delete.description":
|
"account.shares.modal.delete.description":
|
||||||
"Do you really want to delete this share?",
|
"Do you really want to delete this share?",
|
||||||
|
|
||||||
@@ -195,17 +195,17 @@ export default {
|
|||||||
|
|
||||||
"account.reverseShares.modal.max-size.label": "Max share size",
|
"account.reverseShares.modal.max-size.label": "Max share size",
|
||||||
|
|
||||||
"account.reverseShares.modal.send-email": "Send email notification",
|
"account.reverseShares.modal.send-email": "Send email notifications",
|
||||||
"account.reverseShares.modal.send-email.description":
|
"account.reverseShares.modal.send-email.description":
|
||||||
"Send an email notification when a share is created with this reverse share link.",
|
"Sends you an email notification when a share is created with this reverse share link.",
|
||||||
|
|
||||||
"account.reverseShares.modal.simplified": "Simple mode",
|
"account.reverseShares.modal.simplified": "Simple mode",
|
||||||
"account.reverseShares.modal.simplified.description":
|
"account.reverseShares.modal.simplified.description":
|
||||||
"Make it easy for the person uploading the file to share it with you. They will be able to customize only the name and description of the share.",
|
"Make it easy for the person uploading the file to share it with you. They will only be able to customize the name and description of the share.",
|
||||||
|
|
||||||
"account.reverseShares.modal.public-access": "Public access",
|
"account.reverseShares.modal.public-access": "Public access",
|
||||||
"account.reverseShares.modal.public-access.description":
|
"account.reverseShares.modal.public-access.description":
|
||||||
"Make the created shares with this reverse share public. If disabled, only you and the creator of the share can view it.",
|
"Make the shares created with this reverse share public. If disabled, only you and the share creator will have access to view it.",
|
||||||
|
|
||||||
"account.reverseShares.modal.max-use.label": "Max uses",
|
"account.reverseShares.modal.max-use.label": "Max uses",
|
||||||
"account.reverseShares.modal.max-use.description":
|
"account.reverseShares.modal.max-use.description":
|
||||||
@@ -244,7 +244,7 @@ export default {
|
|||||||
"admin.users.table.email": "Email",
|
"admin.users.table.email": "Email",
|
||||||
"admin.users.table.admin": "Admin",
|
"admin.users.table.admin": "Admin",
|
||||||
|
|
||||||
"admin.users.edit.update.title": "Update user {username}",
|
"admin.users.edit.update.title": "Edit user: {username}",
|
||||||
"admin.users.edit.update.admin-privileges": "Admin privileges",
|
"admin.users.edit.update.admin-privileges": "Admin privileges",
|
||||||
"admin.users.edit.update.change-password.title": "Change password",
|
"admin.users.edit.update.change-password.title": "Change password",
|
||||||
"admin.users.edit.update.change-password.field": "New password",
|
"admin.users.edit.update.change-password.field": "New password",
|
||||||
@@ -252,7 +252,7 @@ export default {
|
|||||||
"admin.users.edit.update.notify.password.success":
|
"admin.users.edit.update.notify.password.success":
|
||||||
"Password changed successfully",
|
"Password changed successfully",
|
||||||
|
|
||||||
"admin.users.edit.delete.title": "Delete user {username}",
|
"admin.users.edit.delete.title": "Delete user: {username} ?",
|
||||||
"admin.users.edit.delete.description":
|
"admin.users.edit.delete.description":
|
||||||
"Do you really want to delete this user and all his shares?",
|
"Do you really want to delete this user and all his shares?",
|
||||||
|
|
||||||
@@ -275,9 +275,9 @@ export default {
|
|||||||
"admin.shares.table.id": "Share ID",
|
"admin.shares.table.id": "Share ID",
|
||||||
"admin.shares.table.username": "Creator",
|
"admin.shares.table.username": "Creator",
|
||||||
"admin.shares.table.visitors": "Visitors",
|
"admin.shares.table.visitors": "Visitors",
|
||||||
"admin.shares.table.expires": "Expires At",
|
"admin.shares.table.expires": "Expires on",
|
||||||
|
|
||||||
"admin.shares.edit.delete.title": "Delete share {id}",
|
"admin.shares.edit.delete.title": "Delete share: {id}",
|
||||||
"admin.shares.edit.delete.description":
|
"admin.shares.edit.delete.description":
|
||||||
"Do you really want to delete this share?",
|
"Do you really want to delete this share?",
|
||||||
|
|
||||||
@@ -293,7 +293,7 @@ export default {
|
|||||||
// Dropzone.tsx
|
// Dropzone.tsx
|
||||||
"upload.dropzone.title": "Upload files",
|
"upload.dropzone.title": "Upload files",
|
||||||
"upload.dropzone.description":
|
"upload.dropzone.description":
|
||||||
"Drag'n'drop files here to start your share. We can accept only files that are less than {maxSize} in total.",
|
"Drag'n'drop files here to start your share. We only accept files up to {maxSize} in total.",
|
||||||
"upload.dropzone.notify.file-too-big":
|
"upload.dropzone.notify.file-too-big":
|
||||||
"Your files exceed the maximum share size of {maxSize}.",
|
"Your files exceed the maximum share size of {maxSize}.",
|
||||||
|
|
||||||
@@ -311,9 +311,9 @@ export default {
|
|||||||
"You will be unable to delete your share manually and view the visitor count.",
|
"You will be unable to delete your share manually and view the visitor count.",
|
||||||
|
|
||||||
"upload.modal.expires.never": "never",
|
"upload.modal.expires.never": "never",
|
||||||
"upload.modal.expires.never-long": "Never Expires",
|
"upload.modal.expires.never-long": "Permanent share",
|
||||||
"upload.modal.expires.error.too-long":
|
"upload.modal.expires.error.too-long":
|
||||||
"Expiration exceeds maximum expiration date of {max}.",
|
"Expiration date exceeds the maximum of {max}.",
|
||||||
|
|
||||||
"upload.modal.link.label": "Link",
|
"upload.modal.link.label": "Link",
|
||||||
"upload.modal.expires.label": "Expiration",
|
"upload.modal.expires.label": "Expiration",
|
||||||
@@ -350,7 +350,8 @@ export default {
|
|||||||
"upload.modal.completed.expires-on":
|
"upload.modal.completed.expires-on":
|
||||||
"This share will expire on {expiration}.",
|
"This share will expire on {expiration}.",
|
||||||
"upload.modal.completed.share-ready": "Share ready",
|
"upload.modal.completed.share-ready": "Share ready",
|
||||||
"upload.modal.completed.notified-reverse-share-creator": "We have notified the creator of the reverse share. You can also manually share this link with them through other means.",
|
"upload.modal.completed.notified-reverse-share-creator":
|
||||||
|
"We have notified the creator of the reverse share. You can also manually share this link with them through other means.",
|
||||||
|
|
||||||
// END /upload
|
// END /upload
|
||||||
|
|
||||||
@@ -365,17 +366,18 @@ export default {
|
|||||||
"share.error.not-found.description":
|
"share.error.not-found.description":
|
||||||
"The share you're looking for doesn't exist.",
|
"The share you're looking for doesn't exist.",
|
||||||
"share.error.access-denied.title": "Private share",
|
"share.error.access-denied.title": "Private share",
|
||||||
"share.error.access-denied.description": "The current account does not have permission to access this share",
|
"share.error.access-denied.description":
|
||||||
|
"The current account does not have permission to access this share",
|
||||||
|
|
||||||
"share.modal.password.title": "Password required",
|
"share.modal.password.title": "Password required",
|
||||||
"share.modal.password.description":
|
"share.modal.password.description":
|
||||||
"To access this share please enter the password for the share.",
|
"Please enter the password to acces this share.",
|
||||||
"share.modal.password": "Password",
|
"share.modal.password": "Password",
|
||||||
"share.modal.error.invalid-password": "Invalid password",
|
"share.modal.error.invalid-password": "Invalid password",
|
||||||
|
|
||||||
"share.button.download-all": "Download all",
|
"share.button.download-all": "Download all",
|
||||||
"share.notify.download-all-preparing":
|
"share.notify.download-all-preparing":
|
||||||
"The share is preparing. Try again in a few minutes.",
|
"The share is being prepared. Please try again in a few minutes.",
|
||||||
|
|
||||||
"share.modal.file-link": "File link",
|
"share.modal.file-link": "File link",
|
||||||
"share.table.name": "Name",
|
"share.table.name": "Name",
|
||||||
@@ -383,7 +385,7 @@ export default {
|
|||||||
|
|
||||||
"share.modal.file-preview.error.not-supported.title": "Preview not supported",
|
"share.modal.file-preview.error.not-supported.title": "Preview not supported",
|
||||||
"share.modal.file-preview.error.not-supported.description":
|
"share.modal.file-preview.error.not-supported.description":
|
||||||
"A preview for this file type is unsupported. Please download the file to view it.",
|
"Previews are not supported for this type of files. Please download the file to view it.",
|
||||||
|
|
||||||
// END /share/[id]
|
// END /share/[id]
|
||||||
|
|
||||||
@@ -420,33 +422,33 @@ export default {
|
|||||||
"admin.config.general.logo.placeholder": "Pick image",
|
"admin.config.general.logo.placeholder": "Pick image",
|
||||||
|
|
||||||
"admin.config.email.enable-share-email-recipients":
|
"admin.config.email.enable-share-email-recipients":
|
||||||
"Enable share email recipients",
|
"Enable email recipient sharing",
|
||||||
"admin.config.email.enable-share-email-recipients.description":
|
"admin.config.email.enable-share-email-recipients.description":
|
||||||
"Whether to allow emails to share recipients. Only enable this if you have enabled SMTP.",
|
"Whether to allow email sharing with recipients. Only enable this if SMTP is activated.",
|
||||||
"admin.config.email.share-recipients-subject": "Share recipients subject",
|
"admin.config.email.share-recipients-subject": "Share recipients subject",
|
||||||
"admin.config.email.share-recipients-subject.description":
|
"admin.config.email.share-recipients-subject.description":
|
||||||
"Subject of the email which gets sent to the share recipients.",
|
"Subject of the email which gets sent to the share recipients.",
|
||||||
"admin.config.email.share-recipients-message": "Share recipients message",
|
"admin.config.email.share-recipients-message": "Share recipients message",
|
||||||
"admin.config.email.share-recipients-message.description":
|
"admin.config.email.share-recipients-message.description":
|
||||||
"Message which gets sent to the share recipients. Available variables:\n {creator} - The username of the creator of the share\n {shareUrl} - The URL of the share\n {desc} - The description of the share\n {expires} - The expiration date of the share\n The variables will be replaced with the actual value.",
|
"Message which gets sent to the share recipients. Available variables:\n {creator} - The username of the creator of the share\n {shareUrl} - The URL of the share\n {desc} - The description of the share\n {expires} - The expiration date of the share\n These variables will be replaced with the actual value.",
|
||||||
"admin.config.email.reverse-share-subject": "Reverse share subject",
|
"admin.config.email.reverse-share-subject": "Reverse share subject",
|
||||||
"admin.config.email.reverse-share-subject.description":
|
"admin.config.email.reverse-share-subject.description":
|
||||||
"Subject of the email which gets sent when someone created a share with your reverse share link.",
|
"Subject of the sent email when someone created a share with your reverse share link.",
|
||||||
"admin.config.email.reverse-share-message": "Reverse share message",
|
"admin.config.email.reverse-share-message": "Reverse share message",
|
||||||
"admin.config.email.reverse-share-message.description":
|
"admin.config.email.reverse-share-message.description":
|
||||||
"Message which gets sent when someone created a share with your reverse share link. {shareUrl} will be replaced with the creator's name and the share URL.",
|
"Message which gets sent when someone created a share with your reverse share link. {shareUrl} will be replaced with the creator's name and the share URL.",
|
||||||
"admin.config.email.reset-password-subject": "Reset password subject",
|
"admin.config.email.reset-password-subject": "Reset password subject",
|
||||||
"admin.config.email.reset-password-subject.description":
|
"admin.config.email.reset-password-subject.description":
|
||||||
"Subject of the email which gets sent when a user requests a password reset.",
|
"Subject of the sent email when a user requests a password reset.",
|
||||||
"admin.config.email.reset-password-message": "Reset password message",
|
"admin.config.email.reset-password-message": "Reset password message",
|
||||||
"admin.config.email.reset-password-message.description":
|
"admin.config.email.reset-password-message.description":
|
||||||
"Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.",
|
"Message which gets sent when a user requests a password reset. {url} will be replaced with the reset password URL.",
|
||||||
"admin.config.email.invite-subject": "Invite subject",
|
"admin.config.email.invite-subject": "Invite subject",
|
||||||
"admin.config.email.invite-subject.description":
|
"admin.config.email.invite-subject.description":
|
||||||
"Subject of the email which gets sent when an admin invites a user.",
|
"Subject of the sent email when an admin invites a user.",
|
||||||
"admin.config.email.invite-message": "Invite message",
|
"admin.config.email.invite-message": "Invite message",
|
||||||
"admin.config.email.invite-message.description":
|
"admin.config.email.invite-message.description":
|
||||||
"Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the password of the user.",
|
"Message which gets sent when an admin invites a user. {url} will be replaced with the invite URL, {email} with the email and {password} with the users password.",
|
||||||
|
|
||||||
"admin.config.share.allow-registration": "Allow registration",
|
"admin.config.share.allow-registration": "Allow registration",
|
||||||
"admin.config.share.allow-registration.description":
|
"admin.config.share.allow-registration.description":
|
||||||
@@ -465,12 +467,12 @@ export default {
|
|||||||
"Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
"Adjust the level to balance between file size and compression speed. Valid values range from 0 to 9, with 0 being no compression and 9 being maximum compression. ",
|
||||||
"admin.config.share.chunk-size": "Chunk size",
|
"admin.config.share.chunk-size": "Chunk size",
|
||||||
"admin.config.share.chunk-size.description":
|
"admin.config.share.chunk-size.description":
|
||||||
"Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks speed up uploads for stable connections.",
|
"Adjust the chunk size (in bytes) for your uploads to balance efficiency and reliability according to your internet connection. Smaller chunks can enhance success rates for unstable connections, while larger chunks make uploads faster for stable connections.",
|
||||||
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
"admin.config.share.auto-open-share-modal": "Auto open create share modal",
|
||||||
"admin.config.share.auto-open-share-modal.description":
|
"admin.config.share.auto-open-share-modal.description":
|
||||||
"The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
"The share creation modal automatically appears when a user selects files, eliminating the need to manually click the button.",
|
||||||
|
|
||||||
"admin.config.smtp.enabled": "Enabled",
|
"admin.config.smtp.enabled": "Enable",
|
||||||
"admin.config.smtp.enabled.description":
|
"admin.config.smtp.enabled.description":
|
||||||
"Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
"Whether SMTP is enabled. Only set this to true if you entered the host, port, email, user and password of your SMTP server.",
|
||||||
"admin.config.smtp.host": "Host",
|
"admin.config.smtp.host": "Host",
|
||||||
@@ -479,7 +481,7 @@ export default {
|
|||||||
"admin.config.smtp.port.description": "Port of the SMTP server",
|
"admin.config.smtp.port.description": "Port of the SMTP server",
|
||||||
"admin.config.smtp.email": "Email",
|
"admin.config.smtp.email": "Email",
|
||||||
"admin.config.smtp.email.description":
|
"admin.config.smtp.email.description":
|
||||||
"Email address which the emails get sent from",
|
"Email address from wich the emails get sent",
|
||||||
"admin.config.smtp.username": "Username",
|
"admin.config.smtp.username": "Username",
|
||||||
"admin.config.smtp.username.description": "Username of the SMTP server",
|
"admin.config.smtp.username.description": "Username of the SMTP server",
|
||||||
"admin.config.smtp.password": "Password",
|
"admin.config.smtp.password": "Password",
|
||||||
@@ -532,6 +534,9 @@ export default {
|
|||||||
"admin.config.oauth.discord-enabled": "Discord",
|
"admin.config.oauth.discord-enabled": "Discord",
|
||||||
"admin.config.oauth.discord-enabled.description":
|
"admin.config.oauth.discord-enabled.description":
|
||||||
"Whether Discord login is enabled",
|
"Whether Discord login is enabled",
|
||||||
|
"admin.config.oauth.discord-limited-users": "Discord limited users",
|
||||||
|
"admin.config.oauth.discord-limited-users.description":
|
||||||
|
"Limit signing in to specific users by their Discord ID. Leave it blank to disable.",
|
||||||
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
|
"admin.config.oauth.discord-limited-guild": "Discord limited server ID",
|
||||||
"admin.config.oauth.discord-limited-guild.description":
|
"admin.config.oauth.discord-limited-guild.description":
|
||||||
"Limit signing in to users in a specific server. Leave it blank to disable.",
|
"Limit signing in to users in a specific server. Leave it blank to disable.",
|
||||||
@@ -558,11 +563,13 @@ export default {
|
|||||||
"Must be a valid JMES path referencing an array of roles. " +
|
"Must be a valid JMES path referencing an array of roles. " +
|
||||||
"Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " +
|
"Managing access rights using OpenID Connect roles is only recommended if no other identity provider is configured and password login is disabled. " +
|
||||||
"Leave it blank if you don't know what this config is.",
|
"Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-general-access": "OpenID Connect role for general access",
|
"admin.config.oauth.oidc-role-general-access":
|
||||||
|
"OpenID Connect role for general access",
|
||||||
"admin.config.oauth.oidc-role-general-access.description":
|
"admin.config.oauth.oidc-role-general-access.description":
|
||||||
"Role required for general access. Must be present in a user’s roles for them to log in. " +
|
"Role required for general access. Must be present in a user’s roles for them to log in. " +
|
||||||
"Leave it blank if you don't know what this config is.",
|
"Leave it blank if you don't know what this config is.",
|
||||||
"admin.config.oauth.oidc-role-admin-access": "OpenID Connect role for admin access",
|
"admin.config.oauth.oidc-role-admin-access":
|
||||||
|
"OpenID Connect role for admin access",
|
||||||
"admin.config.oauth.oidc-role-admin-access.description":
|
"admin.config.oauth.oidc-role-admin-access.description":
|
||||||
"Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " +
|
"Role required for administrative access. Must be present in a user’s roles for them to access the admin panel. " +
|
||||||
"Leave it blank if you don't know what this config is.",
|
"Leave it blank if you don't know what this config is.",
|
||||||
@@ -574,24 +581,32 @@ export default {
|
|||||||
"Client secret of the OpenID Connect OAuth app",
|
"Client secret of the OpenID Connect OAuth app",
|
||||||
|
|
||||||
"admin.config.category.ldap": "LDAP",
|
"admin.config.category.ldap": "LDAP",
|
||||||
"admin.config.ldap.enabled": "Enabled LDAP",
|
"admin.config.ldap.enabled": "Enable LDAP",
|
||||||
"admin.config.ldap.enabled.description": "Use LDAP authentication for user login",
|
"admin.config.ldap.enabled.description":
|
||||||
|
"Use LDAP authentication for user login",
|
||||||
"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 of the LDAP server",
|
||||||
"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 used to perform the user search",
|
||||||
"admin.config.ldap.bind-password": "Bind password",
|
"admin.config.ldap.bind-password": "Bind password",
|
||||||
"admin.config.ldap.bind-password.description": "Password for the user search user",
|
"admin.config.ldap.bind-password.description":
|
||||||
|
"Password used to perform the user search",
|
||||||
"admin.config.ldap.search-base": "User base",
|
"admin.config.ldap.search-base": "User base",
|
||||||
"admin.config.ldap.search-base.description": "Base location, where the user search will be performed",
|
"admin.config.ldap.search-base.description":
|
||||||
|
"Base location, where the user search will be performed",
|
||||||
"admin.config.ldap.search-query": "User query",
|
"admin.config.ldap.search-query": "User query",
|
||||||
"admin.config.ldap.search-query.description": "The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
"admin.config.ldap.search-query.description":
|
||||||
|
"The user query will be used to search the 'User base' for the LDAP user. %username% can be used as the placeholder for the user given input.",
|
||||||
"admin.config.ldap.admin-groups": "Admin group",
|
"admin.config.ldap.admin-groups": "Admin group",
|
||||||
"admin.config.ldap.admin-groups.description": "Group required for administrative access.",
|
"admin.config.ldap.admin-groups.description":
|
||||||
|
"Group required for administrative access.",
|
||||||
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
"admin.config.ldap.field-name-member-of": "User groups attribute name",
|
||||||
"admin.config.ldap.field-name-member-of.description": "LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
"admin.config.ldap.field-name-member-of.description":
|
||||||
|
"LDAP attribute name for the groups, an user is a member of. This is used when checking for the admin group.",
|
||||||
"admin.config.ldap.field-name-email": "User email attribute name",
|
"admin.config.ldap.field-name-email": "User email attribute name",
|
||||||
"admin.config.ldap.field-name-email.description": "LDAP attribute name for the email of an user.",
|
"admin.config.ldap.field-name-email.description":
|
||||||
|
"LDAP attribute name for the email of an user.",
|
||||||
|
|
||||||
// 404
|
// 404
|
||||||
"404.description": "Oops this page doesn't exist.",
|
"404.description": "Oops this page doesn't exist.",
|
||||||
@@ -611,13 +626,13 @@ export default {
|
|||||||
"error.msg.no_email": "Can't get email address from this {0} account.",
|
"error.msg.no_email": "Can't get email address from this {0} account.",
|
||||||
"error.msg.already_linked":
|
"error.msg.already_linked":
|
||||||
"This {0} account is already linked to another account.",
|
"This {0} account is already linked to another account.",
|
||||||
"error.msg.not_linked": "This {0} account haven't linked to any account yet.",
|
"error.msg.not_linked":
|
||||||
|
"This {0} account hasn't been linked to any account yet.",
|
||||||
"error.msg.unverified_account":
|
"error.msg.unverified_account":
|
||||||
"This {0} account is unverified, please try again after verification.",
|
"This {0} account is unverified, please try again after verification.",
|
||||||
"error.msg.user_not_allowed":
|
"error.msg.user_not_allowed": "You are not allowed to sign in.",
|
||||||
"You are not allowed to sign in.",
|
|
||||||
"error.msg.cannot_get_user_info":
|
"error.msg.cannot_get_user_info":
|
||||||
"Can not get your user info from this {0} account.",
|
"Cannot get your user info from this {0} account.",
|
||||||
"error.param.provider_github": "GitHub",
|
"error.param.provider_github": "GitHub",
|
||||||
"error.param.provider_google": "Google",
|
"error.param.provider_google": "Google",
|
||||||
"error.param.provider_microsoft": "Microsoft",
|
"error.param.provider_microsoft": "Microsoft",
|
||||||
@@ -636,7 +651,7 @@ export default {
|
|||||||
"common.button.generate": "Generate",
|
"common.button.generate": "Generate",
|
||||||
"common.button.done": "Done",
|
"common.button.done": "Done",
|
||||||
"common.text.link": "Link",
|
"common.text.link": "Link",
|
||||||
"common.text.navigate-to-link": "Go to the link",
|
"common.text.navigate-to-link": "Visit link",
|
||||||
"common.text.or": "or",
|
"common.text.or": "or",
|
||||||
"common.text.redirecting": "Redirecting...",
|
"common.text.redirecting": "Redirecting...",
|
||||||
"common.button.go-back": "Go back",
|
"common.button.go-back": "Go back",
|
||||||
@@ -649,6 +664,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": "必填"
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ import { ModalsProvider } from "@mantine/modals";
|
|||||||
import { Notifications } from "@mantine/notifications";
|
import { Notifications } from "@mantine/notifications";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { getCookie, setCookie } from "cookies-next";
|
import { getCookie, setCookie } from "cookies-next";
|
||||||
|
import moment from "moment";
|
||||||
|
import "moment/min/locales";
|
||||||
import { GetServerSidePropsContext } from "next";
|
import { GetServerSidePropsContext } from "next";
|
||||||
import type { AppProps } from "next/app";
|
import type { AppProps } from "next/app";
|
||||||
import getConfig from "next/config";
|
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
@@ -29,8 +30,6 @@ import Config from "../types/config.type";
|
|||||||
import { CurrentUser } from "../types/user.type";
|
import { CurrentUser } from "../types/user.type";
|
||||||
import i18nUtil from "../utils/i18n.util";
|
import i18nUtil from "../utils/i18n.util";
|
||||||
import userPreferences from "../utils/userPreferences.util";
|
import userPreferences from "../utils/userPreferences.util";
|
||||||
import "moment/min/locales";
|
|
||||||
import moment from "moment";
|
|
||||||
|
|
||||||
const excludeDefaultLayoutRoutes = ["/admin/config/[category]"];
|
const excludeDefaultLayoutRoutes = ["/admin/config/[category]"];
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ function App({ Component, pageProps }: AppProps) {
|
|||||||
const [route, setRoute] = useState<string>(pageProps.route);
|
const [route, setRoute] = useState<string>(pageProps.route);
|
||||||
|
|
||||||
const [configVariables, setConfigVariables] = useState<Config[]>(
|
const [configVariables, setConfigVariables] = useState<Config[]>(
|
||||||
pageProps.configVariables,
|
pageProps.configVariables
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -54,7 +53,7 @@ function App({ Component, pageProps }: AppProps) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const interval = setInterval(
|
const interval = setInterval(
|
||||||
async () => await authService.refreshAccessToken(),
|
async () => await authService.refreshAccessToken(),
|
||||||
2 * 60 * 1000, // 2 minutes
|
2 * 60 * 1000 // 2 minutes
|
||||||
);
|
);
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
@@ -154,8 +153,6 @@ function App({ Component, pageProps }: AppProps) {
|
|||||||
// Fetch user and config variables on server side when the first request is made
|
// Fetch user and config variables on server side when the first request is made
|
||||||
// These will get passed as a page prop to the App component and stored in the contexts
|
// These will get passed as a page prop to the App component and stored in the contexts
|
||||||
App.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {
|
App.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {
|
||||||
const { apiURL } = getConfig().serverRuntimeConfig;
|
|
||||||
|
|
||||||
let pageProps: {
|
let pageProps: {
|
||||||
user?: CurrentUser;
|
user?: CurrentUser;
|
||||||
configVariables?: Config[];
|
configVariables?: Config[];
|
||||||
@@ -169,6 +166,7 @@ App.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (ctx.req) {
|
if (ctx.req) {
|
||||||
|
const apiURL = process.env.API_URL || "http://localhost:8080";
|
||||||
const cookieHeader = ctx.req.headers.cookie;
|
const cookieHeader = ctx.req.headers.cookie;
|
||||||
|
|
||||||
pageProps.user = await axios(`${apiURL}/api/users/me`, {
|
pageProps.user = await axios(`${apiURL}/api/users/me`, {
|
||||||
@@ -182,7 +180,7 @@ App.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {
|
|||||||
pageProps.route = ctx.req.url;
|
pageProps.route = ctx.req.url;
|
||||||
|
|
||||||
const requestLanguage = i18nUtil.getLanguageFromAcceptHeader(
|
const requestLanguage = i18nUtil.getLanguageFromAcceptHeader(
|
||||||
ctx.req.headers["accept-language"],
|
ctx.req.headers["accept-language"]
|
||||||
);
|
);
|
||||||
|
|
||||||
pageProps.language = ctx.req.cookies["language"] ?? requestLanguage;
|
pageProps.language = ctx.req.cookies["language"] ?? requestLanguage;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { NextApiRequest, NextApiResponse } from "next";
|
import { NextApiRequest, NextApiResponse } from "next";
|
||||||
import httpProxyMiddleware from "next-http-proxy-middleware";
|
import httpProxyMiddleware from "next-http-proxy-middleware";
|
||||||
import getConfig from "next/config";
|
|
||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
api: {
|
api: {
|
||||||
@@ -9,7 +8,7 @@ export const config = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const { apiURL } = getConfig().serverRuntimeConfig;
|
const apiURL = process.env.API_URL || "http://localhost:8080";
|
||||||
|
|
||||||
// A proxy to the API server only used in development.
|
// A proxy to the API server only used in development.
|
||||||
// In production this route gets overridden by Caddy.
|
// In production this route gets overridden by Caddy.
|
||||||
|
|||||||
@@ -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.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pingvin-share",
|
"name": "pingvin-share",
|
||||||
"version": "1.2.0",
|
"version": "1.2.2",
|
||||||
"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.2",
|
||||||
"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",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
:3000 {
|
:3000 {
|
||||||
# Reverse proxy for /api
|
# Reverse proxy for /api
|
||||||
reverse_proxy /api/* http://localhost:8080
|
reverse_proxy /api/* http://localhost:{$BACKEND_PORT:8080}
|
||||||
|
|
||||||
# Reverse proxy for all other requests
|
# Reverse proxy for all other requests
|
||||||
reverse_proxy http://localhost:3333
|
reverse_proxy http://localhost:{$PORT:3333}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
:3000 {
|
:3000 {
|
||||||
reverse_proxy /* http://localhost:3333 {
|
reverse_proxy /* http://localhost:{$PORT:3333} {
|
||||||
trusted_proxies 0.0.0.0/0
|
trusted_proxies 0.0.0.0/0
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse_proxy /api/* http://localhost:8080 {
|
reverse_proxy /api/* http://localhost:{$BACKEND_PORT:8080} {
|
||||||
trusted_proxies 0.0.0.0/0
|
trusted_proxies 0.0.0.0/0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user