Compare commits
10 Commits
feat/searc
...
feat/invit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b00c47952c | ||
|
|
aa931ddcbe | ||
|
|
73b9ac7cb5 | ||
|
|
01e0140e6a | ||
|
|
f22a0332ab | ||
|
|
bd97362d90 | ||
|
|
3b3b4f89ba | ||
|
|
17f876160d | ||
|
|
dd1bd9b7cc | ||
|
|
7d9746be20 |
@@ -1,6 +1,6 @@
|
||||
# https://github.com/kanbn/kan?tab=readme-ov-file#environment-variables-)
|
||||
|
||||
# Required environment variables
|
||||
# Required environment variables
|
||||
NEXT_PUBLIC_BASE_URL= # e.g. https://kan.bn
|
||||
BETTER_AUTH_SECRET= # Random 32+ char string (can gen with: openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
|
||||
@@ -18,9 +18,6 @@ SMTP_PASSWORD=
|
||||
EMAIL_FROM= # e.g. "Kan <hello@mail.kan.bn>"
|
||||
SMTP_SECURE= # set to "false" to use port 587
|
||||
|
||||
# Switch email features off entirely (optional)
|
||||
NEXT_PUBLIC_DISABLE_EMAIL=
|
||||
|
||||
# S3 storage (optional)
|
||||
S3_REGION=
|
||||
S3_ENDPOINT=
|
||||
|
||||
@@ -147,7 +147,6 @@ pnpm dev
|
||||
| `SMTP_USER` | SMTP username/email | No | `resend` |
|
||||
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
|
||||
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
|
||||
| `NEXT_PUBLIC_DISABLE_EMAIL` | To disable all email features | For Email | `true` |
|
||||
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
|
||||
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
|
||||
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |
|
||||
|
||||
@@ -112,7 +112,6 @@ checksums:
|
||||
Create%20board/singular: 155b62818bfab0e34f0089e1b34a32f3
|
||||
Create%20card/singular: 32792935dd5837a9433909b04021c22b
|
||||
Create%20checklist/singular: 5cbca15a7004558c4e6d381f83a34da2
|
||||
Create%20invite%20link/singular: bef23fe786978f7abf78dece49a35a26
|
||||
Create%20label/singular: c64e8180fa956f005edc1fd9b8e65abb
|
||||
Create%20list/singular: 858c3d514aa95765ec82114393199144
|
||||
Create%20new%20board/singular: cbb87b1f4cc46b336ad9510c9f19407c
|
||||
@@ -129,7 +128,6 @@ checksums:
|
||||
Custom%20workspace%20URL/singular: 7ba841d0946eb04fa3d17d74365be37b
|
||||
Customer%20Support/singular: 50e3c77e22e41061ca85ea2f02625a2e
|
||||
Dark/singular: 73e6e208ba628b26e90fcf6dce15e1b2
|
||||
Deactivate%20invite%20link/singular: 8cf4bf82e153e4dc82d026448cb4dd10
|
||||
Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9
|
||||
Delete%20account/singular: a9d11113f1a1d7e20582bdcc9633bcef
|
||||
Delete%20board/singular: e915cd160651ad4b61a67e8da0737c23
|
||||
@@ -235,7 +233,6 @@ checksums:
|
||||
Important/singular: 4cf0e8fc8e4e7c5c9b9458059a172a2b
|
||||
Importing%20from%20Trello/singular: 1e3a46fb9bd8ce8c7d632f9555b5bd7c
|
||||
Importing%20your%20Trello%20boards%20into%20Kan%20is%20easy.%20You%20can%20follow%20our%20step-by-step%20guide%20%3C0%3Ehere%3C%2F0%3E./singular: ca88dc22801fef08fee1ecfb1bf6914e
|
||||
in/singular: 1f06ad6763244d5e9927853e65cc6274
|
||||
In%20Progress/singular: 3de9afebcb9d4ce8ac42e14995f79ffd
|
||||
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
|
||||
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
|
||||
@@ -245,7 +242,6 @@ checksums:
|
||||
Invite/singular: 181884cea804cbde665f160811ee7ad0
|
||||
Invite%20link%20copied/singular: 4046f23a78e1cd5166671c3fb8a7ea6e
|
||||
Invite%20link%20copied%20to%20clipboard/singular: 6fc055a0ea0ed1aa58c5e0c502efe17f
|
||||
Invite%20links%20require%20a%20Team%20or%20Pro%20subscription.%20Please%20upgrade%20your%20workspace./singular: 18db646fc55f99789572c8df0539ee69
|
||||
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
|
||||
Inviting%20members%20requires%20a%20Team%20Plan.%20You'll%20be%20redirected%20to%20upgrade%20your%20workspace./singular: 03eeed2d715e770259f722ba48a61ab3
|
||||
Join%20workspace/singular: f5d035df672b05abd760bd022309c719
|
||||
@@ -301,7 +297,6 @@ checksums:
|
||||
No%20boards%20found/singular: e044088d2c51b6bdf660fafa86ee1e17
|
||||
No%20credit%20card%20required/singular: 2090aa4171dc0b60735069f89b592883
|
||||
No%20lists/singular: cedf633d99c77ff4356e089f2d98c0a6
|
||||
No%20results%20found%20for%20%22%7BdebouncedQuery%7D%22./singular: 5db6294712528cd897b15ae36f4fd834
|
||||
Offer/singular: 82b4e0c9a3f5b4bd93590847de7c32a1
|
||||
Onboarding/singular: 52b23f9c62ff199d4c09920e7641829e
|
||||
Once%20you%20delete%20your%20account%2C%20there%20is%20no%20going%20back.%20This%20action%20cannot%20be%20undone./singular: 9cf7aa6ef30890e5124e266c081bae1c
|
||||
@@ -311,8 +306,6 @@ checksums:
|
||||
Own%20your%20data/singular: cc2178dac4bdf6b07f030cfc2a7510e6
|
||||
Part-time/singular: 213d63da450f35dabb3ab0e35e29feed
|
||||
Password%20Changed/singular: 1fcebe9ddb46f722a57f195efddc695d
|
||||
Password%20is%20required%20to%20login./singular: a09c76294ca7b27b38658b34618a7119
|
||||
Password%20is%20required%20to%20sign%20up./singular: 3fa1abbf2e6ac8ac4d18c215191bdbcc
|
||||
Password%20must%20be%20at%20least%208%20characters/singular: 4c30501d085eaccea47af34212bb26a7
|
||||
Passwords%20do%20not%20match/singular: 37ca1f4e0afc9a0b8e9617f767103c92
|
||||
Paused/singular: edb1f7b7219e1c9b7aa67159090d6991
|
||||
@@ -361,7 +354,6 @@ checksums:
|
||||
Save/singular: f7a2929f33bc420195e59ac5a8bcd454
|
||||
Save%20time%20with%20reusable%20board%20templates./singular: d0f2d7d0fd682ceaf4ca12c6353fd75a
|
||||
Screening/singular: 0327bfb25db87bdacf00d4dc297f8b26
|
||||
Search%20boards%20and%20cards.../singular: 137017b2b3e885c4894ca8c899af5bc2
|
||||
Select%20all/singular: eedc7cdb02de467c15dc418a066a77f2
|
||||
Select%20source/singular: c7b0ec447415ff62856803a4d7838bd6
|
||||
Self%20Host/singular: 43fbce2027548b712002e489a20a621a
|
||||
@@ -375,6 +367,7 @@ checksums:
|
||||
Settings%20%7C%20Billing/singular: e44cba741d5414035a0b499c5766c203
|
||||
Settings%20%7C%20Integrations/singular: d04992e28016452f6d3d7dcc0b592415
|
||||
Settings%20%7C%20Workspace/singular: 5d0bacf7ff696da940f232df45edfd39
|
||||
Share%20invite%20link/singular: ec5081a1f4e49fd9d782e770438f703b
|
||||
Sign%20in/singular: cb8757c7450e17de1e226e82fb0fa4a2
|
||||
Sign%20In/singular: ec7b8f314fe9bc6591006707484ede61
|
||||
Sign%20Up/singular: 0dd2ae69be4618c1f9e615774a4509ca
|
||||
@@ -387,7 +380,6 @@ checksums:
|
||||
Social%20Media/singular: 2227508afb0d38a027e323207e47d4a2
|
||||
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
|
||||
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
|
||||
Subscription%20Required/singular: 05f2b4abfc36def17756a6969983cf86
|
||||
Success/singular: c43827becada6750f7a25890905f38b9
|
||||
Supercharge%20your%20workspace%20for%20just%20%2429%2Fmonth.%20Here's%20what%20you'll%20get%3A/singular: 21af8119141afcce5f12da489f34db6a
|
||||
Support/singular: 55aab5fd0f31a9cb055a2edeeedfaf63
|
||||
|
||||
@@ -5,7 +5,7 @@ import { t } from "@lingui/core/macro";
|
||||
import { Trans } from "@lingui/react/macro";
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import { env } from "next-runtime-env";
|
||||
import { useEffect, useMemo, useRef, useState } from "react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
import {
|
||||
FaApple,
|
||||
@@ -156,12 +156,10 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
const [isLoginWithProviderPending, setIsLoginWithProviderPending] =
|
||||
useState<null | AuthProvider>(null);
|
||||
const [isCredentialsEnabled, setIsCredentialsEnabled] = useState(false);
|
||||
const [isEmailSendingEnabled, setIsEmailSendingEnabled] = useState(false);
|
||||
const [isLoginWithEmailPending, setIsLoginWithEmailPending] = useState(false);
|
||||
const [loginError, setLoginError] = useState<string | null>(null);
|
||||
const { showPopup } = usePopup();
|
||||
const oidcProviderName = "OIDC";
|
||||
const passwordRef = useRef<HTMLInputElement | null>(null);
|
||||
|
||||
const redirect = useSearchParams().get("next");
|
||||
const callbackURL = redirect ?? "/boards";
|
||||
@@ -170,9 +168,6 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
useEffect(() => {
|
||||
const credentialsAllowed =
|
||||
env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true";
|
||||
const emailSendingEnabled =
|
||||
env("NEXT_PUBLIC_DISABLE_EMAIL")?.toLowerCase() !== "true";
|
||||
setIsEmailSendingEnabled(emailSendingEnabled);
|
||||
setIsCredentialsEnabled(credentialsAllowed);
|
||||
}, []);
|
||||
|
||||
@@ -192,7 +187,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
|
||||
const handleLoginWithEmail = async (
|
||||
email: string,
|
||||
password?: string | null,
|
||||
password?: string,
|
||||
name?: string,
|
||||
) => {
|
||||
setIsLoginWithEmailPending(true);
|
||||
@@ -235,26 +230,16 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Only allow magic link if email sending is enabled and not in sign up mode
|
||||
if (isEmailSendingEnabled && !isSignUp) {
|
||||
await authClient.signIn.magicLink(
|
||||
{
|
||||
email,
|
||||
callbackURL,
|
||||
},
|
||||
{
|
||||
onSuccess: () => setIsMagicLinkSent(true, email),
|
||||
onError: ({ error }) => setLoginError(error.message),
|
||||
},
|
||||
);
|
||||
} else {
|
||||
// Provide a clear error feedback when password omitted but magic link unavailable
|
||||
setLoginError(
|
||||
isSignUp
|
||||
? t`Password is required to sign up.`
|
||||
: t`Password is required to login.`,
|
||||
);
|
||||
}
|
||||
await authClient.signIn.magicLink(
|
||||
{
|
||||
email,
|
||||
callbackURL,
|
||||
},
|
||||
{
|
||||
onSuccess: () => setIsMagicLinkSent(true, email),
|
||||
onError: ({ error }) => setLoginError(error.message),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
setIsLoginWithEmailPending(false);
|
||||
@@ -291,43 +276,11 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
};
|
||||
|
||||
const onSubmit = async (values: FormValues) => {
|
||||
// Treat empty password string as undefined to trigger magic link path
|
||||
const sanitizedPassword = values.password?.trim()
|
||||
? values.password
|
||||
: undefined;
|
||||
await handleLoginWithEmail(values.email, sanitizedPassword, values.name);
|
||||
await handleLoginWithEmail(values.email, values.password, values.name);
|
||||
};
|
||||
|
||||
const password = watch("password");
|
||||
|
||||
// Determine if we should operate in magic link mode for current form state (login only)
|
||||
const isMagicLinkMode = useMemo(() => {
|
||||
// Magic link only viable when email sending enabled AND not sign up.
|
||||
if (!isEmailSendingEnabled || isSignUp) return false;
|
||||
// If credentials disabled we always default to magic link.
|
||||
if (!isCredentialsEnabled) return true;
|
||||
// Credentials enabled: user chooses magic link by leaving password blank.
|
||||
return !password;
|
||||
}, [isEmailSendingEnabled, isSignUp, isCredentialsEnabled, password]);
|
||||
|
||||
// Auto-focus password field when an error indicates it's required
|
||||
useEffect(() => {
|
||||
if (!isCredentialsEnabled) return;
|
||||
// Focus when: sign up and missing password; login error requiring password; validation error on password.
|
||||
const pwdEmpty = (password ?? "").length === 0;
|
||||
let needsPassword = false;
|
||||
if (isSignUp && pwdEmpty) {
|
||||
needsPassword = true;
|
||||
} else if (loginError?.toLowerCase().includes("password")) {
|
||||
needsPassword = true;
|
||||
} else if (errors.password) {
|
||||
needsPassword = true;
|
||||
}
|
||||
if (needsPassword && passwordRef.current) {
|
||||
passwordRef.current.focus();
|
||||
}
|
||||
}, [isSignUp, password, loginError, errors.password, isCredentialsEnabled]);
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{socialProviders?.length !== 0 && (
|
||||
@@ -398,7 +351,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
/>
|
||||
{errors.password && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{errors.password.message ?? t`Please enter a valid password`}
|
||||
{t`Please enter a valid password`}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@@ -415,7 +368,9 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
variant="secondary"
|
||||
>
|
||||
{isSignUp ? t`Sign up with ` : t`Continue with `}
|
||||
{isMagicLinkMode ? t`magic link` : t`email`}
|
||||
{!isCredentialsEnabled || (password && password.length !== 0)
|
||||
? t`email`
|
||||
: t`magic link`}
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,193 +0,0 @@
|
||||
import { useRouter } from "next/router";
|
||||
import {
|
||||
Combobox,
|
||||
ComboboxInput,
|
||||
ComboboxOption,
|
||||
ComboboxOptions,
|
||||
Dialog,
|
||||
DialogBackdrop,
|
||||
DialogPanel,
|
||||
} from "@headlessui/react";
|
||||
import { t } from "@lingui/macro";
|
||||
import { useState } from "react";
|
||||
import { HiDocumentText, HiFolder, HiMagnifyingGlass } from "react-icons/hi2";
|
||||
|
||||
import { useDebounce } from "~/hooks/useDebounce";
|
||||
import { useWorkspace } from "~/providers/workspace";
|
||||
import { api } from "~/utils/api";
|
||||
|
||||
type SearchResult =
|
||||
| {
|
||||
publicId: string;
|
||||
title: string;
|
||||
description: string | null;
|
||||
slug: string;
|
||||
updatedAt: Date | null;
|
||||
createdAt: Date;
|
||||
type: "board";
|
||||
}
|
||||
| {
|
||||
publicId: string;
|
||||
title: string;
|
||||
description: string | null;
|
||||
boardPublicId: string;
|
||||
boardName: string;
|
||||
listName: string;
|
||||
updatedAt: Date | null;
|
||||
createdAt: Date;
|
||||
type: "card";
|
||||
};
|
||||
|
||||
export default function CommandPallette({
|
||||
isOpen,
|
||||
onClose,
|
||||
}: {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
}) {
|
||||
const [query, setQuery] = useState("");
|
||||
const { workspace } = useWorkspace();
|
||||
const router = useRouter();
|
||||
|
||||
// Debounce to avoid too many reqs
|
||||
const [debouncedQuery] = useDebounce(query, 300);
|
||||
|
||||
const {
|
||||
data: searchResults,
|
||||
isLoading,
|
||||
isFetched,
|
||||
isPlaceholderData,
|
||||
} = api.workspace.search.useQuery(
|
||||
{
|
||||
workspacePublicId: workspace.publicId,
|
||||
query: debouncedQuery,
|
||||
},
|
||||
{
|
||||
enabled: Boolean(workspace.publicId && debouncedQuery.trim().length > 0),
|
||||
placeholderData: (previousData) => previousData,
|
||||
},
|
||||
);
|
||||
|
||||
// Clear results when query is empty, otherwise show search results
|
||||
const results =
|
||||
debouncedQuery.trim().length === 0
|
||||
? []
|
||||
: ((searchResults ?? []) as SearchResult[]);
|
||||
|
||||
const hasSearched = Boolean(debouncedQuery.trim().length > 0);
|
||||
|
||||
return (
|
||||
<Dialog
|
||||
className="relative z-50"
|
||||
open={isOpen}
|
||||
onClose={() => {
|
||||
onClose();
|
||||
setQuery("");
|
||||
}}
|
||||
>
|
||||
<DialogBackdrop
|
||||
transition
|
||||
className="data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in fixed inset-0 bg-light-50 bg-opacity-40 transition-opacity dark:bg-dark-50 dark:bg-opacity-40"
|
||||
/>
|
||||
|
||||
<div className="fixed inset-0 z-50 w-screen overflow-y-auto">
|
||||
<div className="flex min-h-full items-start justify-center p-4 text-center sm:items-start sm:p-0">
|
||||
<DialogPanel
|
||||
transition
|
||||
className="data-closed:opacity-0 data-closed:translate-y-4 data-closed:sm:translate-y-0 data-closed:sm:scale-95 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in relative mt-[25vh] w-full max-w-[550px] transform divide-y divide-gray-100 overflow-hidden rounded-lg border border-light-600 bg-white/90 shadow-3xl-light backdrop-blur-[6px] transition-all dark:divide-white/10 dark:border-dark-600 dark:bg-dark-100/90 dark:shadow-3xl-dark"
|
||||
>
|
||||
<Combobox>
|
||||
<div className="grid grid-cols-1">
|
||||
<ComboboxInput
|
||||
autoFocus
|
||||
className="col-start-1 row-start-1 h-12 w-full border-0 bg-transparent pl-11 pr-4 text-sm text-light-900 placeholder:text-light-700 focus:outline-none focus:ring-0 dark:text-dark-900 dark:placeholder:text-dark-700"
|
||||
placeholder={t`Search boards and cards...`}
|
||||
value={query}
|
||||
onChange={(event) => setQuery(event.target.value)}
|
||||
onKeyDown={(event) => {
|
||||
if (event.key === "Enter" && results.length > 0) {
|
||||
event.preventDefault();
|
||||
|
||||
// Find the active option or fallback to first option
|
||||
const targetOption =
|
||||
document.querySelector(
|
||||
'[data-headlessui-state*="active"][role="option"]',
|
||||
) ?? document.querySelector('[role="option"]');
|
||||
|
||||
if (targetOption) {
|
||||
(targetOption as HTMLElement).click();
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<HiMagnifyingGlass
|
||||
className="pointer-events-none col-start-1 row-start-1 ml-4 size-5 self-center text-light-700 dark:text-dark-700"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{results.length > 0 && (
|
||||
<ComboboxOptions
|
||||
static
|
||||
className={`max-h-72 scroll-py-2 overflow-y-auto py-2 ${
|
||||
isPlaceholderData ? "opacity-75" : ""
|
||||
}`}
|
||||
>
|
||||
{results.map((result) => {
|
||||
const url =
|
||||
result.type === "board"
|
||||
? `/boards/${result.publicId}`
|
||||
: `/cards/${result.publicId}`;
|
||||
|
||||
return (
|
||||
<ComboboxOption
|
||||
key={`${result.type}-${result.publicId}`}
|
||||
value={result}
|
||||
className="cursor-pointer select-none px-4 py-3 data-[focus]:bg-light-200 hover:bg-light-200 focus:outline-none dark:data-[focus]:bg-dark-200 dark:hover:bg-dark-200"
|
||||
onClick={() => {
|
||||
console.log("clicked", url);
|
||||
void router.push(url);
|
||||
onClose();
|
||||
setQuery("");
|
||||
}}
|
||||
>
|
||||
<div className="flex items-start gap-3">
|
||||
<div className="mt-0.5 flex-shrink-0">
|
||||
{result.type === "board" ? (
|
||||
<HiFolder className="h-4 w-4 text-light-600 dark:text-dark-600" />
|
||||
) : (
|
||||
<HiDocumentText className="h-4 w-4 text-light-600 dark:text-dark-600" />
|
||||
)}
|
||||
</div>
|
||||
<div className="min-w-0 flex-1 text-left">
|
||||
<div className="truncate text-sm font-bold text-light-900 dark:text-dark-900">
|
||||
{result.title}
|
||||
</div>
|
||||
{result.type === "card" && (
|
||||
<div className="truncate text-xs text-light-700 dark:text-dark-700">
|
||||
{`${t`in`} ${result.boardName} → ${result.listName}`}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</ComboboxOption>
|
||||
);
|
||||
})}
|
||||
</ComboboxOptions>
|
||||
)}
|
||||
|
||||
{hasSearched &&
|
||||
!isLoading &&
|
||||
searchResults !== undefined &&
|
||||
results.length === 0 && (
|
||||
<div className="p-4 text-sm text-light-950 dark:text-dark-950">
|
||||
{t`No results found for "${debouncedQuery}".`}
|
||||
</div>
|
||||
)}
|
||||
</Combobox>
|
||||
</DialogPanel>
|
||||
</div>
|
||||
</div>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
@@ -5,12 +5,10 @@ const Toggle = ({
|
||||
isChecked,
|
||||
onChange,
|
||||
label,
|
||||
disabled,
|
||||
}: {
|
||||
isChecked: boolean;
|
||||
onChange: () => void;
|
||||
label: string;
|
||||
disabled?: boolean;
|
||||
}) => (
|
||||
<div className="mr-4 flex items-center justify-end">
|
||||
<span className="mr-2 text-xs text-light-900 dark:text-dark-900">
|
||||
@@ -19,7 +17,6 @@ const Toggle = ({
|
||||
<Switch
|
||||
checked={isChecked}
|
||||
onChange={onChange}
|
||||
disabled={disabled}
|
||||
className={twMerge(
|
||||
"relative inline-flex h-4 w-6 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent bg-light-800 transition-colors duration-200 ease-in-out focus:outline-none dark:bg-dark-800",
|
||||
isChecked && "bg-indigo-600 dark:bg-indigo-600",
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import { Button, Menu, Transition } from "@headlessui/react";
|
||||
import { Menu, Transition } from "@headlessui/react";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { Fragment, useEffect, useState } from "react";
|
||||
import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
|
||||
import { Fragment } from "react";
|
||||
import { HiCheck } from "react-icons/hi2";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { useWorkspace } from "~/providers/workspace";
|
||||
import CommandPallette from "./CommandPallette";
|
||||
|
||||
export default function WorkspaceMenu({
|
||||
isCollapsed = false,
|
||||
@@ -16,143 +15,110 @@ export default function WorkspaceMenu({
|
||||
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
||||
useWorkspace();
|
||||
const { openModal } = useModal();
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const handleKeyDown = (event: KeyboardEvent) => {
|
||||
if ((event.metaKey || event.ctrlKey) && event.key === "k") {
|
||||
event.preventDefault();
|
||||
setIsOpen(true);
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener("keydown", handleKeyDown);
|
||||
return () => document.removeEventListener("keydown", handleKeyDown);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<CommandPallette isOpen={isOpen} onClose={() => setIsOpen(false)} />
|
||||
<Menu as="div" className="relative inline-block w-full pb-3 text-left">
|
||||
<div>
|
||||
{isLoading ? (
|
||||
<div className={twMerge("mb-1 flex", isCollapsed && "md:p-1.5")}>
|
||||
<div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
|
||||
<div
|
||||
className={twMerge(
|
||||
"ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<Menu as="div" className="relative inline-block w-full pb-3 text-left">
|
||||
<div>
|
||||
{isLoading ? (
|
||||
<div className={twMerge("mb-1 flex", isCollapsed && "md:p-1.5")}>
|
||||
<div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
|
||||
<div
|
||||
className={twMerge(
|
||||
"flex items-center gap-1",
|
||||
isCollapsed && "md:flex-col-reverse md:items-stretch",
|
||||
"ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<Menu.Button
|
||||
className={twMerge(
|
||||
"mb-1 flex h-[34px] w-full items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
|
||||
isCollapsed && "md:mb-1.5 md:h-9 md:p-1",
|
||||
)}
|
||||
title={isCollapsed ? workspace.name : undefined}
|
||||
>
|
||||
<span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
|
||||
<span className="text-xs font-bold leading-none text-white">
|
||||
{workspace.name.charAt(0).toUpperCase()}
|
||||
</span>
|
||||
</span>
|
||||
<span
|
||||
className={twMerge(
|
||||
"ml-2 truncate text-sm font-bold text-neutral-900 dark:text-dark-1000",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
>
|
||||
<Menu.Button
|
||||
{workspace.name}
|
||||
</span>
|
||||
{workspace.plan === "pro" && (
|
||||
<span
|
||||
className={twMerge(
|
||||
"mb-1 flex h-[34px] flex-1 items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
|
||||
isCollapsed &&
|
||||
"md:mb-1.5 md:h-9 md:w-9 md:flex-none md:justify-center md:p-0",
|
||||
"ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
title={isCollapsed ? workspace.name : undefined}
|
||||
>
|
||||
<span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
|
||||
<span className="text-xs font-bold leading-none text-white">
|
||||
{workspace.name.charAt(0).toUpperCase()}
|
||||
</span>
|
||||
</span>
|
||||
<span
|
||||
className={twMerge(
|
||||
"ml-2 truncate text-sm font-bold text-neutral-900 dark:text-dark-1000",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
>
|
||||
{workspace.name}
|
||||
</span>
|
||||
{workspace.plan === "pro" && (
|
||||
<span
|
||||
className={twMerge(
|
||||
"ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700",
|
||||
isCollapsed && "md:hidden",
|
||||
)}
|
||||
>
|
||||
Pro
|
||||
</span>
|
||||
)}
|
||||
</Menu.Button>
|
||||
<Button
|
||||
className={twMerge(
|
||||
"mb-1 h-[34px] w-[34px] flex-shrink-0 rounded-lg bg-light-200 p-2 hover:bg-light-300 focus:outline-none dark:bg-dark-200 dark:hover:bg-dark-300",
|
||||
isCollapsed && "md:mb-2 md:h-9 md:w-9 md:self-center",
|
||||
)}
|
||||
onClick={() => setIsOpen(true)}
|
||||
>
|
||||
<HiMagnifyingGlass className="h-4 w-4" aria-hidden="true" />
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<Transition
|
||||
as={Fragment}
|
||||
enter="transition ease-out duration-100"
|
||||
enterFrom="transform opacity-0 scale-95"
|
||||
enterTo="transform opacity-100 scale-100"
|
||||
leave="transition ease-in duration-75"
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Menu.Items
|
||||
className={twMerge(
|
||||
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
|
||||
isCollapsed ? "w-48" : "w-full",
|
||||
Pro
|
||||
</span>
|
||||
)}
|
||||
>
|
||||
<div className="p-1">
|
||||
{availableWorkspaces.map((availableWorkspace) => (
|
||||
<div key={availableWorkspace.publicId} className="flex">
|
||||
<Menu.Item>
|
||||
<button
|
||||
onClick={() => switchWorkspace(availableWorkspace)}
|
||||
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
||||
>
|
||||
<div className="flex min-w-0 flex-1 items-center">
|
||||
<span className="inline-flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-[5px] bg-indigo-700">
|
||||
<span className="text-xs font-medium leading-none text-white">
|
||||
{availableWorkspace.name.charAt(0).toUpperCase()}
|
||||
</span>
|
||||
</Menu.Button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<Transition
|
||||
as={Fragment}
|
||||
enter="transition ease-out duration-100"
|
||||
enterFrom="transform opacity-0 scale-95"
|
||||
enterTo="transform opacity-100 scale-100"
|
||||
leave="transition ease-in duration-75"
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Menu.Items
|
||||
className={twMerge(
|
||||
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
|
||||
isCollapsed ? "w-48" : "w-full",
|
||||
)}
|
||||
>
|
||||
<div className="p-1">
|
||||
{availableWorkspaces.map((availableWorkspace) => (
|
||||
<div key={availableWorkspace.publicId} className="flex">
|
||||
<Menu.Item>
|
||||
<button
|
||||
onClick={() => switchWorkspace(availableWorkspace)}
|
||||
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
||||
>
|
||||
<div className="flex min-w-0 flex-1 items-center">
|
||||
<span className="inline-flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-[5px] bg-indigo-700">
|
||||
<span className="text-xs font-medium leading-none text-white">
|
||||
{availableWorkspace.name.charAt(0).toUpperCase()}
|
||||
</span>
|
||||
<span className="ml-2 truncate text-xs font-medium">
|
||||
{availableWorkspace.name}
|
||||
</span>
|
||||
</div>
|
||||
{workspace.publicId === availableWorkspace.publicId && (
|
||||
<span>
|
||||
<HiCheck className="h-4 w-4" aria-hidden="true" />
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
</Menu.Item>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="border-t-[1px] border-light-600 p-1 dark:border-dark-500">
|
||||
<Menu.Item>
|
||||
<button
|
||||
onClick={() => openModal("NEW_WORKSPACE")}
|
||||
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-xs text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
||||
>
|
||||
{t`Create workspace`}
|
||||
</button>
|
||||
</Menu.Item>
|
||||
</div>
|
||||
</Menu.Items>
|
||||
</Transition>
|
||||
</Menu>
|
||||
</>
|
||||
</span>
|
||||
<span className="ml-2 truncate text-xs font-medium">
|
||||
{availableWorkspace.name}
|
||||
</span>
|
||||
</div>
|
||||
{workspace.publicId === availableWorkspace.publicId && (
|
||||
<span>
|
||||
<HiCheck className="h-4 w-4" aria-hidden="true" />
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
</Menu.Item>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="border-t-[1px] border-light-600 p-1 dark:border-dark-500">
|
||||
<Menu.Item>
|
||||
<button
|
||||
onClick={() => openModal("NEW_WORKSPACE")}
|
||||
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-xs text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
||||
>
|
||||
{t`Create workspace`}
|
||||
</button>
|
||||
</Menu.Item>
|
||||
</div>
|
||||
</Menu.Items>
|
||||
</Transition>
|
||||
</Menu>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -36,12 +36,12 @@ msgstr "{0} Labels"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/Monat"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/Monat"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Label hinzufügen"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Mitglied hinzufügen"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "hat Checklistenelement <0>{0}</0> hinzugefügt"
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "hat Label <0>{0}</0> hinzugefügt"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Das Hinzufügen eines neuen Mitglieds kostet zusätzlich {price} ({billingType}) pro Platz."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Jeder mit diesem Link kann deinem Arbeitsbereich beitreten"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Backlog"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Einfaches Kanban"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "jährlich abgerechnet"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "monatlich abgerechnet"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Kontaktiere uns"
|
||||
msgid "Content Creation"
|
||||
msgstr "Content-Erstellung"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Fortfahren mit "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Fortfahren mit {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Karte erstellen"
|
||||
msgid "Create checklist"
|
||||
msgstr "Checkliste erstellen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Einladungslink erstellen"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Label erstellen"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Neue Liste erstellen"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Arbeitsbereich erstellen"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Kundensupport"
|
||||
msgid "Dark"
|
||||
msgstr "Dunkel"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Einladungslink deaktivieren"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Workspace-URL bearbeiten"
|
||||
msgid "Editing"
|
||||
msgstr "Bearbeitung"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "E-Mail"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "E-Mail"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Geben Sie Ihr aktuelles Passwort ein"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Geben Sie Ihr aktuelles Passwort ein und wählen Sie ein neues sicheres Passwort."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Gib deine E-Mail-Adresse ein"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Gib deinen Namen ein"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Gib deinen Namen ein"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Geben Sie Ihr neues Passwort ein"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Gib dein Passwort ein"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Fehler"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Fehler beim Ändern des Passworts"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Fehler beim Erstellen des Einladungslinks"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Fehler beim Deaktivieren des Einladungslinks"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Fehler beim Löschen des Arbeitsbereichs"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Fehler beim Trennen von Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Fehler beim Einladen des Mitglieds"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Fehler beim Aktualisieren des Arbeitsbereichsnamens"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Fehler beim Aktualisieren der Workspace-URL"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Fehler beim Upgrade des Abonnements"
|
||||
@@ -828,12 +820,12 @@ msgstr "Ausführung"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Einladung konnte nicht angenommen werden. Bitte versuche es später erneut oder kontaktiere den Kundensupport."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Einladungslink konnte nicht kopiert werden"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-S
|
||||
msgid "Free"
|
||||
msgstr "Kostenlos"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Kostenloser Plan"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Import von Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Der Import Ihrer Trello-Boards in Kan ist einfach. Sie können unserer Schritt-für-Schritt-Anleitung <0>hier</0> folgen."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "in"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,7 +1035,7 @@ msgstr "Integrationen"
|
||||
msgid "Interviewing"
|
||||
msgstr "Vorstellungsgespräch"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Ungültige E-Mail-Adresse"
|
||||
|
||||
@@ -1055,28 +1043,24 @@ msgstr "Ungültige E-Mail-Adresse"
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Ungültige Einladung"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Einladen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Einladungslink kopiert"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Einladungslink in die Zwischenablage kopiert"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Einladungslinks erfordern ein Team- oder Pro-Abonnement. Bitte upgraden Sie Ihren Workspace."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Mitglied einladen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Das Einladen von Mitgliedern erfordert einen Team-Plan. Sie werden weitergeleitet, um Ihren Workspace zu upgraden."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Sprache"
|
||||
msgid "Launch offer"
|
||||
msgstr "Einführungsangebot"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Einführungsangebot: Erhalten Sie unbegrenzte Mitglieder mit Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "Langfristig"
|
||||
msgid "Low Priority"
|
||||
msgstr "Niedrige Priorität"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "Magic Link"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Mittlere Priorität"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Mitglieder"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Mitglieder | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Mitglieder | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Monatlich"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "monatliche Abrechnung"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "Keine Kreditkarte erforderlich"
|
||||
msgid "No lists"
|
||||
msgstr "Keine Listen"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "Keine Ergebnisse gefunden für \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Angebot"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion k
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Sobald Sie Ihren Arbeitsbereich löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "oder"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Teilzeit"
|
||||
msgid "Password Changed"
|
||||
msgstr "Passwort geändert"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Passwort ist für die Anmeldung erforderlich."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Passwort ist für die Registrierung erforderlich."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "Passwort muss mindestens 8 Zeichen lang sein"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "Passwort muss mindestens 8 Zeichen lang sein"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Passwörter stimmen nicht überein"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "Pausiert"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "Pausiert"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Zahlungshäufigkeit"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "Ausstehend"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Planung"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Bitte bestätigen Sie Ihr neues Passwort"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Bitte gib einen gültigen Namen ein"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Bitte gib ein gültiges Passwort ein"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Bitte versuche es später erneut."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Datenschutzrichtlinie"
|
||||
msgid "Private"
|
||||
msgstr "Privat"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Pro-Plan"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Pro-Plan ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "Remote"
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Mitglied entfernen"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Überprüfung"
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Rolle"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Spare Zeit mit wiederverwendbaren Board-Vorlagen."
|
||||
msgid "Screening"
|
||||
msgstr "Vorauswahl"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Boards und Karten durchsuchen..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Alle auswählen"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Einstellungen | Integrationen"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Einstellungen | Arbeitsbereich"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Einladungslink teilen"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Registrierung deaktiviert"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Registrieren mit "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Softwareentwicklung"
|
||||
msgid "Star on Github"
|
||||
msgstr "Stern auf Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Abonnement erforderlich"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Erfolg"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Unterstütze die Entwicklung des Projekts"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Team-Plan"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Upgrade auf Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Upgrade auf Pro ($29/Monat)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Upgrade auf Team-Plan"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "URL muss mindestens 3 Zeichen lang sein"
|
||||
msgid "Use template"
|
||||
msgstr "Vorlage verwenden"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Benutzer"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Du kannst teammitglieder einladen, indem du auf die schaltfläche \"Einl
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Sie können selbst hosten, indem sie den anweisungen in unserem <0>repo</0> folgen."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Sie haben sich erfolgreich angemeldet."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Sie haben sich erfolgreich registriert."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "Sie haben unbegrenzte Plätze mit Ihrem Pro-Plan. Für neue Mitglieder fallen keine zusätzlichen Kosten an!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -40,12 +40,12 @@ msgstr "{boardCount, plural, one {Import board (1)} other {Import boards ({board
|
||||
#~ msgid "#1 Hacker News"
|
||||
#~ msgstr "#1 Hacker News"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/month"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/month"
|
||||
|
||||
@@ -117,7 +117,7 @@ msgid "Add label"
|
||||
msgstr "Add label"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Add member"
|
||||
|
||||
@@ -156,7 +156,7 @@ msgstr "added label <0>{0}</0>"
|
||||
#~ msgid "added label <0>{label}</0>"
|
||||
#~ msgstr "added label <0>{label}</0>"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
|
||||
@@ -188,7 +188,7 @@ msgstr "An error occurred while disconnecting your Trello account."
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "An unexpected error occurred. Please try again later."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Anyone with this link can join your workspace"
|
||||
|
||||
@@ -286,11 +286,11 @@ msgstr "Backlog"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Basic Kanban"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "billed annually"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "billed monthly"
|
||||
|
||||
@@ -520,12 +520,12 @@ msgstr "Contact us"
|
||||
msgid "Content Creation"
|
||||
msgstr "Content Creation"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Continue with "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Continue with {0}"
|
||||
|
||||
@@ -559,10 +559,6 @@ msgstr "Create card"
|
||||
msgid "Create checklist"
|
||||
msgstr "Create checklist"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Create invite link"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Create label"
|
||||
@@ -593,7 +589,7 @@ msgstr "Create new list"
|
||||
#~ msgstr "Create Pro workspace"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Create workspace"
|
||||
|
||||
@@ -642,10 +638,6 @@ msgstr "Customer Support"
|
||||
msgid "Dark"
|
||||
msgstr "Dark"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Deactivate invite link"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -778,11 +770,11 @@ msgstr "Edit workspace URL"
|
||||
msgid "Editing"
|
||||
msgstr "Editing"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "email"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
@@ -798,11 +790,11 @@ msgstr "Enter your current password"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Enter your current password and choose a new secure password."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Enter your email address"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Enter your name"
|
||||
|
||||
@@ -810,11 +802,11 @@ msgstr "Enter your name"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Enter your new password"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Enter your password"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
@@ -822,11 +814,11 @@ msgstr "Error"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Error Changing Password"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Error creating invite link"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Error deactivating invite link"
|
||||
|
||||
@@ -846,8 +838,8 @@ msgstr "Error deleting workspace"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Error disconnecting Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Error inviting member"
|
||||
|
||||
@@ -871,7 +863,7 @@ msgstr "Error updating workspace name"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Error updating workspace URL"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Error upgrading subscription"
|
||||
@@ -901,12 +893,12 @@ msgstr "Execution"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Failed to copy invite link"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Failed to login with {0}. Please try again."
|
||||
|
||||
@@ -955,8 +947,8 @@ msgstr "For long-term sustainability, we recognise all good open source projects
|
||||
msgid "Free"
|
||||
msgstr "Free"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Free Plan"
|
||||
|
||||
@@ -1102,10 +1094,6 @@ msgstr "Importing from Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "in"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1125,7 +1113,7 @@ msgstr "Integrations"
|
||||
msgid "Interviewing"
|
||||
msgstr "Interviewing"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Invalid email address"
|
||||
|
||||
@@ -1133,7 +1121,7 @@ msgstr "Invalid email address"
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Invalid invitation"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Invite"
|
||||
|
||||
@@ -1141,24 +1129,20 @@ msgstr "Invite"
|
||||
#~ msgid "Invite another"
|
||||
#~ msgstr "Invite another"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Invite link copied"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Invite link copied to clipboard"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Invite member"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
|
||||
@@ -1207,7 +1191,7 @@ msgstr "Language"
|
||||
msgid "Launch offer"
|
||||
msgstr "Launch offer"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Launch offer: Get unlimited members with Pro"
|
||||
|
||||
@@ -1259,7 +1243,7 @@ msgstr "Long-term"
|
||||
msgid "Low Priority"
|
||||
msgstr "Low Priority"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "magic link"
|
||||
|
||||
@@ -1280,12 +1264,12 @@ msgstr "Medium Priority"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Members"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Members | {0}"
|
||||
|
||||
@@ -1293,7 +1277,7 @@ msgstr "Members | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Monthly"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "monthly billing"
|
||||
|
||||
@@ -1401,10 +1385,6 @@ msgstr "No credit card required"
|
||||
msgid "No lists"
|
||||
msgstr "No lists"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "No results found for \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Offer"
|
||||
@@ -1421,7 +1401,7 @@ msgstr "Once you delete your account, there is no going back. This action cannot
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "or"
|
||||
|
||||
@@ -1441,14 +1421,6 @@ msgstr "Part-time"
|
||||
msgid "Password Changed"
|
||||
msgstr "Password Changed"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Password is required to login."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Password is required to sign up."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "Password must be at least 8 characters"
|
||||
@@ -1457,7 +1429,7 @@ msgstr "Password must be at least 8 characters"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Passwords do not match"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "Paused"
|
||||
|
||||
@@ -1465,7 +1437,7 @@ msgstr "Paused"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Payment frequency"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "Pending"
|
||||
|
||||
@@ -1486,15 +1458,15 @@ msgstr "Planning"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Please confirm your new password"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Please enter a valid email address"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Please enter a valid name"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Please enter a valid password"
|
||||
|
||||
@@ -1527,8 +1499,8 @@ msgstr "Please select a file to upload."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1541,8 +1513,8 @@ msgstr "Please select a file to upload."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Please try again later, or contact customer support."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Please try again later."
|
||||
|
||||
@@ -1565,11 +1537,11 @@ msgstr "Privacy policy"
|
||||
msgid "Private"
|
||||
msgstr "Private"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Pro Plan"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Pro Plan ∞"
|
||||
|
||||
@@ -1613,7 +1585,7 @@ msgstr "Remote"
|
||||
msgid "Remove"
|
||||
msgstr "Remove"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Remove member"
|
||||
|
||||
@@ -1673,7 +1645,7 @@ msgstr "Review"
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Role"
|
||||
|
||||
@@ -1694,10 +1666,6 @@ msgstr "Save time with reusable board templates."
|
||||
msgid "Screening"
|
||||
msgstr "Screening"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Search boards and cards..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Select all"
|
||||
@@ -1760,8 +1728,8 @@ msgid "Settings | Workspace"
|
||||
msgstr "Settings | Workspace"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
#~ msgid "Share invite link"
|
||||
#~ msgstr "Share invite link"
|
||||
msgid "Share invite link"
|
||||
msgstr "Share invite link"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
@@ -1789,7 +1757,7 @@ msgstr "Sign up disabled"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "Sign up is currently disabled. Please try again later."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Sign up with "
|
||||
|
||||
@@ -1813,12 +1781,8 @@ msgstr "Software Development"
|
||||
msgid "Star on Github"
|
||||
msgstr "Star on Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Subscription Required"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Success"
|
||||
|
||||
@@ -1838,8 +1802,8 @@ msgstr "Support the development of the project"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Team Plan"
|
||||
|
||||
@@ -2134,7 +2098,7 @@ msgstr "Upgrade to Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Upgrade to Pro ($29/month)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Upgrade to Team Plan"
|
||||
|
||||
@@ -2162,11 +2126,11 @@ msgstr "URL must be at least 3 characters long"
|
||||
msgid "Use template"
|
||||
msgstr "Use template"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "User"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "User is already a member of this workspace"
|
||||
|
||||
@@ -2329,15 +2293,15 @@ msgstr "You can invite team members by clicking the \"Invite\" button in the top
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "You can self-host by following the instructions in our <0>repo</0>."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "You have been logged in successfully."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "You have been signed up successfully."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,12 +36,12 @@ msgstr "{0} etiquetas"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/mes"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/mes"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Añadir etiqueta"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Añadir miembro"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "añadió el elemento <0>{0}</0> a la lista de verificación"
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "añadió la etiqueta <0>{0}</0>"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Añadir un nuevo miembro costará {price} adicionales ({billingType}) por asiento."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo más tarde."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Cualquier persona con este enlace puede unirse a tu espacio de trabajo"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Pendientes"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Kanban básico"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "facturado anualmente"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "facturado mensualmente"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Contáctanos"
|
||||
msgid "Content Creation"
|
||||
msgstr "Creación de contenido"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Continuar con "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Continuar con {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Crear tarjeta"
|
||||
msgid "Create checklist"
|
||||
msgstr "Crear lista de verificación"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Crear enlace de invitación"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Crear etiqueta"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Crear nueva lista"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Crear espacio de trabajo"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Atención al cliente"
|
||||
msgid "Dark"
|
||||
msgstr "Oscuro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Desactivar enlace de invitación"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Editar URL del espacio de trabajo"
|
||||
msgid "Editing"
|
||||
msgstr "Editando"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "correo electrónico"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "Correo electrónico"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Introduce tu contraseña actual"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Introduce tu contraseña actual y elige una nueva contraseña segura."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Introduce tu dirección de correo electrónico"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Introduce tu nombre"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Introduce tu nombre"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Introduce tu nueva contraseña"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Introduce tu contraseña"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Error"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Error al cambiar la contraseña"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Error al crear el enlace de invitación"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Error al desactivar el enlace de invitación"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Error al eliminar el espacio de trabajo"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Error al desconectar Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Error al invitar al miembro"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Error al actualizar el nombre del espacio de trabajo"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Error al actualizar la URL del espacio de trabajo"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Error al actualizar la suscripción"
|
||||
@@ -828,12 +820,12 @@ msgstr "Ejecución"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "No se pudo aceptar la invitación. Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "No se pudo copiar el enlace de invitación"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos p
|
||||
msgid "Free"
|
||||
msgstr "Gratis"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Plan gratuito"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Importando desde Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Importar tus tableros de Trello a Kan es fácil. Puedes seguir nuestra guía paso a paso <0>aquí</0>."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "en"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,36 +1035,32 @@ msgstr "Integraciones"
|
||||
msgid "Interviewing"
|
||||
msgstr "Entrevistando"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Dirección de correo electrónico no válida"
|
||||
|
||||
#: src/views/invite/index.tsx:105
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Invitación inválida"
|
||||
msgstr "Invitación no válida"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Invitar"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Enlace de invitación copiado"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Enlace de invitación copiado al portapapeles"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Los enlaces de invitación requieren una suscripción de Equipo o Pro. Por favor, actualiza tu espacio de trabajo."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Invitar miembro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Invitar miembros requiere un Plan de Equipo. Serás redirigido para actualizar tu espacio de trabajo."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Idioma"
|
||||
msgid "Launch offer"
|
||||
msgstr "Oferta de lanzamiento"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Oferta de lanzamiento: Obtén miembros ilimitados con Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "Largo plazo"
|
||||
msgid "Low Priority"
|
||||
msgstr "Prioridad baja"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "enlace mágico"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Prioridad media"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Miembros"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Miembros | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Miembros | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensual"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "facturación mensual"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "No se requiere tarjeta de crédito"
|
||||
msgid "No lists"
|
||||
msgstr "Sin listas"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "No se encontraron resultados para \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Oferta"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Una vez que elimines tu espacio de trabajo, no hay vuelta atrás. Esta acción no se puede deshacer."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "o"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Tiempo parcial"
|
||||
msgid "Password Changed"
|
||||
msgstr "Contraseña cambiada"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Se requiere contraseña para iniciar sesión."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Se requiere contraseña para registrarse."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "La contraseña debe tener al menos 8 caracteres"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "La contraseña debe tener al menos 8 caracteres"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Las contraseñas no coinciden"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "Pausado"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "Pausado"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Frecuencia de pago"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "Pendiente"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Planificación"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Por favor, confirma tu nueva contraseña"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Por favor, introduce una dirección de correo electrónico válida"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Por favor, introduce un nombre válido"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Por favor, introduce una contraseña válida"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Por favor selecciona un archivo para subir."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Por favor selecciona un archivo para subir."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Por favor, inténtalo de nuevo más tarde."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Política de privacidad"
|
||||
msgid "Private"
|
||||
msgstr "Privado"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Plan Pro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Plan Pro ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "Remoto"
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Eliminar miembro"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Revisión"
|
||||
msgid "Roadmap"
|
||||
msgstr "Hoja de ruta"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Rol"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Ahorra tiempo con plantillas de tableros reutilizables."
|
||||
msgid "Screening"
|
||||
msgstr "Preselección"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Buscar tableros y tarjetas..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Seleccionar todo"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Configuración | Integraciones"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Configuración | Espacio de trabajo"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Compartir enlace de invitación"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Registro deshabilitado"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Registrarse con "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Desarrollo de software"
|
||||
msgid "Star on Github"
|
||||
msgstr "Estrella en Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Suscripción requerida"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Éxito"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Apoya el desarrollo del proyecto"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Plan de Equipo"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Actualizar a Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Actualizar a Pro ($29/mes)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Actualizar al Plan de Equipo"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "La URL debe tener al menos 3 caracteres"
|
||||
msgid "Use template"
|
||||
msgstr "Usar plantilla"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Usuario"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "El usuario ya es miembro de este espacio de trabajo"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Puedes invitar a miembros del equipo haciendo clic en el botón \"Invita
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Puedes autoalojar siguiendo las instrucciones en nuestro <0>repositorio</0>."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Has iniciado sesión correctamente."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Te has registrado correctamente."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "Tienes plazas ilimitadas con tu Plan Pro. ¡No hay cargos adicionales por nuevos miembros!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,12 +36,12 @@ msgstr "{0} étiquettes"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "10 $/mois"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "8 $/mois"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Ajouter une étiquette"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Ajouter un membre"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "a ajouté l'élément <0>{0}</0> à la checklist"
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "a ajouté l'étiquette <0>{0}</0>"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "L'ajout d'un nouveau membre coûtera {price} supplémentaires ({billingType}) par siège."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Une erreur inattendue s'est produite. Veuillez réessayer plus tard."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Toute personne disposant de ce lien peut rejoindre votre espace de travail"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Backlog"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Kanban basique"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "facturation annuelle"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "facturation mensuelle"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Contactez-nous"
|
||||
msgid "Content Creation"
|
||||
msgstr "Création de contenu"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Continuer avec "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Continuer avec {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Créer une carte"
|
||||
msgid "Create checklist"
|
||||
msgstr "Créer une checklist"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Créer un lien d'invitation"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Créer une étiquette"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Créer une nouvelle liste"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Créer un espace de travail"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Support client"
|
||||
msgid "Dark"
|
||||
msgstr "Sombre"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Désactiver le lien d'invitation"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Modifier l'URL de l'espace de travail"
|
||||
msgid "Editing"
|
||||
msgstr "Édition"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "e-mail"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "E-mail"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Saisissez votre mot de passe actuel"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Saisissez votre mot de passe actuel et choisissez un nouveau mot de passe sécurisé."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Saisissez votre adresse e-mail"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Saisissez votre nom"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Saisissez votre nom"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Saisissez votre nouveau mot de passe"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Saisissez votre mot de passe"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Erreur"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Erreur lors du changement de mot de passe"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Erreur lors de la création du lien d'invitation"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Erreur lors de la désactivation du lien d'invitation"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Erreur lors de la suppression de l'espace de travail"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Erreur lors de la déconnexion de Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Erreur lors de l'invitation du membre"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Erreur lors de la mise à jour du nom de l'espace de travail"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Erreur lors de la mise à niveau de l'abonnement"
|
||||
@@ -828,12 +820,12 @@ msgstr "Exécution"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Échec de l'acceptation de l'invitation. Veuillez réessayer plus tard ou contacter le service client."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Échec de la copie du lien d'invitation"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Échec de connexion avec {0}. Veuillez réessayer."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons
|
||||
msgid "Free"
|
||||
msgstr "Gratuit"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Forfait gratuit"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Importation depuis Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "L'importation de vos tableaux Trello dans Kan est simple. Vous pouvez suivre notre guide étape par étape <0>ici</0>."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "dans"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,36 +1035,32 @@ msgstr "Intégrations"
|
||||
msgid "Interviewing"
|
||||
msgstr "Entretien"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Adresse e-mail invalide"
|
||||
|
||||
#: src/views/invite/index.tsx:105
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Invitation invalide"
|
||||
msgstr "Invitation non valide"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Inviter"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Lien d'invitation copié"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Lien d'invitation copié dans le presse-papiers"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Les liens d'invitation nécessitent un abonnement Team ou Pro. Veuillez mettre à niveau votre espace de travail."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Inviter un membre"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "L'invitation de membres nécessite un forfait d'équipe. Vous serez redirigé pour mettre à niveau votre espace de travail."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Langue"
|
||||
msgid "Launch offer"
|
||||
msgstr "Offre de lancement"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Offre de lancement : obtenez des membres illimités avec Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "Long terme"
|
||||
msgid "Low Priority"
|
||||
msgstr "Priorité basse"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "lien magique"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Priorité moyenne"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Membres"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Membres | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Membres | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensuel"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "facturation mensuelle"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "Aucune carte de crédit requise"
|
||||
msgid "No lists"
|
||||
msgstr "Aucune liste"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "Aucun résultat trouvé pour \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Offre"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possibl
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Une fois que vous supprimez votre espace de travail, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "ou"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Temps partiel"
|
||||
msgid "Password Changed"
|
||||
msgstr "Mot de passe modifié"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Le mot de passe est requis pour se connecter."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Le mot de passe est requis pour s'inscrire."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "Le mot de passe doit comporter au moins 8 caractères"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "Le mot de passe doit comporter au moins 8 caractères"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Les mots de passe ne correspondent pas"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "En pause"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "En pause"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Fréquence de paiement"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "En attente"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Planification"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Veuillez confirmer votre nouveau mot de passe"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Veuillez saisir une adresse e-mail valide"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Veuillez saisir un nom valide"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Veuillez saisir un mot de passe valide"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Veuillez réessayer plus tard ou contacter le service client."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Veuillez réessayer plus tard."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Politique de confidentialité"
|
||||
msgid "Private"
|
||||
msgstr "Privé"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Plan Pro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Plan Pro ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "À distance"
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Supprimer le membre"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Révision"
|
||||
msgid "Roadmap"
|
||||
msgstr "Feuille de route"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Rôle"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Gagnez du temps avec des modèles de tableaux réutilisables."
|
||||
msgid "Screening"
|
||||
msgstr "Présélection"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Rechercher des tableaux et des cartes..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Sélectionner tout"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Paramètres | Intégrations"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Paramètres | Espace de travail"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Partager le lien d'invitation"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Inscription désactivée"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "S'inscrire avec "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Développement logiciel"
|
||||
msgid "Star on Github"
|
||||
msgstr "Étoile sur Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Abonnement requis"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Succès"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Soutenir le développement du projet"
|
||||
msgid "System"
|
||||
msgstr "Système"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Forfait d'équipe"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Passer à Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Passer à Pro (29 $/mois)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Passer au forfait d'équipe"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "L'URL doit comporter au moins 3 caractères"
|
||||
msgid "Use template"
|
||||
msgstr "Utiliser le modèle"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Utilisateur"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "L'utilisateur est déjà membre de cet espace de travail"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Vous pouvez inviter des membres de l'équipe en cliquant sur le bouton \
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Vous pouvez auto-héberger en suivant les instructions dans notre <0>dépôt</0>."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Vous vous êtes connecté avec succès."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Vous vous êtes inscrit avec succès."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "Vous disposez de places illimitées avec votre Plan Pro. Il n'y a pas de frais supplémentaires pour les nouveaux membres !"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,12 +36,12 @@ msgstr "{0} etichette"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/mese"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/mese"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Aggiungi etichetta"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Aggiungi membro"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "ha aggiunto l'elemento <0>{0}</0> alla checklist"
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "ha aggiunto l'etichetta <0>{0}</0>"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "L'aggiunta di un nuovo membro costerà un supplemento di {price} ({billingType}) per posto."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Si è verificato un errore durante la disconnessione del tuo account Tre
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Si è verificato un errore imprevisto. Riprova più tardi."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Chiunque abbia questo link può unirsi al tuo spazio di lavoro"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Backlog"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Kanban base"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "fatturato annualmente"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "fatturato mensilmente"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Contattaci"
|
||||
msgid "Content Creation"
|
||||
msgstr "Creazione contenuti"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Continua con "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Continua con {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Crea carta"
|
||||
msgid "Create checklist"
|
||||
msgstr "Crea checklist"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Crea link di invito"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Crea etichetta"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Crea nuova lista"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Crea spazio di lavoro"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Assistenza clienti"
|
||||
msgid "Dark"
|
||||
msgstr "Scuro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Disattiva link di invito"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Modifica URL dell'area di lavoro"
|
||||
msgid "Editing"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "email"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Inserisci la tua password attuale"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Inserisci la tua password attuale e scegli una nuova password sicura."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Inserisci il tuo indirizzo email"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Inserisci il tuo nome"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Inserisci il tuo nome"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Inserisci la tua nuova password"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Inserisci la tua password"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Errore"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Errore durante il cambio della password"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Errore durante la creazione del link di invito"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Errore durante la disattivazione del link di invito"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Errore durante l'eliminazione dell'area di lavoro"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Errore durante la disconnessione da Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Errore durante l'invito del membro"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Errore durante l'aggiornamento del nome dell'area di lavoro"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Errore nell'aggiornamento dell'abbonamento"
|
||||
@@ -828,12 +820,12 @@ msgstr "Esecuzione"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Impossibile accettare l'invito. Riprova più tardi o contatta l'assistenza clienti."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Impossibile copiare il link di invito"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Accesso con {0} fallito. Riprova."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni pr
|
||||
msgid "Free"
|
||||
msgstr "Gratuito"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Piano gratuito"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Importazione da Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Importare le tue bacheche Trello in Kan è facile. Puoi seguire la nostra guida passo-passo <0>qui</0>."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "in"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,7 +1035,7 @@ msgstr "Integrazioni"
|
||||
msgid "Interviewing"
|
||||
msgstr "Colloquio"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Indirizzo email non valido"
|
||||
|
||||
@@ -1055,28 +1043,24 @@ msgstr "Indirizzo email non valido"
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Invito non valido"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Invita"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Link di invito copiato"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Link di invito copiato negli appunti"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "I link di invito richiedono un abbonamento Team o Pro. Per favore aggiorna il tuo spazio di lavoro."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Invita membro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "L'invito di membri richiede un Piano Team. Sarai reindirizzato per aggiornare il tuo spazio di lavoro."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Lingua"
|
||||
msgid "Launch offer"
|
||||
msgstr "Offerta di lancio"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Offerta di lancio: ottieni membri illimitati con Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "A lungo termine"
|
||||
msgid "Low Priority"
|
||||
msgstr "Bassa priorità"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "link magico"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Media priorità"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Membri"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Membri | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Membri | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensile"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "fatturazione mensile"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "Nessuna carta di credito richiesta"
|
||||
msgid "No lists"
|
||||
msgstr "Nessuna lista"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "Nessun risultato trovato per \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Offerta"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Una volta eliminata l'area di lavoro, non si può tornare indietro. Questa azione non può essere annullata."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "o"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Part-time"
|
||||
msgid "Password Changed"
|
||||
msgstr "Password modificata"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "La password è necessaria per accedere."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "La password è necessaria per registrarsi."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "La password deve contenere almeno 8 caratteri"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "La password deve contenere almeno 8 caratteri"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Le password non corrispondono"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "In pausa"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "In pausa"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Frequenza di pagamento"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "In attesa"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Pianificazione"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Conferma la tua nuova password"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Inserisci un indirizzo email valido"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Inserisci un nome valido"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Inserisci una password valida"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Seleziona un file da caricare."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Seleziona un file da caricare."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Riprova più tardi o contatta l'assistenza clienti."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Riprova più tardi."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Informativa sulla privacy"
|
||||
msgid "Private"
|
||||
msgstr "Privato"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Piano Pro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Piano Pro ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "Remoto"
|
||||
msgid "Remove"
|
||||
msgstr "Rimuovi"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Rimuovi membro"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Revisione"
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Ruolo"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Risparmia tempo con modelli di bacheca riutilizzabili."
|
||||
msgid "Screening"
|
||||
msgstr "Selezione"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Cerca bacheche e schede..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Seleziona tutto"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Impostazioni | Integrazioni"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Impostazioni | Area di lavoro"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Condividi link di invito"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Registrazione disabilitata"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Registrati con "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Sviluppo software"
|
||||
msgid "Star on Github"
|
||||
msgstr "Metti una stella su Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Abbonamento richiesto"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Operazione riuscita"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Sostieni lo sviluppo del progetto"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Piano Team"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Passa a Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Passa a Pro ($29/mese)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Passa al Piano Team"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "L'URL deve contenere almeno 3 caratteri"
|
||||
msgid "Use template"
|
||||
msgstr "Usa template"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Utente"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "L'utente è già membro di questo spazio di lavoro"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Puoi invitare i membri del team cliccando sul pulsante \"Invita\" nell'a
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>repo</0>."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Hai effettuato l'accesso con successo."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Ti sei registrato con successo."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "Hai posti illimitati con il tuo Piano Pro. Non ci sono costi aggiuntivi per i nuovi membri!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,12 +36,12 @@ msgstr "{0} labels"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/maand"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/maand"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Label toevoegen"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Lid toevoegen"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "heeft label <0>{0}</0> toegevoegd"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Het toevoegen van een nieuw lid kost een extra {price} ({billingType}) per plaats."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Tre
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Er is een onverwachte fout opgetreden. Probeer het later opnieuw."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Iedereen met deze link kan deelnemen aan je werkruimte"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Backlog"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Basis kanban"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "jaarlijks gefactureerd"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "maandelijks gefactureerd"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Neem contact op"
|
||||
msgid "Content Creation"
|
||||
msgstr "Content creatie"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Doorgaan met "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Doorgaan met {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Maak kaart"
|
||||
msgid "Create checklist"
|
||||
msgstr "Checklist maken"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Uitnodigingslink maken"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Maak label"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Maak nieuwe lijst"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Werkruimte maken"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Klantenservice"
|
||||
msgid "Dark"
|
||||
msgstr "Donker"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Uitnodigingslink deactiveren"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Werkruimte-URL bewerken"
|
||||
msgid "Editing"
|
||||
msgstr "Bewerken"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "e-mail"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "E-mail"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Voer je huidige wachtwoord in"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Voer je huidige wachtwoord in en kies een nieuw veilig wachtwoord."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Voer je e-mailadres in"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Voer je naam in"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Voer je naam in"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Voer je nieuwe wachtwoord in"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Voer je wachtwoord in"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Fout"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Fout"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Fout bij wijzigen wachtwoord"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Fout bij het maken van uitnodigingslink"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Fout bij het deactiveren van uitnodigingslink"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Fout bij verwijderen werkruimte"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Fout bij ontkoppelen van Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Fout bij het uitnodigen van lid"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Fout bij bijwerken naam werkruimte"
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Fout bij het bijwerken van werkruimte-URL"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Fout bij het upgraden van abonnement"
|
||||
@@ -828,12 +820,12 @@ msgstr "Uitvoering"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Uitnodiging accepteren mislukt. Probeer het later opnieuw of neem contact op met de klantenservice."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Kopiëren van uitnodigingslink mislukt"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open sourc
|
||||
msgid "Free"
|
||||
msgstr "Gratis"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Gratis plan"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Importeren vanuit Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Het importeren van je Trello-borden naar Kan is eenvoudig. Je kunt onze stap-voor-stap handleiding <0>hier</0> volgen."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "in"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,7 +1035,7 @@ msgstr "Integraties"
|
||||
msgid "Interviewing"
|
||||
msgstr "Interviewen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Ongeldig e-mailadres"
|
||||
|
||||
@@ -1055,28 +1043,24 @@ msgstr "Ongeldig e-mailadres"
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Ongeldige uitnodiging"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Uitnodigen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Uitnodigingslink gekopieerd"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Uitnodigingslink gekopieerd naar klembord"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Uitnodigingslinks vereisen een Team- of Pro-abonnement. Upgrade je werkruimte."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Lid uitnodigen"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Voor het uitnodigen van leden is een teamplan vereist. Je wordt doorgestuurd om je werkruimte te upgraden."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Taal"
|
||||
msgid "Launch offer"
|
||||
msgstr "Introductieaanbieding"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Lanceringsaanbieding: krijg onbeperkt aantal leden met Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "Lange termijn"
|
||||
msgid "Low Priority"
|
||||
msgstr "Lage prioriteit"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "magische link"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Gemiddelde prioriteit"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Leden"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Leden | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Leden | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Maandelijks"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "maandelijkse facturering"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "Geen creditcard vereist"
|
||||
msgid "No lists"
|
||||
msgstr "Geen lijsten"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "Geen resultaten gevonden voor \"{debouncedQuery}\"."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Aanbod"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan nie
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "Zodra je je werkruimte verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "of"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Deeltijd"
|
||||
msgid "Password Changed"
|
||||
msgstr "Wachtwoord gewijzigd"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Wachtwoord is vereist om in te loggen."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Wachtwoord is vereist om je aan te melden."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "Wachtwoord moet minimaal 8 tekens bevatten"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "Wachtwoord moet minimaal 8 tekens bevatten"
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Wachtwoorden komen niet overeen"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "Gepauzeerd"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "Gepauzeerd"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Betalingsfrequentie"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "In behandeling"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Planning"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Bevestig je nieuwe wachtwoord"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Voer een geldig e-mailadres in"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Voer een geldige naam in"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Voer een geldig wachtwoord in"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Selecteer een bestand om te uploaden."
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Selecteer een bestand om te uploaden."
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Probeer het later opnieuw."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Privacybeleid"
|
||||
msgid "Private"
|
||||
msgstr "Privé"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Pro Plan"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Pro Plan ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "Op afstand"
|
||||
msgid "Remove"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Lid verwijderen"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Beoordeling"
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Rol"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Bespaar tijd met herbruikbare bordsjablonen."
|
||||
msgid "Screening"
|
||||
msgstr "Screening"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Zoek in borden en kaarten..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Alles selecteren"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Instellingen | Integraties"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Instellingen | Werkruimte"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Uitnodigingslink delen"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Registreren uitgeschakeld"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Registreren met "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Softwareontwikkeling"
|
||||
msgid "Star on Github"
|
||||
msgstr "Star op Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Abonnement vereist"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Geslaagd"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Ondersteun de ontwikkeling van het project"
|
||||
msgid "System"
|
||||
msgstr "Systeem"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Teamplan"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Upgraden naar Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Upgrade naar Pro ($29/maand)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Upgraden naar teamplan"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "URL moet minimaal 3 tekens lang zijn"
|
||||
msgid "Use template"
|
||||
msgstr "Sjabloon gebruiken"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Gebruiker"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "Gebruiker is al lid van deze werkruimte"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Je kunt teamleden uitnodigen door op de knop \"Uitnodigen\" in de rechte
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Je bent succesvol ingelogd."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Je bent succesvol geregistreerd."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "Je hebt onbeperkte plaatsen met je Pro Plan. Er zijn geen extra kosten voor nieuwe leden!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,12 +36,12 @@ msgstr "{0} метки"
|
||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||
msgstr "{boardCount, plural, one {Импортировать доску (1)} other {Импортировать доски ({boardCount})}}"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:146
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
msgid "$10/month"
|
||||
msgstr "$10/месяц"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:170
|
||||
#: src/views/members/components/InviteMemberForm.tsx:158
|
||||
msgid "$8/month"
|
||||
msgstr "$8/месяц"
|
||||
|
||||
@@ -101,7 +101,7 @@ msgid "Add label"
|
||||
msgstr "Добавить метку"
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:130
|
||||
#: src/views/members/components/InviteMemberForm.tsx:250
|
||||
#: src/views/members/components/InviteMemberForm.tsx:238
|
||||
msgid "Add member"
|
||||
msgstr "Добавить участника"
|
||||
|
||||
@@ -136,7 +136,7 @@ msgstr "добавлен элемент контрольного списка <0
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "добавлена метка <0>{0}</0>"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:320
|
||||
#: src/views/members/components/InviteMemberForm.tsx:306
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Добавление нового участника будет стоить дополнительно {price} ({billingType}) за место."
|
||||
|
||||
@@ -164,7 +164,7 @@ msgstr "Произошла ошибка при отключении вашего
|
||||
msgid "An unexpected error occurred. Please try again later."
|
||||
msgstr "Произошла непредвиденная ошибка. Пожалуйста, попробуйте позже."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:304
|
||||
#: src/views/members/components/InviteMemberForm.tsx:290
|
||||
msgid "Anyone with this link can join your workspace"
|
||||
msgstr "Любой, у кого есть эта ссылка, может присоединиться к вашему рабочему пространству"
|
||||
|
||||
@@ -250,11 +250,11 @@ msgstr "Бэклог"
|
||||
msgid "Basic Kanban"
|
||||
msgstr "Базовый Канбан"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed annually"
|
||||
msgstr "выставляется счет ежегодно"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:171
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
msgid "billed monthly"
|
||||
msgstr "выставляется счет ежемесячно"
|
||||
|
||||
@@ -463,12 +463,12 @@ msgstr "Свяжитесь с нами"
|
||||
msgid "Content Creation"
|
||||
msgstr "Создание контента"
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Continue with "
|
||||
msgstr "Продолжить с "
|
||||
|
||||
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
|
||||
#: src/components/AuthForm.tsx:348
|
||||
#: src/components/AuthForm.tsx:301
|
||||
msgid "Continue with {0}"
|
||||
msgstr "Продолжить с {0}"
|
||||
|
||||
@@ -498,10 +498,6 @@ msgstr "Создать карточку"
|
||||
msgid "Create checklist"
|
||||
msgstr "Создать чек-лист"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:342
|
||||
msgid "Create invite link"
|
||||
msgstr "Создать ссылку-приглашение"
|
||||
|
||||
#: src/components/LabelForm.tsx:238
|
||||
msgid "Create label"
|
||||
msgstr "Создать метку"
|
||||
@@ -528,7 +524,7 @@ msgid "Create new list"
|
||||
msgstr "Создать новый список"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/WorkspaceMenu.tsx:116
|
||||
msgid "Create workspace"
|
||||
msgstr "Создать рабочее пространство"
|
||||
|
||||
@@ -569,10 +565,6 @@ msgstr "Служба поддержки"
|
||||
msgid "Dark"
|
||||
msgstr "Тёмный"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Deactivate invite link"
|
||||
msgstr "Деактивировать ссылку-приглашение"
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
||||
#: src/components/LabelForm.tsx:228
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
@@ -705,11 +697,11 @@ msgstr "Редактировать URL рабочей области"
|
||||
msgid "Editing"
|
||||
msgstr "Редактирование"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:372
|
||||
msgid "email"
|
||||
msgstr "email"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:265
|
||||
#: src/views/members/components/InviteMemberForm.tsx:252
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
@@ -725,11 +717,11 @@ msgstr "Введите ваш текущий пароль"
|
||||
msgid "Enter your current password and choose a new secure password."
|
||||
msgstr "Введите ваш текущий пароль и выберите новый безопасный пароль."
|
||||
|
||||
#: src/components/AuthForm.tsx:384
|
||||
#: src/components/AuthForm.tsx:337
|
||||
msgid "Enter your email address"
|
||||
msgstr "Введите ваш адрес электронной почты"
|
||||
|
||||
#: src/components/AuthForm.tsx:372
|
||||
#: src/components/AuthForm.tsx:325
|
||||
msgid "Enter your name"
|
||||
msgstr "Введите ваше имя"
|
||||
|
||||
@@ -737,11 +729,11 @@ msgstr "Введите ваше имя"
|
||||
msgid "Enter your new password"
|
||||
msgstr "Введите ваш новый пароль"
|
||||
|
||||
#: src/components/AuthForm.tsx:397
|
||||
#: src/components/AuthForm.tsx:350
|
||||
msgid "Enter your password"
|
||||
msgstr "Введите ваш пароль"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:196
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
@@ -749,11 +741,11 @@ msgstr "Ошибка"
|
||||
msgid "Error Changing Password"
|
||||
msgstr "Ошибка при изменении пароля"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:128
|
||||
#: src/views/members/components/InviteMemberForm.tsx:117
|
||||
msgid "Error creating invite link"
|
||||
msgstr "Ошибка при создании ссылки приглашения"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:144
|
||||
#: src/views/members/components/InviteMemberForm.tsx:132
|
||||
msgid "Error deactivating invite link"
|
||||
msgstr "Ошибка при деактивации ссылки приглашения"
|
||||
|
||||
@@ -773,8 +765,8 @@ msgstr "Ошибка при удалении рабочей области"
|
||||
msgid "Error disconnecting Trello"
|
||||
msgstr "Ошибка при отключении Trello"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:97
|
||||
#: src/views/members/components/InviteMemberForm.tsx:103
|
||||
#: src/views/members/components/InviteMemberForm.tsx:95
|
||||
#: src/views/members/components/InviteMemberForm.tsx:101
|
||||
msgid "Error inviting member"
|
||||
msgstr "Ошибка при приглашении участника"
|
||||
|
||||
@@ -798,7 +790,7 @@ msgstr "Ошибка при обновлении имени рабочей об
|
||||
msgid "Error updating workspace URL"
|
||||
msgstr "Ошибка при обновлении URL рабочей области"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:233
|
||||
#: src/views/members/components/InviteMemberForm.tsx:221
|
||||
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
|
||||
msgid "Error upgrading subscription"
|
||||
msgstr "Ошибка при обновлении подписки"
|
||||
@@ -828,12 +820,12 @@ msgstr "Выполнение"
|
||||
msgid "Failed to accept invitation. Please try again later, or contact customer support."
|
||||
msgstr "Не удалось принять приглашение. Пожалуйста, попробуйте позже или свяжитесь со службой поддержки."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:197
|
||||
msgid "Failed to copy invite link"
|
||||
msgstr "Не удалось скопировать ссылку приглашения"
|
||||
|
||||
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
|
||||
#: src/components/AuthForm.tsx:288
|
||||
#: src/components/AuthForm.tsx:273
|
||||
msgid "Failed to login with {0}. Please try again."
|
||||
msgstr "Не удалось войти с {0}. Пожалуйста, попробуйте снова."
|
||||
|
||||
@@ -881,8 +873,8 @@ msgstr "Для долгосрочной устойчивости мы призн
|
||||
msgid "Free"
|
||||
msgstr "Бесплатно"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:326
|
||||
#: src/views/members/index.tsx:209
|
||||
#: src/views/members/components/InviteMemberForm.tsx:312
|
||||
#: src/views/members/index.tsx:208
|
||||
msgid "Free Plan"
|
||||
msgstr "Бесплатный план"
|
||||
|
||||
@@ -1024,10 +1016,6 @@ msgstr "Импорт из Trello"
|
||||
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
|
||||
msgstr "Импортировать ваши доски Trello в Kan легко. Вы можете следовать нашему пошаговому руководству <0>здесь</0>."
|
||||
|
||||
#: src/components/CommandPallette.tsx:168
|
||||
msgid "in"
|
||||
msgstr "в"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:16
|
||||
#: src/views/boards/components/TemplateBoards.tsx:22
|
||||
#: src/views/boards/components/TemplateBoards.tsx:45
|
||||
@@ -1047,7 +1035,7 @@ msgstr "Интеграции"
|
||||
msgid "Interviewing"
|
||||
msgstr "Собеседование"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:51
|
||||
#: src/views/members/components/InviteMemberForm.tsx:49
|
||||
msgid "Invalid email address"
|
||||
msgstr "Недействительный адрес электронной почты"
|
||||
|
||||
@@ -1055,28 +1043,24 @@ msgstr "Недействительный адрес электронной по
|
||||
msgid "Invalid invitation"
|
||||
msgstr "Недействительное приглашение"
|
||||
|
||||
#: src/views/members/index.tsx:222
|
||||
#: src/views/members/index.tsx:221
|
||||
msgid "Invite"
|
||||
msgstr "Пригласить"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:202
|
||||
#: src/views/members/components/InviteMemberForm.tsx:190
|
||||
msgid "Invite link copied"
|
||||
msgstr "Ссылка приглашения скопирована"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:203
|
||||
#: src/views/members/components/InviteMemberForm.tsx:191
|
||||
msgid "Invite link copied to clipboard"
|
||||
msgstr "Ссылка приглашения скопирована в буфер обмена"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
|
||||
msgstr "Ссылки для приглашений требуют подписки Team или Pro. Пожалуйста, обновите ваше рабочее пространство."
|
||||
|
||||
#: src/views/card/components/MemberSelector.tsx:111
|
||||
#: src/views/members/components/InviteMemberForm.tsx:365
|
||||
#: src/views/members/components/InviteMemberForm.tsx:350
|
||||
msgid "Invite member"
|
||||
msgstr "Пригласить участника"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:329
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Для приглашения участников необходим командный план. Вы будете перенаправлены для обновления вашего рабочего пространства."
|
||||
|
||||
@@ -1125,7 +1109,7 @@ msgstr "Язык"
|
||||
msgid "Launch offer"
|
||||
msgstr "Стартовое предложение"
|
||||
|
||||
#: src/views/members/index.tsx:192
|
||||
#: src/views/members/index.tsx:191
|
||||
msgid "Launch offer: Get unlimited members with Pro"
|
||||
msgstr "Стартовое предложение: получите неограниченное количество участников с Pro"
|
||||
|
||||
@@ -1177,7 +1161,7 @@ msgstr "Долгосрочный"
|
||||
msgid "Low Priority"
|
||||
msgstr "Низкий приоритет"
|
||||
|
||||
#: src/components/AuthForm.tsx:418
|
||||
#: src/components/AuthForm.tsx:373
|
||||
msgid "magic link"
|
||||
msgstr "магическая ссылка"
|
||||
|
||||
@@ -1198,12 +1182,12 @@ msgstr "Средний приоритет"
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:357
|
||||
#: src/views/card/index.tsx:125
|
||||
#: src/views/members/index.tsx:179
|
||||
#: src/views/members/index.tsx:178
|
||||
msgid "Members"
|
||||
msgstr "Участники"
|
||||
|
||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||
#: src/views/members/index.tsx:174
|
||||
#: src/views/members/index.tsx:173
|
||||
msgid "Members | {0}"
|
||||
msgstr "Участники | {0}"
|
||||
|
||||
@@ -1211,7 +1195,7 @@ msgstr "Участники | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Ежемесячно"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:159
|
||||
#: src/views/members/components/InviteMemberForm.tsx:147
|
||||
msgid "monthly billing"
|
||||
msgstr "ежемесячная оплата"
|
||||
|
||||
@@ -1307,10 +1291,6 @@ msgstr "Кредитная карта не требуется"
|
||||
msgid "No lists"
|
||||
msgstr "Нет списков"
|
||||
|
||||
#: src/components/CommandPallette.tsx:184
|
||||
msgid "No results found for \"{debouncedQuery}\"."
|
||||
msgstr "Результаты для запроса \"{debouncedQuery}\" не найдены."
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:65
|
||||
msgid "Offer"
|
||||
msgstr "Предложение"
|
||||
@@ -1327,7 +1307,7 @@ msgstr "После удаления аккаунта возврат будет
|
||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||
msgstr "После удаления рабочего пространства возврат будет невозможен. Это действие необратимо."
|
||||
|
||||
#: src/components/AuthForm.tsx:362
|
||||
#: src/components/AuthForm.tsx:315
|
||||
msgid "or"
|
||||
msgstr "или"
|
||||
|
||||
@@ -1347,14 +1327,6 @@ msgstr "Частичная занятость"
|
||||
msgid "Password Changed"
|
||||
msgstr "Пароль изменён"
|
||||
|
||||
#: src/components/AuthForm.tsx:255
|
||||
msgid "Password is required to login."
|
||||
msgstr "Пароль необходим для входа."
|
||||
|
||||
#: src/components/AuthForm.tsx:254
|
||||
msgid "Password is required to sign up."
|
||||
msgstr "Пароль необходим для регистрации."
|
||||
|
||||
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
|
||||
msgid "Password must be at least 8 characters"
|
||||
msgstr "Пароль должен содержать не менее 8 символов"
|
||||
@@ -1363,7 +1335,7 @@ msgstr "Пароль должен содержать не менее 8 симв
|
||||
msgid "Passwords do not match"
|
||||
msgstr "Пароли не совпадают"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Paused"
|
||||
msgstr "Приостановлено"
|
||||
|
||||
@@ -1371,7 +1343,7 @@ msgstr "Приостановлено"
|
||||
msgid "Payment frequency"
|
||||
msgstr "Частота платежей"
|
||||
|
||||
#: src/views/members/index.tsx:135
|
||||
#: src/views/members/index.tsx:134
|
||||
msgid "Pending"
|
||||
msgstr "В ожидании"
|
||||
|
||||
@@ -1392,15 +1364,15 @@ msgstr "Планирование"
|
||||
msgid "Please confirm your new password"
|
||||
msgstr "Пожалуйста, подтвердите новый пароль"
|
||||
|
||||
#: src/components/AuthForm.tsx:388
|
||||
#: src/components/AuthForm.tsx:341
|
||||
msgid "Please enter a valid email address"
|
||||
msgstr "Пожалуйста, введите действительный адрес электронной почты"
|
||||
|
||||
#: src/components/AuthForm.tsx:376
|
||||
#: src/components/AuthForm.tsx:329
|
||||
msgid "Please enter a valid name"
|
||||
msgstr "Пожалуйста, введите действительное имя"
|
||||
|
||||
#: src/components/AuthForm.tsx:401
|
||||
#: src/components/AuthForm.tsx:354
|
||||
msgid "Please enter a valid password"
|
||||
msgstr "Пожалуйста, введите действительный пароль"
|
||||
|
||||
@@ -1433,8 +1405,8 @@ msgstr "Пожалуйста, выберите файл для загрузки.
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:173
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
#: src/views/members/components/InviteMemberForm.tsx:102
|
||||
#: src/views/members/components/InviteMemberForm.tsx:222
|
||||
#: src/views/settings/components/Avatar.tsx:78
|
||||
#: src/views/settings/components/Avatar.tsx:219
|
||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||
@@ -1447,8 +1419,8 @@ msgstr "Пожалуйста, выберите файл для загрузки.
|
||||
msgid "Please try again later, or contact customer support."
|
||||
msgstr "Пожалуйста, попробуйте позже или свяжитесь со службой поддержки."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:129
|
||||
#: src/views/members/components/InviteMemberForm.tsx:145
|
||||
#: src/views/members/components/InviteMemberForm.tsx:118
|
||||
#: src/views/members/components/InviteMemberForm.tsx:133
|
||||
msgid "Please try again later."
|
||||
msgstr "Пожалуйста, попробуйте позже."
|
||||
|
||||
@@ -1471,11 +1443,11 @@ msgstr "Политика конфиденциальности"
|
||||
msgid "Private"
|
||||
msgstr "Личное"
|
||||
|
||||
#: src/views/members/index.tsx:206
|
||||
#: src/views/members/index.tsx:205
|
||||
msgid "Pro Plan"
|
||||
msgstr "Профессиональный план"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
msgid "Pro Plan ∞"
|
||||
msgstr "Профессиональный план ∞"
|
||||
|
||||
@@ -1519,7 +1491,7 @@ msgstr "Удалённый"
|
||||
msgid "Remove"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: src/views/members/index.tsx:149
|
||||
#: src/views/members/index.tsx:148
|
||||
msgid "Remove member"
|
||||
msgstr "Удалить участника"
|
||||
|
||||
@@ -1571,7 +1543,7 @@ msgstr "Обзор"
|
||||
msgid "Roadmap"
|
||||
msgstr "Дорожная карта"
|
||||
|
||||
#: src/views/members/index.tsx:244
|
||||
#: src/views/members/index.tsx:243
|
||||
msgid "Role"
|
||||
msgstr "Роль"
|
||||
|
||||
@@ -1592,10 +1564,6 @@ msgstr "Экономьте время с помощью шаблонов дос
|
||||
msgid "Screening"
|
||||
msgstr "Отбор"
|
||||
|
||||
#: src/components/CommandPallette.tsx:104
|
||||
msgid "Search boards and cards..."
|
||||
msgstr "Поиск досок и карточек..."
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:274
|
||||
msgid "Select all"
|
||||
msgstr "Выбрать все"
|
||||
@@ -1649,6 +1617,10 @@ msgstr "Настройки | Интеграции"
|
||||
msgid "Settings | Workspace"
|
||||
msgstr "Настройки | Рабочая область"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Share invite link"
|
||||
msgstr "Поделиться ссылкой приглашения"
|
||||
|
||||
#: src/views/home/components/Header.tsx:100
|
||||
#: src/views/home/components/Header.tsx:138
|
||||
msgid "Sign in"
|
||||
@@ -1675,7 +1647,7 @@ msgstr "Регистрация отключена"
|
||||
msgid "Sign up is currently disabled. Please try again later."
|
||||
msgstr "Регистрация в настоящее время отключена. Пожалуйста, попробуйте позже."
|
||||
|
||||
#: src/components/AuthForm.tsx:417
|
||||
#: src/components/AuthForm.tsx:370
|
||||
msgid "Sign up with "
|
||||
msgstr "Зарегистрироваться с "
|
||||
|
||||
@@ -1699,12 +1671,8 @@ msgstr "Разработка программного обеспечения"
|
||||
msgid "Star on Github"
|
||||
msgstr "Поставить звезду на Github"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:122
|
||||
msgid "Subscription Required"
|
||||
msgstr "Требуется подписка"
|
||||
|
||||
#: src/components/AuthForm.tsx:212
|
||||
#: src/components/AuthForm.tsx:229
|
||||
#: src/components/AuthForm.tsx:207
|
||||
#: src/components/AuthForm.tsx:224
|
||||
msgid "Success"
|
||||
msgstr "Успех"
|
||||
|
||||
@@ -1724,8 +1692,8 @@ msgstr "Поддержите развитие проекта"
|
||||
msgid "System"
|
||||
msgstr "Система"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:315
|
||||
#: src/views/members/index.tsx:208
|
||||
#: src/views/members/components/InviteMemberForm.tsx:301
|
||||
#: src/views/members/index.tsx:207
|
||||
msgid "Team Plan"
|
||||
msgstr "Командный план"
|
||||
|
||||
@@ -2008,7 +1976,7 @@ msgstr "Обновить до Pro"
|
||||
msgid "Upgrade to Pro ($29/month)"
|
||||
msgstr "Обновить до Pro ($29/месяц)"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:357
|
||||
#: src/views/members/components/InviteMemberForm.tsx:341
|
||||
msgid "Upgrade to Team Plan"
|
||||
msgstr "Обновить до командного плана"
|
||||
|
||||
@@ -2036,11 +2004,11 @@ msgstr "URL должен содержать не менее 3 символов"
|
||||
msgid "Use template"
|
||||
msgstr "Использовать шаблон"
|
||||
|
||||
#: src/views/members/index.tsx:238
|
||||
#: src/views/members/index.tsx:237
|
||||
msgid "User"
|
||||
msgstr "Пользователь"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:96
|
||||
msgid "User is already a member of this workspace"
|
||||
msgstr "Пользователь уже является участником этого рабочего пространства"
|
||||
|
||||
@@ -2199,15 +2167,15 @@ msgstr "Вы можете пригласить участников команд
|
||||
msgid "You can self-host by following the instructions in our <0>repo</0>."
|
||||
msgstr "Вы можете развернуть собственный хостинг, следуя инструкциям в нашем <0>репозитории</0>."
|
||||
|
||||
#: src/components/AuthForm.tsx:230
|
||||
#: src/components/AuthForm.tsx:225
|
||||
msgid "You have been logged in successfully."
|
||||
msgstr "Вы успешно вошли в систему."
|
||||
|
||||
#: src/components/AuthForm.tsx:213
|
||||
#: src/components/AuthForm.tsx:208
|
||||
msgid "You have been signed up successfully."
|
||||
msgstr "Вы успешно зарегистрировались."
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:319
|
||||
#: src/views/members/components/InviteMemberForm.tsx:305
|
||||
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
|
||||
msgstr "В вашем профессиональном плане неограниченное количество мест. За новых участников дополнительная плата не взимается!"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -39,14 +39,12 @@ export function InviteMemberForm({
|
||||
const [isShareInviteLinkEnabled, setIsShareInviteLinkEnabled] =
|
||||
useState(false);
|
||||
const [inviteLink, setInviteLink] = useState<string>("");
|
||||
const [_isLoadingInviteLink, setIsLoadingInviteLink] = useState(false);
|
||||
const [isLoadingInviteLink, setIsLoadingInviteLink] = useState(false);
|
||||
const [copied, setCopied] = useState(false);
|
||||
const { closeModal } = useModal();
|
||||
const { workspace } = useWorkspace();
|
||||
const { showPopup } = usePopup();
|
||||
|
||||
const isEmailEnabled = env("NEXT_PUBLIC_DISABLE_EMAIL") !== "true";
|
||||
|
||||
const InviteMemberSchema = z.object({
|
||||
email: z.string().email({ message: t`Invalid email address` }),
|
||||
workspacePublicId: z.string(),
|
||||
@@ -68,7 +66,7 @@ export function InviteMemberForm({
|
||||
const refetchBoards = () => utils.board.all.refetch();
|
||||
|
||||
// Fetch active invite link on component mount
|
||||
const { data: activeInviteLink, refetch: _refetchInviteLink } =
|
||||
const { data: activeInviteLink, refetch: refetchInviteLink } =
|
||||
api.member.getActiveInviteLink.useQuery(
|
||||
{ workspacePublicId: workspace.publicId || "" },
|
||||
{ enabled: !!workspace.publicId },
|
||||
@@ -78,7 +76,7 @@ export function InviteMemberForm({
|
||||
useEffect(() => {
|
||||
if (activeInviteLink) {
|
||||
setIsShareInviteLinkEnabled(activeInviteLink.isActive);
|
||||
setInviteLink(activeInviteLink.inviteLink ?? "");
|
||||
setInviteLink(activeInviteLink.inviteLink || "");
|
||||
}
|
||||
}, [activeInviteLink]);
|
||||
|
||||
@@ -113,23 +111,13 @@ export function InviteMemberForm({
|
||||
setInviteLink(data.inviteLink);
|
||||
setIsLoadingInviteLink(false);
|
||||
},
|
||||
onError: (error) => {
|
||||
onError: () => {
|
||||
setIsLoadingInviteLink(false);
|
||||
setIsShareInviteLinkEnabled(false);
|
||||
|
||||
if (error.data?.code === "FORBIDDEN") {
|
||||
showPopup({
|
||||
header: t`Subscription Required`,
|
||||
message: t`Invite links require a Team or Pro subscription. Please upgrade your workspace.`,
|
||||
icon: "error",
|
||||
});
|
||||
} else {
|
||||
showPopup({
|
||||
header: t`Error creating invite link`,
|
||||
message: t`Please try again later.`,
|
||||
icon: "error",
|
||||
});
|
||||
}
|
||||
showPopup({
|
||||
header: t`Error creating invite link`,
|
||||
message: t`Please try again later.`,
|
||||
icon: "error",
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -158,7 +146,7 @@ export function InviteMemberForm({
|
||||
let price = t`$10/month`;
|
||||
let billingType = t`monthly billing`;
|
||||
|
||||
if (teamSubscription?.periodStart && teamSubscription.periodEnd) {
|
||||
if (teamSubscription?.periodStart && teamSubscription?.periodEnd) {
|
||||
const periodStartDate = new Date(teamSubscription.periodStart);
|
||||
const periodEndDate = new Date(teamSubscription.periodEnd);
|
||||
const diffInDays = Math.round(
|
||||
@@ -203,7 +191,7 @@ export function InviteMemberForm({
|
||||
message: t`Invite link copied to clipboard`,
|
||||
icon: "success",
|
||||
});
|
||||
} catch {
|
||||
} catch (error) {
|
||||
showPopup({
|
||||
header: t`Error`,
|
||||
message: t`Failed to copy invite link`,
|
||||
@@ -259,26 +247,24 @@ export function InviteMemberForm({
|
||||
<HiXMark size={18} className="dark:text-dark-9000 text-light-900" />
|
||||
</button>
|
||||
</div>
|
||||
{isEmailEnabled && (
|
||||
<Input
|
||||
id="email"
|
||||
placeholder={t`Email`}
|
||||
disabled={
|
||||
env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
|
||||
!hasTeamSubscription &&
|
||||
!hasProSubscription
|
||||
<Input
|
||||
id="email"
|
||||
placeholder={t`Email`}
|
||||
disabled={
|
||||
env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
|
||||
!hasTeamSubscription &&
|
||||
!hasProSubscription
|
||||
}
|
||||
{...register("email", { required: true })}
|
||||
onKeyDown={async (e) => {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
await handleSubmit(onSubmit)();
|
||||
}
|
||||
{...register("email", { required: true })}
|
||||
onKeyDown={async (e) => {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
await handleSubmit(onSubmit)();
|
||||
}
|
||||
}}
|
||||
errorMessage={errors.email?.message}
|
||||
/>
|
||||
)}
|
||||
{(!isEmailEnabled || (isShareInviteLinkEnabled && inviteLink)) && (
|
||||
}}
|
||||
errorMessage={errors.email?.message}
|
||||
/>
|
||||
{isShareInviteLinkEnabled && inviteLink && (
|
||||
<div className="my-4">
|
||||
<div className="relative">
|
||||
<Input
|
||||
@@ -335,32 +321,31 @@ export function InviteMemberForm({
|
||||
</div>
|
||||
|
||||
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
||||
<Toggle
|
||||
label={
|
||||
isShareInviteLinkEnabled
|
||||
? t`Deactivate invite link`
|
||||
: t`Create invite link`
|
||||
}
|
||||
isChecked={isShareInviteLinkEnabled}
|
||||
disabled={
|
||||
env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
|
||||
!hasTeamSubscription &&
|
||||
!hasProSubscription
|
||||
}
|
||||
onChange={handleInviteLinkToggle}
|
||||
/>
|
||||
{(hasTeamSubscription || hasProSubscription) &&
|
||||
env("NEXT_PUBLIC_KAN_ENV") === "cloud" && (
|
||||
<Toggle
|
||||
label={t`Share invite link`}
|
||||
isChecked={isShareInviteLinkEnabled}
|
||||
onChange={handleInviteLinkToggle}
|
||||
/>
|
||||
)}
|
||||
<div>
|
||||
{env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
|
||||
!hasTeamSubscription &&
|
||||
!hasProSubscription ? (
|
||||
<Button type="button" onClick={handleUpgrade}>
|
||||
<Button
|
||||
type="button"
|
||||
onClick={handleUpgrade}
|
||||
className="inline-flex w-full justify-center rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none dark:bg-dark-1000 dark:text-dark-50"
|
||||
>
|
||||
{t`Upgrade to Team Plan`}
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
type="submit"
|
||||
disabled={inviteMember.isPending || !isEmailEnabled}
|
||||
disabled={inviteMember.isPending || isShareInviteLinkEnabled}
|
||||
isLoading={inviteMember.isPending}
|
||||
className="inline-flex w-full justify-center rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none dark:bg-dark-1000 dark:text-dark-50"
|
||||
>
|
||||
{t`Invite member`}
|
||||
</Button>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import Link from "next/link";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { env } from "next-runtime-env";
|
||||
import { useEffect, useState } from "react";
|
||||
import {
|
||||
HiBolt,
|
||||
HiEllipsisHorizontal,
|
||||
|
||||
@@ -25,9 +25,6 @@ services:
|
||||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||||
- EMAIL_FROM=${EMAIL_FROM}
|
||||
|
||||
# Disable email features entirely (optional)
|
||||
- NEXT_PUBLIC_DISABLE_EMAIL=${NEXT_PUBLIC_DISABLE_EMAIL}
|
||||
|
||||
# S3 storage (optional)
|
||||
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
||||
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
|
||||
|
||||
@@ -362,30 +362,6 @@ export const memberRouter = createTRPCRouter({
|
||||
// Check if user is in workspace
|
||||
await assertUserInWorkspace(ctx.db, userId, workspace.id, "admin");
|
||||
|
||||
// Check subscription for cloud environment
|
||||
if (process.env.NEXT_PUBLIC_KAN_ENV === "cloud") {
|
||||
const subscriptions = await subscriptionRepo.getByReferenceId(
|
||||
ctx.db,
|
||||
workspace.publicId,
|
||||
);
|
||||
|
||||
const activeTeamSubscription = getSubscriptionByPlan(
|
||||
subscriptions,
|
||||
"team",
|
||||
);
|
||||
const activeProSubscription = getSubscriptionByPlan(
|
||||
subscriptions,
|
||||
"pro",
|
||||
);
|
||||
|
||||
if (!activeTeamSubscription && !activeProSubscription) {
|
||||
throw new TRPCError({
|
||||
message: `Invite links require a Team or Pro subscription`,
|
||||
code: "FORBIDDEN",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Deactivate any existing active invite links
|
||||
await inviteLinkRepo.deactivateAllActiveForWorkspace(ctx.db, {
|
||||
workspaceId: workspace.id,
|
||||
|
||||
@@ -409,80 +409,4 @@ export const workspaceRouter = createTRPCRouter({
|
||||
isReserved: workspaceSlug?.type === "reserved",
|
||||
};
|
||||
}),
|
||||
search: protectedProcedure
|
||||
.meta({
|
||||
openapi: {
|
||||
summary: "Search boards and cards in a workspace",
|
||||
method: "GET",
|
||||
path: "/workspaces/{workspacePublicId}/search",
|
||||
description:
|
||||
"Searches for boards and cards by title within a workspace",
|
||||
tags: ["Workspaces"],
|
||||
protect: true,
|
||||
},
|
||||
})
|
||||
.input(
|
||||
z.object({
|
||||
workspacePublicId: z.string().min(12),
|
||||
query: z.string().min(1).max(100),
|
||||
limit: z.number().min(1).max(50).optional().default(20),
|
||||
}),
|
||||
)
|
||||
.output(
|
||||
z.array(
|
||||
z.discriminatedUnion("type", [
|
||||
z.object({
|
||||
publicId: z.string(),
|
||||
title: z.string(),
|
||||
description: z.string().nullable(),
|
||||
slug: z.string(),
|
||||
updatedAt: z.date().nullable(),
|
||||
createdAt: z.date(),
|
||||
type: z.literal("board"),
|
||||
}),
|
||||
z.object({
|
||||
publicId: z.string(),
|
||||
title: z.string(),
|
||||
description: z.string().nullable(),
|
||||
boardPublicId: z.string(),
|
||||
boardName: z.string(),
|
||||
listName: z.string(),
|
||||
updatedAt: z.date().nullable(),
|
||||
createdAt: z.date(),
|
||||
type: z.literal("card"),
|
||||
}),
|
||||
]),
|
||||
),
|
||||
)
|
||||
.query(async ({ ctx, input }) => {
|
||||
const userId = ctx.user?.id;
|
||||
|
||||
if (!userId)
|
||||
throw new TRPCError({
|
||||
message: `User not authenticated`,
|
||||
code: "UNAUTHORIZED",
|
||||
});
|
||||
|
||||
const workspace = await workspaceRepo.getByPublicId(
|
||||
ctx.db,
|
||||
input.workspacePublicId,
|
||||
);
|
||||
|
||||
if (!workspace)
|
||||
throw new TRPCError({
|
||||
message: `Workspace not found`,
|
||||
code: "NOT_FOUND",
|
||||
});
|
||||
|
||||
await assertUserInWorkspace(ctx.db, userId, workspace.id);
|
||||
|
||||
const result = await workspaceRepo.searchBoardsAndCards(
|
||||
ctx.db,
|
||||
workspace.id,
|
||||
input.query,
|
||||
input.limit,
|
||||
);
|
||||
|
||||
return result;
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
CREATE EXTENSION IF NOT EXISTS pg_trgm; --> statement-breakpoint
|
||||
CREATE INDEX IF NOT EXISTS boards_name_trgm_idx ON board USING gin (name gin_trgm_ops);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX IF NOT EXISTS cards_title_trgm_idx ON card USING gin (title gin_trgm_ops);
|
||||
File diff suppressed because it is too large
Load Diff
@@ -113,13 +113,6 @@
|
||||
"when": 1758662398166,
|
||||
"tag": "20250923211958_AddWorkspaceInviteLinks",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 16,
|
||||
"version": "7",
|
||||
"when": 1759356096392,
|
||||
"tag": "20251001220136_AddFuzzySearchSupport",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -95,32 +95,9 @@ export const create = async (
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (duplicateIndices.length > 0) {
|
||||
// Compact indices for this list to sequential values (0..n-1) preserving order
|
||||
await tx.execute(sql`
|
||||
WITH ordered AS (
|
||||
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
|
||||
FROM "card"
|
||||
WHERE "listId" = ${result[0].listId} AND "deletedAt" IS NULL
|
||||
)
|
||||
UPDATE "card" c
|
||||
SET "index" = o.new_index
|
||||
FROM ordered o
|
||||
WHERE c.id = o.id;
|
||||
`);
|
||||
|
||||
// Last resort: verify fix; rollback if duplicates persist
|
||||
const postFixDupes = await tx
|
||||
.select({ index: cards.index, count: countExpr })
|
||||
.from(cards)
|
||||
.where(and(eq(cards.listId, result[0].listId), isNull(cards.deletedAt)))
|
||||
.groupBy(cards.listId, cards.index)
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (postFixDupes.length > 0) {
|
||||
throw new Error(
|
||||
`Invariant violation: duplicate card indices remain after compaction in list ${result[0].listId}`,
|
||||
);
|
||||
}
|
||||
throw new Error(
|
||||
`Duplicate indices found after creating card ${result[0].id}`,
|
||||
);
|
||||
}
|
||||
|
||||
return result[0];
|
||||
@@ -242,95 +219,11 @@ export const bulkCreate = async (
|
||||
importId?: number;
|
||||
}[],
|
||||
) => {
|
||||
if (cardInput.length === 0) return [];
|
||||
|
||||
return db.transaction(async (tx) => {
|
||||
// Group incoming cards by list to compute safe, sequential indices per list
|
||||
const byList = new Map<number, typeof cardInput>();
|
||||
for (const item of cardInput) {
|
||||
const arr = byList.get(item.listId) ?? [];
|
||||
arr.push(item);
|
||||
byList.set(item.listId, arr);
|
||||
}
|
||||
|
||||
const allValuesToInsert: {
|
||||
publicId: string;
|
||||
title: string;
|
||||
description: string;
|
||||
createdBy: string;
|
||||
listId: number;
|
||||
index: number;
|
||||
importId?: number;
|
||||
}[] = [];
|
||||
|
||||
// For each list, append incoming cards after current max index, preserving incoming order
|
||||
for (const [listId, items] of byList.entries()) {
|
||||
const last = await tx.query.cards.findFirst({
|
||||
columns: { index: true },
|
||||
where: and(eq(cards.listId, listId), isNull(cards.deletedAt)),
|
||||
orderBy: [desc(cards.index)],
|
||||
});
|
||||
|
||||
let nextIndex = last ? last.index + 1 : 0;
|
||||
const sorted = [...items].sort((a, b) => a.index - b.index);
|
||||
for (const it of sorted) {
|
||||
allValuesToInsert.push({
|
||||
publicId: it.publicId,
|
||||
title: it.title,
|
||||
description: it.description,
|
||||
createdBy: it.createdBy,
|
||||
listId: it.listId,
|
||||
index: nextIndex++,
|
||||
importId: it.importId,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const inserted = await tx
|
||||
.insert(cards)
|
||||
.values(allValuesToInsert)
|
||||
.returning({ id: cards.id });
|
||||
|
||||
// Post-insert: compact per list if duplicates exist; then verify
|
||||
const countExpr = sql<number>`COUNT(*)`.mapWith(Number);
|
||||
for (const listId of byList.keys()) {
|
||||
const duplicateIndices = await tx
|
||||
.select({ index: cards.index, count: countExpr })
|
||||
.from(cards)
|
||||
.where(and(eq(cards.listId, listId), isNull(cards.deletedAt)))
|
||||
.groupBy(cards.listId, cards.index)
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (duplicateIndices.length > 0) {
|
||||
await tx.execute(sql`
|
||||
WITH ordered AS (
|
||||
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
|
||||
FROM "card"
|
||||
WHERE "listId" = ${listId} AND "deletedAt" IS NULL
|
||||
)
|
||||
UPDATE "card" c
|
||||
SET "index" = o.new_index
|
||||
FROM ordered o
|
||||
WHERE c.id = o.id;
|
||||
`);
|
||||
|
||||
const postFixDupes = await tx
|
||||
.select({ index: cards.index, count: countExpr })
|
||||
.from(cards)
|
||||
.where(and(eq(cards.listId, listId), isNull(cards.deletedAt)))
|
||||
.groupBy(cards.listId, cards.index)
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (postFixDupes.length > 0) {
|
||||
throw new Error(
|
||||
`Invariant violation: duplicate card indices remain after compaction in list ${listId}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return inserted;
|
||||
const result = await db.insert(cards).values(cardInput).returning({
|
||||
id: cards.id,
|
||||
});
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
export const createCardLabelRelationship = async (
|
||||
@@ -713,53 +606,9 @@ export const reorder = async (
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (duplicateIndices.length > 0) {
|
||||
// Auto-heal by compacting indices for the affected list(s)
|
||||
const affectedListIds = [currentList.id, newList?.id].filter(
|
||||
(id): id is number => id !== undefined,
|
||||
throw new Error(
|
||||
`Duplicate indices found after reordering card ${card.id}`,
|
||||
);
|
||||
|
||||
if (affectedListIds.length === 1) {
|
||||
await tx.execute(sql`
|
||||
WITH ordered AS (
|
||||
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
|
||||
FROM "card"
|
||||
WHERE "listId" = ${affectedListIds[0]} AND "deletedAt" IS NULL
|
||||
)
|
||||
UPDATE "card" c
|
||||
SET "index" = o.new_index
|
||||
FROM ordered o
|
||||
WHERE c.id = o.id;
|
||||
`);
|
||||
} else if (affectedListIds.length === 2) {
|
||||
await tx.execute(sql`
|
||||
WITH ordered AS (
|
||||
SELECT id,
|
||||
ROW_NUMBER() OVER (PARTITION BY "listId" ORDER BY "index", id) - 1 AS new_index
|
||||
FROM "card"
|
||||
WHERE "listId" IN (${sql.join(affectedListIds, sql`,`)}) AND "deletedAt" IS NULL
|
||||
)
|
||||
UPDATE "card" c
|
||||
SET "index" = o.new_index
|
||||
FROM ordered o
|
||||
WHERE c.id = o.id;
|
||||
`);
|
||||
}
|
||||
|
||||
// Verify fix and rollback if necessary
|
||||
const postFixDupes = await tx
|
||||
.select({ index: cards.index, count: countExpr })
|
||||
.from(cards)
|
||||
.where(
|
||||
and(inArray(cards.listId, affectedListIds), isNull(cards.deletedAt)),
|
||||
)
|
||||
.groupBy(cards.listId, cards.index)
|
||||
.having(gt(countExpr, 1));
|
||||
|
||||
if (postFixDupes.length > 0) {
|
||||
throw new Error(
|
||||
`Invariant violation: duplicate card indices remain after compaction for card ${card.id}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const updatedCard = await tx.query.cards.findFirst({
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
import { and, desc, eq, ilike, inArray, isNull, or, sql } from "drizzle-orm";
|
||||
import { and, eq, inArray, isNull } from "drizzle-orm";
|
||||
|
||||
import type { dbClient } from "@kan/db/client";
|
||||
import {
|
||||
boards,
|
||||
cards,
|
||||
lists,
|
||||
workspaceMembers,
|
||||
workspaces,
|
||||
} from "@kan/db/schema";
|
||||
import { boards, workspaceMembers, workspaces } from "@kan/db/schema";
|
||||
import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
export const create = async (
|
||||
@@ -280,84 +274,3 @@ export const isUserInWorkspace = async (
|
||||
|
||||
return result?.id !== undefined;
|
||||
};
|
||||
|
||||
export const searchBoardsAndCards = async (
|
||||
db: dbClient,
|
||||
workspaceId: number,
|
||||
query: string,
|
||||
limit = 20,
|
||||
) => {
|
||||
const searchQuery = `%${query}%`;
|
||||
|
||||
// Search for boards
|
||||
const boardResults = await db
|
||||
.select({
|
||||
publicId: boards.publicId,
|
||||
title: boards.name,
|
||||
description: boards.description,
|
||||
slug: boards.slug,
|
||||
updatedAt: boards.updatedAt,
|
||||
createdAt: boards.createdAt,
|
||||
})
|
||||
.from(boards)
|
||||
.where(
|
||||
and(
|
||||
eq(boards.workspaceId, workspaceId),
|
||||
// Combine exact and fuzzy matching
|
||||
or(
|
||||
ilike(boards.name, `%${query}%`), // Exact substring match
|
||||
sql`similarity(${boards.name}, ${query}) > 0.2`, // Fuzzy match
|
||||
),
|
||||
isNull(boards.deletedAt),
|
||||
),
|
||||
)
|
||||
.orderBy(
|
||||
sql`CASE WHEN ${boards.name} ILIKE ${`%${query}%`} THEN 1 ELSE 0 END DESC`,
|
||||
sql`similarity(${boards.name}, ${query}) DESC`,
|
||||
desc(boards.updatedAt),
|
||||
)
|
||||
.limit(Math.ceil(limit * 0.4));
|
||||
|
||||
// Search for cards
|
||||
const cardResults = await db
|
||||
.select({
|
||||
publicId: cards.publicId,
|
||||
title: cards.title,
|
||||
description: cards.description,
|
||||
boardPublicId: boards.publicId,
|
||||
boardName: boards.name,
|
||||
listName: lists.name,
|
||||
updatedAt: cards.updatedAt,
|
||||
createdAt: cards.createdAt,
|
||||
})
|
||||
.from(cards)
|
||||
.innerJoin(lists, eq(cards.listId, lists.id))
|
||||
.innerJoin(boards, eq(lists.boardId, boards.id))
|
||||
.where(
|
||||
and(
|
||||
eq(boards.workspaceId, workspaceId),
|
||||
or(
|
||||
ilike(cards.title, searchQuery),
|
||||
sql`similarity(${cards.title}, ${query}) > 0.2`,
|
||||
),
|
||||
isNull(cards.deletedAt),
|
||||
isNull(lists.deletedAt),
|
||||
isNull(boards.deletedAt),
|
||||
),
|
||||
)
|
||||
.orderBy(
|
||||
sql`CASE WHEN ${cards.title} ILIKE ${searchQuery} THEN 1 ELSE 0 END DESC`,
|
||||
sql`similarity(${cards.title}, ${query}) DESC`,
|
||||
desc(cards.updatedAt),
|
||||
)
|
||||
.limit(Math.floor(limit * 0.6));
|
||||
|
||||
// Combine results
|
||||
const allResults = [
|
||||
...boardResults.map((board) => ({ ...board, type: "board" as const })),
|
||||
...cardResults.map((card) => ({ ...card, type: "card" as const })),
|
||||
];
|
||||
|
||||
// Ensure we don't exceed the total limit
|
||||
return allResults.slice(0, limit);
|
||||
};
|
||||
|
||||
@@ -89,7 +89,6 @@
|
||||
"APPLE_CLIENT_ID",
|
||||
"APPLE_CLIENT_SECRET",
|
||||
"APPLE_APP_BUNDLE_IDENTIFIER",
|
||||
"NEXT_PUBLIC_DISABLE_EMAIL",
|
||||
"EMAIL_FROM",
|
||||
"SMTP_HOST",
|
||||
"SMTP_PORT",
|
||||
|
||||
Reference in New Issue
Block a user