Compare commits

..

1 Commits

Author SHA1 Message Date
Henry
8f11eb0085 fix: missing translation for editor placeholder 2025-08-14 21:36:14 +01:00
42 changed files with 488 additions and 1427 deletions

View File

@@ -138,40 +138,36 @@ pnpm dev
## Environment Variables 🔐
| Variable | Description | Required | Example |
| ----------------------------------------- | -------------------------------------------------------- | ------------------------ | ----------------------------------------------------------- |
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
| `SMTP_PORT` | SMTP server port | For Email | `465` |
| `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_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` |
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
| `OIDC_CLIENT_ID` | Generic OIDC client ID | For OIDC login | `xxx` |
| `OIDC_CLIENT_SECRET` | Generic OIDC client secret | For OIDC login | `xxx` |
| `OIDC_DISCOVERY_URL` | OIDC discovery URL | For OIDC login | `https://auth.example.com/.well-known/openid-configuration` |
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
| `NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY` | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | `true` |
| Variable | Description | Required | Example |
| -------------------------------- | -------------------------------------------------------- | ------------------ | --------------------------------------------- |
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
| `SMTP_PORT` | SMTP server port | For Email | `465` |
| `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_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` |
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
See `.env.example` for a complete list of supported environment variables.

View File

@@ -31,7 +31,6 @@ checksums:
All%20systems%20operational/singular: ee943a4046b09e6334cceeea9fda2bfc
Already%20have%20an%20account%3F%20%3C0%3E%3C1%3ESign%20in%3C%2F1%3E%3C%2F0%3E/singular: 2959fd276248208b65cb27ed46b20135
An%20error%20occurred%20while%20disconnecting%20your%20Trello%20account./singular: 0aa3973b860c1faf8d9123aebf567e40
An%20unexpected%20error%20occurred.%20Please%20try%20again%20later./singular: 1b5749b0cca6a62d75a577bee6804074
API%20keys/singular: 07f3620a30e08136f0b072c9af8d1eef
API%20Reference/singular: 7dcc877064bfdf889ec55dbc9e06a242
Applicants/singular: 4babd8331a1441e91087f855f43e57f8
@@ -68,7 +67,6 @@ checksums:
Cancel/singular: 2e2a849c2223911717de8caa2c71bade
Card%20not%20found/singular: 91509e2f92b0b3b11330b6983139fdbf
Card%20title/singular: 7c34f59f4005e6cb3a6ff546ea0b96e3
Change%20Password/singular: a552fc5c4189ebc3e2e6018edda7d18f
Change%20the%20language%20of%20the%20app./singular: fb20db145e28ed44aba89c146ded7bfc
Check%20your%20inbox/singular: e9a430fcd298def74212238df0f680d6
Checklist%20name/singular: 5eb5de823f7ca5a4d97bb41e6a3f675a
@@ -84,7 +82,6 @@ checksums:
completed%20a%20checklist%20item/singular: 757b04c6c80cc927e1c597c0ad4fda33
completed%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 71ec18acf051fc909a48a07ca3578673
Confirm%20URL%20change/singular: e14b4ce081d1ef6194b37e1814e97b39
Confirm%20your%20new%20password/singular: a0d2935d7b63f8dd19d7c0de47524416
Connect%20Trello/singular: 4440a0b9e387ef7136e3958e7a089213
Connect%20your%20favorite%20tools%20to%20streamline%20your%20workflow./singular: 033c5dcdb059ccb634aef7fe63f2f45d
Connect%20your%20Trello%20account%20to%20import%20boards./singular: 84a510a7485f43e43f2191bd161171d7
@@ -107,7 +104,6 @@ checksums:
Create%20workspace/singular: 2e6718e79964ea5ce22d76c2189c77ca
created%20the%20card/singular: 605475f5aaeb4dbccbf7c4eb9107b43d
Critical/singular: eb327cd411b50aee954f8d1d215d003a
Current%20password%20is%20required/singular: 72536bca9598680027f2be8ce80ac280
Custom%20domain/singular: b09e7a9c187b7163b4a6cfc78042fe42
Custom%20URLs%20are%20a%20premium%20feature.%20You'll%20be%20directed%20to%20upgrade%20your%20account./singular: b52e4f6122cf739c9551d29beb89b25e
Customer%20Support/singular: 50e3c77e22e41061ca85ea2f02625a2e
@@ -144,13 +140,9 @@ checksums:
email/singular: f31eb214738e037d58e26149797739df
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
Enhancement/singular: 785fe23c0eef0a5b60b5b2a88151de31
Enter%20your%20current%20password/singular: bfceabde4c0b6f2cb439015b76549651
Enter%20your%20current%20password%20and%20choose%20a%20new%20secure%20password./singular: 9bb88155b18e98ea799c0e939d16af64
Enter%20your%20email%20address/singular: 9bc008365ebe3e404e241c8ca876f56e
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
Enter%20your%20new%20password/singular: c67251e3002b68bc20a7cf5de23e43ac
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
Error%20Changing%20Password/singular: ebecb5c1b72ba4b063117241f5ba4f2d
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
@@ -252,8 +244,6 @@ checksums:
New%20import/singular: e8fddfe15dd170277df919e5d37efd47
New%20label/singular: 890040da52a88c16c249a4ac78980f81
New%20list/singular: 146c2e642b11056a0b07ed65733e4178
New%20password%20is%20required/singular: f88427a4cca058631199a4384cb5622e
New%20password%20must%20be%20different%20from%20current%20password/singular: db33013fcc6c40995cf8a37deb3d5667
New%20Ticket/singular: 665ff16ec736cba20e8a1b3beb3baa09
New%20workspace/singular: 8eecf05b4ce29aa880adfed2e11476af
Newsletter/singular: dcfb9666301924431ac8ae88e5b6f9d7
@@ -270,15 +260,11 @@ checksums:
Organize%20and%20find%20cards%20quickly%20with%20powerful%20filtering%20tools./singular: 1b9898c4b21e9dff413b4f76dc59db56
Own%20your%20data/singular: cc2178dac4bdf6b07f030cfc2a7510e6
Part-time/singular: 213d63da450f35dabb3ab0e35e29feed
Password%20Changed/singular: 1fcebe9ddb46f722a57f195efddc695d
Password%20must%20be%20at%20least%208%20characters/singular: 4c30501d085eaccea47af34212bb26a7
Passwords%20do%20not%20match/singular: 37ca1f4e0afc9a0b8e9617f767103c92
Payment%20frequency/singular: 63ded0e4ffb462ca8bd33d38e4691d86
Pending/singular: 030a6f3395d5d4efddd3cc67d6009039
per%20user%2Fmonth/singular: 72af182c1ba6df6732640f4d8a78d360
Personal%20Project/singular: d7820b1bf4efecc61ed89234567aaa9c
Planning/singular: 353f58c75248275fe091740607501610
Please%20confirm%20your%20new%20password/singular: 43d0307b9307238cc6c199cfa66caff2
Please%20enter%20a%20valid%20email%20address/singular: 8de4bc8832b11b380bc4cbcedc16e48b
Please%20enter%20a%20valid%20name/singular: f2d741f1b5cae722e35cb5206786f932
Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f
@@ -343,7 +329,6 @@ checksums:
Templates/singular: 8ed62f56c81fa96c0f3182acb331bf63
Terms%20of%20service/singular: 0b8a8b23aff021a6cde79613fdb39c28
Thank%20you%20for%20your%20feedback!/singular: 07edd8c50685a52c0969d711df26d768
The%20current%20password%20you%20entered%20is%20incorrect./singular: 67a76bf346ab4b48563269e9d941a64a
The%20main%20difference%20between%20Kan%20and%20Trello%20is%20that%20Kan%20is%20open%20source%2C%20allowing%20anyone%20to%20view%2C%20modify%2C%20and%20contribute%20to%20our%20code.%20Our%20cloud%20offering%20also%20offers%20no%20restrictions%20on%20features%20for%20individual%20use%2C%20whereas%20Trello%20locks%20basic%20features%20such%20as%20the%20number%20of%20boards%20you%20can%20create%20behind%20a%20paywall./singular: db6e22cc955c5fbe547feedeb48f8719
The%20open%20source%20%3C0%2F%3E%20alternative%20to%20Trello/singular: 692cb2e8a8e610953c996826beed45a2
The%20visibility%20of%20your%20board%20has%20been%20set%20to%20%7B0%7D./singular: 970e17a115f7374e60e0a8ded425db8f
@@ -435,7 +420,6 @@ checksums:
Writing/singular: 4f5f3ee3320c252921f80c42653c5d49
Yearly/singular: 87f43e016c19cb25860f456549a2f431
Yes%2C%20we%20offer%20an%20forever%20free%20plan%20for%20individual%20use.%20No%20restrictions%2C%20no%20paywalls%2C%20no%20limits./singular: 963cee303d0ff13c1719f4575e774fe3
You%20are%20about%20to%20change%20your%20password./singular: df4783d593505766d78c5bc08d3d48ac
You%20can%20get%20a%20custom%20workspace%20URL%2C%20like%20%3C0%3Ekan.bn%2Fkan%3C%2F0%3E%2C%20by%20going%20into%20your%20%3C1%3Eworkspace%20settings%3C%2F1%3E%20and%20purchasing%20a%20pro%20workspace%20subscription.%20All%20subscriptions%20help%20fund%20the%20development%20of%20the%20project!/singular: 41dd145ef56f539e12dc064a9807c660
You%20can%20invite%20team%20members%20by%20clicking%20the%20%22Invite%22%20button%20in%20the%20top%20right%20corner%20of%20the%20%3C0%3Emembers%20page%3C%2F0%3E%20and%20entering%20their%20email%20address.%20They%20will%20receive%20an%20email%20with%20a%20link%20to%20join%20the%20workspace./singular: 47e125eb9b4c11cab5a2f4b3ab08e883
You%20can%20self-host%20by%20following%20the%20instructions%20in%20our%20%3C0%3Erepo%3C%2F0%3E./singular: a6152a41b2d8f64d5a657e5b8bc808a9
@@ -444,7 +428,6 @@ checksums:
Your%20account%20has%20been%20deleted./singular: 8c8d944e07388c5877effdb2c2803dcf
Your%20boards%20have%20been%20imported./singular: 403972e7a25afc2415762c1c2b1ec868
Your%20display%20name%20has%20been%20updated./singular: 15e5fff36c554c16ec5214427fae1bf4
Your%20password%20has%20been%20changed./singular: 8f730f68d52b7efa727aa0784282ebcb
Your%20profile%20image%20has%20been%20updated./singular: 099e1780348cd7bf617721344371a430
Your%20Trello%20account%20has%20been%20disconnected./singular: 126aeeb73f7e4cad338056e4c933f39b
Your%20Trello%20account%20is%20connected./singular: 0499d193001fce2fbec445ae034ce512

View File

