Compare commits

...

10 Commits

Author SHA1 Message Date
Henry
b00c47952c chore: add translations 2025-09-26 22:11:18 +01:00
Henry
aa931ddcbe feat: only allow admin users to create links 2025-09-26 22:08:52 +01:00
Henry
73b9ac7cb5 feat(cloud): update subscription for cloud 2025-09-26 22:00:20 +01:00
Henry
01e0140e6a refactor: tweak light mode styles 2025-09-26 21:45:49 +01:00
Henry
f22a0332ab feat: switch to workspace on invite success 2025-09-26 21:38:05 +01:00
Henry
bd97362d90 feat: add invite page 2025-09-25 23:11:02 +01:00
Henry
3b3b4f89ba feat: redirect to next param on authentication 2025-09-25 22:06:18 +01:00
Henry
17f876160d feat: add repo funcs and share link toggle 2025-09-23 22:58:59 +01:00
Henry
dd1bd9b7cc feat: update workspace invite schema 2025-09-23 22:51:33 +01:00
Henry
7d9746be20 feat: add workspace invite links schema 2025-09-23 21:42:37 +01:00
30 changed files with 4678 additions and 506 deletions

View File

@@ -36,6 +36,7 @@ checksums:
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
Anyone%20with%20this%20link%20can%20join%20your%20workspace/singular: 2366ed295eb2c03c425559c24cb31606
API/singular: 01d9819514e27056dcc69463194b63d2
API%20key%20created/singular: 8dbb2b60a719b0d120e774d6666c8c45
API%20key%20name/singular: 2d8aeb08b2cce3b750a584bbc5ce6d1d
@@ -165,7 +166,10 @@ checksums:
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
Enter%20your%20new%20password/singular: c67251e3002b68bc20a7cf5de23e43ac
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
Error/singular: 3c95bcb32c2104b99a46f5b3dd015248
Error%20Changing%20Password/singular: ebecb5c1b72ba4b063117241f5ba4f2d
Error%20creating%20invite%20link/singular: cbedc3f3213dfc4fdc8b7503ae1a5cd6
Error%20deactivating%20invite%20link/singular: ccf42cd5aa8481692003e87e836de66c
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
@@ -182,6 +186,8 @@ checksums:
Everything%20in%20the%20free%20plan%2C%20plus%3A/singular: 62b44c4973b92b806c69a4b15e0256dc
Everything%20you%20need%2C%20free%20forever.%20Unlimited%20boards%2C%20unlimited%20lists%2C%20unlimited%20cards.%20Upgrade%20any%20time./singular: fa21632ab1468edf10acda2fe7b71323
Execution/singular: cbac4a3c721123cbc6a883560bf29800
Failed%20to%20accept%20invitation.%20Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: e4505a9df3a81e93a8a8b103c6e3ebc4
Failed%20to%20copy%20invite%20link/singular: 635884d5ed8d6ee20b85a003939b4ae7
Failed%20to%20login%20with%20%7B0%7D.%20Please%20try%20again./singular: 669a4b4247a73f53fb9b8b16e42d166f
FAQs/singular: dc36d7992372ccd419b39ef51cf5b16c
Feature/singular: 58f5f3f37862b6312a2f20ec1a1fd0e8
@@ -206,6 +212,7 @@ checksums:
Get%20started%20on%20Cloud/singular: ed926f526266ad2063283c58e6f4284a
Getting%20started/singular: 8e5e7bd026b5bec46bbfdce02ab9e0b8
GitHub/singular: 6e1cf3c00fa6fbe24afcc78ea3b5f3e4
Go%20Home/singular: 6251589da1964d55afabdfd64c84c335
Go%20to%20app/singular: 896d0441384dcd2bfb3b23d61ff1944d
High%20Priority/singular: 5d231ff8254aabc875f194c4b4f49c97
Hired/singular: e5a9b1bd409b007141fe3d7890022f9a
@@ -231,10 +238,14 @@ checksums:
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
Invalid%20email%20address/singular: b2d9f25626f2d15c7c63e0281bccc247
Invalid%20invitation/singular: 4b936a8811a2295a5f58b41473c608f3
Invite/singular: 181884cea804cbde665f160811ee7ad0
Invite%20another/singular: acb543563dab7edbcf46060a53ade3a3
Invite%20link%20copied/singular: 4046f23a78e1cd5166671c3fb8a7ea6e
Invite%20link%20copied%20to%20clipboard/singular: 6fc055a0ea0ed1aa58c5e0c502efe17f
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
Inviting%20members%20requires%20a%20Team%20Plan.%20You'll%20be%20redirected%20to%20upgrade%20your%20workspace./singular: 03eeed2d715e770259f722ba48a61ab3
Join%20workspace/singular: f5d035df672b05abd760bd022309c719
Join%20workspace%20%7C%20kan.bn/singular: 97855216a0e00214b2dcf917e93164f2
Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
Kanban%20reimagined/singular: 613ccfdd9f54c66cbf68cfa313498766
@@ -309,6 +320,7 @@ checksums:
Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f
Please%20select%20a%20file%20to%20upload./singular: de315bf594047f8ef9307a7fa9285844
Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: 21ffcf0b00e7cd7b64f7454a95762e1d
Please%20try%20again%20later./singular: 325dea6dd0348a27a6818db2c1340c98
Pricing/singular: ce27f1aeacccc542a174c4b2bce022b0
Priority%20email%20support/singular: 678538c912a770b1e1416ecdb8e299b1
Privacy%20policy/singular: 462c6a536b52873e4498785c66dd48c8
@@ -355,7 +367,10 @@ checksums:
Settings%20%7C%20Billing/singular: e44cba741d5414035a0b499c5766c203
Settings%20%7C%20Integrations/singular: d04992e28016452f6d3d7dcc0b592415
Settings%20%7C%20Workspace/singular: 5d0bacf7ff696da940f232df45edfd39
Share%20invite%20link/singular: ec5081a1f4e49fd9d782e770438f703b
Sign%20in/singular: cb8757c7450e17de1e226e82fb0fa4a2
Sign%20In/singular: ec7b8f314fe9bc6591006707484ede61
Sign%20Up/singular: 0dd2ae69be4618c1f9e615774a4509ca
Sign%20up%20%7C%20kan.bn/singular: f3de2a110c90358e6eac07d0b2f663a6
Sign%20up%20disabled/singular: 9581b1f75b404ac0ecb7e603e0d4189c
Sign%20up%20is%20currently%20disabled.%20Please%20try%20again%20later./singular: c6cb7c455ec053b351a27029158ff166
@@ -385,6 +400,7 @@ checksums:
This%20API%20key%20will%20only%20be%20shown%20once.%20Please%20save%20it%20in%20a%20secure%20location./singular: 7df18d2978d317375f780822f8321c4d
This%20board%20is%20private%20or%20does%20not%20exist/singular: a217ff3f04463b4df8c86adb6f83c6bc
This%20board%20URL%20has%20already%20been%20taken/singular: 1d8b40332a031b5b77a3658e48dd51ca
This%20invitation%20link%20is%20invalid%20or%20has%20expired./singular: 11cc7ef8f1512e7e058e1fbbe5644001
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081
This%20workspace%20URL%20has%20already%20been%20taken/singular: b455329e2a71da677acab91d3a00bad6
@@ -485,6 +501,8 @@ checksums:
You%20have%20been%20logged%20in%20successfully./singular: ef8fad1dce13ae4112f17c5258655fea
You%20have%20been%20signed%20up%20successfully./singular: f614a6e3b45f5ffb9a3b0fb420fef84b
You%20have%20unlimited%20seats%20with%20your%20Pro%20Plan.%20There%20is%20no%20additional%20charge%20for%20new%20members!/singular: e3dc59a5ba7211cd3d8516b3a79d85ca
You've%20been%20invited%20to%20join%20a%20workspace%20on%20kan.bn./singular: 257b840726f972f384243a72767f880f
You've%20been%20invited%20to%20join%20a%20workspace./singular: 24fc6cdc8740f37a83df85f582f03293
Your%20account%20has%20been%20deleted./singular: 8c8d944e07388c5877effdb2c2803dcf
Your%20boards%20have%20been%20imported./singular: 403972e7a25afc2415762c1c2b1ec868
Your%20display%20name%20has%20been%20updated./singular: 15e5fff36c554c16ec5214427fae1bf4

View File

@@ -1,4 +1,5 @@
import type { SocialProvider } from "better-auth/social-providers";
import { useSearchParams } from "next/navigation";
import { zodResolver } from "@hookform/resolvers/zod";
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
@@ -160,6 +161,9 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
const { showPopup } = usePopup();
const oidcProviderName = "OIDC";
const redirect = useSearchParams().get("next");
const callbackURL = redirect ?? "/boards";
// Safely get environment variables on client side to avoid hydration mismatch
useEffect(() => {
const credentialsAllowed =
@@ -195,7 +199,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
name,
email,
password,
callbackURL: "/boards",
callbackURL,
},
{
onSuccess: () =>
@@ -212,7 +216,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
{
email,
password,
callbackURL: "/boards",
callbackURL,
},
{
onSuccess: () =>
@@ -229,7 +233,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
await authClient.signIn.magicLink(
{
email,
callbackURL: "/boards",
callbackURL,
},
{
onSuccess: () => setIsMagicLinkSent(true, email),
@@ -250,14 +254,14 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
// Use oauth2 signin for OIDC provider
const result = await authClient.signIn.oauth2({
providerId: "oidc",
callbackURL: "/boards",
callbackURL,
});
error = result.error;
} else {
// Use social signin for traditional social providers
const result = await authClient.signIn.social({
provider,
callbackURL: "/boards",
callbackURL,
});
error = result.error;
}

View File

@@ -36,12 +36,12 @@ msgstr "{0} Labels"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/Monat"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/Monat"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Label hinzufügen"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Mitglied hinzufügen"
@@ -136,11 +136,11 @@ msgstr "hat Checklistenelement <0>{0}</0> hinzugefügt"
msgid "added label <0>{0}</0>"
msgstr "hat Label <0>{0}</0> hinzugefügt"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Das Hinzufügen eines neuen Mitglieds kostet zusätzlich {price} ({billingType}) pro Platz."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Passe den quadratischen Zuschnitt an deinen Avatar an."
@@ -152,7 +152,7 @@ msgstr "Administratorrollen"
msgid "All systems operational"
msgstr "Alle Systeme funktionieren"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</1></0>"
@@ -164,6 +164,10 @@ msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
msgid "An unexpected error occurred. Please try again later."
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Jeder mit diesem Link kann deinem Arbeitsbereich beitreten"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Einfaches Kanban"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "jährlich abgerechnet"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "monatlich abgerechnet"
@@ -342,7 +346,7 @@ msgstr "Fehlerbericht"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Passwort ändern"
msgid "Change your language preferences."
msgstr "Ändern Sie Ihre Spracheinstellungen."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Überprüfe deinen Posteingang"
@@ -382,8 +386,8 @@ msgstr "Checklistenname"
msgid "Clear filters"
msgstr "Filter löschen"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Klicke auf den Link, den wir an {magicLinkRecipient} gesendet haben, um dich anzumelden."
@@ -459,12 +463,12 @@ msgstr "Kontaktiere uns"
msgid "Content Creation"
msgstr "Content-Erstellung"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Fortfahren mit "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Fortfahren mit {0}"
@@ -532,7 +536,7 @@ msgstr "hat die Karte erstellt"
msgid "Critical"
msgstr "Kritisch"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Schneide deinen Avatar zu"
@@ -661,7 +665,7 @@ msgstr "Dokumente"
msgid "Documentation"
msgstr "Dokumentation"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Du hast noch kein Konto? <0><1>Registrieren</1></0>"
@@ -693,11 +697,11 @@ msgstr "Workspace-URL bearbeiten"
msgid "Editing"
msgstr "Bearbeitung"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "E-Mail"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "E-Mail"
@@ -713,11 +717,11 @@ msgstr "Geben Sie Ihr aktuelles Passwort ein"
msgid "Enter your current password and choose a new secure password."
msgstr "Geben Sie Ihr aktuelles Passwort ein und wählen Sie ein neues sicheres Passwort."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Gib deine E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Gib deinen Namen ein"
@@ -725,14 +729,26 @@ msgstr "Gib deinen Namen ein"
msgid "Enter your new password"
msgstr "Geben Sie Ihr neues Passwort ein"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Gib dein Passwort ein"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Fehler"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Fehler beim Ändern des Passworts"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Fehler beim Erstellen des Einladungslinks"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Fehler beim Deaktivieren des Einladungslinks"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Fehler beim Löschen des Kontos"
@@ -749,8 +765,8 @@ msgstr "Fehler beim Löschen des Arbeitsbereichs"
msgid "Error disconnecting Trello"
msgstr "Fehler beim Trennen von Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Fehler beim Einladen des Mitglieds"
@@ -758,7 +774,7 @@ msgstr "Fehler beim Einladen des Mitglieds"
msgid "Error updating display name"
msgstr "Fehler beim Aktualisieren des Anzeigenamens"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Fehler beim Aktualisieren des Profilbilds"
@@ -774,7 +790,7 @@ msgstr "Fehler beim Aktualisieren des Arbeitsbereichsnamens"
msgid "Error updating workspace URL"
msgstr "Fehler beim Aktualisieren der Workspace-URL"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Fehler beim Upgrade des Abonnements"
@@ -783,8 +799,8 @@ msgstr "Fehler beim Upgrade des Abonnements"
msgid "Error upgrading to Pro"
msgstr "Fehler beim Upgrade auf Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Fehler beim Hochladen des Profilbilds"
@@ -800,8 +816,16 @@ msgstr "Alles was du brauchst, für immer kostenlos. Unbegrenzte Boards, unbegre
msgid "Execution"
msgstr "Ausführung"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Einladung konnte nicht angenommen werden. Bitte versuche es später erneut oder kontaktiere den Kundensupport."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Einladungslink konnte nicht kopiert werden"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut."
@@ -849,7 +873,7 @@ msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-S
msgid "Free"
msgstr "Kostenlos"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Kostenloser Plan"
@@ -866,7 +890,7 @@ msgstr "Vollzeit"
msgid "Fun"
msgstr "Spaß"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Erste Schritte"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Zur Startseite"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Zur App"
@@ -1006,27 +1035,44 @@ msgstr "Integrationen"
msgid "Interviewing"
msgstr "Vorstellungsgespräch"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Ungültige E-Mail-Adresse"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Ungültige Einladung"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Einladen"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Weitere Person einladen"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Einladungslink kopiert"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Einladungslink in die Zwischenablage kopiert"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Mitglied einladen"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Das Einladen von Mitgliedern erfordert einen Team-Plan. Sie werden weitergeleitet, um Ihren Workspace zu upgraden."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Arbeitsbereich beitreten"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Arbeitsbereich beitreten | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1099,7 +1145,7 @@ msgstr "Liste"
msgid "List name"
msgstr "Listenname"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "Langfristig"
msgid "Low Priority"
msgstr "Niedrige Priorität"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "Magic Link"
@@ -1149,7 +1195,7 @@ msgstr "Mitglieder | {0}"
msgid "Monthly"
msgstr "Monatlich"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "monatliche Abrechnung"
@@ -1261,7 +1307,7 @@ msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion k
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Sobald Sie Ihren Arbeitsbereich löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "oder"
@@ -1318,19 +1364,19 @@ msgstr "Planung"
msgid "Please confirm your new password"
msgstr "Bitte bestätigen Sie Ihr neues Passwort"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Bitte gib einen gültigen Namen ein"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Bitte gib ein gültiges Passwort ein"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Bitte wähle eine Datei zum Hochladen aus."
@@ -1359,10 +1405,10 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
msgid "Please try again later, or contact customer support."
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Bitte versuche es später erneut."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Privat"
msgid "Pro Plan"
msgstr "Pro-Plan"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Pro-Plan ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Profilbild aktualisiert"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Auf eigener Infrastruktur betreiben"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Speichern"
@@ -1566,25 +1617,37 @@ msgstr "Einstellungen | Integrationen"
msgid "Settings | Workspace"
msgstr "Einstellungen | Arbeitsbereich"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Einladungslink teilen"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Anmelden"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Anmelden"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Registrieren"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Registrieren | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Registrierung deaktiviert"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Registrieren mit "
@@ -1608,8 +1671,8 @@ msgstr "Softwareentwicklung"
msgid "Star on Github"
msgstr "Stern auf Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Erfolg"
@@ -1629,7 +1692,7 @@ msgstr "Unterstütze die Entwicklung des Projekts"
msgid "System"
msgstr "System"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Team-Plan"
@@ -1694,6 +1757,10 @@ msgstr "Dieses Board ist privat oder existiert nicht"
msgid "This board URL has already been taken"
msgstr "Diese Board-URL ist bereits vergeben"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Dieser Einladungslink ist ungültig oder abgelaufen."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Dies führt zur permanenten Löschung aller mit diesem Workspace verbundenen Daten."
@@ -1909,7 +1976,7 @@ msgstr "Upgrade auf Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade auf Pro ($29/Monat)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Upgrade auf Team-Plan"
@@ -1941,7 +2008,7 @@ msgstr "Vorlage verwenden"
msgid "User"
msgstr "Benutzer"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
@@ -1985,7 +2052,7 @@ msgstr "Wir verwenden die <0>AGPL-3.0 lizenz</0>."
msgid "We're just getting started. "
msgstr "Wir stehen erst am anfang. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Willkommen zurück"
@@ -2100,18 +2167,26 @@ msgstr "Du kannst teammitglieder einladen, indem du auf die schaltfläche \"Einl
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Sie können selbst hosten, indem sie den anweisungen in unserem <0>repo</0> folgen."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Sie haben sich erfolgreich angemeldet."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Sie haben sich erfolgreich registriert."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "Sie haben unbegrenzte Plätze mit Ihrem Pro-Plan. Für neue Mitglieder fallen keine zusätzlichen Kosten an!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Du wurdest eingeladen, einem Arbeitsbereich auf kan.bn beizutreten."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Du wurdest eingeladen, einem Arbeitsbereich beizutreten."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Dein Konto wurde gelöscht."
@@ -2128,7 +2203,7 @@ msgstr "Dein Anzeigename wurde aktualisiert."
msgid "Your password has been changed."
msgstr "Ihr Passwort wurde geändert."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Dein Profilbild wurde aktualisiert."

File diff suppressed because one or more lines are too long

View File

@@ -40,12 +40,12 @@ msgstr "{boardCount, plural, one {Import board (1)} other {Import boards ({board
#~ msgid "#1 Hacker News"
#~ msgstr "#1 Hacker News"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/month"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/month"
@@ -117,7 +117,7 @@ msgid "Add label"
msgstr "Add label"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Add member"
@@ -156,11 +156,11 @@ msgstr "added label <0>{0}</0>"
#~ msgid "added label <0>{label}</0>"
#~ msgstr "added label <0>{label}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Adding a new member will cost an additional {price} ({billingType}) per seat."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Adjust the square crop to fit your avatar."
@@ -176,7 +176,7 @@ msgstr "Admin roles"
msgid "All systems operational"
msgstr "All systems operational"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Already have an account? <0><1>Sign in</1></0>"
@@ -188,6 +188,10 @@ msgstr "An error occurred while disconnecting your Trello account."
msgid "An unexpected error occurred. Please try again later."
msgstr "An unexpected error occurred. Please try again later."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Anyone with this link can join your workspace"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -282,11 +286,11 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basic Kanban"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "billed annually"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "billed monthly"
@@ -391,7 +395,7 @@ msgstr "Bug Report"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -422,8 +426,8 @@ msgstr "Change Password"
msgid "Change your language preferences."
msgstr "Change your language preferences."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Check your inbox"
@@ -435,8 +439,8 @@ msgstr "Checklist name"
msgid "Clear filters"
msgstr "Clear filters"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Click on the link we've sent to {magicLinkRecipient} to sign in."
@@ -516,12 +520,12 @@ msgstr "Contact us"
msgid "Content Creation"
msgstr "Content Creation"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Continue with "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Continue with {0}"
@@ -597,7 +601,7 @@ msgstr "created the card"
msgid "Critical"
msgstr "Critical"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Crop your avatar"
@@ -734,7 +738,7 @@ msgstr "Docs"
msgid "Documentation"
msgstr "Documentation"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Don't have an account? <0><1>Sign up</1></0>"
@@ -766,11 +770,11 @@ msgstr "Edit workspace URL"
msgid "Editing"
msgstr "Editing"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "Email"
@@ -786,11 +790,11 @@ msgstr "Enter your current password"
msgid "Enter your current password and choose a new secure password."
msgstr "Enter your current password and choose a new secure password."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Enter your email address"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Enter your name"
@@ -798,14 +802,26 @@ msgstr "Enter your name"
msgid "Enter your new password"
msgstr "Enter your new password"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Enter your password"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Error"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Error Changing Password"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Error creating invite link"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Error deactivating invite link"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Error deleting account"
@@ -822,8 +838,8 @@ msgstr "Error deleting workspace"
msgid "Error disconnecting Trello"
msgstr "Error disconnecting Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Error inviting member"
@@ -831,7 +847,7 @@ msgstr "Error inviting member"
msgid "Error updating display name"
msgstr "Error updating display name"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Error updating profile image"
@@ -847,7 +863,7 @@ msgstr "Error updating workspace name"
msgid "Error updating workspace URL"
msgstr "Error updating workspace URL"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Error upgrading subscription"
@@ -856,8 +872,8 @@ msgstr "Error upgrading subscription"
msgid "Error upgrading to Pro"
msgstr "Error upgrading to Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Error uploading profile image"
@@ -873,8 +889,16 @@ msgstr "Everything you need, free forever. Unlimited boards, unlimited lists, un
msgid "Execution"
msgstr "Execution"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Failed to accept invitation. Please try again later, or contact customer support."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Failed to copy invite link"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Failed to login with {0}. Please try again."
@@ -923,7 +947,7 @@ msgstr "For long-term sustainability, we recognise all good open source projects
msgid "Free"
msgstr "Free"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Free Plan"
@@ -940,7 +964,7 @@ msgstr "Full-time"
msgid "Fun"
msgstr "Fun"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -980,8 +1004,13 @@ msgstr "Getting started"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Go Home"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Go to app"
@@ -1084,27 +1113,48 @@ msgstr "Integrations"
msgid "Interviewing"
msgstr "Interviewing"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Invalid email address"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invalid invitation"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Invite"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Invite another"
#~ msgid "Invite another"
#~ msgstr "Invite another"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Invite link copied"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Invite link copied to clipboard"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Invite member"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Join workspace"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Join workspace | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1177,7 +1227,7 @@ msgstr "List"
msgid "List name"
msgstr "List name"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1193,7 +1243,7 @@ msgstr "Long-term"
msgid "Low Priority"
msgstr "Low Priority"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "magic link"
@@ -1227,7 +1277,7 @@ msgstr "Members | {0}"
msgid "Monthly"
msgstr "Monthly"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "monthly billing"
@@ -1351,7 +1401,7 @@ msgstr "Once you delete your account, there is no going back. This action cannot
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Once you delete your workspace, there is no going back. This action cannot be undone."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "or"
@@ -1408,19 +1458,19 @@ msgstr "Planning"
msgid "Please confirm your new password"
msgstr "Please confirm your new password"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Please enter a valid email address"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Please enter a valid name"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Please enter a valid password"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Please select a file to upload."
@@ -1449,10 +1499,10 @@ msgstr "Please select a file to upload."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1463,6 +1513,11 @@ msgstr "Please select a file to upload."
msgid "Please try again later, or contact customer support."
msgstr "Please try again later, or contact customer support."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Please try again later."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1486,11 +1541,11 @@ msgstr "Private"
msgid "Pro Plan"
msgstr "Pro Plan"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Pro Plan ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Profile image updated"
@@ -1599,7 +1654,7 @@ msgid "Run on your own infrastructure"
msgstr "Run on your own infrastructure"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Save"
@@ -1672,25 +1727,37 @@ msgstr "Settings | Integrations"
msgid "Settings | Workspace"
msgstr "Settings | Workspace"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Share invite link"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Sign in"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Sign In"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Sign Up"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Sign up | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Sign up disabled"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "Sign up is currently disabled. Please try again later."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Sign up with "
@@ -1714,8 +1781,8 @@ msgstr "Software Development"
msgid "Star on Github"
msgstr "Star on Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Success"
@@ -1735,7 +1802,7 @@ msgstr "Support the development of the project"
msgid "System"
msgstr "System"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Team Plan"
@@ -1800,6 +1867,10 @@ msgstr "This board is private or does not exist"
msgid "This board URL has already been taken"
msgstr "This board URL has already been taken"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "This invitation link is invalid or has expired."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "This will result in the permanent deletion of all data associated with this workspace."
@@ -2027,7 +2098,7 @@ msgstr "Upgrade to Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade to Pro ($29/month)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Upgrade to Team Plan"
@@ -2059,7 +2130,7 @@ msgstr "Use template"
msgid "User"
msgstr "User"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "User is already a member of this workspace"
@@ -2103,7 +2174,7 @@ msgstr "We are using the <0>AGPL-3.0 license</0>."
msgid "We're just getting started. "
msgstr "We're just getting started. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Welcome back"
@@ -2222,18 +2293,26 @@ msgstr "You can invite team members by clicking the \"Invite\" button in the top
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "You can self-host by following the instructions in our <0>repo</0>."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "You have been logged in successfully."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "You have been signed up successfully."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "You've been invited to join a workspace on kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "You've been invited to join a workspace."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Your account has been deleted."
@@ -2250,7 +2329,7 @@ msgstr "Your display name has been updated."
msgid "Your password has been changed."
msgstr "Your password has been changed."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Your profile image has been updated."

File diff suppressed because one or more lines are too long

View File

@@ -36,12 +36,12 @@ msgstr "{0} etiquetas"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/mes"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/mes"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Añadir etiqueta"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Añadir miembro"
@@ -136,11 +136,11 @@ msgstr "añadió el elemento <0>{0}</0> a la lista de verificación"
msgid "added label <0>{0}</0>"
msgstr "añadió la etiqueta <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Añadir un nuevo miembro costará {price} adicionales ({billingType}) por asiento."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Ajusta el recorte cuadrado para que se adapte a tu avatar."
@@ -152,7 +152,7 @@ msgstr "Roles de administrador"
msgid "All systems operational"
msgstr "Todos los sistemas operativos"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</1></0>"
@@ -164,6 +164,10 @@ msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
msgid "An unexpected error occurred. Please try again later."
msgstr "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo más tarde."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Cualquier persona con este enlace puede unirse a tu espacio de trabajo"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Pendientes"
msgid "Basic Kanban"
msgstr "Kanban básico"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "facturado anualmente"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "facturado mensualmente"
@@ -342,7 +346,7 @@ msgstr "Informe de error"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Cambiar contraseña"
msgid "Change your language preferences."
msgstr "Cambia tus preferencias de idioma."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Revisa tu bandeja de entrada"
@@ -382,8 +386,8 @@ msgstr "Nombre de la lista de verificación"
msgid "Clear filters"
msgstr "Borrar filtros"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Haz clic en el enlace que hemos enviado a {magicLinkRecipient} para iniciar sesión."
@@ -459,12 +463,12 @@ msgstr "Contáctanos"
msgid "Content Creation"
msgstr "Creación de contenido"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Continuar con "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Continuar con {0}"
@@ -532,7 +536,7 @@ msgstr "creó la tarjeta"
msgid "Critical"
msgstr "Crítico"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Recorta tu avatar"
@@ -661,7 +665,7 @@ msgstr "Documentos"
msgid "Documentation"
msgstr "Documentación"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "¿No tienes una cuenta? <0><1>Regístrate</1></0>"
@@ -693,11 +697,11 @@ msgstr "Editar URL del espacio de trabajo"
msgid "Editing"
msgstr "Editando"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "correo electrónico"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "Correo electrónico"
@@ -713,11 +717,11 @@ msgstr "Introduce tu contraseña actual"
msgid "Enter your current password and choose a new secure password."
msgstr "Introduce tu contraseña actual y elige una nueva contraseña segura."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Introduce tu dirección de correo electrónico"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Introduce tu nombre"
@@ -725,14 +729,26 @@ msgstr "Introduce tu nombre"
msgid "Enter your new password"
msgstr "Introduce tu nueva contraseña"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Introduce tu contraseña"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Error"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Error al cambiar la contraseña"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Error al crear el enlace de invitación"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Error al desactivar el enlace de invitación"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Error al eliminar la cuenta"
@@ -749,8 +765,8 @@ msgstr "Error al eliminar el espacio de trabajo"
msgid "Error disconnecting Trello"
msgstr "Error al desconectar Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Error al invitar al miembro"
@@ -758,7 +774,7 @@ msgstr "Error al invitar al miembro"
msgid "Error updating display name"
msgstr "Error al actualizar el nombre visible"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Error al actualizar la imagen de perfil"
@@ -774,7 +790,7 @@ msgstr "Error al actualizar el nombre del espacio de trabajo"
msgid "Error updating workspace URL"
msgstr "Error al actualizar la URL del espacio de trabajo"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Error al actualizar la suscripción"
@@ -783,8 +799,8 @@ msgstr "Error al actualizar la suscripción"
msgid "Error upgrading to Pro"
msgstr "Error al actualizar a Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Error al subir la imagen de perfil"
@@ -800,8 +816,16 @@ msgstr "Todo lo que necesitas, gratis para siempre. Tableros ilimitados, listas
msgid "Execution"
msgstr "Ejecución"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "No se pudo aceptar la invitación. Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "No se pudo copiar el enlace de invitación"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo."
@@ -849,7 +873,7 @@ msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos p
msgid "Free"
msgstr "Gratis"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Plan gratuito"
@@ -866,7 +890,7 @@ msgstr "Tiempo completo"
msgid "Fun"
msgstr "Diversión"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Primeros pasos"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Ir a inicio"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Ir a la aplicación"
@@ -1006,27 +1035,44 @@ msgstr "Integraciones"
msgid "Interviewing"
msgstr "Entrevistando"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Dirección de correo electrónico no válida"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invitación no válida"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Invitar"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Invitar a otro"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Enlace de invitación copiado"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Enlace de invitación copiado al portapapeles"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Invitar miembro"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Invitar miembros requiere un Plan de Equipo. Serás redirigido para actualizar tu espacio de trabajo."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Unirse al espacio de trabajo"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Unirse al espacio de trabajo | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1099,7 +1145,7 @@ msgstr "Lista"
msgid "List name"
msgstr "Nombre de la lista"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Iniciar sesión | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "Largo plazo"
msgid "Low Priority"
msgstr "Prioridad baja"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "enlace mágico"
@@ -1149,7 +1195,7 @@ msgstr "Miembros | {0}"
msgid "Monthly"
msgstr "Mensual"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "facturación mensual"
@@ -1261,7 +1307,7 @@ msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Una vez que elimines tu espacio de trabajo, no hay vuelta atrás. Esta acción no se puede deshacer."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "o"
@@ -1318,19 +1364,19 @@ msgstr "Planificación"
msgid "Please confirm your new password"
msgstr "Por favor, confirma tu nueva contraseña"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Por favor, introduce una dirección de correo electrónico válida"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Por favor, introduce un nombre válido"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Por favor, introduce una contraseña válida"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Por favor selecciona un archivo para subir."
@@ -1359,10 +1405,10 @@ msgstr "Por favor selecciona un archivo para subir."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Por favor selecciona un archivo para subir."
msgid "Please try again later, or contact customer support."
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Por favor, inténtalo de nuevo más tarde."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Privado"
msgid "Pro Plan"
msgstr "Plan Pro"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Plan Pro ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Imagen de perfil actualizada"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Ejecuta en tu propia infraestructura"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Guardar"
@@ -1566,25 +1617,37 @@ msgstr "Configuración | Integraciones"
msgid "Settings | Workspace"
msgstr "Configuración | Espacio de trabajo"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Compartir enlace de invitación"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Iniciar sesión"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Iniciar sesión"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Registrarse"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Registrarse | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Registro deshabilitado"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Registrarse con "
@@ -1608,8 +1671,8 @@ msgstr "Desarrollo de software"
msgid "Star on Github"
msgstr "Estrella en Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Éxito"
@@ -1629,7 +1692,7 @@ msgstr "Apoya el desarrollo del proyecto"
msgid "System"
msgstr "Sistema"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Plan de Equipo"
@@ -1694,6 +1757,10 @@ msgstr "Este tablero es privado o no existe"
msgid "This board URL has already been taken"
msgstr "Esta URL de tablero ya ha sido utilizada"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Este enlace de invitación no es válido o ha caducado."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Esto resultará en la eliminación permanente de todos los datos asociados con este espacio de trabajo."
@@ -1909,7 +1976,7 @@ msgstr "Actualizar a Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Actualizar a Pro ($29/mes)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Actualizar al Plan de Equipo"
@@ -1941,7 +2008,7 @@ msgstr "Usar plantilla"
msgid "User"
msgstr "Usuario"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "El usuario ya es miembro de este espacio de trabajo"
@@ -1985,7 +2052,7 @@ msgstr "Estamos usando la <0>licencia AGPL-3.0</0>."
msgid "We're just getting started. "
msgstr "Apenas estamos comenzando. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Bienvenido de nuevo"
@@ -2100,18 +2167,26 @@ msgstr "Puedes invitar a miembros del equipo haciendo clic en el botón \"Invita
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Puedes autoalojar siguiendo las instrucciones en nuestro <0>repositorio</0>."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Has iniciado sesión correctamente."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Te has registrado correctamente."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "Tienes plazas ilimitadas con tu Plan Pro. ¡No hay cargos adicionales por nuevos miembros!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Has sido invitado a unirte a un espacio de trabajo en kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Has sido invitado a unirte a un espacio de trabajo."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Tu cuenta ha sido eliminada."
@@ -2128,7 +2203,7 @@ msgstr "Tu nombre de visualización ha sido actualizado."
msgid "Your password has been changed."
msgstr "Tu contraseña ha sido cambiada."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Tu imagen de perfil ha sido actualizada."

File diff suppressed because one or more lines are too long

View File

@@ -36,12 +36,12 @@ msgstr "{0} étiquettes"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "10 $/mois"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "8 $/mois"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Ajouter une étiquette"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Ajouter un membre"
@@ -136,11 +136,11 @@ msgstr "a ajouté l'élément <0>{0}</0> à la checklist"
msgid "added label <0>{0}</0>"
msgstr "a ajouté l'étiquette <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "L'ajout d'un nouveau membre coûtera {price} supplémentaires ({billingType}) par siège."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Ajustez le recadrage carré pour adapter votre avatar."
@@ -152,7 +152,7 @@ msgstr "Rôles d'administrateur"
msgid "All systems operational"
msgstr "Tous les systèmes opérationnels"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</1></0>"
@@ -164,6 +164,10 @@ msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello
msgid "An unexpected error occurred. Please try again later."
msgstr "Une erreur inattendue s'est produite. Veuillez réessayer plus tard."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Toute personne disposant de ce lien peut rejoindre votre espace de travail"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban basique"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "facturation annuelle"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "facturation mensuelle"
@@ -342,7 +346,7 @@ msgstr "Rapport de bug"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Modifier le mot de passe"
msgid "Change your language preferences."
msgstr "Modifiez vos préférences linguistiques."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Vérifiez votre boîte de réception"
@@ -382,8 +386,8 @@ msgstr "Nom de la checklist"
msgid "Clear filters"
msgstr "Effacer les filtres"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Cliquez sur le lien que nous avons envoyé à {magicLinkRecipient} pour vous connecter."
@@ -459,12 +463,12 @@ msgstr "Contactez-nous"
msgid "Content Creation"
msgstr "Création de contenu"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Continuer avec "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Continuer avec {0}"
@@ -532,7 +536,7 @@ msgstr "a créé la carte"
msgid "Critical"
msgstr "Critique"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Recadrez votre avatar"
@@ -661,7 +665,7 @@ msgstr "Documentation"
msgid "Documentation"
msgstr "Documentation"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Vous n'avez pas de compte ? <0><1>Inscrivez-vous</1></0>"
@@ -693,11 +697,11 @@ msgstr "Modifier l'URL de l'espace de travail"
msgid "Editing"
msgstr "Édition"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "E-mail"
@@ -713,11 +717,11 @@ msgstr "Saisissez votre mot de passe actuel"
msgid "Enter your current password and choose a new secure password."
msgstr "Saisissez votre mot de passe actuel et choisissez un nouveau mot de passe sécurisé."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Saisissez votre adresse e-mail"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Saisissez votre nom"
@@ -725,14 +729,26 @@ msgstr "Saisissez votre nom"
msgid "Enter your new password"
msgstr "Saisissez votre nouveau mot de passe"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Saisissez votre mot de passe"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Erreur"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Erreur lors du changement de mot de passe"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Erreur lors de la création du lien d'invitation"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Erreur lors de la désactivation du lien d'invitation"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Erreur lors de la suppression du compte"
@@ -749,8 +765,8 @@ msgstr "Erreur lors de la suppression de l'espace de travail"
msgid "Error disconnecting Trello"
msgstr "Erreur lors de la déconnexion de Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Erreur lors de l'invitation du membre"
@@ -758,7 +774,7 @@ msgstr "Erreur lors de l'invitation du membre"
msgid "Error updating display name"
msgstr "Erreur lors de la mise à jour du nom d'affichage"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Erreur lors de la mise à jour de l'image de profil"
@@ -774,7 +790,7 @@ msgstr "Erreur lors de la mise à jour du nom de l'espace de travail"
msgid "Error updating workspace URL"
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Erreur lors de la mise à niveau de l'abonnement"
@@ -783,8 +799,8 @@ msgstr "Erreur lors de la mise à niveau de l'abonnement"
msgid "Error upgrading to Pro"
msgstr "Erreur lors de la mise à niveau vers Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Erreur lors du téléchargement de l'image de profil"
@@ -800,8 +816,16 @@ msgstr "Tout ce dont vous avez besoin, gratuit pour toujours. Tableaux illimité
msgid "Execution"
msgstr "Exécution"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Échec de l'acceptation de l'invitation. Veuillez réessayer plus tard ou contacter le service client."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Échec de la copie du lien d'invitation"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Échec de connexion avec {0}. Veuillez réessayer."
@@ -849,7 +873,7 @@ msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons
msgid "Free"
msgstr "Gratuit"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Forfait gratuit"
@@ -866,7 +890,7 @@ msgstr "Temps plein"
msgid "Fun"
msgstr "Amusant"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Premiers pas"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Aller à l'accueil"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Accéder à l'application"
@@ -1006,27 +1035,44 @@ msgstr "Intégrations"
msgid "Interviewing"
msgstr "Entretien"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Adresse e-mail invalide"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invitation non valide"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Inviter"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Inviter un autre"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Lien d'invitation copié"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Lien d'invitation copié dans le presse-papiers"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Inviter un membre"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "L'invitation de membres nécessite un forfait d'équipe. Vous serez redirigé pour mettre à niveau votre espace de travail."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Rejoindre l'espace de travail"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Rejoindre l'espace de travail | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1099,7 +1145,7 @@ msgstr "Liste"
msgid "List name"
msgstr "Nom de la liste"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Connexion | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "Long terme"
msgid "Low Priority"
msgstr "Priorité basse"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "lien magique"
@@ -1149,7 +1195,7 @@ msgstr "Membres | {0}"
msgid "Monthly"
msgstr "Mensuel"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "facturation mensuelle"
@@ -1261,7 +1307,7 @@ msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possibl
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Une fois que vous supprimez votre espace de travail, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "ou"
@@ -1318,19 +1364,19 @@ msgstr "Planification"
msgid "Please confirm your new password"
msgstr "Veuillez confirmer votre nouveau mot de passe"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Veuillez saisir une adresse e-mail valide"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Veuillez saisir un nom valide"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Veuillez saisir un mot de passe valide"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Veuillez sélectionner un fichier à télécharger."
@@ -1359,10 +1405,10 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
msgid "Please try again later, or contact customer support."
msgstr "Veuillez réessayer plus tard ou contacter le service client."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Veuillez réessayer plus tard."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Privé"
msgid "Pro Plan"
msgstr "Plan Pro"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Plan Pro ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Image de profil mise à jour"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Exécutez sur votre propre infrastructure"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Enregistrer"
@@ -1566,25 +1617,37 @@ msgstr "Paramètres | Intégrations"
msgid "Settings | Workspace"
msgstr "Paramètres | Espace de travail"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Partager le lien d'invitation"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Se connecter"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Se connecter"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "S'inscrire"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Inscription | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Inscription désactivée"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "S'inscrire avec "
@@ -1608,8 +1671,8 @@ msgstr "Développement logiciel"
msgid "Star on Github"
msgstr "Étoile sur Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Succès"
@@ -1629,7 +1692,7 @@ msgstr "Soutenir le développement du projet"
msgid "System"
msgstr "Système"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Forfait d'équipe"
@@ -1694,6 +1757,10 @@ msgstr "Ce tableau est privé ou n'existe pas"
msgid "This board URL has already been taken"
msgstr "Cette URL de tableau est déjà utilisée"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Ce lien d'invitation est invalide ou a expiré."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Cela entraînera la suppression définitive de toutes les données associées à cet espace de travail."
@@ -1909,7 +1976,7 @@ msgstr "Passer à Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Passer à Pro (29 $/mois)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Passer au forfait d'équipe"
@@ -1941,7 +2008,7 @@ msgstr "Utiliser le modèle"
msgid "User"
msgstr "Utilisateur"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "L'utilisateur est déjà membre de cet espace de travail"
@@ -1985,7 +2052,7 @@ msgstr "Nous utilisons la <0>licence AGPL-3.0</0>."
msgid "We're just getting started. "
msgstr "Nous ne faisons que commencer. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Bienvenue à nouveau"
@@ -2100,18 +2167,26 @@ msgstr "Vous pouvez inviter des membres de l'équipe en cliquant sur le bouton \
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Vous pouvez auto-héberger en suivant les instructions dans notre <0>dépôt</0>."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Vous vous êtes connecté avec succès."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Vous vous êtes inscrit avec succès."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "Vous disposez de places illimitées avec votre Plan Pro. Il n'y a pas de frais supplémentaires pour les nouveaux membres !"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Vous avez été invité à rejoindre un espace de travail sur kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Vous avez été invité à rejoindre un espace de travail."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Votre compte a été supprimé."
@@ -2128,7 +2203,7 @@ msgstr "Votre nom d'affichage a été mis à jour."
msgid "Your password has been changed."
msgstr "Votre mot de passe a été modifié."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Votre image de profil a été mise à jour."

File diff suppressed because one or more lines are too long

View File

@@ -36,12 +36,12 @@ msgstr "{0} etichette"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/mese"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/mese"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Aggiungi etichetta"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Aggiungi membro"
@@ -136,11 +136,11 @@ msgstr "ha aggiunto l'elemento <0>{0}</0> alla checklist"
msgid "added label <0>{0}</0>"
msgstr "ha aggiunto l'etichetta <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "L'aggiunta di un nuovo membro costerà un supplemento di {price} ({billingType}) per posto."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Regola il ritaglio quadrato per adattarlo al tuo avatar."
@@ -152,7 +152,7 @@ msgstr "Ruoli amministratore"
msgid "All systems operational"
msgstr "Tutti i sistemi operativi"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Hai già un account? <0><1>Accedi</1></0>"
@@ -164,6 +164,10 @@ msgstr "Si è verificato un errore durante la disconnessione del tuo account Tre
msgid "An unexpected error occurred. Please try again later."
msgstr "Si è verificato un errore imprevisto. Riprova più tardi."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Chiunque abbia questo link può unirsi al tuo spazio di lavoro"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban base"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "fatturato annualmente"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "fatturato mensilmente"
@@ -342,7 +346,7 @@ msgstr "Segnalazione bug"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Cambia password"
msgid "Change your language preferences."
msgstr "Modifica le tue preferenze di lingua."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Controlla la tua casella di posta"
@@ -382,8 +386,8 @@ msgstr "Nome della checklist"
msgid "Clear filters"
msgstr "Cancella filtri"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Clicca sul link che abbiamo inviato a {magicLinkRecipient} per accedere."
@@ -459,12 +463,12 @@ msgstr "Contattaci"
msgid "Content Creation"
msgstr "Creazione contenuti"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Continua con "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Continua con {0}"
@@ -532,7 +536,7 @@ msgstr "ha creato la carta"
msgid "Critical"
msgstr "Critico"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Ritaglia il tuo avatar"
@@ -661,7 +665,7 @@ msgstr "Documenti"
msgid "Documentation"
msgstr "Documentazione"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Non hai un account? <0><1>Registrati</1></0>"
@@ -693,11 +697,11 @@ msgstr "Modifica URL dell'area di lavoro"
msgid "Editing"
msgstr "Modifica"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "Email"
@@ -713,11 +717,11 @@ msgstr "Inserisci la tua password attuale"
msgid "Enter your current password and choose a new secure password."
msgstr "Inserisci la tua password attuale e scegli una nuova password sicura."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Inserisci il tuo indirizzo email"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Inserisci il tuo nome"
@@ -725,14 +729,26 @@ msgstr "Inserisci il tuo nome"
msgid "Enter your new password"
msgstr "Inserisci la tua nuova password"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Inserisci la tua password"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Errore"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Errore durante il cambio della password"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Errore durante la creazione del link di invito"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Errore durante la disattivazione del link di invito"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Errore durante l'eliminazione dell'account"
@@ -749,8 +765,8 @@ msgstr "Errore durante l'eliminazione dell'area di lavoro"
msgid "Error disconnecting Trello"
msgstr "Errore durante la disconnessione da Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Errore durante l'invito del membro"
@@ -758,7 +774,7 @@ msgstr "Errore durante l'invito del membro"
msgid "Error updating display name"
msgstr "Errore durante l'aggiornamento del nome visualizzato"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Errore durante l'aggiornamento dell'immagine del profilo"
@@ -774,7 +790,7 @@ msgstr "Errore durante l'aggiornamento del nome dell'area di lavoro"
msgid "Error updating workspace URL"
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Errore nell'aggiornamento dell'abbonamento"
@@ -783,8 +799,8 @@ msgstr "Errore nell'aggiornamento dell'abbonamento"
msgid "Error upgrading to Pro"
msgstr "Errore durante l'aggiornamento a Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Errore durante il caricamento dell'immagine del profilo"
@@ -800,8 +816,16 @@ msgstr "Tutto ciò di cui hai bisogno, gratis per sempre. Bacheche illimitate, l
msgid "Execution"
msgstr "Esecuzione"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Impossibile accettare l'invito. Riprova più tardi o contatta l'assistenza clienti."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Impossibile copiare il link di invito"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Accesso con {0} fallito. Riprova."
@@ -849,7 +873,7 @@ msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni pr
msgid "Free"
msgstr "Gratuito"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Piano gratuito"
@@ -866,7 +890,7 @@ msgstr "Tempo pieno"
msgid "Fun"
msgstr "Divertimento"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Primi passi"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Vai alla home"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Vai all'app"
@@ -1006,27 +1035,44 @@ msgstr "Integrazioni"
msgid "Interviewing"
msgstr "Colloquio"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Indirizzo email non valido"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invito non valido"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Invita"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Invita un altro"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Link di invito copiato"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Link di invito copiato negli appunti"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Invita membro"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "L'invito di membri richiede un Piano Team. Sarai reindirizzato per aggiornare il tuo spazio di lavoro."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Unisciti allo spazio di lavoro"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Unisciti allo spazio di lavoro | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1099,7 +1145,7 @@ msgstr "Lista"
msgid "List name"
msgstr "Nome lista"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "A lungo termine"
msgid "Low Priority"
msgstr "Bassa priorità"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "link magico"
@@ -1149,7 +1195,7 @@ msgstr "Membri | {0}"
msgid "Monthly"
msgstr "Mensile"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "fatturazione mensile"
@@ -1261,7 +1307,7 @@ msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Una volta eliminata l'area di lavoro, non si può tornare indietro. Questa azione non può essere annullata."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "o"
@@ -1318,19 +1364,19 @@ msgstr "Pianificazione"
msgid "Please confirm your new password"
msgstr "Conferma la tua nuova password"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Inserisci un indirizzo email valido"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Inserisci un nome valido"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Inserisci una password valida"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Seleziona un file da caricare."
@@ -1359,10 +1405,10 @@ msgstr "Seleziona un file da caricare."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Seleziona un file da caricare."
msgid "Please try again later, or contact customer support."
msgstr "Riprova più tardi o contatta l'assistenza clienti."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Riprova più tardi."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Privato"
msgid "Pro Plan"
msgstr "Piano Pro"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Piano Pro ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Immagine del profilo aggiornata"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Esegui sulla tua infrastruttura"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Salva"
@@ -1566,25 +1617,37 @@ msgstr "Impostazioni | Integrazioni"
msgid "Settings | Workspace"
msgstr "Impostazioni | Area di lavoro"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Condividi link di invito"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Accedi"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Accedi"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Registrati"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Registrati | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Registrazione disabilitata"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Registrati con "
@@ -1608,8 +1671,8 @@ msgstr "Sviluppo software"
msgid "Star on Github"
msgstr "Metti una stella su Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Operazione riuscita"
@@ -1629,7 +1692,7 @@ msgstr "Sostieni lo sviluppo del progetto"
msgid "System"
msgstr "Sistema"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Piano Team"
@@ -1694,6 +1757,10 @@ msgstr "Questa bacheca è privata o non esiste"
msgid "This board URL has already been taken"
msgstr "Questo URL della bacheca è già stato utilizzato"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Questo link di invito non è valido o è scaduto."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Questo comporterà l'eliminazione permanente di tutti i dati associati a questo spazio di lavoro."
@@ -1909,7 +1976,7 @@ msgstr "Passa a Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Passa a Pro ($29/mese)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Passa al Piano Team"
@@ -1941,7 +2008,7 @@ msgstr "Usa template"
msgid "User"
msgstr "Utente"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "L'utente è già membro di questo spazio di lavoro"
@@ -1985,7 +2052,7 @@ msgstr "Utilizziamo la <0>licenza AGPL-3.0</0>."
msgid "We're just getting started. "
msgstr "Siamo solo all'inizio. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Bentornato"
@@ -2100,18 +2167,26 @@ msgstr "Puoi invitare i membri del team cliccando sul pulsante \"Invita\" nell'a
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>repo</0>."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Hai effettuato l'accesso con successo."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Ti sei registrato con successo."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "Hai posti illimitati con il tuo Piano Pro. Non ci sono costi aggiuntivi per i nuovi membri!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Sei stato invitato a unirti a uno spazio di lavoro su kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Sei stato invitato a unirti a uno spazio di lavoro."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Il tuo account è stato eliminato."
@@ -2128,7 +2203,7 @@ msgstr "Il tuo nome visualizzato è stato aggiornato."
msgid "Your password has been changed."
msgstr "La tua password è stata modificata."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "La tua immagine del profilo è stata aggiornata."

File diff suppressed because one or more lines are too long

View File

@@ -36,12 +36,12 @@ msgstr "{0} labels"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/maand"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/maand"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Label toevoegen"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Lid toevoegen"
@@ -136,11 +136,11 @@ msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
msgid "added label <0>{0}</0>"
msgstr "heeft label <0>{0}</0> toegevoegd"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Het toevoegen van een nieuw lid kost een extra {price} ({billingType}) per plaats."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Pas de vierkante uitsnede aan zodat je avatar goed past."
@@ -152,7 +152,7 @@ msgstr "Beheerdersrollen"
msgid "All systems operational"
msgstr "Alle systemen operationeel"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Heb je al een account? <0><1>Log in</1></0>"
@@ -164,6 +164,10 @@ msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Tre
msgid "An unexpected error occurred. Please try again later."
msgstr "Er is een onverwachte fout opgetreden. Probeer het later opnieuw."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Iedereen met deze link kan deelnemen aan je werkruimte"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basis kanban"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "jaarlijks gefactureerd"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "maandelijks gefactureerd"
@@ -342,7 +346,7 @@ msgstr "Bugrapport"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Wachtwoord wijzigen"
msgid "Change your language preferences."
msgstr "Wijzig je taalvoorkeuren."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Controleer je inbox"
@@ -382,8 +386,8 @@ msgstr "Naam checklist"
msgid "Clear filters"
msgstr "Filters wissen"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Klik op de link die we naar {magicLinkRecipient} hebben gestuurd om in te loggen."
@@ -459,12 +463,12 @@ msgstr "Neem contact op"
msgid "Content Creation"
msgstr "Content creatie"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Doorgaan met "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Doorgaan met {0}"
@@ -532,7 +536,7 @@ msgstr "heeft de kaart aangemaakt"
msgid "Critical"
msgstr "Kritiek"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Snijd je avatar bij"
@@ -661,7 +665,7 @@ msgstr "Docs"
msgid "Documentation"
msgstr "Documentatie"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Heb je geen account? <0><1>Registreer je</1></0>"
@@ -693,11 +697,11 @@ msgstr "Werkruimte-URL bewerken"
msgid "Editing"
msgstr "Bewerken"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "E-mail"
@@ -713,11 +717,11 @@ msgstr "Voer je huidige wachtwoord in"
msgid "Enter your current password and choose a new secure password."
msgstr "Voer je huidige wachtwoord in en kies een nieuw veilig wachtwoord."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Voer je e-mailadres in"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Voer je naam in"
@@ -725,14 +729,26 @@ msgstr "Voer je naam in"
msgid "Enter your new password"
msgstr "Voer je nieuwe wachtwoord in"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Voer je wachtwoord in"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Fout"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Fout bij wijzigen wachtwoord"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Fout bij het maken van uitnodigingslink"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Fout bij het deactiveren van uitnodigingslink"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Fout bij verwijderen account"
@@ -749,8 +765,8 @@ msgstr "Fout bij verwijderen werkruimte"
msgid "Error disconnecting Trello"
msgstr "Fout bij ontkoppelen van Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Fout bij het uitnodigen van lid"
@@ -758,7 +774,7 @@ msgstr "Fout bij het uitnodigen van lid"
msgid "Error updating display name"
msgstr "Fout bij bijwerken weergavenaam"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Fout bij het bijwerken van profielafbeelding"
@@ -774,7 +790,7 @@ msgstr "Fout bij bijwerken naam werkruimte"
msgid "Error updating workspace URL"
msgstr "Fout bij het bijwerken van werkruimte-URL"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Fout bij het upgraden van abonnement"
@@ -783,8 +799,8 @@ msgstr "Fout bij het upgraden van abonnement"
msgid "Error upgrading to Pro"
msgstr "Fout bij upgraden naar Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Fout bij het uploaden van profielafbeelding"
@@ -800,8 +816,16 @@ msgstr "Alles wat je nodig hebt, voor altijd gratis. Onbeperkte borden, onbeperk
msgid "Execution"
msgstr "Uitvoering"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Uitnodiging accepteren mislukt. Probeer het later opnieuw of neem contact op met de klantenservice."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Kopiëren van uitnodigingslink mislukt"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
@@ -849,7 +873,7 @@ msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open sourc
msgid "Free"
msgstr "Gratis"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Gratis plan"
@@ -866,7 +890,7 @@ msgstr "Fulltime"
msgid "Fun"
msgstr "Leuk"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Aan de slag"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "Naar startpagina"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Naar de app"
@@ -1006,27 +1035,44 @@ msgstr "Integraties"
msgid "Interviewing"
msgstr "Interviewen"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Ongeldig e-mailadres"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Ongeldige uitnodiging"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Nog iemand uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Uitnodigingslink gekopieerd"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Uitnodigingslink gekopieerd naar klembord"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Lid uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Voor het uitnodigen van leden is een teamplan vereist. Je wordt doorgestuurd om je werkruimte te upgraden."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Deelnemen aan werkruimte"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Deelnemen aan werkruimte | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
@@ -1099,7 +1145,7 @@ msgstr "Lijst"
msgid "List name"
msgstr "Lijstnaam"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "Lange termijn"
msgid "Low Priority"
msgstr "Lage prioriteit"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "magische link"
@@ -1149,7 +1195,7 @@ msgstr "Leden | {0}"
msgid "Monthly"
msgstr "Maandelijks"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "maandelijkse facturering"
@@ -1261,7 +1307,7 @@ msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan nie
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Zodra je je werkruimte verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "of"
@@ -1318,19 +1364,19 @@ msgstr "Planning"
msgid "Please confirm your new password"
msgstr "Bevestig je nieuwe wachtwoord"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Voer een geldig e-mailadres in"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Voer een geldige naam in"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Voer een geldig wachtwoord in"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Selecteer een bestand om te uploaden."
@@ -1359,10 +1405,10 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Selecteer een bestand om te uploaden."
msgid "Please try again later, or contact customer support."
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Probeer het later opnieuw."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Privé"
msgid "Pro Plan"
msgstr "Pro Plan"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Pro Plan ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Profielafbeelding bijgewerkt"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Draai op je eigen infrastructuur"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Opslaan"
@@ -1566,25 +1617,37 @@ msgstr "Instellingen | Integraties"
msgid "Settings | Workspace"
msgstr "Instellingen | Werkruimte"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Uitnodigingslink delen"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Inloggen"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Inloggen"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Registreren"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Registreren | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Registreren uitgeschakeld"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Registreren met "
@@ -1608,8 +1671,8 @@ msgstr "Softwareontwikkeling"
msgid "Star on Github"
msgstr "Star op Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Geslaagd"
@@ -1629,7 +1692,7 @@ msgstr "Ondersteun de ontwikkeling van het project"
msgid "System"
msgstr "Systeem"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Teamplan"
@@ -1694,6 +1757,10 @@ msgstr "Dit bord is privé of bestaat niet"
msgid "This board URL has already been taken"
msgstr "Deze board URL is al in gebruik"
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Deze uitnodigingslink is ongeldig of verlopen."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Dit zal resulteren in het permanent verwijderen van alle gegevens die aan deze werkruimte zijn gekoppeld."
@@ -1909,7 +1976,7 @@ msgstr "Upgraden naar Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade naar Pro ($29/maand)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Upgraden naar teamplan"
@@ -1941,7 +2008,7 @@ msgstr "Sjabloon gebruiken"
msgid "User"
msgstr "Gebruiker"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "Gebruiker is al lid van deze werkruimte"
@@ -1985,7 +2052,7 @@ msgstr "We gebruiken de <0>AGPL-3.0 licentie</0>."
msgid "We're just getting started. "
msgstr "We zijn nog maar net begonnen. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "Welkom terug"
@@ -2100,18 +2167,26 @@ msgstr "Je kunt teamleden uitnodigen door op de knop \"Uitnodigen\" in de rechte
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Je bent succesvol ingelogd."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Je bent succesvol geregistreerd."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "Je hebt onbeperkte plaatsen met je Pro Plan. Er zijn geen extra kosten voor nieuwe leden!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Je bent uitgenodigd om deel te nemen aan een werkruimte op kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Je bent uitgenodigd om deel te nemen aan een werkruimte."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Je account is verwijderd."
@@ -2128,7 +2203,7 @@ msgstr "Je weergavenaam is bijgewerkt."
msgid "Your password has been changed."
msgstr "Je wachtwoord is gewijzigd."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Je profielafbeelding is bijgewerkt."

File diff suppressed because one or more lines are too long

View File

@@ -36,12 +36,12 @@ msgstr "{0} метки"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Импортировать доску (1)} other {Импортировать доски ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:146
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$10/month"
msgstr "$10/месяц"
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:158
msgid "$8/month"
msgstr "$8/месяц"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Добавить метку"
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147
#: src/views/members/components/InviteMemberForm.tsx:238
msgid "Add member"
msgstr "Добавить участника"
@@ -136,11 +136,11 @@ msgstr "добавлен элемент контрольного списка <0
msgid "added label <0>{0}</0>"
msgstr "добавлена метка <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187
#: src/views/members/components/InviteMemberForm.tsx:306
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Добавление нового участника будет стоить дополнительно {price} ({billingType}) за место."
#: src/views/settings/components/Avatar.tsx:278
#: src/views/settings/components/Avatar.tsx:275
msgid "Adjust the square crop to fit your avatar."
msgstr "Настройте квадратное кадрирование, чтобы оно подходило для вашего аватара."
@@ -152,7 +152,7 @@ msgstr "Роли администратора"
msgid "All systems operational"
msgstr "Все системы работают нормально"
#: src/views/auth/signup/index.tsx:86
#: src/views/auth/signup/index.tsx:88
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Уже есть аккаунт? <0><1>Войти</1></0>"
@@ -164,6 +164,10 @@ msgstr "Произошла ошибка при отключении вашего
msgid "An unexpected error occurred. Please try again later."
msgstr "Произошла непредвиденная ошибка. Пожалуйста, попробуйте позже."
#: src/views/members/components/InviteMemberForm.tsx:290
msgid "Anyone with this link can join your workspace"
msgstr "Любой, у кого есть эта ссылка, может присоединиться к вашему рабочему пространству"
#: src/components/SettingsLayout.tsx:51
msgid "API"
msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Бэклог"
msgid "Basic Kanban"
msgstr "Базовый Канбан"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed annually"
msgstr "выставляется счет ежегодно"
#: src/views/members/components/InviteMemberForm.tsx:105
#: src/views/members/components/InviteMemberForm.tsx:159
msgid "billed monthly"
msgstr "выставляется счет ежемесячно"
@@ -342,7 +346,7 @@ msgstr "Отчет об ошибке"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:309
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Изменить пароль"
msgid "Change your language preferences."
msgstr "Измените настройки языка."
#: src/views/auth/login/index.tsx:41
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:69
msgid "Check your inbox"
msgstr "Проверьте ваш почтовый ящик"
@@ -382,8 +386,8 @@ msgstr "Название контрольного списка"
msgid "Clear filters"
msgstr "Очистить фильтры"
#: src/views/auth/login/index.tsx:46
#: src/views/auth/signup/index.tsx:72
#: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Нажмите на ссылку, которую мы отправили на {magicLinkRecipient}, чтобы войти."
@@ -459,12 +463,12 @@ msgstr "Свяжитесь с нами"
msgid "Content Creation"
msgstr "Создание контента"
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Continue with "
msgstr "Продолжить с "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297
#: src/components/AuthForm.tsx:301
msgid "Continue with {0}"
msgstr "Продолжить с {0}"
@@ -532,7 +536,7 @@ msgstr "создал(а) карточку"
msgid "Critical"
msgstr "Критический"
#: src/views/settings/components/Avatar.tsx:275
#: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar"
msgstr "Обрежьте ваш аватар"
@@ -661,7 +665,7 @@ msgstr "Документы"
msgid "Documentation"
msgstr "Документация"
#: src/views/auth/login/index.tsx:61
#: src/views/auth/login/index.tsx:63
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Нет аккаунта? <0><1>Зарегистрируйтесь</1></0>"
@@ -693,11 +697,11 @@ msgstr "Редактировать URL рабочей области"
msgid "Editing"
msgstr "Редактирование"
#: src/components/AuthForm.tsx:368
#: src/components/AuthForm.tsx:372
msgid "email"
msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161
#: src/views/members/components/InviteMemberForm.tsx:252
msgid "Email"
msgstr "Email"
@@ -713,11 +717,11 @@ msgstr "Введите ваш текущий пароль"
msgid "Enter your current password and choose a new secure password."
msgstr "Введите ваш текущий пароль и выберите новый безопасный пароль."
#: src/components/AuthForm.tsx:333
#: src/components/AuthForm.tsx:337
msgid "Enter your email address"
msgstr "Введите ваш адрес электронной почты"
#: src/components/AuthForm.tsx:321
#: src/components/AuthForm.tsx:325
msgid "Enter your name"
msgstr "Введите ваше имя"
@@ -725,14 +729,26 @@ msgstr "Введите ваше имя"
msgid "Enter your new password"
msgstr "Введите ваш новый пароль"
#: src/components/AuthForm.tsx:346
#: src/components/AuthForm.tsx:350
msgid "Enter your password"
msgstr "Введите ваш пароль"
#: src/views/members/components/InviteMemberForm.tsx:196
msgid "Error"
msgstr "Ошибка"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password"
msgstr "Ошибка при изменении пароля"
#: src/views/members/components/InviteMemberForm.tsx:117
msgid "Error creating invite link"
msgstr "Ошибка при создании ссылки приглашения"
#: src/views/members/components/InviteMemberForm.tsx:132
msgid "Error deactivating invite link"
msgstr "Ошибка при деактивации ссылки приглашения"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account"
msgstr "Ошибка при удалении аккаунта"
@@ -749,8 +765,8 @@ msgstr "Ошибка при удалении рабочей области"
msgid "Error disconnecting Trello"
msgstr "Ошибка при отключении Trello"
#: src/views/members/components/InviteMemberForm.tsx:71
#: src/views/members/components/InviteMemberForm.tsx:77
#: src/views/members/components/InviteMemberForm.tsx:95
#: src/views/members/components/InviteMemberForm.tsx:101
msgid "Error inviting member"
msgstr "Ошибка при приглашении участника"
@@ -758,7 +774,7 @@ msgstr "Ошибка при приглашении участника"
msgid "Error updating display name"
msgstr "Ошибка при обновлении отображаемого имени"
#: src/views/settings/components/Avatar.tsx:80
#: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image"
msgstr "Ошибка при обновлении изображения профиля"
@@ -774,7 +790,7 @@ msgstr "Ошибка при обновлении имени рабочей об
msgid "Error updating workspace URL"
msgstr "Ошибка при обновлении URL рабочей области"
#: src/views/members/components/InviteMemberForm.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:221
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription"
msgstr "Ошибка при обновлении подписки"
@@ -783,8 +799,8 @@ msgstr "Ошибка при обновлении подписки"
msgid "Error upgrading to Pro"
msgstr "Ошибка при обновлении до Pro"
#: src/views/settings/components/Avatar.tsx:94
#: src/views/settings/components/Avatar.tsx:221
#: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image"
msgstr "Ошибка загрузки изображения профиля"
@@ -800,8 +816,16 @@ msgstr "Все, что вам нужно, бесплатно навсегда.
msgid "Execution"
msgstr "Выполнение"
#: src/views/invite/index.tsx:41
msgid "Failed to accept invitation. Please try again later, or contact customer support."
msgstr "Не удалось принять приглашение. Пожалуйста, попробуйте позже или свяжитесь со службой поддержки."
#: src/views/members/components/InviteMemberForm.tsx:197
msgid "Failed to copy invite link"
msgstr "Не удалось скопировать ссылку приглашения"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:273
msgid "Failed to login with {0}. Please try again."
msgstr "Не удалось войти с {0}. Пожалуйста, попробуйте снова."
@@ -849,7 +873,7 @@ msgstr "Для долгосрочной устойчивости мы призн
msgid "Free"
msgstr "Бесплатно"
#: src/views/members/components/InviteMemberForm.tsx:193
#: src/views/members/components/InviteMemberForm.tsx:312
#: src/views/members/index.tsx:208
msgid "Free Plan"
msgstr "Бесплатный план"
@@ -866,7 +890,7 @@ msgstr "Полный рабочий день"
msgid "Fun"
msgstr "Веселье"
#: src/views/auth/signup/index.tsx:67
#: src/views/auth/signup/index.tsx:69
#: src/views/home/components/Cta.tsx:61
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
@@ -906,8 +930,13 @@ msgstr "Начало работы"
msgid "GitHub"
msgstr "GitHub"
#: src/views/invite/index.tsx:113
msgid "Go Home"
msgstr "На главную"
#: src/views/home/components/Header.tsx:96
#: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app"
msgstr "Перейти в приложение"
@@ -1006,27 +1035,44 @@ msgstr "Интеграции"
msgid "Interviewing"
msgstr "Собеседование"
#: src/views/members/components/InviteMemberForm.tsx:40
#: src/views/members/components/InviteMemberForm.tsx:49
msgid "Invalid email address"
msgstr "Недействительный адрес электронной почты"
#: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Недействительное приглашение"
#: src/views/members/index.tsx:221
msgid "Invite"
msgstr "Пригласить"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another"
msgstr "Пригласить ещё одного"
#: src/views/members/components/InviteMemberForm.tsx:190
msgid "Invite link copied"
msgstr "Ссылка приглашения скопирована"
#: src/views/members/components/InviteMemberForm.tsx:191
msgid "Invite link copied to clipboard"
msgstr "Ссылка приглашения скопирована в буфер обмена"
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/members/components/InviteMemberForm.tsx:350
msgid "Invite member"
msgstr "Пригласить участника"
#: src/views/members/components/InviteMemberForm.tsx:196
#: src/views/members/components/InviteMemberForm.tsx:315
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Для приглашения участников необходим командный план. Вы будете перенаправлены для обновления вашего рабочего пространства."
#: src/views/invite/index.tsx:79
#: src/views/invite/index.tsx:129
msgid "Join workspace"
msgstr "Присоединиться к рабочему пространству"
#: src/views/invite/index.tsx:91
msgid "Join workspace | kan.bn"
msgstr "Присоединиться к рабочему пространству | kan.bn"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Младший"
@@ -1099,7 +1145,7 @@ msgstr "Список"
msgid "List name"
msgstr "Название списка"
#: src/views/auth/login/index.tsx:31
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Вход | kan.bn"
@@ -1115,7 +1161,7 @@ msgstr "Долгосрочный"
msgid "Low Priority"
msgstr "Низкий приоритет"
#: src/components/AuthForm.tsx:369
#: src/components/AuthForm.tsx:373
msgid "magic link"
msgstr "магическая ссылка"
@@ -1149,7 +1195,7 @@ msgstr "Участники | {0}"
msgid "Monthly"
msgstr "Ежемесячно"
#: src/views/members/components/InviteMemberForm.tsx:93
#: src/views/members/components/InviteMemberForm.tsx:147
msgid "monthly billing"
msgstr "ежемесячная оплата"
@@ -1261,7 +1307,7 @@ msgstr "После удаления аккаунта возврат будет
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "После удаления рабочего пространства возврат будет невозможен. Это действие необратимо."
#: src/components/AuthForm.tsx:311
#: src/components/AuthForm.tsx:315
msgid "or"
msgstr "или"
@@ -1318,19 +1364,19 @@ msgstr "Планирование"
msgid "Please confirm your new password"
msgstr "Пожалуйста, подтвердите новый пароль"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:341
msgid "Please enter a valid email address"
msgstr "Пожалуйста, введите действительный адрес электронной почты"
#: src/components/AuthForm.tsx:325
#: src/components/AuthForm.tsx:329
msgid "Please enter a valid name"
msgstr "Пожалуйста, введите действительное имя"
#: src/components/AuthForm.tsx:350
#: src/components/AuthForm.tsx:354
msgid "Please enter a valid password"
msgstr "Пожалуйста, введите действительный пароль"
#: src/views/settings/components/Avatar.tsx:95
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Пожалуйста, выберите файл для загрузки."
@@ -1359,10 +1405,10 @@ msgstr "Пожалуйста, выберите файл для загрузки.
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78
#: src/views/members/components/InviteMemberForm.tsx:131
#: src/views/settings/components/Avatar.tsx:81
#: src/views/settings/components/Avatar.tsx:222
#: src/views/members/components/InviteMemberForm.tsx:102
#: src/views/members/components/InviteMemberForm.tsx:222
#: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1419,11 @@ msgstr "Пожалуйста, выберите файл для загрузки.
msgid "Please try again later, or contact customer support."
msgstr "Пожалуйста, попробуйте позже или свяжитесь со службой поддержки."
#: src/views/members/components/InviteMemberForm.tsx:118
#: src/views/members/components/InviteMemberForm.tsx:133
msgid "Please try again later."
msgstr "Пожалуйста, попробуйте позже."
#: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85
@@ -1396,11 +1447,11 @@ msgstr "Личное"
msgid "Pro Plan"
msgstr "Профессиональный план"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
msgid "Pro Plan ∞"
msgstr "Профессиональный план ∞"
#: src/views/settings/components/Avatar.tsx:67
#: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated"
msgstr "Изображение профиля обновлено"
@@ -1501,7 +1552,7 @@ msgid "Run on your own infrastructure"
msgstr "Запустите на своей инфраструктуре"
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Сохранить"
@@ -1566,25 +1617,37 @@ msgstr "Настройки | Интеграции"
msgid "Settings | Workspace"
msgstr "Настройки | Рабочая область"
#: src/views/members/components/InviteMemberForm.tsx:327
msgid "Share invite link"
msgstr "Поделиться ссылкой приглашения"
#: src/views/home/components/Header.tsx:100
#: src/views/home/components/Header.tsx:138
msgid "Sign in"
msgstr "Войти"
#: src/views/auth/signup/index.tsx:32
#: src/views/auth/signup/index.tsx:57
#: src/views/invite/index.tsx:154
msgid "Sign In"
msgstr "Войти"
#: src/views/invite/index.tsx:162
msgid "Sign Up"
msgstr "Зарегистрироваться"
#: src/views/auth/signup/index.tsx:34
#: src/views/auth/signup/index.tsx:59
msgid "Sign up | kan.bn"
msgstr "Регистрация | kan.bn"
#: src/views/auth/signup/index.tsx:42
#: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled"
msgstr "Регистрация отключена"
#: src/views/auth/signup/index.tsx:45
#: src/views/auth/signup/index.tsx:47
msgid "Sign up is currently disabled. Please try again later."
msgstr "Регистрация в настоящее время отключена. Пожалуйста, попробуйте позже."
#: src/components/AuthForm.tsx:366
#: src/components/AuthForm.tsx:370
msgid "Sign up with "
msgstr "Зарегистрироваться с "
@@ -1608,8 +1671,8 @@ msgstr "Разработка программного обеспечения"
msgid "Star on Github"
msgstr "Поставить звезду на Github"
#: src/components/AuthForm.tsx:203
#: src/components/AuthForm.tsx:220
#: src/components/AuthForm.tsx:207
#: src/components/AuthForm.tsx:224
msgid "Success"
msgstr "Успех"
@@ -1629,7 +1692,7 @@ msgstr "Поддержите развитие проекта"
msgid "System"
msgstr "Система"
#: src/views/members/components/InviteMemberForm.tsx:182
#: src/views/members/components/InviteMemberForm.tsx:301
#: src/views/members/index.tsx:207
msgid "Team Plan"
msgstr "Командный план"
@@ -1694,6 +1757,10 @@ msgstr "Эта доска является приватной или не сущ
msgid "This board URL has already been taken"
msgstr "Этот URL доски уже занят."
#: src/views/invite/index.tsx:108
msgid "This invitation link is invalid or has expired."
msgstr "Эта ссылка приглашения недействительна или истек срок её действия."
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Это приведет к безвозвратному удалению всех данных, связанных с этим рабочим пространством."
@@ -1909,7 +1976,7 @@ msgstr "Обновить до Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Обновить до Pro ($29/месяц)"
#: src/views/members/components/InviteMemberForm.tsx:224
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Upgrade to Team Plan"
msgstr "Обновить до командного плана"
@@ -1941,7 +2008,7 @@ msgstr "Использовать шаблон"
msgid "User"
msgstr "Пользователь"
#: src/views/members/components/InviteMemberForm.tsx:72
#: src/views/members/components/InviteMemberForm.tsx:96
msgid "User is already a member of this workspace"
msgstr "Пользователь уже является участником этого рабочего пространства"
@@ -1985,7 +2052,7 @@ msgstr "Мы используем лицензию <0>AGPL-3.0</0>."
msgid "We're just getting started. "
msgstr "Мы только начинаем. "
#: src/views/auth/login/index.tsx:41
#: src/views/auth/login/index.tsx:43
msgid "Welcome back"
msgstr "С возвращением"
@@ -2100,18 +2167,26 @@ msgstr "Вы можете пригласить участников команд
msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Вы можете развернуть собственный хостинг, следуя инструкциям в нашем <0>репозитории</0>."
#: src/components/AuthForm.tsx:221
#: src/components/AuthForm.tsx:225
msgid "You have been logged in successfully."
msgstr "Вы успешно вошли в систему."
#: src/components/AuthForm.tsx:204
#: src/components/AuthForm.tsx:208
msgid "You have been signed up successfully."
msgstr "Вы успешно зарегистрировались."
#: src/views/members/components/InviteMemberForm.tsx:186
#: src/views/members/components/InviteMemberForm.tsx:305
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "В вашем профессиональном плане неограниченное количество мест. За новых участников дополнительная плата не взимается!"
#: src/views/invite/index.tsx:134
msgid "You've been invited to join a workspace on kan.bn."
msgstr "Вас пригласили присоединиться к рабочему пространству на kan.bn."
#: src/views/invite/index.tsx:135
msgid "You've been invited to join a workspace."
msgstr "Вас пригласили присоединиться к рабочему пространству."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted."
msgstr "Ваш аккаунт был удалён."
@@ -2128,7 +2203,7 @@ msgstr "Ваше отображаемое имя было обновлено."
msgid "Your password has been changed."
msgstr "Ваш пароль был изменён."
#: src/views/settings/components/Avatar.tsx:68
#: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated."
msgstr "Ваше изображение профиля было обновлено."

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
import InviteView from "~/views/invite";
export default function InvitePage() {
return <InviteView />;
}

View File

@@ -1,5 +1,5 @@
import type { ReactNode } from "react";
import { useRouter } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import React, { createContext, useContext, useEffect, useState } from "react";
import { api } from "~/utils/api";
@@ -46,6 +46,8 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
);
const [hasLoaded, setHasLoaded] = useState(false);
const workspacePublicId = useSearchParams().get("workspacePublicId");
const { data, isLoading } = api.workspace.all.useQuery();
const utils = api.useUtils();
@@ -67,7 +69,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
}
const storedWorkspaceId: string | null =
localStorage.getItem("workspacePublicId");
workspacePublicId ?? localStorage.getItem("workspacePublicId");
if (data.length) {
const workspaces = data.map(({ workspace, role }) => ({
@@ -99,6 +101,11 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
description: selectedWorkspace.workspace.description,
role: selectedWorkspace.role,
});
if (workspacePublicId) {
router.push(`/boards`);
localStorage.setItem("workspacePublicId", workspacePublicId);
}
} else {
const primaryWorkspace = data[0]?.workspace;
const primaryWorkspaceRole = data[0]?.role;
@@ -114,7 +121,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
role: primaryWorkspaceRole,
});
}
}, [data, isLoading]);
}, [data, isLoading, workspacePublicId, router]);
return (
<WorkspaceContext.Provider

View File

@@ -1,5 +1,5 @@
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { env } from "next-runtime-env";
@@ -17,6 +17,8 @@ export default function LoginPage() {
const [isMagicLinkSent, setIsMagicLinkSent] = useState<boolean>(false);
const [magicLinkRecipient, setMagicLinkRecipient] = useState<string>("");
const redirect = useSearchParams().get("next");
const handleMagicLinkSent = (value: boolean, recipient: string) => {
setIsMagicLinkSent(value);
setMagicLinkRecipient(recipient);
@@ -61,7 +63,11 @@ export default function LoginPage() {
<Trans>
Don't have an account?{" "}
<span className="underline">
<Link href="/signup">Sign up</Link>
<Link
href={redirect ? `/signup?next=${redirect}` : "/signup"}
>
Sign up
</Link>
</span>
</Trans>
</p>

View File

@@ -1,5 +1,5 @@
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { env } from "next-runtime-env";
@@ -17,6 +17,8 @@ export default function SignUpPage() {
const [isMagicLinkSent, setIsMagicLinkSent] = useState<boolean>(false);
const [magicLinkRecipient, setMagicLinkRecipient] = useState<string>("");
const redirect = useSearchParams().get("next");
const { data } = authClient.useSession();
if (data?.user.id) router.push("/boards");
@@ -86,7 +88,9 @@ export default function SignUpPage() {
<Trans>
Already have an account?{" "}
<span className="underline">
<Link href="/login">Sign in</Link>
<Link href={redirect ? `/login?next=${redirect}` : "/login"}>
Sign in
</Link>
</span>
</Trans>
</p>

View File

@@ -0,0 +1,171 @@
import { useRouter } from "next/router";
import { t } from "@lingui/core/macro";
import { env } from "next-runtime-env";
import { useEffect, useState } from "react";
import { authClient } from "@kan/auth/client";
import Button from "~/components/Button";
import LoadingSpinner from "~/components/LoadingSpinner";
import { PageHead } from "~/components/PageHead";
import PatternedBackground from "~/components/PatternedBackground";
import { api } from "~/utils/api";
export default function InvitePage() {
const router = useRouter();
const { code } = router.query;
const [isProcessing, setIsProcessing] = useState(false);
const [error, setError] = useState<string | null>(null);
const { data: session, isPending: isSessionLoading } =
authClient.useSession();
const isCloudEnv = env("NEXT_PUBLIC_KAN_ENV") === "cloud";
const inviteCode = Array.isArray(code) ? code[0] : code;
const acceptInviteMutation = api.member.acceptInviteLink.useMutation({
onSuccess: (result) => {
if (result.success) {
return router.push(
`/boards?workspacePublicId=${result.workspacePublicId}`,
);
}
},
onError: (error) => {
if (error.data?.code === "CONFLICT") {
return router.push(`/boards`);
}
setError(
error.message ||
t`Failed to accept invitation. Please try again later, or contact customer support.`,
);
setIsProcessing(false);
},
});
const {
data: inviteInfo,
isLoading: isInviteInfoLoading,
isError: isInviteInfoError,
} = api.member.getInviteByCode.useQuery(
{ inviteCode: inviteCode ?? "" },
{
enabled: !!inviteCode,
retry: false,
},
);
// Auto accept invite if user is logged in
useEffect(() => {
if (session?.user.id && inviteCode && inviteInfo && !error) {
setIsProcessing(true);
setError(null);
acceptInviteMutation.mutate({
inviteCode,
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [session?.user.id, inviteCode, inviteInfo, error]);
if (
!isInviteInfoError &&
!error &&
(session?.user.id || isInviteInfoLoading || isSessionLoading)
) {
return (
<>
<PageHead title={t`Join workspace`} />
<PatternedBackground />
<div className="flex min-h-screen items-center justify-center">
<LoadingSpinner size="lg" />
</div>
</>
);
}
const PageWrapper = ({ children }: { children: React.ReactNode }) => {
return (
<>
<PageHead title={t`Join workspace | kan.bn`} />
{children}
</>
);
};
if (isInviteInfoError || (!isInviteInfoLoading && !inviteInfo)) {
return (
<PageWrapper>
<div className="relative flex min-h-screen items-center justify-center px-4 py-12 sm:px-6 lg:px-8">
<PatternedBackground />
<div className="z-10 w-full max-w-md space-y-8">
<div>
<h2 className="mt-6 text-center text-3xl font-bold tracking-tight text-light-1000 dark:text-dark-1000">
{t`Invalid invitation`}
</h2>
<p className="mt-4 text-center text-sm text-light-900 dark:text-dark-800">
{t`This invitation link is invalid or has expired.`}
</p>
</div>
<div className="text-center">
<Button href="/" variant="primary">
{t`Go Home`}
</Button>
</div>
</div>
</div>
</PageWrapper>
);
}
return (
<PageWrapper>
<div className="relative flex min-h-screen items-center justify-center px-4 py-12 sm:px-6 lg:px-8">
<PatternedBackground />
<div className="z-10 w-full max-w-[400px] space-y-8">
<div>
<h2 className="mt-6 text-center text-3xl font-bold tracking-tight text-light-1000 dark:text-dark-1000">
{t`Join workspace`}
</h2>
{!error ? (
<p className="mt-4 text-center text-sm text-light-900 dark:text-dark-800">
{isCloudEnv
? t`You've been invited to join a workspace on kan.bn.`
: t`You've been invited to join a workspace.`}
</p>
) : (
<p className="mt-4 text-center text-sm text-red-500">{error}</p>
)}
</div>
<div className="flex justify-center gap-2">
{session?.user.id ? (
<Button href={`/boards`} variant="primary" size="md">
{t`Go to app`}
</Button>
) : (
<>
<Button
href={`/login?next=/invite/${inviteCode}`}
disabled={isProcessing}
variant="primary"
size="md"
>
{t`Sign In`}
</Button>
<Button
href={`/signup?next=/invite/${inviteCode}`}
disabled={isProcessing}
variant="primary"
size="md"
>
{t`Sign Up`}
</Button>
</>
)}
</div>
</div>
</div>
</PageWrapper>
);
}

View File

@@ -3,7 +3,12 @@ import { t } from "@lingui/core/macro";
import { env } from "next-runtime-env";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { HiXMark } from "react-icons/hi2";
import {
HiInformationCircle,
HiMiniCheck,
HiOutlineDocumentDuplicate,
HiXMark,
} from "react-icons/hi2";
import { z } from "zod";
import type { InviteMemberInput } from "@kan/api/types";
@@ -31,7 +36,11 @@ export function InviteMemberForm({
userId: string | undefined;
}) {
const utils = api.useUtils();
const [isCreateAnotherEnabled, setIsCreateAnotherEnabled] = useState(false);
const [isShareInviteLinkEnabled, setIsShareInviteLinkEnabled] =
useState(false);
const [inviteLink, setInviteLink] = useState<string>("");
const [isLoadingInviteLink, setIsLoadingInviteLink] = useState(false);
const [copied, setCopied] = useState(false);
const { closeModal } = useModal();
const { workspace } = useWorkspace();
const { showPopup } = usePopup();
@@ -56,6 +65,21 @@ export function InviteMemberForm({
const refetchBoards = () => utils.board.all.refetch();
// Fetch active invite link on component mount
const { data: activeInviteLink, refetch: refetchInviteLink } =
api.member.getActiveInviteLink.useQuery(
{ workspacePublicId: workspace.publicId || "" },
{ enabled: !!workspace.publicId },
);
// Set initial state based on active invite link
useEffect(() => {
if (activeInviteLink) {
setIsShareInviteLinkEnabled(activeInviteLink.isActive);
setInviteLink(activeInviteLink.inviteLink || "");
}
}, [activeInviteLink]);
const inviteMember = api.member.invite.useMutation({
onSuccess: async () => {
closeModal();
@@ -64,7 +88,7 @@ export function InviteMemberForm({
},
onError: (error) => {
reset();
if (!isCreateAnotherEnabled) closeModal();
if (!isShareInviteLinkEnabled) closeModal();
if (error.data?.code === "CONFLICT") {
showPopup({
@@ -82,6 +106,36 @@ export function InviteMemberForm({
},
});
const createInviteLink = api.member.createInviteLink.useMutation({
onSuccess: (data) => {
setInviteLink(data.inviteLink);
setIsLoadingInviteLink(false);
},
onError: () => {
setIsLoadingInviteLink(false);
showPopup({
header: t`Error creating invite link`,
message: t`Please try again later.`,
icon: "error",
});
},
});
const deactivateInviteLink = api.member.deactivateInviteLink.useMutation({
onSuccess: () => {
setInviteLink("");
setIsLoadingInviteLink(false);
},
onError: () => {
setIsLoadingInviteLink(false);
showPopup({
header: t`Error deactivating invite link`,
message: t`Please try again later.`,
icon: "error",
});
},
});
const teamSubscription = getSubscriptionByPlan(subscriptions, "team");
const proSubscription = getSubscriptionByPlan(subscriptions, "pro");
@@ -109,6 +163,43 @@ export function InviteMemberForm({
inviteMember.mutate(member);
};
const handleInviteLinkToggle = async () => {
setIsLoadingInviteLink(true);
if (isShareInviteLinkEnabled && workspace.publicId) {
// Deactivate invite link
await deactivateInviteLink.mutateAsync({
workspacePublicId: workspace.publicId,
});
setIsShareInviteLinkEnabled(false);
} else {
// Create new invite link
await createInviteLink.mutateAsync({
workspacePublicId: workspace.publicId,
});
setIsShareInviteLinkEnabled(true);
}
};
const copyToClipboard = async () => {
try {
await navigator.clipboard.writeText(inviteLink);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
showPopup({
header: t`Invite link copied`,
message: t`Invite link copied to clipboard`,
icon: "success",
});
} catch (error) {
showPopup({
header: t`Error`,
message: t`Failed to copy invite link`,
icon: "error",
});
}
};
const handleUpgrade = async () => {
const { data, error } = await authClient.subscription.upgrade({
plan: "team",
@@ -173,6 +264,34 @@ export function InviteMemberForm({
}}
errorMessage={errors.email?.message}
/>
{isShareInviteLinkEnabled && inviteLink && (
<div className="my-4">
<div className="relative">
<Input
value={inviteLink}
className="pr-10 text-sm text-light-900 dark:text-dark-900"
readOnly
/>
<button
type="button"
className="absolute inset-y-0 right-0 flex items-center pr-3 text-light-900 hover:text-light-950 dark:text-dark-900 dark:hover:text-dark-950"
onClick={copyToClipboard}
>
{copied ? (
<HiMiniCheck className="h-5 w-5 text-green-600" />
) : (
<HiOutlineDocumentDuplicate className="h-5 w-5" />
)}
</button>
</div>
<div className="mt-2 flex items-start gap-1">
<HiInformationCircle className="mt-0.5 h-4 w-4 text-dark-900" />
<p className="text-xs text-gray-500 dark:text-dark-900">
{t`Anyone with this link can join your workspace`}
</p>
</div>
</div>
)}
{env("NEXT_PUBLIC_KAN_ENV") === "cloud" && (
<div className="mt-3 rounded-md bg-light-100 p-3 text-xs text-light-900 dark:bg-dark-200 dark:text-dark-900">
@@ -205,11 +324,9 @@ export function InviteMemberForm({
{(hasTeamSubscription || hasProSubscription) &&
env("NEXT_PUBLIC_KAN_ENV") === "cloud" && (
<Toggle
label={t`Invite another`}
isChecked={isCreateAnotherEnabled}
onChange={() =>
setIsCreateAnotherEnabled(!isCreateAnotherEnabled)
}
label={t`Share invite link`}
isChecked={isShareInviteLinkEnabled}
onChange={handleInviteLinkToggle}
/>
)}
<div>
@@ -226,7 +343,7 @@ export function InviteMemberForm({
) : (
<Button
type="submit"
disabled={inviteMember.isPending}
disabled={inviteMember.isPending || isShareInviteLinkEnabled}
isLoading={inviteMember.isPending}
className="inline-flex w-full justify-center rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none dark:bg-dark-1000 dark:text-dark-50"
>

View File

@@ -1,14 +1,19 @@
import { TRPCError } from "@trpc/server";
import { z } from "zod";
import * as inviteLinkRepo from "@kan/db/repository/inviteLink.repo";
import * as memberRepo from "@kan/db/repository/member.repo";
import * as subscriptionRepo from "@kan/db/repository/subscription.repo";
import * as userRepo from "@kan/db/repository/user.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { getSubscriptionByPlan, hasUnlimitedSeats } from "@kan/shared/utils";
import {
generateUID,
getSubscriptionByPlan,
hasUnlimitedSeats,
} from "@kan/shared/utils";
import { updateSubscriptionSeats } from "@kan/stripe";
import { createTRPCRouter, protectedProcedure } from "../trpc";
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
import { assertUserInWorkspace } from "../utils/auth";
export const memberRouter = createTRPCRouter({
@@ -241,4 +246,379 @@ export const memberRouter = createTRPCRouter({
return { success: true };
}),
getActiveInviteLink: protectedProcedure
.meta({
openapi: {
summary: "Get active invite link for workspace",
method: "GET",
path: "/workspaces/{workspacePublicId}/invite",
description: "Gets the active invite link for a workspace",
tags: ["Invites"],
protect: true,
},
})
.input(
z.object({
workspacePublicId: z.string().min(12),
}),
)
.output(
z.object({
id: z.number().optional(),
inviteCode: z.string().optional(),
inviteLink: z.string().optional(),
isActive: z.boolean(),
expiresAt: z.date().optional(),
}),
)
.query(async ({ ctx, input }) => {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
const workspace = await workspaceRepo.getByPublicId(
ctx.db,
input.workspacePublicId,
);
if (!workspace)
throw new TRPCError({
message: `Workspace not found`,
code: "NOT_FOUND",
});
// Check if user is in workspace
await assertUserInWorkspace(ctx.db, userId, workspace.id);
// Get active invite link for this workspace
const activeInviteLink = await inviteLinkRepo.getActiveForWorkspace(
ctx.db,
workspace.id,
);
if (
activeInviteLink &&
(!activeInviteLink.expiresAt || new Date() < activeInviteLink.expiresAt)
) {
return {
id: activeInviteLink.id,
inviteCode: activeInviteLink.code,
inviteLink: `${process.env.NEXT_PUBLIC_BASE_URL}/invite/${activeInviteLink.code}`,
isActive: true,
expiresAt: activeInviteLink.expiresAt ?? undefined,
};
}
return { isActive: false };
}),
createInviteLink: protectedProcedure
.meta({
openapi: {
summary: "Create invite link for workspace",
method: "POST",
path: "/workspaces/{workspacePublicId}/invites",
description: "Create invite link for a workspace",
tags: ["Invites"],
protect: true,
},
})
.input(
z.object({
workspacePublicId: z.string().min(12),
}),
)
.output(
z.object({
publicId: z.string().min(12),
inviteCode: z.string(),
inviteLink: z.string(),
expiresAt: z.date().nullable(),
}),
)
.mutation(async ({ ctx, input }) => {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
const workspace = await workspaceRepo.getByPublicId(
ctx.db,
input.workspacePublicId,
);
if (!workspace)
throw new TRPCError({
message: `Workspace not found`,
code: "NOT_FOUND",
});
// Check if user is in workspace
await assertUserInWorkspace(ctx.db, userId, workspace.id, "admin");
// Deactivate any existing active invite links
await inviteLinkRepo.deactivateAllActiveForWorkspace(ctx.db, {
workspaceId: workspace.id,
updatedBy: userId,
});
// Generate new invite code
const inviteCode = generateUID();
const expiresAt = new Date();
expiresAt.setDate(expiresAt.getDate() + 7);
// Create new invite link
const inviteLink = await inviteLinkRepo.createInviteLink(ctx.db, {
workspaceId: workspace.id,
code: inviteCode,
expiresAt,
createdBy: userId,
});
if (!inviteLink) {
throw new TRPCError({
message: `Failed to create invite link`,
code: "INTERNAL_SERVER_ERROR",
});
}
return {
publicId: inviteLink.publicId,
inviteCode: inviteLink.code,
inviteLink: `${process.env.NEXT_PUBLIC_BASE_URL}/invite/${inviteLink.code}`,
expiresAt: inviteLink.expiresAt,
};
}),
deactivateInviteLink: protectedProcedure
.meta({
openapi: {
summary: "Deactivate invite link for workspace",
method: "DELETE",
path: "/workspaces/{workspacePublicId}/invites",
description: "Deactivates the invite link for a workspace",
tags: ["Invites"],
protect: true,
},
})
.input(
z.object({
workspacePublicId: z.string().min(12),
}),
)
.output(
z.object({
success: z.boolean(),
}),
)
.mutation(async ({ ctx, input }) => {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
const workspace = await workspaceRepo.getByPublicId(
ctx.db,
input.workspacePublicId,
);
if (!workspace)
throw new TRPCError({
message: `Workspace not found`,
code: "NOT_FOUND",
});
// Check if user is in workspace
await assertUserInWorkspace(ctx.db, userId, workspace.id, "admin");
// Deactivate all active invite links
await inviteLinkRepo.deactivateAllActiveForWorkspace(ctx.db, {
workspaceId: workspace.id,
updatedBy: userId,
});
return { success: true };
}),
getInviteByCode: publicProcedure
.meta({
openapi: {
summary: "Get invite information by code",
method: "GET",
path: "/workspaces/{workspacePublicId}/invites/{inviteCode}",
description: "Get invite information by invite code",
tags: ["Invites"],
protect: false,
},
})
.input(
z.object({
inviteCode: z.string().min(12),
}),
)
.output(
z
.object({
publicId: z.string().min(12),
status: z.string(),
expiresAt: z.date().nullable(),
})
.optional(),
)
.query(async ({ ctx, input }) => {
const invite = await inviteLinkRepo.getByCode(ctx.db, input.inviteCode);
if (
!invite ||
invite.status !== "active" ||
(invite.expiresAt && new Date() > invite.expiresAt)
) {
throw new TRPCError({
message: `Invalid or expired invite link`,
code: "BAD_REQUEST",
});
}
return {
publicId: invite.publicId,
status: invite.status,
expiresAt: invite.expiresAt ?? null,
};
}),
acceptInviteLink: publicProcedure
.meta({
openapi: {
summary: "Accept an invite link",
method: "POST",
path: "/workspaces/{workspacePublicId}/invites/accept",
description: "Accepts an invitation via invite link",
tags: ["Invites"],
protect: false,
},
})
.input(
z.object({
inviteCode: z.string().min(12),
}),
)
.output(
z.object({
success: z.boolean(),
workspacePublicId: z.string().optional(),
workspaceSlug: z.string().optional(),
}),
)
.mutation(async ({ ctx, input }) => {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
const invite = await inviteLinkRepo.getByCode(ctx.db, input.inviteCode);
if (
!invite ||
invite.status !== "active" ||
(invite.expiresAt && new Date() > invite.expiresAt)
)
throw new TRPCError({
message: `Invalid or expired invite link`,
code: "BAD_REQUEST",
});
const workspace = await workspaceRepo.getById(ctx.db, invite.workspaceId);
if (!workspace)
throw new TRPCError({
message: `Workspace not found`,
code: "NOT_FOUND",
});
const isMember = await workspaceRepo.isUserInWorkspace(
ctx.db,
userId,
invite.workspaceId,
);
if (isMember) {
throw new TRPCError({
message: `User is already a member of this workspace`,
code: "CONFLICT",
});
}
const user = await userRepo.getById(ctx.db, userId);
if (!user)
throw new TRPCError({
message: `User not found`,
code: "NOT_FOUND",
});
if (process.env.NEXT_PUBLIC_KAN_ENV === "cloud") {
const subscriptions = await subscriptionRepo.getByReferenceId(
ctx.db,
workspace.publicId,
);
// get the active subscriptions
const activeTeamSubscription = getSubscriptionByPlan(
subscriptions,
"team",
);
const activeProSubscription = getSubscriptionByPlan(
subscriptions,
"pro",
);
const unlimitedSeats = hasUnlimitedSeats(subscriptions);
if (!activeTeamSubscription && !activeProSubscription) {
throw new TRPCError({
message: `Workspace with public ID ${workspace.publicId} does not have an active subscription`,
code: "NOT_FOUND",
});
}
// Update the Stripe subscription
if (activeTeamSubscription?.stripeSubscriptionId && !unlimitedSeats) {
try {
await updateSubscriptionSeats(
activeTeamSubscription.stripeSubscriptionId,
1,
);
} catch (error) {
console.error("Failed to update Stripe subscription seats:", error);
throw new TRPCError({
message: `Failed to update subscription for the new member.`,
code: "INTERNAL_SERVER_ERROR",
});
}
}
}
await memberRepo.create(ctx.db, {
workspaceId: invite.workspaceId,
email: user.email,
userId: user.id,
createdBy: user.id,
role: "member",
status: "active",
});
return {
success: true,
workspacePublicId: workspace.publicId,
workspaceSlug: workspace.slug,
};
}),
});

View File

@@ -0,0 +1,34 @@
CREATE TYPE "public"."invite_link_status" AS ENUM('active', 'inactive');--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "workspace_invite_links" (
"id" bigserial PRIMARY KEY NOT NULL,
"publicId" varchar(12) NOT NULL,
"workspaceId" bigint NOT NULL,
"code" varchar(12) NOT NULL,
"status" "invite_link_status" DEFAULT 'active' NOT NULL,
"expiresAt" timestamp,
"createdAt" timestamp DEFAULT now() NOT NULL,
"createdBy" uuid,
"updatedAt" timestamp,
"updatedBy" uuid,
CONSTRAINT "workspace_invite_links_publicId_unique" UNIQUE("publicId"),
CONSTRAINT "workspace_invite_links_code_unique" UNIQUE("code")
);
--> statement-breakpoint
ALTER TABLE "workspace_invite_links" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "workspace_invite_links" ADD CONSTRAINT "workspace_invite_links_workspaceId_workspace_id_fk" FOREIGN KEY ("workspaceId") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "workspace_invite_links" ADD CONSTRAINT "workspace_invite_links_createdBy_user_id_fk" FOREIGN KEY ("createdBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "workspace_invite_links" ADD CONSTRAINT "workspace_invite_links_updatedBy_user_id_fk" FOREIGN KEY ("updatedBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;

File diff suppressed because it is too large Load Diff

View File

@@ -106,6 +106,13 @@
"when": 1758226671081,
"tag": "20250918201751_AddPausedMemberStatus",
"breakpoints": true
},
{
"idx": 15,
"version": "7",
"when": 1758662398166,
"tag": "20250923211958_AddWorkspaceInviteLinks",
"breakpoints": true
}
]
}

View File

@@ -0,0 +1,71 @@
import { and, eq, gt } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { workspaceInviteLinks } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const createInviteLink = async (
db: dbClient,
args: {
workspaceId: number;
code: string;
expiresAt: Date | null;
createdBy: string;
},
) => {
const [result] = await db
.insert(workspaceInviteLinks)
.values({
publicId: generateUID(),
workspaceId: args.workspaceId,
code: args.code,
expiresAt: args.expiresAt ?? null,
status: "active",
createdBy: args.createdBy,
})
.returning({
publicId: workspaceInviteLinks.publicId,
code: workspaceInviteLinks.code,
status: workspaceInviteLinks.status,
expiresAt: workspaceInviteLinks.expiresAt,
});
return result;
};
export const deactivateAllActiveForWorkspace = async (
db: dbClient,
args: { workspaceId: number; updatedBy: string },
) => {
await db
.update(workspaceInviteLinks)
.set({
status: "inactive",
updatedBy: args.updatedBy,
updatedAt: new Date(),
})
.where(
and(
eq(workspaceInviteLinks.workspaceId, args.workspaceId),
eq(workspaceInviteLinks.status, "active"),
),
);
};
export const getActiveForWorkspace = async (
db: dbClient,
workspaceId: number,
) => {
return db.query.workspaceInviteLinks.findFirst({
where: and(
eq(workspaceInviteLinks.workspaceId, workspaceId),
eq(workspaceInviteLinks.status, "active"),
),
orderBy: (links, { desc }) => [desc(links.createdAt)],
});
};
export const getByCode = async (db: dbClient, code: string) => {
return db.query.workspaceInviteLinks.findFirst({
where: eq(workspaceInviteLinks.code, code),
});
};

View File

@@ -87,11 +87,25 @@ export const getByPublicId = (db: dbClient, workspacePublicId: string) => {
publicId: true,
name: true,
plan: true,
slug: true,
},
where: eq(workspaces.publicId, workspacePublicId),
});
};
export const getById = (db: dbClient, workspaceId: number) => {
return db.query.workspaces.findFirst({
columns: {
id: true,
publicId: true,
name: true,
plan: true,
slug: true,
},
where: eq(workspaces.id, workspaceId),
});
};
export const getByPublicIdWithMembers = (
db: dbClient,
workspacePublicId: string,

View File

@@ -11,3 +11,4 @@ export * from "./users";
export * from "./integrations";
export * from "./workspaces";
export * from "./subscriptions";
export * from "./workspaceInviteLinks";

View File

@@ -0,0 +1,38 @@
import {
bigint,
bigserial,
pgEnum,
pgTable,
timestamp,
uuid,
varchar,
} from "drizzle-orm/pg-core";
import { users } from "./users";
import { workspaces } from "./workspaces";
export const inviteLinkStatuses = ["active", "inactive"] as const;
export type InviteLinkStatus = (typeof inviteLinkStatuses)[number];
export const inviteLinkStatusEnum = pgEnum(
"invite_link_status",
inviteLinkStatuses,
);
export const workspaceInviteLinks = pgTable("workspace_invite_links", {
id: bigserial("id", { mode: "number" }).primaryKey(),
publicId: varchar("publicId", { length: 12 }).notNull().unique(),
workspaceId: bigint("workspaceId", { mode: "number" })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
code: varchar("code", { length: 12 }).notNull().unique(),
status: inviteLinkStatusEnum("status").notNull().default("active"),
expiresAt: timestamp("expiresAt"),
createdAt: timestamp("createdAt").defaultNow().notNull(),
createdBy: uuid("createdBy").references(() => users.id, {
onDelete: "set null",
}),
updatedAt: timestamp("updatedAt"),
updatedBy: uuid("updatedBy").references(() => users.id, {
onDelete: "set null",
}),
}).enableRLS();