@@ -31,12 +31,12 @@ const config = {
images: {
remotePatterns: [
{
protocol: "https",
hostname:
env("S3_FORCE_PATH_STYLE") === "true"
? `${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`
: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
hostname: process.env.S3_FORCE_PATH_STYLE === "true"
? `${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`
: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
},
{
protocol: "http",
@@ -54,16 +54,4 @@ const config = {
},
};
// Only allow external images when OIDC is configured (for OIDC provider avatars)
if (
env("OIDC_CLIENT_ID") &&
env("OIDC_CLIENT_SECRET") &&
env("OIDC_DISCOVERY_URL")
) {
config.images?.remotePatterns?.push({
protocol: "https",
hostname: "**",
});
}
export default config;

View File

@@ -49,7 +49,6 @@
"next": "^15.3.4",
"next-logger": "^5.0.1",
"next-runtime-env": "^1.7.2",
"next-themes": "^0.4.6",
"nextjs-cors": "^2.2.0",
"pino": "^9.6.0",
"posthog-js": "^1.254.0",

View File

@@ -4,7 +4,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, useState } from "react";
import { useState } from "react";
import { useForm } from "react-hook-form";
import {
FaApple,
@@ -16,7 +16,6 @@ import {
FaGoogle,
FaLinkedin,
FaMicrosoft,
FaOpenid,
FaReddit,
FaSpotify,
FaTiktok,
@@ -34,8 +33,6 @@ import Button from "~/components/Button";
import Input from "~/components/Input";
import { usePopup } from "~/providers/popup";
type AuthProvider = SocialProvider | "oidc";
interface FormValues {
name?: string;
email: string;
@@ -144,28 +141,16 @@ const availableSocialProviders = {
name: "Zoom",
icon: SiZoom,
},
oidc: {
id: "oidc",
name: "OIDC",
icon: FaOpenid,
},
};
export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
const [isLoginWithProviderPending, setIsLoginWithProviderPending] =
useState<null | AuthProvider>(null);
const [isCredentialsEnabled, setIsCredentialsEnabled] = useState(false);
useState<null | SocialProvider>(null);
const isCredentialsEnabled =
env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true";
const [isLoginWithEmailPending, setIsLoginWithEmailPending] = useState(false);
const [loginError, setLoginError] = useState<string | null>(null);
const { showPopup } = usePopup();
const oidcProviderName = "OIDC";
// Safely get environment variables on client side to avoid hydration mismatch
useEffect(() => {
const credentialsAllowed =
env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true";
setIsCredentialsEnabled(credentialsAllowed);
}, []);
const {
register,
@@ -241,26 +226,13 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
setIsLoginWithEmailPending(false);
};
const handleLoginWithProvider = async (provider: AuthProvider) => {
const handleLoginWithProvider = async (provider: SocialProvider) => {
setIsLoginWithProviderPending(provider);
setLoginError(null);
let error;
if (provider === "oidc") {
// Use oauth2 signin for OIDC provider
const result = await authClient.signIn.oauth2({
providerId: "oidc",
callbackURL: "/boards",
});
error = result.error;
} else {
// Use social signin for traditional social providers
const result = await authClient.signIn.social({
provider,
callbackURL: "/boards",
});
error = result.error;
}
const { error } = await authClient.signIn.social({
provider,
callbackURL: "/boards",
});
setIsLoginWithProviderPending(null);
@@ -288,16 +260,13 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
return (
<Button
key={key}
onClick={() => handleLoginWithProvider(key as AuthProvider)}
onClick={() => handleLoginWithProvider(key as SocialProvider)}
isLoading={isLoginWithProviderPending === key}
iconLeft={<provider.icon />}
fullWidth
size="lg"
>
<Trans>
Continue with{" "}
{key === "oidc" ? oidcProviderName : provider.name}
</Trans>
<Trans>Continue with {provider.name}</Trans>
</Button>
);
})}

View File

@@ -55,59 +55,51 @@ export default function CheckboxDropdown({
const renderMenuItems = (items: Item[], groupKey: string | null) => (
<>
{items.length > 0 ? (
items.map((item) => (
<Menu.Item key={item.key}>
<div
className="group flex items-center rounded-[5px] p-2 hover:bg-light-200 dark:hover:bg-dark-300"
onClick={(e) => {
e.preventDefault();
handleSelect(groupKey, { key: item.key, value: item.value });
}}
{items.map((item) => (
<Menu.Item key={item.key}>
<div
className="group flex items-center rounded-[5px] p-2 hover:bg-light-200 dark:hover:bg-dark-300"
onClick={(e) => {
e.preventDefault();
handleSelect(groupKey, { key: item.key, value: item.value });
}}
>
<input
id={item.key}
name={item.key}
type="checkbox"
className="h-[14px] w-[14px] rounded bg-transparent"
onClick={(event) => event.stopPropagation()}
onChange={() =>
handleSelect(groupKey, { key: item.key, value: item.value })
}
checked={item.selected}
/>
{item.leftIcon && (
<span className="ml-3 flex items-center">{item.leftIcon}</span>
)}
<label
htmlFor={item.key}
className="ml-3 text-[12px] text-dark-900"
>
<input
id={item.key}
name={item.key}
type="checkbox"
className="h-[14px] w-[14px] rounded bg-transparent"
onClick={(event) => event.stopPropagation()}
onChange={() =>
handleSelect(groupKey, { key: item.key, value: item.value })
}
checked={item.selected}
/>
{item.leftIcon && (
<span className="ml-3 flex items-center">{item.leftIcon}</span>
)}
<label
htmlFor={item.key}
className="ml-3 text-[12px] text-dark-900"
{item.value}
</label>
{handleEdit && (
<button
type="button"
className="invisible ml-auto group-hover:visible"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
handleEdit(item.key);
}}
>
{item.value}
</label>
{handleEdit && (
<button
type="button"
className="invisible ml-auto group-hover:visible"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
handleEdit(item.key);
}}
>
<HiEllipsisHorizontal size={20} className="text-dark-900" />
</button>
)}
</div>
</Menu.Item>
))
) : (
!handleCreate && (
<div className="flex items-center p-2 text-[12px] text-dark-900">
No items
<HiEllipsisHorizontal size={20} className="text-dark-900" />
</button>
)}
</div>
)
)}
</Menu.Item>
))}
{handleCreate && (
<button
type="button"

View File

@@ -10,7 +10,7 @@ import { authClient } from "@kan/auth/client";
import { useClickOutside } from "~/hooks/useClickOutside";
import { useModal } from "~/providers/modal";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
import { WorkspaceProvider } from "~/providers/workspace";
import FeedbackModal from "./FeedbackModal";
import Modal from "./modal";
@@ -41,7 +41,7 @@ export default function Dashboard({
rightPanel,
hasRightPanel = false,
}: DashboardProps) {
const { theme } = useTheme();
const theme = useTheme();
const { modalContentType } = useModal();
const { data: session, isPending: sessionLoading } = authClient.useSession();
@@ -90,7 +90,7 @@ export default function Dashboard({
}
});
const isDarkMode = theme === "dark";
const isDarkMode = theme.activeTheme === "dark";
return (
<>

View File

@@ -31,7 +31,6 @@ export function NewWorkspaceForm() {
description: values.description,
slug: values.slug,
plan: values.plan,
role: "admin",
});
closeModal();
}

View File

@@ -18,7 +18,7 @@ import settingsIconLight from "~/assets/settings-light.json";
import ReactiveButton from "~/components/ReactiveButton";
import UserMenu from "~/components/UserMenu";
import WorkspaceMenu from "~/components/WorkspaceMenu";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
interface SideNavigationProps {
user: UserType;
@@ -59,9 +59,9 @@ export default function SideNavigation({
const { pathname } = router;
const { theme, resolvedTheme } = useTheme();
const { activeTheme } = useTheme();
const isDarkMode = resolvedTheme === "dark";
const isDarkMode = activeTheme === "dark";
const navigation = [
{

View File

@@ -1,22 +1,23 @@
import { CgDarkMode } from "react-icons/cg";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
const ThemeToggle = () => {
const { theme, setTheme } = useTheme();
const { themePreference, switchTheme } = useTheme();
const toggleTheme = () => {
setTheme(theme === "light" ? "dark" : "light");
switchTheme(themePreference === "light" ? "dark" : "light");
};
return (
<button
onClick={toggleTheme}
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
aria-label={`Switch to ${theme === "light" ? "dark" : "light"} theme`}
aria-label={`Switch to ${themePreference === "light" ? "dark" : "light"} theme`}
>
<CgDarkMode
className={`h-4 w-4 text-light-900 transition-transform duration-200 dark:text-dark-900 ${
theme === "dark" ? "rotate-180" : "rotate-0"
themePreference === "dark" ? "rotate-180" : "rotate-0"
}`}
/>
</button>

View File

@@ -10,7 +10,7 @@ import { authClient } from "@kan/auth/client";
import { useIsMobile } from "~/hooks/useMediaQuery";
import { useModal } from "~/providers/modal";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
import { getAvatarUrl } from "~/utils/helpers";
interface UserMenuProps {
@@ -29,7 +29,7 @@ export default function UserMenu({
onCloseSideNav,
}: UserMenuProps) {
const router = useRouter();
const { theme, setTheme } = useTheme();
const { themePreference, switchTheme } = useTheme();
const { openModal } = useModal();
const isMobile = useIsMobile();
@@ -127,12 +127,12 @@ export default function UserMenu({
</div>
<Menu.Item>
<button
onClick={() => setTheme("system")}
onClick={() => switchTheme("system")}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
theme === "system" ? "visible" : "invisible",
themePreference === "system" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
/>
@@ -141,12 +141,12 @@ export default function UserMenu({
</Menu.Item>
<Menu.Item>
<button
onClick={() => setTheme("dark")}
onClick={() => switchTheme("dark")}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
theme === "dark" ? "visible" : "invisible",
themePreference === "dark" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
/>
@@ -155,12 +155,12 @@ export default function UserMenu({
</Menu.Item>
<Menu.Item>
<button
onClick={() => setTheme("light")}
onClick={() => switchTheme("light")}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
theme === "light" ? "visible" : "invisible",
themePreference === "light" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
/>

View File

@@ -24,7 +24,7 @@ export const env = createEnv({
s.split(",").every((l) => z.string().url().safeParse(l).success),
)
.optional(),
POSTGRES_URL: z.string().url().optional().or(z.literal("")),
POSTGRES_URL: z.string().url().optional().or(z.literal('')),
TRELLO_APP_API_KEY: z.string().optional(),
TRELLO_APP_SECRET: z.string().optional(),
STRIPE_SECRET_KEY: z.string().optional(),
@@ -51,10 +51,6 @@ export const env = createEnv({
VK_CLIENT_SECRET: z.string().optional(),
LINKEDIN_CLIENT_ID: z.string().optional(),
LINKEDIN_CLIENT_SECRET: z.string().optional(),
// Generic OIDC Provider
OIDC_CLIENT_ID: z.string().optional(),
OIDC_CLIENT_SECRET: z.string().optional(),
OIDC_DISCOVERY_URL: z.string().optional(),
REDDIT_CLIENT_ID: z.string().optional(),
REDDIT_CLIENT_SECRET: z.string().optional(),
ROBLOX_CLIENT_ID: z.string().optional(),
@@ -105,13 +101,6 @@ export const env = createEnv({
(s) => !s || s.toLowerCase() === "true" || s.toLowerCase() === "false",
)
.optional(),
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY: z
.string()
.transform((s) => (s === "" ? undefined : s))
.refine(
(s) => !s || s.toLowerCase() === "true" || s.toLowerCase() === "false",
)
.optional(),
},
/**
* Destructure all variables from `process.env` to make sure they aren't tree-shaken away.
@@ -130,8 +119,6 @@ export const env = createEnv({
NEXT_PUBLIC_DISABLE_SIGN_UP: process.env.NEXT_PUBLIC_DISABLE_SIGN_UP,
NEXT_PUBLIC_USE_STANDALONE_OUTPUT:
process.env.NEXT_PUBLIC_USE_STANDALONE_OUTPUT,
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY:
process.env.NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY,
},
skipValidation:
!!process.env.CI || process.env.npm_lifecycle_event === "lint",

View File

@@ -23,7 +23,7 @@ msgstr ", oder besuche unsere"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -139,15 +139,11 @@ msgstr "Alle Systeme funktionieren"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
msgid "An unexpected error occurred. Please try again later."
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
#: src/views/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "API-Schlüssel"
@@ -209,12 +205,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Einfaches Kanban"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Abrechnung"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Abrechnungsportal"
@@ -288,7 +284,6 @@ msgstr "Fehlerbericht"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -306,14 +301,7 @@ msgstr "Karte nicht gefunden"
msgid "Card title"
msgstr "Kartentitel"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Passwort ändern"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Ändere die Sprache der App."
@@ -376,11 +364,7 @@ msgstr "hat Checklistenelement <0>{0}</0> abgeschlossen"
msgid "Confirm URL change"
msgstr "URL-Änderung bestätigen"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Bestätigen Sie Ihr neues Passwort"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Trello verbinden"
@@ -389,7 +373,7 @@ msgstr "Trello verbinden"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Verbinde deine Lieblingstools, um deinen Arbeitsablauf zu optimieren."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
@@ -474,10 +458,6 @@ msgstr "hat die Karte erstellt"
msgid "Critical"
msgstr "Kritisch"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "Aktuelles Passwort ist erforderlich"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Benutzerdefinierte Domain"
@@ -502,8 +482,8 @@ msgstr "Dunkel"
msgid "Delete"
msgstr "Löschen"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Konto löschen"
@@ -524,8 +504,8 @@ msgstr "Kommentar löschen"
msgid "Delete list"
msgstr "Liste löschen"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Workspace löschen"
@@ -552,7 +532,7 @@ msgstr "hat Checklistenelement <0>{0}</0> gelöscht"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Trello trennen"
@@ -560,7 +540,7 @@ msgstr "Trello trennen"
msgid "Discuss and collaborate on cards."
msgstr "Diskutiere und arbeite gemeinsam an Karten."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Anzeigename"
@@ -638,14 +618,6 @@ msgstr "E-Mail"
msgid "Enhancement"
msgstr "Verbesserung"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Geben Sie Ihr aktuelles Passwort ein"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Gib deine E-Mail-Adresse ein"
@@ -654,18 +626,10 @@ msgstr "Gib deine E-Mail-Adresse ein"
msgid "Enter your name"
msgstr "Gib deinen Namen ein"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Geben Sie Ihr neues Passwort ein"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Gib dein Passwort ein"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Fehler beim Ändern des Passworts"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Fehler beim Löschen des Kontos"
@@ -678,7 +642,7 @@ msgstr "Fehler beim Löschen des Labels"
msgid "Error deleting workspace"
msgstr "Fehler beim Löschen des Arbeitsbereichs"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Fehler beim Trennen von Trello"
@@ -958,7 +922,7 @@ msgstr "Kanban neu gedacht"
msgid "Keep in mind that this action is irreversible."
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -968,7 +932,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & Filter"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Sprache"
@@ -992,7 +956,7 @@ msgstr "Hell"
msgid "Link copied"
msgstr "Link kopiert"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "Liste"
@@ -1034,7 +998,7 @@ msgid "Medium Priority"
msgstr "Mittlere Priorität"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1098,14 +1062,6 @@ msgstr "Neues Label"
msgid "New list"
msgstr "Neue Liste"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "Neues Passwort ist erforderlich"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "Neues Passwort muss sich vom aktuellen Passwort unterscheiden"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Neues Ticket"
@@ -1146,11 +1102,11 @@ msgstr "Angebot"
msgid "Onboarding"
msgstr "Einarbeitung"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1170,18 +1126,6 @@ msgstr "Besitze deine Daten"
msgid "Part-time"
msgstr "Teilzeit"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Passwort geändert"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters"
msgstr "Passwort muss mindestens 8 Zeichen lang sein"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Zahlungshäufigkeit"
@@ -1203,10 +1147,6 @@ msgstr "Persönliches Projekt"
msgid "Planning"
msgstr "Planung"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Bitte bestätigen Sie Ihr neues Passwort"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
@@ -1233,7 +1173,7 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1282,7 +1222,7 @@ msgstr "Privat"
msgid "Profile image updated"
msgstr "Profilbild aktualisiert"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Profilbild"
@@ -1422,13 +1362,13 @@ msgstr "Feedback senden"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Einstellungen"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Einstellungen | {0}"
@@ -1507,10 +1447,6 @@ msgstr "Nutzungsbedingungen"
msgid "Thank you for your feedback!"
msgstr "Vielen Dank für dein Feedback!"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "Das eingegebene aktuelle Passwort ist falsch."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "Der hauptunterschied zwischen Kan und Trello ist, dass Kan open source ist und jedem ermöglicht, unseren code einzusehen, zu ändern und dazu beizutragen. Unser cloud-angebot bietet außerdem keine einschränkungen bei funktionen für die individuelle nutzung, während Trello grundlegende funktionen wie die anzahl der boards, die du erstellen kannst, hinter einer paywall versteckt."
@@ -1572,7 +1508,7 @@ msgstr "Menü umschalten"
msgid "Track all card changes with detailed activity history."
msgstr "Verfolge alle kartenänderungen mit detaillierter aktivitätshistorie."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello getrennt"
@@ -1640,7 +1576,7 @@ msgstr "Board-URL kann nicht aktualisiert werden"
msgid "Unable to update board visibility"
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "Karte konnte nicht aktualisiert werden"
@@ -1769,11 +1705,11 @@ msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "API-Schlüssel anzeigen und verwalten."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "Verwalte deine Abrechnung und dein Abonnement."
@@ -1833,7 +1769,7 @@ msgstr "Arbeitsbereich"
msgid "Workspace deleted"
msgstr "Workspace gelöscht"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Workspace-Beschreibung"
@@ -1854,7 +1790,7 @@ msgstr "Workspace-Beschreibung aktualisiert"
msgid "Workspace members"
msgstr "Workspace-mitglieder"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Name des Workspaces"
@@ -1875,7 +1811,7 @@ msgstr "Workspace-Name aktualisiert"
msgid "Workspace slug updated"
msgstr "Workspace-Slug aktualisiert"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "Workspace-URL"
@@ -1891,10 +1827,6 @@ msgstr "Jährlich"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Ja, wir bieten einen dauerhaft kostenlosen plan für die individuelle nutzung an. Keine einschränkungen, keine paywalls, keine limits."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "Sie sind dabei, Ihr Passwort zu ändern."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "Du kannst eine benutzerdefinierte workspace-URL, wie <0>kan.bn/kan</0>, erhalten, indem du in deine <1>workspace-einstellungen</1> gehst und ein pro-workspace-abonnement kaufst. Alle abonnements helfen, die entwicklung des projekts zu finanzieren!"
@@ -1927,19 +1859,15 @@ msgstr "Deine Boards wurden importiert."
msgid "Your display name has been updated."
msgstr "Dein Anzeigename wurde aktualisiert."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Ihr Passwort wurde geändert."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "Dein Profilbild wurde aktualisiert."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Dein Trello-Konto wurde getrennt."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Dein Trello-Konto ist verbunden."

File diff suppressed because one or more lines are too long

View File

@@ -23,7 +23,7 @@ msgstr ", or see our"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -159,15 +159,11 @@ msgstr "All systems operational"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Already have an account? <0><1>Sign in</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "An error occurred while disconnecting your Trello account."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
msgid "An unexpected error occurred. Please try again later."
msgstr "An unexpected error occurred. Please try again later."
#: src/views/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "API keys"
@@ -241,12 +237,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basic Kanban"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Billing"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Billing portal"
@@ -328,7 +324,6 @@ msgstr "Bug Report"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -346,14 +341,7 @@ msgstr "Card not found"
msgid "Card title"
msgstr "Card title"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Change Password"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Change the language of the app."
@@ -416,11 +404,7 @@ msgstr "completed checklist item <0>{0}</0>"
msgid "Confirm URL change"
msgstr "Confirm URL change"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Confirm your new password"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connect Trello"
@@ -429,7 +413,7 @@ msgstr "Connect Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connect your favorite tools to streamline your workflow."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Connect your Trello account to import boards."
@@ -522,10 +506,6 @@ msgstr "created the card"
msgid "Critical"
msgstr "Critical"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "Current password is required"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Custom domain"
@@ -550,8 +530,8 @@ msgstr "Dark"
msgid "Delete"
msgstr "Delete"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Delete account"
@@ -572,8 +552,8 @@ msgstr "Delete comment"
msgid "Delete list"
msgstr "Delete list"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Delete workspace"
@@ -600,7 +580,7 @@ msgstr "deleted checklist item <0>{0}</0>"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Disconnect Trello"
@@ -608,7 +588,7 @@ msgstr "Disconnect Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discuss and collaborate on cards."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Display name"
@@ -686,14 +666,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Enhancement"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Enter your current password"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Enter your email address"
@@ -702,18 +674,10 @@ msgstr "Enter your email address"
msgid "Enter your name"
msgstr "Enter your name"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Enter your new password"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Enter your password"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Error Changing Password"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Error deleting account"
@@ -726,7 +690,7 @@ msgstr "Error deleting label"
msgid "Error deleting workspace"
msgstr "Error deleting workspace"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Error disconnecting Trello"
@@ -1011,7 +975,7 @@ msgstr "Kanban reimagined"
msgid "Keep in mind that this action is irreversible."
msgstr "Keep in mind that this action is irreversible."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -1021,7 +985,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & Filters"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Language"
@@ -1045,7 +1009,7 @@ msgstr "Light"
msgid "Link copied"
msgstr "Link copied"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "List"
@@ -1087,7 +1051,7 @@ msgid "Medium Priority"
msgstr "Medium Priority"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1155,14 +1119,6 @@ msgstr "New label"
msgid "New list"
msgstr "New list"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "New password is required"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "New password must be different from current password"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "New Ticket"
@@ -1207,11 +1163,11 @@ msgstr "Offer"
msgid "Onboarding"
msgstr "Onboarding"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Once you delete your account, there is no going back. This action cannot be undone."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1231,18 +1187,6 @@ msgstr "Own your data"
msgid "Part-time"
msgstr "Part-time"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Password Changed"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters"
msgstr "Password must be at least 8 characters"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Passwords do not match"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Payment frequency"
@@ -1264,10 +1208,6 @@ msgstr "Personal Project"
msgid "Planning"
msgstr "Planning"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Please confirm your new password"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Please enter a valid email address"
@@ -1294,7 +1234,7 @@ msgstr "Please select a file to upload."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1343,7 +1283,7 @@ msgstr "Private"
msgid "Profile image updated"
msgstr "Profile image updated"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Profile picture"
@@ -1491,13 +1431,13 @@ msgstr "Send feedback"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Settings"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Settings | {0}"
@@ -1576,10 +1516,6 @@ msgstr "Terms of service"
msgid "Thank you for your feedback!"
msgstr "Thank you for your feedback!"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "The current password you entered is incorrect."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
@@ -1645,7 +1581,7 @@ msgstr "Toggle menu"
msgid "Track all card changes with detailed activity history."
msgstr "Track all card changes with detailed activity history."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello disconnected"
@@ -1713,7 +1649,7 @@ msgstr "Unable to update board URL"
msgid "Unable to update board visibility"
msgstr "Unable to update board visibility"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "Unable to update card"
@@ -1850,11 +1786,11 @@ msgstr "User is already a member of this workspace"
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "View and manage your API keys."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "View and manage your billing and subscription."
@@ -1918,7 +1854,7 @@ msgstr "Workspace"
msgid "Workspace deleted"
msgstr "Workspace deleted"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Workspace description"
@@ -1939,7 +1875,7 @@ msgstr "Workspace description updated"
msgid "Workspace members"
msgstr "Workspace members"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Workspace name"
@@ -1960,7 +1896,7 @@ msgstr "Workspace name updated"
msgid "Workspace slug updated"
msgstr "Workspace slug updated"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "Workspace URL"
@@ -1976,10 +1912,6 @@ msgstr "Yearly"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "You are about to change your password."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
@@ -2012,19 +1944,15 @@ msgstr "Your boards have been imported."
msgid "Your display name has been updated."
msgstr "Your display name has been updated."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Your password has been changed."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "Your profile image has been updated."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Your Trello account has been disconnected."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Your Trello account is connected."

File diff suppressed because one or more lines are too long

View File

@@ -23,7 +23,7 @@ msgstr ", o consulta nuestra"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -139,15 +139,11 @@ msgstr "Todos los sistemas operativos"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
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/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "Claves API"
@@ -209,12 +205,12 @@ msgstr "Pendientes"
msgid "Basic Kanban"
msgstr "Kanban básico"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturación"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Portal de facturación"
@@ -288,7 +284,6 @@ msgstr "Informe de error"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -306,14 +301,7 @@ msgstr "Tarjeta no encontrada"
msgid "Card title"
msgstr "Título de la tarjeta"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Cambiar contraseña"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Cambiar el idioma de la aplicación."
@@ -376,11 +364,7 @@ msgstr "completó el elemento <0>{0}</0> de la lista de verificación"
msgid "Confirm URL change"
msgstr "Confirmar cambio de URL"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Confirma tu nueva contraseña"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Conectar Trello"
@@ -389,7 +373,7 @@ msgstr "Conectar Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Conecta tus herramientas favoritas para agilizar tu flujo de trabajo."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Conecta tu cuenta de Trello para importar tableros."
@@ -474,10 +458,6 @@ msgstr "creó la tarjeta"
msgid "Critical"
msgstr "Crítico"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "Se requiere la contraseña actual"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Dominio personalizado"
@@ -502,8 +482,8 @@ msgstr "Oscuro"
msgid "Delete"
msgstr "Eliminar"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Eliminar cuenta"
@@ -524,8 +504,8 @@ msgstr "Eliminar comentario"
msgid "Delete list"
msgstr "Eliminar lista"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Eliminar espacio de trabajo"
@@ -552,7 +532,7 @@ msgstr "eliminó el elemento <0>{0}</0> de la lista de verificación"
msgid "Design"
msgstr "Diseño"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Desconectar Trello"
@@ -560,7 +540,7 @@ msgstr "Desconectar Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discute y colabora en las tarjetas."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Nombre visible"
@@ -638,14 +618,6 @@ msgstr "Correo electrónico"
msgid "Enhancement"
msgstr "Mejora"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Introduce tu contraseña actual"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Introduce tu dirección de correo electrónico"
@@ -654,18 +626,10 @@ msgstr "Introduce tu dirección de correo electrónico"
msgid "Enter your name"
msgstr "Introduce tu nombre"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Introduce tu nueva contraseña"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Introduce tu contraseña"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Error al cambiar la contraseña"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Error al eliminar la cuenta"
@@ -678,7 +642,7 @@ msgstr "Error al eliminar la etiqueta"
msgid "Error deleting workspace"
msgstr "Error al eliminar el espacio de trabajo"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Error al desconectar Trello"
@@ -958,7 +922,7 @@ msgstr "Kanban reinventado"
msgid "Keep in mind that this action is irreversible."
msgstr "Ten en cuenta que esta acción es irreversible."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -968,7 +932,7 @@ msgstr "Etiquetas"
msgid "Labels & Filters"
msgstr "Etiquetas y filtros"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Idioma"
@@ -992,7 +956,7 @@ msgstr "Claro"
msgid "Link copied"
msgstr "Enlace copiado"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "Lista"
@@ -1034,7 +998,7 @@ msgid "Medium Priority"
msgstr "Prioridad media"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1098,14 +1062,6 @@ msgstr "Nueva etiqueta"
msgid "New list"
msgstr "Nueva lista"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "Se requiere una nueva contraseña"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "La nueva contraseña debe ser diferente de la contraseña actual"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nuevo ticket"
@@ -1146,11 +1102,11 @@ msgstr "Oferta"
msgid "Onboarding"
msgstr "Incorporación"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se puede deshacer."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1170,18 +1126,6 @@ msgstr "Sé dueño de tus datos"
msgid "Part-time"
msgstr "Tiempo parcial"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Contraseña cambiada"
#: 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"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Frecuencia de pago"
@@ -1203,10 +1147,6 @@ msgstr "Proyecto personal"
msgid "Planning"
msgstr "Planificación"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Por favor, confirma tu nueva contraseña"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Por favor, introduce una dirección de correo electrónico válida"
@@ -1233,7 +1173,7 @@ msgstr "Por favor selecciona un archivo para subir."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1282,7 +1222,7 @@ msgstr "Privado"
msgid "Profile image updated"
msgstr "Imagen de perfil actualizada"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Foto de perfil"
@@ -1422,13 +1362,13 @@ msgstr "Enviar comentarios"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Configuración"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Configuración | {0}"
@@ -1507,10 +1447,6 @@ msgstr "Términos de servicio"
msgid "Thank you for your feedback!"
msgstr "¡Gracias por tus comentarios!"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "La contraseña actual que has introducido es incorrecta."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "La principal diferencia entre Kan y Trello es que Kan es de código abierto, permitiendo a cualquiera ver, modificar y contribuir a nuestro código. Nuestra oferta en la nube también ofrece funciones sin restricciones para uso individual, mientras que Trello bloquea características básicas como el número de tableros que puedes crear detrás de un muro de pago."
@@ -1572,7 +1508,7 @@ msgstr "Alternar menú"
msgid "Track all card changes with detailed activity history."
msgstr "Rastrea todos los cambios en las tarjetas con un historial de actividad detallado."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello desconectado"
@@ -1640,7 +1576,7 @@ msgstr "No se puede actualizar la URL del tablero"
msgid "Unable to update board visibility"
msgstr "No se puede actualizar la visibilidad del tablero"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "No se puede actualizar la tarjeta"
@@ -1769,11 +1705,11 @@ msgstr "El usuario ya es miembro de este espacio de trabajo"
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "Ver y gestionar tus claves API."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "Ver y gestionar tu facturación y suscripción."
@@ -1833,7 +1769,7 @@ msgstr "Espacio de trabajo"
msgid "Workspace deleted"
msgstr "Espacio de trabajo eliminado"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Descripción del espacio de trabajo"
@@ -1854,7 +1790,7 @@ msgstr "Descripción del espacio de trabajo actualizada"
msgid "Workspace members"
msgstr "Miembros del espacio de trabajo"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Nombre del espacio de trabajo"
@@ -1875,7 +1811,7 @@ msgstr "Nombre del espacio de trabajo actualizado"
msgid "Workspace slug updated"
msgstr "Slug del espacio de trabajo actualizado"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "URL del espacio de trabajo"
@@ -1891,10 +1827,6 @@ msgstr "Anual"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Sí, ofrecemos un plan gratuito para siempre para uso individual. Sin restricciones, sin muros de pago, sin límites."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "Estás a punto de cambiar tu contraseña."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "Puedes obtener una URL personalizada para tu espacio de trabajo, como <0>kan.bn/kan</0>, yendo a la <1>configuración de tu espacio de trabajo</1> y comprando una suscripción pro. ¡Todas las suscripciones ayudan a financiar el desarrollo del proyecto!"
@@ -1927,19 +1859,15 @@ msgstr "Tus tableros han sido importados."
msgid "Your display name has been updated."
msgstr "Tu nombre de visualización ha sido actualizado."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Tu contraseña ha sido cambiada."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "Tu imagen de perfil ha sido actualizada."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Tu cuenta de Trello ha sido desconectada."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Tu cuenta de Trello está conectada."

File diff suppressed because one or more lines are too long

View File

@@ -23,7 +23,7 @@ msgstr ", ou consultez notre"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -139,15 +139,11 @@ msgstr "Tous les systèmes opérationnels"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
msgid "An unexpected error occurred. Please try again later."
msgstr "Une erreur inattendue s'est produite. Veuillez réessayer plus tard."
#: src/views/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "Clés API"
@@ -209,12 +205,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban basique"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturation"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Portail de facturation"
@@ -288,7 +284,6 @@ msgstr "Rapport de bug"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -306,14 +301,7 @@ msgstr "Carte introuvable"
msgid "Card title"
msgstr "Titre de la carte"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Modifier le mot de passe"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Changer la langue de l'application."
@@ -376,11 +364,7 @@ msgstr "a terminé l'élément <0>{0}</0> de la checklist"
msgid "Confirm URL change"
msgstr "Confirmer le changement d'URL"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Confirmez votre nouveau mot de passe"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connecter Trello"
@@ -389,7 +373,7 @@ msgstr "Connecter Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connectez vos outils favoris pour simplifier votre flux de travail."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Connectez votre compte Trello pour importer des tableaux."
@@ -474,10 +458,6 @@ msgstr "a créé la carte"
msgid "Critical"
msgstr "Critique"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "Le mot de passe actuel est requis"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Domaine personnalisé"
@@ -502,8 +482,8 @@ msgstr "Sombre"
msgid "Delete"
msgstr "Supprimer"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Supprimer le compte"
@@ -524,8 +504,8 @@ msgstr "Supprimer le commentaire"
msgid "Delete list"
msgstr "Supprimer la liste"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Supprimer l'espace de travail"
@@ -552,7 +532,7 @@ msgstr "a supprimé l'élément <0>{0}</0> de la checklist"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Déconnecter Trello"
@@ -560,7 +540,7 @@ msgstr "Déconnecter Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discutez et collaborez sur les cartes."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Nom d'affichage"
@@ -638,14 +618,6 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Amélioration"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Saisissez votre mot de passe actuel"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Saisissez votre adresse e-mail"
@@ -654,18 +626,10 @@ msgstr "Saisissez votre adresse e-mail"
msgid "Enter your name"
msgstr "Saisissez votre nom"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Saisissez votre nouveau mot de passe"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Saisissez votre mot de passe"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Erreur lors du changement de mot de passe"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Erreur lors de la suppression du compte"
@@ -678,7 +642,7 @@ msgstr "Erreur lors de la suppression de l'étiquette"
msgid "Error deleting workspace"
msgstr "Erreur lors de la suppression de l'espace de travail"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Erreur lors de la déconnexion de Trello"
@@ -958,7 +922,7 @@ msgstr "Kanban réinventé"
msgid "Keep in mind that this action is irreversible."
msgstr "Gardez à l'esprit que cette action est irréversible."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -968,7 +932,7 @@ msgstr "Étiquettes"
msgid "Labels & Filters"
msgstr "Étiquettes & filtres"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Langue"
@@ -992,7 +956,7 @@ msgstr "Clair"
msgid "Link copied"
msgstr "Lien copié"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "Liste"
@@ -1034,7 +998,7 @@ msgid "Medium Priority"
msgstr "Priorité moyenne"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1098,14 +1062,6 @@ msgstr "Nouvelle étiquette"
msgid "New list"
msgstr "Nouvelle liste"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "Le nouveau mot de passe est requis"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "Le nouveau mot de passe doit être différent du mot de passe actuel"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nouveau ticket"
@@ -1146,11 +1102,11 @@ msgstr "Offre"
msgid "Onboarding"
msgstr "Intégration"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1170,18 +1126,6 @@ msgstr "Maîtrisez vos données"
msgid "Part-time"
msgstr "Temps partiel"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Mot de passe modifié"
#: 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"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Fréquence de paiement"
@@ -1203,10 +1147,6 @@ msgstr "Projet personnel"
msgid "Planning"
msgstr "Planification"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Veuillez confirmer votre nouveau mot de passe"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Veuillez saisir une adresse e-mail valide"
@@ -1233,7 +1173,7 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1282,7 +1222,7 @@ msgstr "Privé"
msgid "Profile image updated"
msgstr "Image de profil mise à jour"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Photo de profil"
@@ -1422,13 +1362,13 @@ msgstr "Envoyer des commentaires"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Paramètres"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Paramètres | {0}"
@@ -1507,10 +1447,6 @@ msgstr "Conditions d'utilisation"
msgid "Thank you for your feedback!"
msgstr "Merci pour vos commentaires !"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "Le mot de passe actuel que vous avez saisi est incorrect."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "La principale différence entre Kan et Trello est que Kan est open source, permettant à chacun de consulter, modifier et contribuer à notre code. Notre offre cloud ne comporte également aucune restriction sur les fonctionnalités pour un usage individuel, alors que Trello verrouille des fonctionnalités de base comme le nombre de tableaux que vous pouvez créer derrière un paywall."
@@ -1572,7 +1508,7 @@ msgstr "Basculer le menu"
msgid "Track all card changes with detailed activity history."
msgstr "Suivez tous les changements de cartes avec un historique d'activité détaillé."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello déconnecté"
@@ -1640,7 +1576,7 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
msgid "Unable to update board visibility"
msgstr "Impossible de mettre à jour la visibilité du tableau"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "Impossible de mettre à jour la carte"
@@ -1769,11 +1705,11 @@ msgstr "L'utilisateur est déjà membre de cet espace de travail"
msgid "Video"
msgstr "Vidéo"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "Consultez et gérez vos clés API."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "Consultez et gérez votre facturation et votre abonnement."
@@ -1833,7 +1769,7 @@ msgstr "Espace de travail"
msgid "Workspace deleted"
msgstr "Espace de travail supprimé"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Description de l'espace de travail"
@@ -1854,7 +1790,7 @@ msgstr "Description de l'espace de travail mise à jour"
msgid "Workspace members"
msgstr "Membres de l'espace de travail"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Nom de l'espace de travail"
@@ -1875,7 +1811,7 @@ msgstr "Nom de l'espace de travail mis à jour"
msgid "Workspace slug updated"
msgstr "Slug de l'espace de travail mis à jour"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "URL de l'espace de travail"
@@ -1891,10 +1827,6 @@ msgstr "Annuel"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Oui, nous proposons un plan gratuit à vie pour un usage individuel. Aucune restriction, aucun paywall, aucune limite."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "Vous êtes sur le point de modifier votre mot de passe."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "Vous pouvez obtenir une URL d'espace de travail personnalisée, comme <0>kan.bn/kan</0>, en accédant à vos <1>paramètres d'espace de travail</1> et en souscrivant à un abonnement pro. Tous les abonnements contribuent à financer le développement du projet !"
@@ -1927,19 +1859,15 @@ msgstr "Vos tableaux ont été importés."
msgid "Your display name has been updated."
msgstr "Votre nom d'affichage a été mis à jour."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Votre mot de passe a été modifié."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "Votre image de profil a été mise à jour."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Votre compte Trello a été déconnecté."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Votre compte Trello est connecté."

File diff suppressed because one or more lines are too long

View File

@@ -23,7 +23,7 @@ msgstr ", o consulta i nostri"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -139,15 +139,11 @@ msgstr "Tutti i sistemi operativi"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Hai già un account? <0><1>Accedi</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "Si è verificato un errore durante la disconnessione del tuo account Trello."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
msgid "An unexpected error occurred. Please try again later."
msgstr "Si è verificato un errore imprevisto. Riprova più tardi."
#: src/views/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "Chiavi API"
@@ -209,12 +205,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban base"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Fatturazione"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Portale di fatturazione"
@@ -288,7 +284,6 @@ msgstr "Segnalazione bug"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -306,14 +301,7 @@ msgstr "Carta non trovata"
msgid "Card title"
msgstr "Titolo della carta"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Cambia password"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Cambia la lingua dell'app."
@@ -376,11 +364,7 @@ msgstr "ha completato l'elemento <0>{0}</0> della checklist"
msgid "Confirm URL change"
msgstr "Conferma modifica URL"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Conferma la tua nuova password"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connetti Trello"
@@ -389,7 +373,7 @@ msgstr "Connetti Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connetti i tuoi strumenti preferiti per semplificare il tuo flusso di lavoro."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Connetti il tuo account Trello per importare le bacheche."
@@ -474,10 +458,6 @@ msgstr "ha creato la carta"
msgid "Critical"
msgstr "Critico"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "La password attuale è obbligatoria"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Dominio personalizzato"
@@ -502,8 +482,8 @@ msgstr "Scuro"
msgid "Delete"
msgstr "Elimina"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Elimina account"
@@ -524,8 +504,8 @@ msgstr "Elimina commento"
msgid "Delete list"
msgstr "Elimina lista"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Elimina spazio di lavoro"
@@ -552,7 +532,7 @@ msgstr "ha eliminato l'elemento <0>{0}</0> della checklist"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Disconnetti Trello"
@@ -560,7 +540,7 @@ msgstr "Disconnetti Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discuti e collabora sulle schede."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Nome visualizzato"
@@ -638,14 +618,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Miglioramento"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Inserisci la tua password attuale"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Inserisci il tuo indirizzo email"
@@ -654,18 +626,10 @@ msgstr "Inserisci il tuo indirizzo email"
msgid "Enter your name"
msgstr "Inserisci il tuo nome"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Inserisci la tua nuova password"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Inserisci la tua password"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Errore durante il cambio della password"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Errore durante l'eliminazione dell'account"
@@ -678,7 +642,7 @@ msgstr "Errore durante l'eliminazione dell'etichetta"
msgid "Error deleting workspace"
msgstr "Errore durante l'eliminazione dell'area di lavoro"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Errore durante la disconnessione da Trello"
@@ -958,7 +922,7 @@ msgstr "Kanban reinventato"
msgid "Keep in mind that this action is irreversible."
msgstr "Tieni presente che questa azione è irreversibile."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -968,7 +932,7 @@ msgstr "Etichette"
msgid "Labels & Filters"
msgstr "Etichette & Filtri"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Lingua"
@@ -992,7 +956,7 @@ msgstr "Chiaro"
msgid "Link copied"
msgstr "Link copiato"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "Lista"
@@ -1034,7 +998,7 @@ msgid "Medium Priority"
msgstr "Media priorità"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1098,14 +1062,6 @@ msgstr "Nuova etichetta"
msgid "New list"
msgstr "Nuova lista"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "La nuova password è obbligatoria"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "La nuova password deve essere diversa dalla password attuale"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nuovo ticket"
@@ -1146,11 +1102,11 @@ msgstr "Offerta"
msgid "Onboarding"
msgstr "Inserimento"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa azione non può essere annullata."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1170,18 +1126,6 @@ msgstr "Possiedi i tuoi dati"
msgid "Part-time"
msgstr "Part-time"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Password modificata"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters"
msgstr "La password deve contenere almeno 8 caratteri"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Le password non corrispondono"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Frequenza di pagamento"
@@ -1203,10 +1147,6 @@ msgstr "Progetto personale"
msgid "Planning"
msgstr "Pianificazione"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Conferma la tua nuova password"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Inserisci un indirizzo email valido"
@@ -1233,7 +1173,7 @@ msgstr "Seleziona un file da caricare."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1282,7 +1222,7 @@ msgstr "Privato"
msgid "Profile image updated"
msgstr "Immagine del profilo aggiornata"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Immagine del profilo"
@@ -1422,13 +1362,13 @@ msgstr "Invia feedback"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Impostazioni"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Impostazioni | {0}"
@@ -1507,10 +1447,6 @@ msgstr "Termini di servizio"
msgid "Thank you for your feedback!"
msgstr "Grazie per il tuo feedback!"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "La password attuale inserita non è corretta."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "La principale differenza tra Kan e Trello è che Kan è open source, permettendo a chiunque di visualizzare, modificare e contribuire al nostro codice. La nostra offerta cloud non impone inoltre alcuna restrizione sulle funzionalità per uso individuale, mentre Trello blocca funzionalità di base come il numero di bacheche che puoi creare dietro un paywall."
@@ -1572,7 +1508,7 @@ msgstr "Attiva/disattiva menu"
msgid "Track all card changes with detailed activity history."
msgstr "Tieni traccia di tutte le modifiche alle schede con una cronologia dettagliata delle attività."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello disconnesso"
@@ -1640,7 +1576,7 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
msgid "Unable to update board visibility"
msgstr "Impossibile aggiornare la visibilità della bacheca"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "Impossibile aggiornare la scheda"
@@ -1769,11 +1705,11 @@ msgstr "L'utente è già membro di questo spazio di lavoro"
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "Visualizza e gestisci le tue chiavi API."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
@@ -1833,7 +1769,7 @@ msgstr "Spazio di lavoro"
msgid "Workspace deleted"
msgstr "Spazio di lavoro eliminato"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Descrizione dello spazio di lavoro"
@@ -1854,7 +1790,7 @@ msgstr "Descrizione dell'area di lavoro aggiornata"
msgid "Workspace members"
msgstr "Membri del workspace"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Nome dello spazio di lavoro"
@@ -1875,7 +1811,7 @@ msgstr "Nome dello spazio di lavoro aggiornato"
msgid "Workspace slug updated"
msgstr "Slug dell'area di lavoro aggiornato"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "URL dello spazio di lavoro"
@@ -1891,10 +1827,6 @@ msgstr "Annuale"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Sì, offriamo un piano gratuito per sempre per uso individuale. Nessuna restrizione, nessun paywall, nessun limite."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "Stai per cambiare la tua password."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "Puoi ottenere un URL personalizzato per il tuo workspace, come <0>kan.bn/kan</0>, accedendo alle tue <1>impostazioni del workspace</1> e acquistando un abbonamento pro. Tutti gli abbonamenti contribuiscono a finanziare lo sviluppo del progetto!"
@@ -1927,19 +1859,15 @@ msgstr "Le tue bacheche sono state importate."
msgid "Your display name has been updated."
msgstr "Il tuo nome visualizzato è stato aggiornato."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "La tua password è stata modificata."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "La tua immagine del profilo è stata aggiornata."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Il tuo account Trello è stato disconnesso."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Il tuo account Trello è connesso."

File diff suppressed because one or more lines are too long

View File

@@ -23,7 +23,7 @@ msgstr ", of bekijk onze"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:213
#: src/views/card/index.tsx:214
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -139,15 +139,11 @@ msgstr "Alle systemen operationeel"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Heb je al een account? <0><1>Log in</1></0>"
#: src/views/settings/index.tsx:102
#: src/views/settings/index.tsx:100
msgid "An error occurred while disconnecting your Trello account."
msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Trello-account."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:90
msgid "An unexpected error occurred. Please try again later."
msgstr "Er is een onverwachte fout opgetreden. Probeer het later opnieuw."
#: src/views/settings/index.tsx:259
#: src/views/settings/index.tsx:257
msgid "API keys"
msgstr "API-sleutels"
@@ -209,12 +205,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basis kanban"
#: src/views/settings/index.tsx:198
#: src/views/settings/index.tsx:196
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturering"
#: src/views/settings/index.tsx:208
#: src/views/settings/index.tsx:206
msgid "Billing portal"
msgstr "Factureringsportaal"
@@ -288,7 +284,6 @@ msgstr "Bugrapport"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
@@ -306,14 +301,7 @@ msgstr "Kaart niet gevonden"
msgid "Card title"
msgstr "Kaarttitel"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:301
#: src/views/settings/components/ChangePasswordConfirmation.tsx:109
#: src/views/settings/components/ChangePasswordConfirmation.tsx:178
msgid "Change Password"
msgstr "Wachtwoord wijzigen"
#: src/views/settings/index.tsx:190
#: src/views/settings/index.tsx:188
msgid "Change the language of the app."
msgstr "Wijzig de taal van de app."
@@ -376,11 +364,7 @@ msgstr "heeft checklistitem <0>{0}</0> voltooid"
msgid "Confirm URL change"
msgstr "URL-wijziging bevestigen"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:150
msgid "Confirm your new password"
msgstr "Bevestig je nieuwe wachtwoord"
#: src/views/settings/index.tsx:235
#: src/views/settings/index.tsx:233
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Verbind Trello"
@@ -389,7 +373,7 @@ msgstr "Verbind Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Verbind je favoriete tools om je werkstroom te stroomlijnen."
#: src/views/settings/index.tsx:222
#: src/views/settings/index.tsx:220
msgid "Connect your Trello account to import boards."
msgstr "Verbind je Trello-account om borden te importeren."
@@ -474,10 +458,6 @@ msgstr "heeft de kaart aangemaakt"
msgid "Critical"
msgstr "Kritiek"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:19
msgid "Current password is required"
msgstr "Huidig wachtwoord is vereist"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Aangepast domein"
@@ -502,8 +482,8 @@ msgstr "Donker"
msgid "Delete"
msgstr "Verwijderen"
#: src/views/settings/index.tsx:309
#: src/views/settings/index.tsx:319
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Account verwijderen"
@@ -524,8 +504,8 @@ msgstr "Reactie verwijderen"
msgid "Delete list"
msgstr "Lijst verwijderen"
#: src/views/settings/index.tsx:272
#: src/views/settings/index.tsx:283
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Werkruimte verwijderen"
@@ -552,7 +532,7 @@ msgstr "heeft checklistitem <0>{0}</0> verwijderd"
msgid "Design"
msgstr "Ontwerp"
#: src/views/settings/index.tsx:250
#: src/views/settings/index.tsx:248
msgid "Disconnect Trello"
msgstr "Trello ontkoppelen"
@@ -560,7 +540,7 @@ msgstr "Trello ontkoppelen"
msgid "Discuss and collaborate on cards."
msgstr "Bespreek en werk samen aan kaarten."
#: src/views/settings/index.tsx:151
#: src/views/settings/index.tsx:149
msgid "Display name"
msgstr "Weergavenaam"
@@ -638,14 +618,6 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Verbetering"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Voer je huidige wachtwoord in"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:111
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:302
msgid "Enter your email address"
msgstr "Voer je e-mailadres in"
@@ -654,18 +626,10 @@ msgstr "Voer je e-mailadres in"
msgid "Enter your name"
msgstr "Voer je naam in"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:136
msgid "Enter your new password"
msgstr "Voer je nieuwe wachtwoord in"
#: src/components/AuthForm.tsx:315
msgid "Enter your password"
msgstr "Voer je wachtwoord in"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Fout bij wijzigen wachtwoord"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Fout bij verwijderen account"
@@ -678,7 +642,7 @@ msgstr "Fout bij het verwijderen van label"
msgid "Error deleting workspace"
msgstr "Fout bij verwijderen werkruimte"
#: src/views/settings/index.tsx:101
#: src/views/settings/index.tsx:99
msgid "Error disconnecting Trello"
msgstr "Fout bij ontkoppelen van Trello"
@@ -958,7 +922,7 @@ msgstr "Kanban opnieuw uitgevonden"
msgid "Keep in mind that this action is irreversible."
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
#: src/views/card/index.tsx:117
#: src/views/card/index.tsx:118
#: src/views/board/components/NewCardForm.tsx:398
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
@@ -968,7 +932,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & filters"
#: src/views/settings/index.tsx:187
#: src/views/settings/index.tsx:185
msgid "Language"
msgstr "Taal"
@@ -992,7 +956,7 @@ msgstr "Licht"
msgid "Link copied"
msgstr "Link gekopieerd"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:110
msgid "List"
msgstr "Lijst"
@@ -1034,7 +998,7 @@ msgid "Medium Priority"
msgstr "Gemiddelde prioriteit"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:125
#: src/views/card/index.tsx:126
#: src/views/board/components/NewCardForm.tsx:357
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
@@ -1098,14 +1062,6 @@ msgstr "Nieuw label"
msgid "New list"
msgstr "Nieuwe lijst"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:23
msgid "New password is required"
msgstr "Nieuw wachtwoord is vereist"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:31
msgid "New password must be different from current password"
msgstr "Nieuw wachtwoord moet verschillen van het huidige wachtwoord"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nieuw ticket"
@@ -1146,11 +1102,11 @@ msgstr "Aanbod"
msgid "Onboarding"
msgstr "Inwerktraject"
#: src/views/settings/index.tsx:312
#: src/views/settings/index.tsx:291
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
#: src/views/settings/index.tsx:275
#: src/views/settings/index.tsx:273
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."
@@ -1170,18 +1126,6 @@ msgstr "Bezit je eigen data"
msgid "Part-time"
msgstr "Deeltijd"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:69
msgid "Password Changed"
msgstr "Wachtwoord gewijzigd"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters"
msgstr "Wachtwoord moet minimaal 8 tekens bevatten"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:27
msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Betalingsfrequentie"
@@ -1203,10 +1147,6 @@ msgstr "Persoonlijk project"
msgid "Planning"
msgstr "Planning"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:24
msgid "Please confirm your new password"
msgstr "Bevestig je nieuwe wachtwoord"
#: src/components/AuthForm.tsx:306
msgid "Please enter a valid email address"
msgstr "Voer een geldig e-mailadres in"
@@ -1233,7 +1173,7 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:172
#: src/views/card/index.tsx:173
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistForm.tsx:70
@@ -1282,7 +1222,7 @@ msgstr "Privé"
msgid "Profile image updated"
msgstr "Profielafbeelding bijgewerkt"
#: src/views/settings/index.tsx:146
#: src/views/settings/index.tsx:144
msgid "Profile picture"
msgstr "Profielfoto"
@@ -1422,13 +1362,13 @@ msgstr "Feedback versturen"
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:140
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
msgid "Settings"
msgstr "Instellingen"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:136
#: src/views/settings/index.tsx:134
msgid "Settings | {0}"
msgstr "Instellingen | {0}"
@@ -1507,10 +1447,6 @@ msgstr "Servicevoorwaarden"
msgid "Thank you for your feedback!"
msgstr "Bedankt voor je feedback!"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:84
msgid "The current password you entered is incorrect."
msgstr "Het ingevoerde huidige wachtwoord is onjuist."
#: src/views/home/components/Faqs.tsx:33
msgid "The main difference between Kan and Trello is that Kan is open source, allowing anyone to view, modify, and contribute to our code. Our cloud offering also offers no restrictions on features for individual use, whereas Trello locks basic features such as the number of boards you can create behind a paywall."
msgstr "Het belangrijkste verschil tussen Kan en Trello is dat Kan open source is, waardoor iedereen onze code kan bekijken, wijzigen en eraan kan bijdragen. Onze cloudoplossing biedt ook geen beperkingen op functies voor individueel gebruik, terwijl Trello basisfuncties zoals het aantal borden dat je kunt maken achter een betaalmuur plaatst."
@@ -1572,7 +1508,7 @@ msgstr "Menu in-/uitschakelen"
msgid "Track all card changes with detailed activity history."
msgstr "Volg alle kaartwijzigingen met gedetailleerde activiteitengeschiedenis."
#: src/views/settings/index.tsx:94
#: src/views/settings/index.tsx:92
msgid "Trello disconnected"
msgstr "Trello ontkoppeld"
@@ -1640,7 +1576,7 @@ msgstr "Kan board URL niet bijwerken"
msgid "Unable to update board visibility"
msgstr "Kan bordzichtbaarheid niet bijwerken"
#: src/views/card/index.tsx:171
#: src/views/card/index.tsx:172
#: src/views/board/index.tsx:189
msgid "Unable to update card"
msgstr "Kan kaart niet bijwerken"
@@ -1769,11 +1705,11 @@ msgstr "Gebruiker is al lid van deze werkruimte"
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:262
#: src/views/settings/index.tsx:260
msgid "View and manage your API keys."
msgstr "Bekijk en beheer je API-sleutels."
#: src/views/settings/index.tsx:201
#: src/views/settings/index.tsx:199
msgid "View and manage your billing and subscription."
msgstr "Bekijk en beheer je facturering en abonnement."
@@ -1833,7 +1769,7 @@ msgstr "Werkruimte"
msgid "Workspace deleted"
msgstr "Werkruimte verwijderd"
#: src/views/settings/index.tsx:177
#: src/views/settings/index.tsx:175
msgid "Workspace description"
msgstr "Werkruimte beschrijving"
@@ -1854,7 +1790,7 @@ msgstr "Werkruimtebeschrijving bijgewerkt"
msgid "Workspace members"
msgstr "Werkruimteleden"
#: src/views/settings/index.tsx:158
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
msgid "Workspace name"
msgstr "Naam werkruimte"
@@ -1875,7 +1811,7 @@ msgstr "Werkruimtenaam bijgewerkt"
msgid "Workspace slug updated"
msgstr "Werkruimte-slug bijgewerkt"
#: src/views/settings/index.tsx:167
#: src/views/settings/index.tsx:165
msgid "Workspace URL"
msgstr "Werkruimte URL"
@@ -1891,10 +1827,6 @@ msgstr "Jaarlijks"
msgid "Yes, we offer an forever free plan for individual use. No restrictions, no paywalls, no limits."
msgstr "Ja, we bieden een voor altijd gratis plan voor individueel gebruik. Geen beperkingen, geen betaalmuren, geen limieten."
#: src/views/settings/index.tsx:294
msgid "You are about to change your password."
msgstr "Je staat op het punt je wachtwoord te wijzigen."
#: src/views/home/components/Faqs.tsx:67
msgid "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!"
msgstr "Je kunt een aangepaste werkruimte-URL krijgen, zoals <0>kan.bn/kan</0>, door naar je <1>werkruimte-instellingen</1> te gaan en een pro-werkruimte-abonnement aan te schaffen. Alle abonnementen helpen de ontwikkeling van het project te financieren!"
@@ -1927,19 +1859,15 @@ msgstr "Je borden zijn geïmporteerd."
msgid "Your display name has been updated."
msgstr "Je weergavenaam is bijgewerkt."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Je wachtwoord is gewijzigd."
#: src/views/settings/components/Avatar.tsx:27
msgid "Your profile image has been updated."
msgstr "Je profielafbeelding is bijgewerkt."
#: src/views/settings/index.tsx:95
#: src/views/settings/index.tsx:93
msgid "Your Trello account has been disconnected."
msgstr "Je Trello-account is ontkoppeld."
#: src/views/settings/index.tsx:244
#: src/views/settings/index.tsx:242
msgid "Your Trello account is connected."
msgstr "Je Trello-account is verbonden."

File diff suppressed because one or more lines are too long

View File

@@ -14,7 +14,7 @@ import { useEffect } from "react";
import { LinguiProviderWrapper } from "~/providers/lingui";
import { ModalProvider } from "~/providers/modal";
import { PopupProvider } from "~/providers/popup";
import { ThemeProvider } from "next-themes";
import { ThemeProvider } from "~/providers/theme";
import { api } from "~/utils/api";
const jakarta = Plus_Jakarta_Sans({
@@ -81,9 +81,9 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
<script src="/__ENV.js" />
<main className="font-sans">
<LinguiProviderWrapper>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<ModalProvider>
<PopupProvider>
<ThemeProvider>
<ModalProvider>
<PopupProvider>
{posthogKey ? (
<PostHogProvider client={posthog}>
{getLayout(<Component {...pageProps} />)}
@@ -91,8 +91,8 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
) : (
getLayout(<Component {...pageProps} />)
)}
</PopupProvider>
</ModalProvider>
</PopupProvider>
</ModalProvider>
</ThemeProvider>
</LinguiProviderWrapper>
</main>

View File

@@ -42,7 +42,7 @@ const Card = ({
return (
<div className="flex flex-col rounded-md border border-light-200 bg-light-50 px-3 py-2 text-sm text-neutral-900 dark:border-dark-200 dark:bg-dark-200 dark:text-dark-1000 dark:hover:bg-dark-300">
<span>{title}</span>
{labels.length || members.length || checklists.length > 0 ? (
{labels.length || members.length ? (
<div className="mt-2 flex flex-col justify-end">
<div className="space-x-0.5">
{labels.map((label) => (

View File

@@ -375,7 +375,7 @@ export default function BoardPage() {
/>
<Filters
labels={boardData?.labels ?? []}
members={boardData?.workspace.members?.filter(member => member.user !== null) ?? []}
members={boardData?.workspace.members ?? []}
position="left"
isLoading={!boardData}
/>

View File

@@ -13,7 +13,7 @@ import { ImportBoardsForm } from "./components/ImportBoardsForm";
import { NewBoardForm } from "./components/NewBoardForm";
export default function BoardsPage() {
const { openModal, modalContentType, isOpen } = useModal();
const { openModal, modalContentType } = useModal();
const { workspace, hasLoaded } = useWorkspace();
if (hasLoaded && !workspace.publicId) openModal("NEW_WORKSPACE");
@@ -50,35 +50,12 @@ export default function BoardsPage() {
</div>
</div>
<>
<Modal
modalSize="md"
isVisible={isOpen && modalContentType === "NEW_FEEDBACK"}
>
<FeedbackModal />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_BOARD"}
>
<NewBoardForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "IMPORT_BOARDS"}
>
<ImportBoardsForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
>
<NewWorkspaceForm />
</Modal>
</>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
{modalContentType === "NEW_BOARD" && <NewBoardForm />}
{modalContentType === "IMPORT_BOARDS" && <ImportBoardsForm />}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
</Modal>
<div className="flex h-full flex-row">
<BoardsList />

View File

@@ -29,6 +29,7 @@ import LabelSelector from "./components/LabelSelector";
import ListSelector from "./components/ListSelector";
import MemberSelector from "./components/MemberSelector";
import { NewChecklistForm } from "./components/NewChecklistForm";
import NewChecklistItemForm from "./components/NewChecklistItemForm";
import NewCommentForm from "./components/NewCommentForm";
interface FormValues {
@@ -142,7 +143,6 @@ export default function CardPage() {
openModal,
getModalState,
clearModalState,
isOpen,
} = useModal();
const { showPopup } = usePopup();
const { workspace } = useWorkspace();
@@ -213,179 +213,138 @@ export default function CardPage() {
<PageHead
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
/>
<div className="flex h-full flex-1 flex-row overflow-hidden">
<div className="scrollbar-thumb-rounded-[4px] scrollbar-track-rounded-[4px] w-full flex-1 overflow-y-auto scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 hover:scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300 dark:hover:scrollbar-thumb-dark-300">
<div className="p-auto mx-auto flex h-full w-full max-w-[800px] flex-col">
<div className="p-6 md:p-8">
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
{!card && isLoading && (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
</div>
)}
{card && (
<>
<Link
className="whitespace-nowrap font-bold leading-[2.3rem] tracking-tight text-light-900 dark:text-dark-900 sm:text-[1.2rem]"
href={`/boards/${board?.publicId}`}
>
{board?.name}
</Link>
<IoChevronForwardSharp
size={18}
className="mx-2 text-light-900 dark:text-dark-900"
/>
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full space-y-6"
>
<div>
<input
type="text"
id="title"
{...register("title")}
onBlur={handleSubmit(onSubmit)}
className="block w-full border-0 bg-transparent p-0 py-0 font-bold tracking-tight text-neutral-900 focus:ring-0 dark:text-dark-1000 sm:text-[1.2rem]"
/>
</div>
</form>
<div className="flex">
<Dropdown />
</div>
</>
)}
{!card && !isLoading && (
<p className="block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Card not found`}
</p>
)}
</div>
<div className="flex h-full flex-1 flex-row">
<div className="m-auto flex h-full w-full max-w-[800px] flex-col overflow-hidden">
<div className="h-full max-h-[calc(100dvh-3rem)] overflow-y-auto p-6 md:max-h-[calc(100dvh-4rem)] md:p-8">
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
{!card && isLoading && (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
</div>
)}
{card && (
<>
<div className="mb-10 flex w-full max-w-2xl flex-col justify-between">
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full space-y-6"
>
<div className="mt-2">
<Editor
content={card.description}
onChange={(e) => setValue("description", e)}
onBlur={() => handleSubmit(onSubmit)()}
workspaceMembers={board?.workspace.members ?? []}
/>
</div>
</form>
</div>
<Checklists
checklists={card.checklists}
cardPublicId={cardId}
activeChecklistForm={activeChecklistForm}
setActiveChecklistForm={setActiveChecklistForm}
<Link
className="whitespace-nowrap font-bold leading-[2.3rem] tracking-tight text-light-900 dark:text-dark-900 sm:text-[1.2rem]"
href={`/boards/${board?.publicId}`}
>
{board?.name}
</Link>
<IoChevronForwardSharp
size={18}
className="mx-2 text-light-900 dark:text-dark-900"
/>
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
<h2 className="text-md pb-4 font-medium text-light-1000 dark:text-dark-1000">
{t`Activity`}
</h2>
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full space-y-6"
>
<div>
<ActivityList
cardPublicId={cardId}
activities={activities ?? []}
isLoading={!card}
isAdmin={workspace.role === "admin"}
<input
type="text"
id="title"
{...register("title")}
onBlur={handleSubmit(onSubmit)}
className="block w-full border-0 bg-transparent p-0 py-0 font-bold tracking-tight text-neutral-900 focus:ring-0 dark:text-dark-1000 sm:text-[1.2rem]"
/>
</div>
<div className="mt-6">
<NewCommentForm cardPublicId={cardId} />
</div>
</form>
<div className="flex">
<Dropdown />
</div>
</>
)}
{!card && !isLoading && (
<p className="block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Card not found`}
</p>
)}
</div>
{card && (
<>
<div className="mb-10 flex w-full max-w-2xl flex-col justify-between">
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full space-y-6"
>
<div className="mt-2">
<Editor
content={card.description}
onChange={(e) => setValue("description", e)}
onBlur={() => handleSubmit(onSubmit)()}
workspaceMembers={board?.workspace?.members ?? []}
/>
</div>
</form>
</div>
<Checklists
checklists={card.checklists}
cardPublicId={cardId}
activeChecklistForm={activeChecklistForm}
setActiveChecklistForm={setActiveChecklistForm}
/>
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
<h2 className="text-md pb-4 font-medium text-light-1000 dark:text-dark-1000">
{t`Activity`}
</h2>
<div>
<ActivityList
cardPublicId={cardId}
activities={activities ?? []}
isLoading={!card}
isAdmin={workspace.role === "admin"}
/>
</div>
<div className="mt-6">
<NewCommentForm cardPublicId={cardId} />
</div>
</div>
</>
)}
</div>
</div>
<>
<Modal
modalSize="md"
isVisible={isOpen && modalContentType === "NEW_FEEDBACK"}
>
<FeedbackModal />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_LABEL"}
>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
{modalContentType === "NEW_LABEL" && (
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchCard} />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "EDIT_LABEL"}
>
)}
{modalContentType === "EDIT_LABEL" && (
<LabelForm
boardPublicId={boardId ?? ""}
refetch={refetchCard}
isEdit
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_LABEL"}
>
)}
{modalContentType === "DELETE_LABEL" && (
<DeleteLabelConfirmation
refetch={refetchCard}
labelPublicId={entityId}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_CARD"}
>
)}
{modalContentType === "DELETE_CARD" && (
<DeleteCardConfirmation
boardPublicId={boardId ?? ""}
cardPublicId={cardId}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_COMMENT"}
>
)}
{modalContentType === "DELETE_COMMENT" && (
<DeleteCommentConfirmation
cardPublicId={cardId}
commentPublicId={entityId}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
>
<NewWorkspaceForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "ADD_CHECKLIST"}
>
)}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "ADD_CHECKLIST" && (
<NewChecklistForm cardPublicId={cardId} />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_CHECKLIST"}
>
)}
{modalContentType === "DELETE_CHECKLIST" && (
<DeleteChecklistConfirmation
cardPublicId={cardId}
checklistPublicId={entityId}
/>
</Modal>
</>
)}
</Modal>
</div>
</>
);

View File

@@ -1,17 +1,17 @@
import PatternedBackground from "~/components/PatternedBackground";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
import Footer from "./Footer";
import Header from "./Header";
import { authClient } from "@kan/auth/client";
export default function Layout({ children }: { children: React.ReactNode }) {
const { theme } = useTheme();
const theme = useTheme();
const { data: session } = authClient.useSession();
const isLoggedIn = !!session?.user;
const isDarkMode = theme === "dark";
const isDarkMode = theme.activeTheme === "dark";
return (
<>

View File

@@ -6,7 +6,7 @@ import { IoLogoGithub, IoLogoHackernews } from "react-icons/io";
import Button from "~/components/Button";
import { PageHead } from "~/components/PageHead";
import { useTheme } from "next-themes";
import { useTheme } from "~/providers/theme";
import Cta from "./components/Cta";
import FAQs from "./components/Faqs";
import Features from "./components/Features";
@@ -14,10 +14,9 @@ import Layout from "./components/Layout";
import Pricing from "./components/Pricing";
export default function HomeView() {
const { resolvedTheme } = useTheme();
const isDarkMode = resolvedTheme === "dark";
const theme = useTheme();
const isDarkMode = theme.activeTheme === "dark";
return (
<Layout>
<PageHead title="Kan.bn | The open source alternative to Trello" />
@@ -89,27 +88,19 @@ export default function HomeView() {
</div>
<div className="px-4">
<div className="mb-24 rounded-[16px] border border-light-300 bg-light-50 p-1 shadow-md dark:border-dark-300 dark:bg-dark-100 lg:rounded-[24px] lg:p-2">
<div className="relative overflow-hidden rounded-[12px] border border-light-300 shadow-sm dark:border-dark-300 lg:rounded-[16px]">
<div className="overflow-hidden rounded-[12px] border border-light-300 shadow-sm dark:border-dark-300 lg:rounded-[16px]">
<Image
src={`/hero-light.png`}
src={`/hero-${isDarkMode ? "dark" : "light"}.png`}
alt="kanban"
width={1100}
height={1000}
className="block dark:hidden"
/>
<Image
src={`/hero-dark.png`}
alt="kanban"
width={1100}
height={1000}
className="hidden dark:block"
/>
</div>
</div>
</div>
<div className="relative pt-10">
<div id="features" className="absolute -top-20" />
<Features theme={resolvedTheme === "dark" ? "dark" : "light"} />
<Features theme={theme.activeTheme} />
</div>
<div className="relative pt-10">
<div id="pricing" className="absolute -top-20" />
@@ -120,7 +111,7 @@ export default function HomeView() {
<FAQs />
</div>
<div className="relative">
<Cta theme={resolvedTheme ?? "light"} />
<Cta theme={theme.activeTheme} />
</div>
</div>
</Layout>

View File

@@ -19,7 +19,7 @@ import { DeleteMemberConfirmation } from "./components/DeleteMemberConfirmation"
import { InviteMemberForm } from "./components/InviteMemberForm";
export default function MembersPage() {
const { modalContentType, openModal, isOpen } = useModal();
const { modalContentType, openModal } = useModal();
const { workspace } = useWorkspace();
const { data, isLoading } = api.workspace.byId.useQuery(
@@ -222,35 +222,12 @@ export default function MembersPage() {
</div>
</div>
<>
<Modal
modalSize="md"
isVisible={isOpen && modalContentType === "NEW_FEEDBACK"}
>
<FeedbackModal />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
>
<NewWorkspaceForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "INVITE_MEMBER"}
>
<InviteMemberForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "REMOVE_MEMBER"}
>
<DeleteMemberConfirmation />
</Modal>
</>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "INVITE_MEMBER" && <InviteMemberForm />}
{modalContentType === "REMOVE_MEMBER" && <DeleteMemberConfirmation />}
</Modal>
</div>
</>
);

View File

@@ -69,20 +69,17 @@ export function CardModal({
onClick={async (e) => {
e.preventDefault();
closeModal();
setTimeout(async () => {
try {
await router.replace(
`/${workspaceSlug}/${boardSlug}`,
undefined,
{
shallow: true,
},
);
} catch (error) {
console.error(error);
}
}, 400);
try {
await router.replace(
`/${workspaceSlug}/${boardSlug}`,
undefined,
{
shallow: true,
},
);
} catch (error) {
console.error(error);
}
}}
>
<HiXMark

View File

@@ -2,7 +2,6 @@ import Link from "next/link";
import { useRouter } from "next/router";
import { t } from "@lingui/core/macro";
import { keepPreviousData } from "@tanstack/react-query";
import { env } from "next-runtime-env";
import { useEffect, useState } from "react";
import { HiLink, HiOutlineLockClosed } from "react-icons/hi2";
@@ -20,10 +19,6 @@ import Card from "~/views/board/components/Card";
import Filters from "~/views/board/components/Filters";
import { CardModal } from "./CardModal";
const IS_CLOUD = env("NEXT_PUBLIC_KAN_ENV") === "cloud";
const HIDE_POWERED_BY =
env("NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY") === "true";
export default function PublicBoardView() {
const router = useRouter();
const { showPopup } = usePopup();
@@ -45,7 +40,7 @@ export default function PublicBoardView() {
members: formatToArray(router.query.members),
labels: formatToArray(router.query.labels),
},
{ enabled: router.isReady && !!boardSlug, placeholderData: keepPreviousData },
{ enabled: !!boardSlug, placeholderData: keepPreviousData },
);
const CopyBoardLink = () => {
@@ -107,7 +102,7 @@ export default function PublicBoardView() {
<div className="relative h-full overflow-hidden rounded-md border pb-8 dark:border-dark-200">
<PatternedBackground />
<div className="z-10 flex w-full justify-between p-8">
{isLoading || !router.isReady ? (
{isLoading ? (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-100" />
</div>
@@ -134,13 +129,13 @@ export default function PublicBoardView() {
</div>
<div className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative h-full flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300">
{isLoading || !router.isReady ? (
{isLoading ? (
<div className="ml-[2rem] flex">
<div className="0 mr-5 h-[500px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="0 mr-5 h-[275px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="0 mr-5 h-[375px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
</div>
) : !data && !isLoading && router.isReady && !!boardSlug ? (
) : !data ? (
<div className="z-10 flex h-full w-full flex-col items-center justify-center space-y-8 pb-[150px]">
<div className="flex flex-col items-center">
<HiOutlineLockClosed className="h-10 w-10 text-light-800 dark:text-dark-800" />
@@ -199,26 +194,12 @@ export default function PublicBoardView() {
<CopyBoardLink />
</div>
{IS_CLOUD && (
<Link
className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000"
href="/"
>
kan.bn
</Link>
)}
{!IS_CLOUD && !HIDE_POWERED_BY && (
<a
href="https://kan.bn"
target="_blank"
rel="noreferrer noopener"
className="absolute right-[1rem] inline-flex items-center gap-[0.175rem] rounded-full border border-light-300 bg-light-50 px-3 py-1 text-[11px] font-medium text-light-950 shadow-sm transition-colors hover:bg-light-100 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900 dark:hover:bg-dark-100"
>
<span>{`Powered by`}</span>
<span className="font-semibold">kan.bn</span>
</a>
)}
<Link
className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000"
href="/"
>
kan.bn
</Link>
</div>
</div>
<Popup />

View File

@@ -1,184 +0,0 @@
import { useRouter } from "next/navigation";
import { zodResolver } from "@hookform/resolvers/zod";
import { t } from "@lingui/core/macro";
import { useMutation } from "@tanstack/react-query";
import { env } from "next-runtime-env";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { authClient } from "@kan/auth/client";
import Button from "~/components/Button";
import Input from "~/components/Input";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
const FormSchema = z
.object({
currentPassword: z.string().min(1, t`Current password is required`),
newPassword: z
.string()
.min(8, t`Password must be at least 8 characters`)
.min(1, t`New password is required`),
confirmPassword: z.string().min(1, t`Please confirm your new password`),
})
.refine((data) => data.newPassword === data.confirmPassword, {
message: t`Passwords do not match`,
path: ["confirmPassword"],
})
.refine((data) => data.currentPassword !== data.newPassword, {
message: t`New password must be different from current password`,
path: ["newPassword"],
});
type FormValues = z.infer<typeof FormSchema>;
export function ChangePasswordFormConfirmation() {
const { closeModal } = useModal();
const { showPopup } = usePopup();
const router = useRouter();
const utils = api.useUtils();
const {
register,
handleSubmit,
formState: { errors, isValid },
reset,
setError,
} = useForm<FormValues>({
resolver: zodResolver(FormSchema),
mode: "onChange",
});
const changePasswordMutation = useMutation({
mutationFn: async (data: FormValues) => {
const response = await authClient.changePassword({
newPassword: data.newPassword,
currentPassword: data.currentPassword,
revokeOtherSessions: true,
});
if (response?.error) {
throw new Error(response?.error.message || "Invalid Password");
}
},
onSuccess: async () => {
closeModal();
showPopup({
header: t`Password Changed`,
message: t`Your password has been changed.`,
icon: "success",
});
utils.invalidate();
reset();
router.push("/");
},
onError: async (error: any) => {
const errorMessage = error.message.toLowerCase();
if (errorMessage.includes("invalid password")) {
setError("currentPassword", {
type: "manual",
message: t`The current password you entered is incorrect.`,
});
} else {
closeModal();
showPopup({
header: t`Error Changing Password`,
message: t`An unexpected error occurred. Please try again later.`,
icon: "error",
});
}
},
});
const onSubmit = (data: FormValues) => {
changePasswordMutation.mutate(data);
};
const handleCancel = () => {
reset();
closeModal();
};
return (
<div className="p-5">
<div className="flex w-full flex-col justify-between pb-4">
<h2 className="text-md pb-4 font-medium dark:text-white">{t`Change Password`}</h2>
<p className="mb-4 text-sm text-light-900">
{t`Enter your current password and choose a new secure password.`}
</p>
</div>
<form onSubmit={handleSubmit(onSubmit)}>
<div className="space-y-2">
<div>
<Input
id="currentPassword"
type="password"
{...register("currentPassword")}
placeholder={t`Enter your current password`}
/>
{errors.currentPassword && (
<p className="mt-2 text-xs text-red-400">
{errors.currentPassword.message}
</p>
)}
</div>
<div>
<Input
id="newPassword"
type="password"
{...register("newPassword")}
placeholder={t`Enter your new password`}
/>
{errors.newPassword && (
<p className="mt-2 text-xs text-red-400">
{errors.newPassword.message}
</p>
)}
</div>
<div>
<Input
id="confirmPassword"
type="password"
{...register("confirmPassword")}
placeholder={t`Confirm your new password`}
/>
{errors.confirmPassword && (
<p className="mt-2 text-xs text-red-400">
{errors.confirmPassword.message}
</p>
)}
</div>
</div>
<div className="mt-[1.5rem] flex items-center gap-4">
<Button
variant="secondary"
onClick={handleCancel}
type="button"
fullWidth
size="lg"
>
{t`Cancel`}
</Button>
<Button
variant="primary"
type="submit"
disabled={!isValid || changePasswordMutation.isPending}
isLoading={changePasswordMutation.isPending}
fullWidth
size="lg"
>
{t`Change Password`}
</Button>
</div>
</form>
</div>
);
}

View File

@@ -15,7 +15,6 @@ import { usePopup } from "~/providers/popup";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
import Avatar from "./components/Avatar";
import { ChangePasswordFormConfirmation } from "./components/ChangePasswordConfirmation";
import CreateAPIKeyForm from "./components/CreateAPIKeyForm";
import { CustomURLConfirmation } from "./components/CustomURLConfirmation";
import { DeleteAccountConfirmation } from "./components/DeleteAccountConfirmation";
@@ -26,15 +25,14 @@ import UpdateWorkspaceNameForm from "./components/UpdateWorkspaceNameForm";
import UpdateWorkspaceUrlForm from "./components/UpdateWorkspaceUrlForm";
export default function SettingsPage() {
const { modalContentType, openModal, isOpen } = useModal();
const { modalContentType, openModal } = useModal();
const { workspace } = useWorkspace();
const utils = api.useUtils();
const { showPopup } = usePopup();
const router = useRouter();
const workspaceUrlSectionRef = useRef<HTMLDivElement>(null);
const scrollContainerRef = useRef<HTMLDivElement>(null);
const isCredentialsEnabled =
env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true";
const { data } = api.user.getUser.useQuery();
const {
@@ -285,25 +283,6 @@ export default function SettingsPage() {
</div>
</div>
{isCredentialsEnabled && (
<div className="mb-8 border-t border-light-300 dark:border-dark-300">
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
{t`Change Password`}
</h2>
<p className="mb-8 text-sm text-neutral-500 dark:text-dark-900">
{t`You are about to change your password.`}
</p>
<div className="mt-4">
<Button
variant="secondary"
onClick={() => openModal("CHANGE_PASSWORD")}
>
{t`Change Password`}
</Button>
</div>
</div>
)}
<div className="mb-8 border-t border-light-300 dark:border-dark-300">
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
{t`Delete account`}
@@ -322,49 +301,19 @@ export default function SettingsPage() {
</div>
</div>
<>
<Modal
modalSize="md"
isVisible={isOpen && modalContentType === "NEW_FEEDBACK"}
>
<FeedbackModal />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
>
<NewWorkspaceForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_WORKSPACE"}
>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "DELETE_WORKSPACE" && (
<DeleteWorkspaceConfirmation />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "UPDATE_WORKSPACE_URL"}
>
)}
{modalContentType === "UPDATE_WORKSPACE_URL" && (
<CustomURLConfirmation workspacePublicId={workspace.publicId} />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_ACCOUNT"}
>
)}
{modalContentType === "DELETE_ACCOUNT" && (
<DeleteAccountConfirmation />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "CHANGE_PASSWORD"}
>
<ChangePasswordFormConfirmation />
</Modal>
</>
)}
</Modal>
</div>
</div>
</>

View File

@@ -4,7 +4,6 @@ import { fontFamily } from "tailwindcss/defaultTheme";
import baseConfig from "@kan/tailwind-config/web";
export default {
darkMode: "class",
content: [...baseConfig.content],
plugins: [require("@tailwindcss/typography")],
presets: [baseConfig],

View File

@@ -35,9 +35,6 @@ services:
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
# White label
- NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY=${NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY}
# Auth config (optional)
- NEXT_PUBLIC_ALLOW_CREDENTIALS=${NEXT_PUBLIC_ALLOW_CREDENTIALS}
- NEXT_PUBLIC_DISABLE_SIGN_UP=${NEXT_PUBLIC_DISABLE_SIGN_UP}
@@ -46,11 +43,6 @@ services:
- TRELLO_APP_API_KEY=${TRELLO_APP_API_KEY}
- TRELLO_APP_SECRET=${TRELLO_APP_SECRET}
# Generic OIDC provider (optional)
- OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
- OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
- OIDC_DISCOVERY_URL=${OIDC_DISCOVERY_URL}
# OAuth providers (optional)
- BETTER_AUTH_TRUSTED_ORIGINS=${BETTER_AUTH_TRUSTED_ORIGINS}
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}

View File

@@ -2,7 +2,7 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { createAuthEndpoint, createAuthMiddleware } from "better-auth/api";
import { apiKey, genericOAuth } from "better-auth/plugins";
import { apiKey } from "better-auth/plugins";
import { magicLink } from "better-auth/plugins/magic-link";
import { socialProviderList } from "better-auth/social-providers";
import { env } from "next-runtime-env";
@@ -83,20 +83,8 @@ export const socialProvidersPlugin = () => ({
{
method: "GET",
},
async (ctx) => {
const providers = ctx.context.socialProviders.map((p) =>
p.id.toLowerCase(),
);
// Add OIDC provider if configured
if (
process.env.OIDC_CLIENT_ID &&
process.env.OIDC_CLIENT_SECRET &&
process.env.OIDC_DISCOVERY_URL
) {
providers.push("oidc");
}
return ctx.json(providers);
},
async (ctx) =>
ctx.json(ctx.context.socialProviders.map((p) => p.id.toLowerCase())),
),
},
});
@@ -174,25 +162,6 @@ export const initAuth = (db: dbClient) => {
}
},
}),
// Generic OIDC provider
...(process.env.OIDC_CLIENT_ID &&
process.env.OIDC_CLIENT_SECRET &&
process.env.OIDC_DISCOVERY_URL
? [
genericOAuth({
config: [
{
providerId: "oidc",
clientId: process.env.OIDC_CLIENT_ID,
clientSecret: process.env.OIDC_CLIENT_SECRET,
discoveryUrl: process.env.OIDC_DISCOVERY_URL,
scopes: ["openid", "email", "profile"],
pkce: true,
},
],
}),
]
: []),
],
databaseHooks: {
user: {

View File

@@ -1,13 +1,8 @@
import type { BetterAuthClientPlugin } from "better-auth";
import type { BetterFetchOption } from "better-auth/react";
import {
apiKeyClient,
genericOAuthClient,
magicLinkClient,
} from "better-auth/client/plugins";
import { createAuthClient } from "better-auth/react";
import { BetterAuthClientPlugin } from "better-auth";
import { apiKeyClient, magicLinkClient } from "better-auth/client/plugins";
import { BetterFetchOption, createAuthClient } from "better-auth/react";
import type { socialProvidersPlugin } from "./auth";
import { socialProvidersPlugin } from "./auth";
const socialProvidersPluginClient = {
id: "social-providers-plugin",
@@ -26,10 +21,5 @@ const socialProvidersPluginClient = {
} satisfies BetterAuthClientPlugin;
export const authClient = createAuthClient({
plugins: [
magicLinkClient(),
apiKeyClient(),
genericOAuthClient(),
socialProvidersPluginClient,
],
plugins: [magicLinkClient(), apiKeyClient(), socialProvidersPluginClient],
});

14
pnpm-lock.yaml generated
View File

@@ -171,9 +171,6 @@ importers:
next-runtime-env:
specifier: ^1.7.2
version: 1.8.0
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
nextjs-cors:
specifier: ^2.2.0
version: 2.2.0(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
@@ -5460,12 +5457,6 @@ packages:
next-runtime-env@1.8.0:
resolution: {integrity: sha512-QJVxzmr2gTao/vZKFgcrByFrifl0YOMTvuUVxcI/X7ratlW+9zMvMmA9AGU9cFsumXJtohWkCvwPdBNdkTCYfw==}
next-themes@0.4.6:
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
next@15.0.4:
resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -13037,11 +13028,6 @@ snapshots:
dependencies:
chalk: 4.1.2
next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next@15.0.4(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 15.0.4

View File

@@ -72,9 +72,6 @@
"VK_CLIENT_SECRET",
"LINKEDIN_CLIENT_ID",
"LINKEDIN_CLIENT_SECRET",
"OIDC_CLIENT_ID",
"OIDC_CLIENT_SECRET",
"OIDC_DISCOVERY_URL",
"REDDIT_CLIENT_ID",
"REDDIT_CLIENT_SECRET",
"ROBLOX_CLIENT_ID",
@@ -96,7 +93,6 @@
"SMTP_PASSWORD",
"SMTP_SECURE",
"NEXT_PUBLIC_KAN_ENV",
"NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY",
"STRIPE_SECRET_KEY",
"STRIPE_WEBHOOK_SECRET",
"STRIPE_PRO_PLAN_PRICE_ID",