Compare commits

..

14 Commits

Author SHA1 Message Date
Henry
3636676913 chore: build translations 2025-10-02 22:08:36 +01:00
Henry
9d9b5ed7d1 feat: consistent font size for search placeholder 2025-10-02 22:04:51 +01:00
Henry
e526ad3bda fix: prevent no results flickering 2025-10-02 22:02:42 +01:00
Henry
962aba8ccf feat: add keyboard shortcuts 2025-10-02 21:41:40 +01:00
Henry
c75dcb2f20 feat: add search button to collapsed menu 2025-10-02 21:38:33 +01:00
Henry
f8475b77f1 feat: add fuzzy search 2025-10-01 23:13:22 +01:00
Henry
bd691017ad feat: add icons for search results 2025-10-01 22:40:12 +01:00
Henry
468bd8afec feat: add keyboard navigation 2025-10-01 22:15:09 +01:00
Henry
6904bce96b feat: use placeholder data in search results 2025-10-01 21:42:56 +01:00
Henry
e07a462184 feat: set up command pallette and search endpoint 2025-09-29 22:33:36 +01:00
Henry
6059fa35a2 fix: show invite link toggle on self hosted environments (#198) 2025-09-27 20:48:16 +01:00
Morfixx
60355c762f feat: disable email functions if email not enabled (#195)
* fix: disabled email functionality unless email sending enabled

* feat: missing locale only russian complete

* chore: add ENABLE_EMAIL to docker compose

* chore: add translations

* fix: removed new env variable, and used SMTP_HOST instead for checking

* Revert "fix: removed new env variable, and used SMTP_HOST instead for checking"

This reverts commit 5f75237e06ac07bcbb073c25cdc9d6a9071e4011.

* feat: allow inviting members via link

* refactor: update env to disable email

* chore: update translations

---------

Co-authored-by: Henry <henry_ball@hotmail.co.uk>
2025-09-26 23:20:57 +01:00
Henry
b159b48c35 feat: invite workspace members via link (#196)
* feat: add workspace invite links schema

* feat: update workspace invite schema

* feat: add repo funcs and share link toggle

* feat: redirect to next param on authentication

* feat: add invite page

* feat: switch to workspace on invite success

* refactor: tweak light mode styles

* feat(cloud): update subscription for cloud

* feat: only allow admin users to create links

* chore: add translations
2025-09-26 22:25:42 +01:00
Morfixx
7ab30acfc4 feat(db): added similar checks for duplicate indices for cards (#191) 2025-09-24 21:40:25 +01:00
42 changed files with 8575 additions and 753 deletions

View File

@@ -1,6 +1,6 @@
# https://github.com/kanbn/kan?tab=readme-ov-file#environment-variables-) # https://github.com/kanbn/kan?tab=readme-ov-file#environment-variables-)
# Required environment variables # Required environment variables
NEXT_PUBLIC_BASE_URL= # e.g. https://kan.bn NEXT_PUBLIC_BASE_URL= # e.g. https://kan.bn
BETTER_AUTH_SECRET= # Random 32+ char string (can gen with: openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32) BETTER_AUTH_SECRET= # Random 32+ char string (can gen with: openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
@@ -18,6 +18,9 @@ SMTP_PASSWORD=
EMAIL_FROM= # e.g. "Kan <hello@mail.kan.bn>" EMAIL_FROM= # e.g. "Kan <hello@mail.kan.bn>"
SMTP_SECURE= # set to "false" to use port 587 SMTP_SECURE= # set to "false" to use port 587
# Switch email features off entirely (optional)
NEXT_PUBLIC_DISABLE_EMAIL=
# S3 storage (optional) # S3 storage (optional)
S3_REGION= S3_REGION=
S3_ENDPOINT= S3_ENDPOINT=

View File

@@ -147,6 +147,7 @@ pnpm dev
| `SMTP_USER` | SMTP username/email | No | `resend` | | `SMTP_USER` | SMTP username/email | No | `resend` |
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` | | `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` | | `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
| `NEXT_PUBLIC_DISABLE_EMAIL` | To disable all email features | For Email | `true` |
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` | | `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string | | `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` | | `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |

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 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%20error%20occurred%20while%20disconnecting%20your%20Trello%20account./singular: 0aa3973b860c1faf8d9123aebf567e40
An%20unexpected%20error%20occurred.%20Please%20try%20again%20later./singular: 1b5749b0cca6a62d75a577bee6804074 An%20unexpected%20error%20occurred.%20Please%20try%20again%20later./singular: 1b5749b0cca6a62d75a577bee6804074
Anyone%20with%20this%20link%20can%20join%20your%20workspace/singular: 2366ed295eb2c03c425559c24cb31606
API/singular: 01d9819514e27056dcc69463194b63d2 API/singular: 01d9819514e27056dcc69463194b63d2
API%20key%20created/singular: 8dbb2b60a719b0d120e774d6666c8c45 API%20key%20created/singular: 8dbb2b60a719b0d120e774d6666c8c45
API%20key%20name/singular: 2d8aeb08b2cce3b750a584bbc5ce6d1d API%20key%20name/singular: 2d8aeb08b2cce3b750a584bbc5ce6d1d
@@ -111,6 +112,7 @@ checksums:
Create%20board/singular: 155b62818bfab0e34f0089e1b34a32f3 Create%20board/singular: 155b62818bfab0e34f0089e1b34a32f3
Create%20card/singular: 32792935dd5837a9433909b04021c22b Create%20card/singular: 32792935dd5837a9433909b04021c22b
Create%20checklist/singular: 5cbca15a7004558c4e6d381f83a34da2 Create%20checklist/singular: 5cbca15a7004558c4e6d381f83a34da2
Create%20invite%20link/singular: bef23fe786978f7abf78dece49a35a26
Create%20label/singular: c64e8180fa956f005edc1fd9b8e65abb Create%20label/singular: c64e8180fa956f005edc1fd9b8e65abb
Create%20list/singular: 858c3d514aa95765ec82114393199144 Create%20list/singular: 858c3d514aa95765ec82114393199144
Create%20new%20board/singular: cbb87b1f4cc46b336ad9510c9f19407c Create%20new%20board/singular: cbb87b1f4cc46b336ad9510c9f19407c
@@ -127,6 +129,7 @@ checksums:
Custom%20workspace%20URL/singular: 7ba841d0946eb04fa3d17d74365be37b Custom%20workspace%20URL/singular: 7ba841d0946eb04fa3d17d74365be37b
Customer%20Support/singular: 50e3c77e22e41061ca85ea2f02625a2e Customer%20Support/singular: 50e3c77e22e41061ca85ea2f02625a2e
Dark/singular: 73e6e208ba628b26e90fcf6dce15e1b2 Dark/singular: 73e6e208ba628b26e90fcf6dce15e1b2
Deactivate%20invite%20link/singular: 8cf4bf82e153e4dc82d026448cb4dd10
Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9 Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9
Delete%20account/singular: a9d11113f1a1d7e20582bdcc9633bcef Delete%20account/singular: a9d11113f1a1d7e20582bdcc9633bcef
Delete%20board/singular: e915cd160651ad4b61a67e8da0737c23 Delete%20board/singular: e915cd160651ad4b61a67e8da0737c23
@@ -165,7 +168,10 @@ checksums:
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
Enter%20your%20new%20password/singular: c67251e3002b68bc20a7cf5de23e43ac Enter%20your%20new%20password/singular: c67251e3002b68bc20a7cf5de23e43ac
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
Error/singular: 3c95bcb32c2104b99a46f5b3dd015248
Error%20Changing%20Password/singular: ebecb5c1b72ba4b063117241f5ba4f2d Error%20Changing%20Password/singular: ebecb5c1b72ba4b063117241f5ba4f2d
Error%20creating%20invite%20link/singular: cbedc3f3213dfc4fdc8b7503ae1a5cd6
Error%20deactivating%20invite%20link/singular: ccf42cd5aa8481692003e87e836de66c
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643 Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26 Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
@@ -182,6 +188,8 @@ checksums:
Everything%20in%20the%20free%20plan%2C%20plus%3A/singular: 62b44c4973b92b806c69a4b15e0256dc 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 Everything%20you%20need%2C%20free%20forever.%20Unlimited%20boards%2C%20unlimited%20lists%2C%20unlimited%20cards.%20Upgrade%20any%20time./singular: fa21632ab1468edf10acda2fe7b71323
Execution/singular: cbac4a3c721123cbc6a883560bf29800 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 Failed%20to%20login%20with%20%7B0%7D.%20Please%20try%20again./singular: 669a4b4247a73f53fb9b8b16e42d166f
FAQs/singular: dc36d7992372ccd419b39ef51cf5b16c FAQs/singular: dc36d7992372ccd419b39ef51cf5b16c
Feature/singular: 58f5f3f37862b6312a2f20ec1a1fd0e8 Feature/singular: 58f5f3f37862b6312a2f20ec1a1fd0e8
@@ -206,6 +214,7 @@ checksums:
Get%20started%20on%20Cloud/singular: ed926f526266ad2063283c58e6f4284a Get%20started%20on%20Cloud/singular: ed926f526266ad2063283c58e6f4284a
Getting%20started/singular: 8e5e7bd026b5bec46bbfdce02ab9e0b8 Getting%20started/singular: 8e5e7bd026b5bec46bbfdce02ab9e0b8
GitHub/singular: 6e1cf3c00fa6fbe24afcc78ea3b5f3e4 GitHub/singular: 6e1cf3c00fa6fbe24afcc78ea3b5f3e4
Go%20Home/singular: 6251589da1964d55afabdfd64c84c335
Go%20to%20app/singular: 896d0441384dcd2bfb3b23d61ff1944d Go%20to%20app/singular: 896d0441384dcd2bfb3b23d61ff1944d
High%20Priority/singular: 5d231ff8254aabc875f194c4b4f49c97 High%20Priority/singular: 5d231ff8254aabc875f194c4b4f49c97
Hired/singular: e5a9b1bd409b007141fe3d7890022f9a Hired/singular: e5a9b1bd409b007141fe3d7890022f9a
@@ -226,15 +235,21 @@ checksums:
Important/singular: 4cf0e8fc8e4e7c5c9b9458059a172a2b Important/singular: 4cf0e8fc8e4e7c5c9b9458059a172a2b
Importing%20from%20Trello/singular: 1e3a46fb9bd8ce8c7d632f9555b5bd7c Importing%20from%20Trello/singular: 1e3a46fb9bd8ce8c7d632f9555b5bd7c
Importing%20your%20Trello%20boards%20into%20Kan%20is%20easy.%20You%20can%20follow%20our%20step-by-step%20guide%20%3C0%3Ehere%3C%2F0%3E./singular: ca88dc22801fef08fee1ecfb1bf6914e Importing%20your%20Trello%20boards%20into%20Kan%20is%20easy.%20You%20can%20follow%20our%20step-by-step%20guide%20%3C0%3Ehere%3C%2F0%3E./singular: ca88dc22801fef08fee1ecfb1bf6914e
in/singular: 1f06ad6763244d5e9927853e65cc6274
In%20Progress/singular: 3de9afebcb9d4ce8ac42e14995f79ffd In%20Progress/singular: 3de9afebcb9d4ce8ac42e14995f79ffd
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
Integrations/singular: 0ccce343287704cd90150c32e2fcad36 Integrations/singular: 0ccce343287704cd90150c32e2fcad36
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95 Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
Invalid%20email%20address/singular: b2d9f25626f2d15c7c63e0281bccc247 Invalid%20email%20address/singular: b2d9f25626f2d15c7c63e0281bccc247
Invalid%20invitation/singular: 4b936a8811a2295a5f58b41473c608f3
Invite/singular: 181884cea804cbde665f160811ee7ad0 Invite/singular: 181884cea804cbde665f160811ee7ad0
Invite%20another/singular: acb543563dab7edbcf46060a53ade3a3 Invite%20link%20copied/singular: 4046f23a78e1cd5166671c3fb8a7ea6e
Invite%20link%20copied%20to%20clipboard/singular: 6fc055a0ea0ed1aa58c5e0c502efe17f
Invite%20links%20require%20a%20Team%20or%20Pro%20subscription.%20Please%20upgrade%20your%20workspace./singular: 18db646fc55f99789572c8df0539ee69
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7 Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
Inviting%20members%20requires%20a%20Team%20Plan.%20You'll%20be%20redirected%20to%20upgrade%20your%20workspace./singular: 03eeed2d715e770259f722ba48a61ab3 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 Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223 Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
Kanban%20reimagined/singular: 613ccfdd9f54c66cbf68cfa313498766 Kanban%20reimagined/singular: 613ccfdd9f54c66cbf68cfa313498766
@@ -286,6 +301,7 @@ checksums:
No%20boards%20found/singular: e044088d2c51b6bdf660fafa86ee1e17 No%20boards%20found/singular: e044088d2c51b6bdf660fafa86ee1e17
No%20credit%20card%20required/singular: 2090aa4171dc0b60735069f89b592883 No%20credit%20card%20required/singular: 2090aa4171dc0b60735069f89b592883
No%20lists/singular: cedf633d99c77ff4356e089f2d98c0a6 No%20lists/singular: cedf633d99c77ff4356e089f2d98c0a6
No%20results%20found%20for%20%22%7BdebouncedQuery%7D%22./singular: 5db6294712528cd897b15ae36f4fd834
Offer/singular: 82b4e0c9a3f5b4bd93590847de7c32a1 Offer/singular: 82b4e0c9a3f5b4bd93590847de7c32a1
Onboarding/singular: 52b23f9c62ff199d4c09920e7641829e Onboarding/singular: 52b23f9c62ff199d4c09920e7641829e
Once%20you%20delete%20your%20account%2C%20there%20is%20no%20going%20back.%20This%20action%20cannot%20be%20undone./singular: 9cf7aa6ef30890e5124e266c081bae1c Once%20you%20delete%20your%20account%2C%20there%20is%20no%20going%20back.%20This%20action%20cannot%20be%20undone./singular: 9cf7aa6ef30890e5124e266c081bae1c
@@ -295,6 +311,8 @@ checksums:
Own%20your%20data/singular: cc2178dac4bdf6b07f030cfc2a7510e6 Own%20your%20data/singular: cc2178dac4bdf6b07f030cfc2a7510e6
Part-time/singular: 213d63da450f35dabb3ab0e35e29feed Part-time/singular: 213d63da450f35dabb3ab0e35e29feed
Password%20Changed/singular: 1fcebe9ddb46f722a57f195efddc695d Password%20Changed/singular: 1fcebe9ddb46f722a57f195efddc695d
Password%20is%20required%20to%20login./singular: a09c76294ca7b27b38658b34618a7119
Password%20is%20required%20to%20sign%20up./singular: 3fa1abbf2e6ac8ac4d18c215191bdbcc
Password%20must%20be%20at%20least%208%20characters/singular: 4c30501d085eaccea47af34212bb26a7 Password%20must%20be%20at%20least%208%20characters/singular: 4c30501d085eaccea47af34212bb26a7
Passwords%20do%20not%20match/singular: 37ca1f4e0afc9a0b8e9617f767103c92 Passwords%20do%20not%20match/singular: 37ca1f4e0afc9a0b8e9617f767103c92
Paused/singular: edb1f7b7219e1c9b7aa67159090d6991 Paused/singular: edb1f7b7219e1c9b7aa67159090d6991
@@ -309,6 +327,7 @@ checksums:
Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f
Please%20select%20a%20file%20to%20upload./singular: de315bf594047f8ef9307a7fa9285844 Please%20select%20a%20file%20to%20upload./singular: de315bf594047f8ef9307a7fa9285844
Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: 21ffcf0b00e7cd7b64f7454a95762e1d Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: 21ffcf0b00e7cd7b64f7454a95762e1d
Please%20try%20again%20later./singular: 325dea6dd0348a27a6818db2c1340c98
Pricing/singular: ce27f1aeacccc542a174c4b2bce022b0 Pricing/singular: ce27f1aeacccc542a174c4b2bce022b0
Priority%20email%20support/singular: 678538c912a770b1e1416ecdb8e299b1 Priority%20email%20support/singular: 678538c912a770b1e1416ecdb8e299b1
Privacy%20policy/singular: 462c6a536b52873e4498785c66dd48c8 Privacy%20policy/singular: 462c6a536b52873e4498785c66dd48c8
@@ -342,6 +361,7 @@ checksums:
Save/singular: f7a2929f33bc420195e59ac5a8bcd454 Save/singular: f7a2929f33bc420195e59ac5a8bcd454
Save%20time%20with%20reusable%20board%20templates./singular: d0f2d7d0fd682ceaf4ca12c6353fd75a Save%20time%20with%20reusable%20board%20templates./singular: d0f2d7d0fd682ceaf4ca12c6353fd75a
Screening/singular: 0327bfb25db87bdacf00d4dc297f8b26 Screening/singular: 0327bfb25db87bdacf00d4dc297f8b26
Search%20boards%20and%20cards.../singular: 137017b2b3e885c4894ca8c899af5bc2
Select%20all/singular: eedc7cdb02de467c15dc418a066a77f2 Select%20all/singular: eedc7cdb02de467c15dc418a066a77f2
Select%20source/singular: c7b0ec447415ff62856803a4d7838bd6 Select%20source/singular: c7b0ec447415ff62856803a4d7838bd6
Self%20Host/singular: 43fbce2027548b712002e489a20a621a Self%20Host/singular: 43fbce2027548b712002e489a20a621a
@@ -356,6 +376,8 @@ checksums:
Settings%20%7C%20Integrations/singular: d04992e28016452f6d3d7dcc0b592415 Settings%20%7C%20Integrations/singular: d04992e28016452f6d3d7dcc0b592415
Settings%20%7C%20Workspace/singular: 5d0bacf7ff696da940f232df45edfd39 Settings%20%7C%20Workspace/singular: 5d0bacf7ff696da940f232df45edfd39
Sign%20in/singular: cb8757c7450e17de1e226e82fb0fa4a2 Sign%20in/singular: cb8757c7450e17de1e226e82fb0fa4a2
Sign%20In/singular: ec7b8f314fe9bc6591006707484ede61
Sign%20Up/singular: 0dd2ae69be4618c1f9e615774a4509ca
Sign%20up%20%7C%20kan.bn/singular: f3de2a110c90358e6eac07d0b2f663a6 Sign%20up%20%7C%20kan.bn/singular: f3de2a110c90358e6eac07d0b2f663a6
Sign%20up%20disabled/singular: 9581b1f75b404ac0ecb7e603e0d4189c Sign%20up%20disabled/singular: 9581b1f75b404ac0ecb7e603e0d4189c
Sign%20up%20is%20currently%20disabled.%20Please%20try%20again%20later./singular: c6cb7c455ec053b351a27029158ff166 Sign%20up%20is%20currently%20disabled.%20Please%20try%20again%20later./singular: c6cb7c455ec053b351a27029158ff166
@@ -365,6 +387,7 @@ checksums:
Social%20Media/singular: 2227508afb0d38a027e323207e47d4a2 Social%20Media/singular: 2227508afb0d38a027e323207e47d4a2
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875 Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
Subscription%20Required/singular: 05f2b4abfc36def17756a6969983cf86
Success/singular: c43827becada6750f7a25890905f38b9 Success/singular: c43827becada6750f7a25890905f38b9
Supercharge%20your%20workspace%20for%20just%20%2429%2Fmonth.%20Here's%20what%20you'll%20get%3A/singular: 21af8119141afcce5f12da489f34db6a Supercharge%20your%20workspace%20for%20just%20%2429%2Fmonth.%20Here's%20what%20you'll%20get%3A/singular: 21af8119141afcce5f12da489f34db6a
Support/singular: 55aab5fd0f31a9cb055a2edeeedfaf63 Support/singular: 55aab5fd0f31a9cb055a2edeeedfaf63
@@ -385,6 +408,7 @@ checksums:
This%20API%20key%20will%20only%20be%20shown%20once.%20Please%20save%20it%20in%20a%20secure%20location./singular: 7df18d2978d317375f780822f8321c4d 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%20is%20private%20or%20does%20not%20exist/singular: a217ff3f04463b4df8c86adb6f83c6bc
This%20board%20URL%20has%20already%20been%20taken/singular: 1d8b40332a031b5b77a3658e48dd51ca 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%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081 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 This%20workspace%20URL%20has%20already%20been%20taken/singular: b455329e2a71da677acab91d3a00bad6
@@ -485,6 +509,8 @@ checksums:
You%20have%20been%20logged%20in%20successfully./singular: ef8fad1dce13ae4112f17c5258655fea You%20have%20been%20logged%20in%20successfully./singular: ef8fad1dce13ae4112f17c5258655fea
You%20have%20been%20signed%20up%20successfully./singular: f614a6e3b45f5ffb9a3b0fb420fef84b 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%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%20account%20has%20been%20deleted./singular: 8c8d944e07388c5877effdb2c2803dcf
Your%20boards%20have%20been%20imported./singular: 403972e7a25afc2415762c1c2b1ec868 Your%20boards%20have%20been%20imported./singular: 403972e7a25afc2415762c1c2b1ec868
Your%20display%20name%20has%20been%20updated./singular: 15e5fff36c554c16ec5214427fae1bf4 Your%20display%20name%20has%20been%20updated./singular: 15e5fff36c554c16ec5214427fae1bf4

View File

@@ -1,10 +1,11 @@
import type { SocialProvider } from "better-auth/social-providers"; import type { SocialProvider } from "better-auth/social-providers";
import { useSearchParams } from "next/navigation";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import { t } from "@lingui/core/macro"; import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro"; import { Trans } from "@lingui/react/macro";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { env } from "next-runtime-env"; import { env } from "next-runtime-env";
import { useEffect, useState } from "react"; import { useEffect, useMemo, useRef, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { import {
FaApple, FaApple,
@@ -155,15 +156,23 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
const [isLoginWithProviderPending, setIsLoginWithProviderPending] = const [isLoginWithProviderPending, setIsLoginWithProviderPending] =
useState<null | AuthProvider>(null); useState<null | AuthProvider>(null);
const [isCredentialsEnabled, setIsCredentialsEnabled] = useState(false); const [isCredentialsEnabled, setIsCredentialsEnabled] = useState(false);
const [isEmailSendingEnabled, setIsEmailSendingEnabled] = useState(false);
const [isLoginWithEmailPending, setIsLoginWithEmailPending] = useState(false); const [isLoginWithEmailPending, setIsLoginWithEmailPending] = useState(false);
const [loginError, setLoginError] = useState<string | null>(null); const [loginError, setLoginError] = useState<string | null>(null);
const { showPopup } = usePopup(); const { showPopup } = usePopup();
const oidcProviderName = "OIDC"; const oidcProviderName = "OIDC";
const passwordRef = useRef<HTMLInputElement | null>(null);
const redirect = useSearchParams().get("next");
const callbackURL = redirect ?? "/boards";
// Safely get environment variables on client side to avoid hydration mismatch // Safely get environment variables on client side to avoid hydration mismatch
useEffect(() => { useEffect(() => {
const credentialsAllowed = const credentialsAllowed =
env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true"; env("NEXT_PUBLIC_ALLOW_CREDENTIALS")?.toLowerCase() === "true";
const emailSendingEnabled =
env("NEXT_PUBLIC_DISABLE_EMAIL")?.toLowerCase() !== "true";
setIsEmailSendingEnabled(emailSendingEnabled);
setIsCredentialsEnabled(credentialsAllowed); setIsCredentialsEnabled(credentialsAllowed);
}, []); }, []);
@@ -183,7 +192,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
const handleLoginWithEmail = async ( const handleLoginWithEmail = async (
email: string, email: string,
password?: string, password?: string | null,
name?: string, name?: string,
) => { ) => {
setIsLoginWithEmailPending(true); setIsLoginWithEmailPending(true);
@@ -195,7 +204,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
name, name,
email, email,
password, password,
callbackURL: "/boards", callbackURL,
}, },
{ {
onSuccess: () => onSuccess: () =>
@@ -212,7 +221,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
{ {
email, email,
password, password,
callbackURL: "/boards", callbackURL,
}, },
{ {
onSuccess: () => onSuccess: () =>
@@ -226,16 +235,26 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
); );
} }
} else { } else {
await authClient.signIn.magicLink( // Only allow magic link if email sending is enabled and not in sign up mode
{ if (isEmailSendingEnabled && !isSignUp) {
email, await authClient.signIn.magicLink(
callbackURL: "/boards", {
}, email,
{ callbackURL,
onSuccess: () => setIsMagicLinkSent(true, email), },
onError: ({ error }) => setLoginError(error.message), {
}, onSuccess: () => setIsMagicLinkSent(true, email),
); onError: ({ error }) => setLoginError(error.message),
},
);
} else {
// Provide a clear error feedback when password omitted but magic link unavailable
setLoginError(
isSignUp
? t`Password is required to sign up.`
: t`Password is required to login.`,
);
}
} }
setIsLoginWithEmailPending(false); setIsLoginWithEmailPending(false);
@@ -250,14 +269,14 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
// Use oauth2 signin for OIDC provider // Use oauth2 signin for OIDC provider
const result = await authClient.signIn.oauth2({ const result = await authClient.signIn.oauth2({
providerId: "oidc", providerId: "oidc",
callbackURL: "/boards", callbackURL,
}); });
error = result.error; error = result.error;
} else { } else {
// Use social signin for traditional social providers // Use social signin for traditional social providers
const result = await authClient.signIn.social({ const result = await authClient.signIn.social({
provider, provider,
callbackURL: "/boards", callbackURL,
}); });
error = result.error; error = result.error;
} }
@@ -272,11 +291,43 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
}; };
const onSubmit = async (values: FormValues) => { const onSubmit = async (values: FormValues) => {
await handleLoginWithEmail(values.email, values.password, values.name); // Treat empty password string as undefined to trigger magic link path
const sanitizedPassword = values.password?.trim()
? values.password
: undefined;
await handleLoginWithEmail(values.email, sanitizedPassword, values.name);
}; };
const password = watch("password"); const password = watch("password");
// Determine if we should operate in magic link mode for current form state (login only)
const isMagicLinkMode = useMemo(() => {
// Magic link only viable when email sending enabled AND not sign up.
if (!isEmailSendingEnabled || isSignUp) return false;
// If credentials disabled we always default to magic link.
if (!isCredentialsEnabled) return true;
// Credentials enabled: user chooses magic link by leaving password blank.
return !password;
}, [isEmailSendingEnabled, isSignUp, isCredentialsEnabled, password]);
// Auto-focus password field when an error indicates it's required
useEffect(() => {
if (!isCredentialsEnabled) return;
// Focus when: sign up and missing password; login error requiring password; validation error on password.
const pwdEmpty = (password ?? "").length === 0;
let needsPassword = false;
if (isSignUp && pwdEmpty) {
needsPassword = true;
} else if (loginError?.toLowerCase().includes("password")) {
needsPassword = true;
} else if (errors.password) {
needsPassword = true;
}
if (needsPassword && passwordRef.current) {
passwordRef.current.focus();
}
}, [isSignUp, password, loginError, errors.password, isCredentialsEnabled]);
return ( return (
<div className="space-y-6"> <div className="space-y-6">
{socialProviders?.length !== 0 && ( {socialProviders?.length !== 0 && (
@@ -347,7 +398,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
/> />
{errors.password && ( {errors.password && (
<p className="mt-2 text-xs text-red-400"> <p className="mt-2 text-xs text-red-400">
{t`Please enter a valid password`} {errors.password.message ?? t`Please enter a valid password`}
</p> </p>
)} )}
</div> </div>
@@ -364,9 +415,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
variant="secondary" variant="secondary"
> >
{isSignUp ? t`Sign up with ` : t`Continue with `} {isSignUp ? t`Sign up with ` : t`Continue with `}
{!isCredentialsEnabled || (password && password.length !== 0) {isMagicLinkMode ? t`magic link` : t`email`}
? t`email`
: t`magic link`}
</Button> </Button>
</div> </div>
</form> </form>

View File

@@ -0,0 +1,193 @@
import { useRouter } from "next/router";
import {
Combobox,
ComboboxInput,
ComboboxOption,
ComboboxOptions,
Dialog,
DialogBackdrop,
DialogPanel,
} from "@headlessui/react";
import { t } from "@lingui/macro";
import { useState } from "react";
import { HiDocumentText, HiFolder, HiMagnifyingGlass } from "react-icons/hi2";
import { useDebounce } from "~/hooks/useDebounce";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
type SearchResult =
| {
publicId: string;
title: string;
description: string | null;
slug: string;
updatedAt: Date | null;
createdAt: Date;
type: "board";
}
| {
publicId: string;
title: string;
description: string | null;
boardPublicId: string;
boardName: string;
listName: string;
updatedAt: Date | null;
createdAt: Date;
type: "card";
};
export default function CommandPallette({
isOpen,
onClose,
}: {
isOpen: boolean;
onClose: () => void;
}) {
const [query, setQuery] = useState("");
const { workspace } = useWorkspace();
const router = useRouter();
// Debounce to avoid too many reqs
const [debouncedQuery] = useDebounce(query, 300);
const {
data: searchResults,
isLoading,
isFetched,
isPlaceholderData,
} = api.workspace.search.useQuery(
{
workspacePublicId: workspace.publicId,
query: debouncedQuery,
},
{
enabled: Boolean(workspace.publicId && debouncedQuery.trim().length > 0),
placeholderData: (previousData) => previousData,
},
);
// Clear results when query is empty, otherwise show search results
const results =
debouncedQuery.trim().length === 0
? []
: ((searchResults ?? []) as SearchResult[]);
const hasSearched = Boolean(debouncedQuery.trim().length > 0);
return (
<Dialog
className="relative z-50"
open={isOpen}
onClose={() => {
onClose();
setQuery("");
}}
>
<DialogBackdrop
transition
className="data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in fixed inset-0 bg-light-50 bg-opacity-40 transition-opacity dark:bg-dark-50 dark:bg-opacity-40"
/>
<div className="fixed inset-0 z-50 w-screen overflow-y-auto">
<div className="flex min-h-full items-start justify-center p-4 text-center sm:items-start sm:p-0">
<DialogPanel
transition
className="data-closed:opacity-0 data-closed:translate-y-4 data-closed:sm:translate-y-0 data-closed:sm:scale-95 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in relative mt-[25vh] w-full max-w-[550px] transform divide-y divide-gray-100 overflow-hidden rounded-lg border border-light-600 bg-white/90 shadow-3xl-light backdrop-blur-[6px] transition-all dark:divide-white/10 dark:border-dark-600 dark:bg-dark-100/90 dark:shadow-3xl-dark"
>
<Combobox>
<div className="grid grid-cols-1">
<ComboboxInput
autoFocus
className="col-start-1 row-start-1 h-12 w-full border-0 bg-transparent pl-11 pr-4 text-sm text-light-900 placeholder:text-light-700 focus:outline-none focus:ring-0 dark:text-dark-900 dark:placeholder:text-dark-700"
placeholder={t`Search boards and cards...`}
value={query}
onChange={(event) => setQuery(event.target.value)}
onKeyDown={(event) => {
if (event.key === "Enter" && results.length > 0) {
event.preventDefault();
// Find the active option or fallback to first option
const targetOption =
document.querySelector(
'[data-headlessui-state*="active"][role="option"]',
) ?? document.querySelector('[role="option"]');
if (targetOption) {
(targetOption as HTMLElement).click();
}
}
}}
/>
<HiMagnifyingGlass
className="pointer-events-none col-start-1 row-start-1 ml-4 size-5 self-center text-light-700 dark:text-dark-700"
aria-hidden="true"
/>
</div>
{results.length > 0 && (
<ComboboxOptions
static
className={`max-h-72 scroll-py-2 overflow-y-auto py-2 ${
isPlaceholderData ? "opacity-75" : ""
}`}
>
{results.map((result) => {
const url =
result.type === "board"
? `/boards/${result.publicId}`
: `/cards/${result.publicId}`;
return (
<ComboboxOption
key={`${result.type}-${result.publicId}`}
value={result}
className="cursor-pointer select-none px-4 py-3 data-[focus]:bg-light-200 hover:bg-light-200 focus:outline-none dark:data-[focus]:bg-dark-200 dark:hover:bg-dark-200"
onClick={() => {
console.log("clicked", url);
void router.push(url);
onClose();
setQuery("");
}}
>
<div className="flex items-start gap-3">
<div className="mt-0.5 flex-shrink-0">
{result.type === "board" ? (
<HiFolder className="h-4 w-4 text-light-600 dark:text-dark-600" />
) : (
<HiDocumentText className="h-4 w-4 text-light-600 dark:text-dark-600" />
)}
</div>
<div className="min-w-0 flex-1 text-left">
<div className="truncate text-sm font-bold text-light-900 dark:text-dark-900">
{result.title}
</div>
{result.type === "card" && (
<div className="truncate text-xs text-light-700 dark:text-dark-700">
{`${t`in`} ${result.boardName}${result.listName}`}
</div>
)}
</div>
</div>
</ComboboxOption>
);
})}
</ComboboxOptions>
)}
{hasSearched &&
!isLoading &&
searchResults !== undefined &&
results.length === 0 && (
<div className="p-4 text-sm text-light-950 dark:text-dark-950">
{t`No results found for "${debouncedQuery}".`}
</div>
)}
</Combobox>
</DialogPanel>
</div>
</div>
</Dialog>
);
}

View File

@@ -5,10 +5,12 @@ const Toggle = ({
isChecked, isChecked,
onChange, onChange,
label, label,
disabled,
}: { }: {
isChecked: boolean; isChecked: boolean;
onChange: () => void; onChange: () => void;
label: string; label: string;
disabled?: boolean;
}) => ( }) => (
<div className="mr-4 flex items-center justify-end"> <div className="mr-4 flex items-center justify-end">
<span className="mr-2 text-xs text-light-900 dark:text-dark-900"> <span className="mr-2 text-xs text-light-900 dark:text-dark-900">
@@ -17,6 +19,7 @@ const Toggle = ({
<Switch <Switch
checked={isChecked} checked={isChecked}
onChange={onChange} onChange={onChange}
disabled={disabled}
className={twMerge( className={twMerge(
"relative inline-flex h-4 w-6 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent bg-light-800 transition-colors duration-200 ease-in-out focus:outline-none dark:bg-dark-800", "relative inline-flex h-4 w-6 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent bg-light-800 transition-colors duration-200 ease-in-out focus:outline-none dark:bg-dark-800",
isChecked && "bg-indigo-600 dark:bg-indigo-600", isChecked && "bg-indigo-600 dark:bg-indigo-600",

View File

@@ -1,11 +1,12 @@
import { Menu, Transition } from "@headlessui/react"; import { Button, Menu, Transition } from "@headlessui/react";
import { t } from "@lingui/core/macro"; import { t } from "@lingui/core/macro";
import { Fragment } from "react"; import { Fragment, useEffect, useState } from "react";
import { HiCheck } from "react-icons/hi2"; import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
import { twMerge } from "tailwind-merge"; import { twMerge } from "tailwind-merge";
import { useModal } from "~/providers/modal"; import { useModal } from "~/providers/modal";
import { useWorkspace } from "~/providers/workspace"; import { useWorkspace } from "~/providers/workspace";
import CommandPallette from "./CommandPallette";
export default function WorkspaceMenu({ export default function WorkspaceMenu({
isCollapsed = false, isCollapsed = false,
@@ -15,110 +16,143 @@ export default function WorkspaceMenu({
const { workspace, isLoading, availableWorkspaces, switchWorkspace } = const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
useWorkspace(); useWorkspace();
const { openModal } = useModal(); const { openModal } = useModal();
const [isOpen, setIsOpen] = useState(false);
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if ((event.metaKey || event.ctrlKey) && event.key === "k") {
event.preventDefault();
setIsOpen(true);
}
};
document.addEventListener("keydown", handleKeyDown);
return () => document.removeEventListener("keydown", handleKeyDown);
}, []);
return ( return (
<Menu as="div" className="relative inline-block w-full pb-3 text-left"> <>
<div> <CommandPallette isOpen={isOpen} onClose={() => setIsOpen(false)} />
{isLoading ? ( <Menu as="div" className="relative inline-block w-full pb-3 text-left">
<div className={twMerge("mb-1 flex", isCollapsed && "md:p-1.5")}> <div>
<div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" /> {isLoading ? (
<div <div className={twMerge("mb-1 flex", isCollapsed && "md:p-1.5")}>
className={twMerge( <div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
"ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200", <div
isCollapsed && "md:hidden",
)}
/>
</div>
) : (
<Menu.Button
className={twMerge(
"mb-1 flex h-[34px] w-full items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
isCollapsed && "md:mb-1.5 md:h-9 md:p-1",
)}
title={isCollapsed ? workspace.name : undefined}
>
<span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
<span className="text-xs font-bold leading-none text-white">
{workspace.name.charAt(0).toUpperCase()}
</span>
</span>
<span
className={twMerge(
"ml-2 truncate text-sm font-bold text-neutral-900 dark:text-dark-1000",
isCollapsed && "md:hidden",
)}
>
{workspace.name}
</span>
{workspace.plan === "pro" && (
<span
className={twMerge( className={twMerge(
"ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700", "ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
isCollapsed && "md:hidden", isCollapsed && "md:hidden",
)} )}
/>
</div>
) : (
<div
className={twMerge(
"flex items-center gap-1",
isCollapsed && "md:flex-col-reverse md:items-stretch",
)}
>
<Menu.Button
className={twMerge(
"mb-1 flex h-[34px] flex-1 items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
isCollapsed &&
"md:mb-1.5 md:h-9 md:w-9 md:flex-none md:justify-center md:p-0",
)}
title={isCollapsed ? workspace.name : undefined}
> >
Pro <span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
</span> <span className="text-xs font-bold leading-none text-white">
)} {workspace.name.charAt(0).toUpperCase()}
</Menu.Button> </span>
)} </span>
</div> <span
className={twMerge(
<Transition "ml-2 truncate text-sm font-bold text-neutral-900 dark:text-dark-1000",
as={Fragment} isCollapsed && "md:hidden",
enter="transition ease-out duration-100" )}
enterFrom="transform opacity-0 scale-95" >
enterTo="transform opacity-100 scale-100" {workspace.name}
leave="transition ease-in duration-75" </span>
leaveFrom="transform opacity-100 scale-100" {workspace.plan === "pro" && (
leaveTo="transform opacity-0 scale-95" <span
> className={twMerge(
<Menu.Items "ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700",
className={twMerge( isCollapsed && "md:hidden",
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
isCollapsed ? "w-48" : "w-full",
)}
>
<div className="p-1">
{availableWorkspaces.map((availableWorkspace) => (
<div key={availableWorkspace.publicId} className="flex">
<Menu.Item>
<button
onClick={() => switchWorkspace(availableWorkspace)}
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
>
<div className="flex min-w-0 flex-1 items-center">
<span className="inline-flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-[5px] bg-indigo-700">
<span className="text-xs font-medium leading-none text-white">
{availableWorkspace.name.charAt(0).toUpperCase()}
</span>
</span>
<span className="ml-2 truncate text-xs font-medium">
{availableWorkspace.name}
</span>
</div>
{workspace.publicId === availableWorkspace.publicId && (
<span>
<HiCheck className="h-4 w-4" aria-hidden="true" />
</span>
)} )}
</button> >
</Menu.Item> Pro
</div> </span>
))} )}
</div> </Menu.Button>
<div className="border-t-[1px] border-light-600 p-1 dark:border-dark-500"> <Button
<Menu.Item> className={twMerge(
<button "mb-1 h-[34px] w-[34px] flex-shrink-0 rounded-lg bg-light-200 p-2 hover:bg-light-300 focus:outline-none dark:bg-dark-200 dark:hover:bg-dark-300",
onClick={() => openModal("NEW_WORKSPACE")} isCollapsed && "md:mb-2 md:h-9 md:w-9 md:self-center",
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-xs text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400" )}
onClick={() => setIsOpen(true)}
> >
{t`Create workspace`} <HiMagnifyingGlass className="h-4 w-4" aria-hidden="true" />
</button> </Button>
</Menu.Item> </div>
</div> )}
</Menu.Items> </div>
</Transition>
</Menu> <Transition
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95"
enterTo="transform opacity-100 scale-100"
leave="transition ease-in duration-75"
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
>
<Menu.Items
className={twMerge(
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
isCollapsed ? "w-48" : "w-full",
)}
>
<div className="p-1">
{availableWorkspaces.map((availableWorkspace) => (
<div key={availableWorkspace.publicId} className="flex">
<Menu.Item>
<button
onClick={() => switchWorkspace(availableWorkspace)}
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
>
<div className="flex min-w-0 flex-1 items-center">
<span className="inline-flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-[5px] bg-indigo-700">
<span className="text-xs font-medium leading-none text-white">
{availableWorkspace.name.charAt(0).toUpperCase()}
</span>
</span>
<span className="ml-2 truncate text-xs font-medium">
{availableWorkspace.name}
</span>
</div>
{workspace.publicId === availableWorkspace.publicId && (
<span>
<HiCheck className="h-4 w-4" aria-hidden="true" />
</span>
)}
</button>
</Menu.Item>
</div>
))}
</div>
<div className="border-t-[1px] border-light-600 p-1 dark:border-dark-500">
<Menu.Item>
<button
onClick={() => openModal("NEW_WORKSPACE")}
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-xs text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
>
{t`Create workspace`}
</button>
</Menu.Item>
</div>
</Menu.Items>
</Transition>
</Menu>
</>
); );
} }

View File

@@ -36,12 +36,12 @@ msgstr "{0} Labels"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({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:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/Monat" msgstr "$10/Monat"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/Monat" msgstr "$8/Monat"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Label hinzufügen" msgstr "Label hinzufügen"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Mitglied hinzufügen" msgstr "Mitglied hinzufügen"
@@ -136,11 +136,11 @@ msgstr "hat Checklistenelement <0>{0}</0> hinzugefügt"
msgid "added label <0>{0}</0>" msgid "added label <0>{0}</0>"
msgstr "hat Label <0>{0}</0> hinzugefügt" msgstr "hat Label <0>{0}</0> hinzugefügt"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Passe den quadratischen Zuschnitt an deinen Avatar an." msgstr "Passe den quadratischen Zuschnitt an deinen Avatar an."
@@ -152,7 +152,7 @@ msgstr "Administratorrollen"
msgid "All systems operational" msgid "All systems operational"
msgstr "Alle Systeme funktionieren" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</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." msgid "An unexpected error occurred. Please try again later."
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut." msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
#: src/views/members/components/InviteMemberForm.tsx:304
msgid "Anyone with this link can join your workspace"
msgstr "Jeder mit diesem Link kann deinem Arbeitsbereich beitreten"
#: src/components/SettingsLayout.tsx:51 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Einfaches Kanban" msgstr "Einfaches Kanban"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "jährlich abgerechnet" msgstr "jährlich abgerechnet"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "monatlich abgerechnet" msgstr "monatlich abgerechnet"
@@ -342,7 +346,7 @@ msgstr "Fehlerbericht"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Passwort ändern"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Ändern Sie Ihre Spracheinstellungen." msgstr "Ändern Sie Ihre Spracheinstellungen."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Überprüfe deinen Posteingang" msgstr "Überprüfe deinen Posteingang"
@@ -382,8 +386,8 @@ msgstr "Checklistenname"
msgid "Clear filters" msgid "Clear filters"
msgstr "Filter löschen" msgstr "Filter löschen"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." 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." msgstr "Klicke auf den Link, den wir an {magicLinkRecipient} gesendet haben, um dich anzumelden."
@@ -459,12 +463,12 @@ msgstr "Kontaktiere uns"
msgid "Content Creation" msgid "Content Creation"
msgstr "Content-Erstellung" msgstr "Content-Erstellung"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Fortfahren mit " msgstr "Fortfahren mit "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Fortfahren mit {0}" msgstr "Fortfahren mit {0}"
@@ -494,6 +498,10 @@ msgstr "Karte erstellen"
msgid "Create checklist" msgid "Create checklist"
msgstr "Checkliste erstellen" msgstr "Checkliste erstellen"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Einladungslink erstellen"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Label erstellen" msgstr "Label erstellen"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Neue Liste erstellen" msgstr "Neue Liste erstellen"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Arbeitsbereich erstellen" msgstr "Arbeitsbereich erstellen"
@@ -532,7 +540,7 @@ msgstr "hat die Karte erstellt"
msgid "Critical" msgid "Critical"
msgstr "Kritisch" msgstr "Kritisch"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Schneide deinen Avatar zu" msgstr "Schneide deinen Avatar zu"
@@ -561,6 +569,10 @@ msgstr "Kundensupport"
msgid "Dark" msgid "Dark"
msgstr "Dunkel" msgstr "Dunkel"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Einladungslink deaktivieren"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Dokumente"
msgid "Documentation" msgid "Documentation"
msgstr "Dokumentation" 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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Du hast noch kein Konto? <0><1>Registrieren</1></0>" msgstr "Du hast noch kein Konto? <0><1>Registrieren</1></0>"
@@ -693,11 +705,11 @@ msgstr "Workspace-URL bearbeiten"
msgid "Editing" msgid "Editing"
msgstr "Bearbeitung" msgstr "Bearbeitung"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "E-Mail" msgstr "E-Mail"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "E-Mail"
@@ -713,11 +725,11 @@ msgstr "Geben Sie Ihr aktuelles Passwort ein"
msgid "Enter your current password and choose a new secure password." 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." msgstr "Geben Sie Ihr aktuelles Passwort ein und wählen Sie ein neues sicheres Passwort."
#: src/components/AuthForm.tsx:333 #: src/components/AuthForm.tsx:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Gib deine E-Mail-Adresse ein" msgstr "Gib deine E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Gib deinen Namen ein" msgstr "Gib deinen Namen ein"
@@ -725,14 +737,26 @@ msgstr "Gib deinen Namen ein"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Geben Sie Ihr neues Passwort ein" msgstr "Geben Sie Ihr neues Passwort ein"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Gib dein Passwort ein" msgstr "Gib dein Passwort ein"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Fehler"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Fehler beim Ändern des Passworts" msgstr "Fehler beim Ändern des Passworts"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Fehler beim Erstellen des Einladungslinks"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Fehler beim Deaktivieren des Einladungslinks"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Fehler beim Löschen des Kontos" msgstr "Fehler beim Löschen des Kontos"
@@ -749,8 +773,8 @@ msgstr "Fehler beim Löschen des Arbeitsbereichs"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Fehler beim Trennen von Trello" msgstr "Fehler beim Trennen von Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Fehler beim Einladen des Mitglieds" msgstr "Fehler beim Einladen des Mitglieds"
@@ -758,7 +782,7 @@ msgstr "Fehler beim Einladen des Mitglieds"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Fehler beim Aktualisieren des Anzeigenamens" 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" msgid "Error updating profile image"
msgstr "Fehler beim Aktualisieren des Profilbilds" msgstr "Fehler beim Aktualisieren des Profilbilds"
@@ -774,7 +798,7 @@ msgstr "Fehler beim Aktualisieren des Arbeitsbereichsnamens"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Fehler beim Aktualisieren der Workspace-URL" msgstr "Fehler beim Aktualisieren der Workspace-URL"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Fehler beim Upgrade des Abonnements" msgstr "Fehler beim Upgrade des Abonnements"
@@ -783,8 +807,8 @@ msgstr "Fehler beim Upgrade des Abonnements"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Fehler beim Upgrade auf Pro" msgstr "Fehler beim Upgrade auf Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Fehler beim Hochladen des Profilbilds" msgstr "Fehler beim Hochladen des Profilbilds"
@@ -800,8 +824,16 @@ msgstr "Alles was du brauchst, für immer kostenlos. Unbegrenzte Boards, unbegre
msgid "Execution" msgid "Execution"
msgstr "Ausführung" 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:209
msgid "Failed to copy invite link"
msgstr "Einladungslink konnte nicht kopiert werden"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut." msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut."
@@ -849,8 +881,8 @@ msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-S
msgid "Free" msgid "Free"
msgstr "Kostenlos" msgstr "Kostenlos"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Kostenloser Plan" msgstr "Kostenloser Plan"
@@ -866,7 +898,7 @@ msgstr "Vollzeit"
msgid "Fun" msgid "Fun"
msgstr "Spaß" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Erste Schritte"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Zur App" msgstr "Zur App"
@@ -987,6 +1024,10 @@ msgstr "Import von Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Der Import Ihrer Trello-Boards in Kan ist einfach. Sie können unserer Schritt-für-Schritt-Anleitung <0>hier</0> folgen." msgstr "Der Import Ihrer Trello-Boards in Kan ist einfach. Sie können unserer Schritt-für-Schritt-Anleitung <0>hier</0> folgen."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "in"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Integrationen"
msgid "Interviewing" msgid "Interviewing"
msgstr "Vorstellungsgespräch" msgstr "Vorstellungsgespräch"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Ungültige E-Mail-Adresse" msgstr "Ungültige E-Mail-Adresse"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Ungültige Einladung"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Einladen" msgstr "Einladen"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Weitere Person einladen" msgstr "Einladungslink kopiert"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Einladungslink in die Zwischenablage kopiert"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Einladungslinks erfordern ein Team- oder Pro-Abonnement. Bitte upgraden Sie Ihren Workspace."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Mitglied einladen" msgstr "Mitglied einladen"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1063,7 +1125,7 @@ msgstr "Sprache"
msgid "Launch offer" msgid "Launch offer"
msgstr "Einführungsangebot" msgstr "Einführungsangebot"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Einführungsangebot: Erhalten Sie unbegrenzte Mitglieder mit Pro" msgstr "Einführungsangebot: Erhalten Sie unbegrenzte Mitglieder mit Pro"
@@ -1099,7 +1161,7 @@ msgstr "Liste"
msgid "List name" msgid "List name"
msgstr "Listenname" msgstr "Listenname"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Login | kan.bn" msgstr "Login | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "Langfristig"
msgid "Low Priority" msgid "Low Priority"
msgstr "Niedrige Priorität" msgstr "Niedrige Priorität"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "Magic Link" msgstr "Magic Link"
@@ -1136,12 +1198,12 @@ msgstr "Mittlere Priorität"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Mitglieder" msgstr "Mitglieder"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Mitglieder | {0}" msgstr "Mitglieder | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Mitglieder | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Monatlich" msgstr "Monatlich"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "monatliche Abrechnung" msgstr "monatliche Abrechnung"
@@ -1245,6 +1307,10 @@ msgstr "Keine Kreditkarte erforderlich"
msgid "No lists" msgid "No lists"
msgstr "Keine Listen" msgstr "Keine Listen"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "Keine Ergebnisse gefunden für \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Angebot" msgstr "Angebot"
@@ -1261,7 +1327,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." 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." 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:362
msgid "or" msgid "or"
msgstr "oder" msgstr "oder"
@@ -1281,6 +1347,14 @@ msgstr "Teilzeit"
msgid "Password Changed" msgid "Password Changed"
msgstr "Passwort geändert" msgstr "Passwort geändert"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Passwort ist für die Anmeldung erforderlich."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Passwort ist für die Registrierung erforderlich."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "Passwort muss mindestens 8 Zeichen lang sein" msgstr "Passwort muss mindestens 8 Zeichen lang sein"
@@ -1289,7 +1363,7 @@ msgstr "Passwort muss mindestens 8 Zeichen lang sein"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein" msgstr "Passwörter stimmen nicht überein"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "Pausiert" msgstr "Pausiert"
@@ -1297,7 +1371,7 @@ msgstr "Pausiert"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Zahlungshäufigkeit" msgstr "Zahlungshäufigkeit"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "Ausstehend" msgstr "Ausstehend"
@@ -1318,19 +1392,19 @@ msgstr "Planung"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Bitte bestätigen Sie Ihr neues Passwort" msgstr "Bitte bestätigen Sie Ihr neues Passwort"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mail-Adresse ein" msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Bitte gib einen gültigen Namen ein" msgstr "Bitte gib einen gültigen Namen ein"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Bitte gib ein gültiges Passwort ein" 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." msgid "Please select a file to upload."
msgstr "Bitte wähle eine Datei zum Hochladen aus." msgstr "Bitte wähle eine Datei zum Hochladen aus."
@@ -1359,10 +1433,10 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport." msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Bitte versuche es später erneut."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Datenschutzrichtlinie"
msgid "Private" msgid "Private"
msgstr "Privat" msgstr "Privat"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Pro-Plan" msgstr "Pro-Plan"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Pro-Plan ∞" msgstr "Pro-Plan ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Profilbild aktualisiert" msgstr "Profilbild aktualisiert"
@@ -1440,7 +1519,7 @@ msgstr "Remote"
msgid "Remove" msgid "Remove"
msgstr "Entfernen" msgstr "Entfernen"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Mitglied entfernen" msgstr "Mitglied entfernen"
@@ -1492,7 +1571,7 @@ msgstr "Überprüfung"
msgid "Roadmap" msgid "Roadmap"
msgstr "Roadmap" msgstr "Roadmap"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Rolle" msgstr "Rolle"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Auf eigener Infrastruktur betreiben" msgstr "Auf eigener Infrastruktur betreiben"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
@@ -1513,6 +1592,10 @@ msgstr "Spare Zeit mit wiederverwendbaren Board-Vorlagen."
msgid "Screening" msgid "Screening"
msgstr "Vorauswahl" msgstr "Vorauswahl"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Boards und Karten durchsuchen..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Alle auswählen" msgstr "Alle auswählen"
@@ -1571,20 +1654,28 @@ msgstr "Einstellungen | Arbeitsbereich"
msgid "Sign in" msgid "Sign in"
msgstr "Anmelden" msgstr "Anmelden"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Registrieren | kan.bn" msgstr "Registrieren | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Registrierung deaktiviert" 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." msgid "Sign up is currently disabled. Please try again later."
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut." msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Registrieren mit " msgstr "Registrieren mit "
@@ -1608,8 +1699,12 @@ msgstr "Softwareentwicklung"
msgid "Star on Github" msgid "Star on Github"
msgstr "Stern auf Github" msgstr "Stern auf Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Abonnement erforderlich"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Erfolg" msgstr "Erfolg"
@@ -1629,8 +1724,8 @@ msgstr "Unterstütze die Entwicklung des Projekts"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Team-Plan" msgstr "Team-Plan"
@@ -1694,6 +1789,10 @@ msgstr "Dieses Board ist privat oder existiert nicht"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Diese Board-URL ist bereits vergeben" 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "Dies führt zur permanenten Löschung aller mit diesem Workspace verbundenen Daten."
@@ -1909,7 +2008,7 @@ msgstr "Upgrade auf Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade auf Pro ($29/Monat)" msgstr "Upgrade auf Pro ($29/Monat)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Upgrade auf Team-Plan" msgstr "Upgrade auf Team-Plan"
@@ -1937,11 +2036,11 @@ msgstr "URL muss mindestens 3 Zeichen lang sein"
msgid "Use template" msgid "Use template"
msgstr "Vorlage verwenden" msgstr "Vorlage verwenden"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Benutzer" msgstr "Benutzer"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs" msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
@@ -1985,7 +2084,7 @@ msgstr "Wir verwenden die <0>AGPL-3.0 lizenz</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "Wir stehen erst am anfang. " msgstr "Wir stehen erst am anfang. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "Willkommen zurück" msgstr "Willkommen zurück"
@@ -2100,18 +2199,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>." 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." 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:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Sie haben sich erfolgreich angemeldet." msgstr "Sie haben sich erfolgreich angemeldet."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Sie haben sich erfolgreich registriert." msgstr "Sie haben sich erfolgreich registriert."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Dein Konto wurde gelöscht." msgstr "Dein Konto wurde gelöscht."
@@ -2128,7 +2235,7 @@ msgstr "Dein Anzeigename wurde aktualisiert."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "Ihr Passwort wurde geändert." 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." msgid "Your profile image has been updated."
msgstr "Dein Profilbild wurde aktualisiert." 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" #~ msgid "#1 Hacker News"
#~ msgstr "#1 Hacker News" #~ msgstr "#1 Hacker News"
#: src/views/members/components/InviteMemberForm.tsx:92 #: src/views/members/components/InviteMemberForm.tsx:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/month" msgstr "$10/month"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/month" msgstr "$8/month"
@@ -117,7 +117,7 @@ msgid "Add label"
msgstr "Add label" msgstr "Add label"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Add member" msgstr "Add member"
@@ -156,11 +156,11 @@ msgstr "added label <0>{0}</0>"
#~ msgid "added label <0>{label}</0>" #~ msgid "added label <0>{label}</0>"
#~ msgstr "added label <0>{label}</0>" #~ msgstr "added label <0>{label}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "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" msgid "All systems operational"
msgstr "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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "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." msgid "An unexpected error occurred. Please try again later."
msgstr "An unexpected error occurred. Please try again later." msgstr "An unexpected error occurred. Please try again later."
#: src/views/members/components/InviteMemberForm.tsx:304
msgid "Anyone with this link can join your workspace"
msgstr "Anyone with this link can join your workspace"
#: src/components/SettingsLayout.tsx:51 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -282,11 +286,11 @@ msgstr "Backlog"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Basic Kanban" msgstr "Basic Kanban"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "billed annually" msgstr "billed annually"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "billed monthly" msgstr "billed monthly"
@@ -391,7 +395,7 @@ msgstr "Bug Report"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -422,8 +426,8 @@ msgstr "Change Password"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Change your language preferences." msgstr "Change your language preferences."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Check your inbox" msgstr "Check your inbox"
@@ -435,8 +439,8 @@ msgstr "Checklist name"
msgid "Clear filters" msgid "Clear filters"
msgstr "Clear filters" msgstr "Clear filters"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." 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." msgstr "Click on the link we've sent to {magicLinkRecipient} to sign in."
@@ -516,12 +520,12 @@ msgstr "Contact us"
msgid "Content Creation" msgid "Content Creation"
msgstr "Content Creation" msgstr "Content Creation"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Continue with " msgstr "Continue with "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Continue with {0}" msgstr "Continue with {0}"
@@ -555,6 +559,10 @@ msgstr "Create card"
msgid "Create checklist" msgid "Create checklist"
msgstr "Create checklist" msgstr "Create checklist"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Create invite link"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Create label" msgstr "Create label"
@@ -585,7 +593,7 @@ msgstr "Create new list"
#~ msgstr "Create Pro workspace" #~ msgstr "Create Pro workspace"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Create workspace" msgstr "Create workspace"
@@ -597,7 +605,7 @@ msgstr "created the card"
msgid "Critical" msgid "Critical"
msgstr "Critical" msgstr "Critical"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Crop your avatar" msgstr "Crop your avatar"
@@ -634,6 +642,10 @@ msgstr "Customer Support"
msgid "Dark" msgid "Dark"
msgstr "Dark" msgstr "Dark"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Deactivate invite link"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -734,7 +746,7 @@ msgstr "Docs"
msgid "Documentation" msgid "Documentation"
msgstr "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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "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 +778,11 @@ msgstr "Edit workspace URL"
msgid "Editing" msgid "Editing"
msgstr "Editing" msgstr "Editing"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "email" msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
@@ -786,11 +798,11 @@ msgstr "Enter your current password"
msgid "Enter your current password and choose a new secure password." msgid "Enter your current password and choose a new secure password."
msgstr "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:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Enter your email address" msgstr "Enter your email address"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Enter your name" msgstr "Enter your name"
@@ -798,14 +810,26 @@ msgstr "Enter your name"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Enter your new password" msgstr "Enter your new password"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Enter your password" msgstr "Enter your password"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Error"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Error Changing Password" msgstr "Error Changing Password"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Error creating invite link"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Error deactivating invite link"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Error deleting account" msgstr "Error deleting account"
@@ -822,8 +846,8 @@ msgstr "Error deleting workspace"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Error disconnecting Trello" msgstr "Error disconnecting Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Error inviting member" msgstr "Error inviting member"
@@ -831,7 +855,7 @@ msgstr "Error inviting member"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "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" msgid "Error updating profile image"
msgstr "Error updating profile image" msgstr "Error updating profile image"
@@ -847,7 +871,7 @@ msgstr "Error updating workspace name"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Error updating workspace URL" msgstr "Error updating workspace URL"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Error upgrading subscription" msgstr "Error upgrading subscription"
@@ -856,8 +880,8 @@ msgstr "Error upgrading subscription"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Error upgrading to Pro" msgstr "Error upgrading to Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Error uploading profile image" msgstr "Error uploading profile image"
@@ -873,8 +897,16 @@ msgstr "Everything you need, free forever. Unlimited boards, unlimited lists, un
msgid "Execution" msgid "Execution"
msgstr "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:209
msgid "Failed to copy invite link"
msgstr "Failed to copy invite link"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Failed to login with {0}. Please try again." msgstr "Failed to login with {0}. Please try again."
@@ -923,8 +955,8 @@ msgstr "For long-term sustainability, we recognise all good open source projects
msgid "Free" msgid "Free"
msgstr "Free" msgstr "Free"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Free Plan" msgstr "Free Plan"
@@ -940,7 +972,7 @@ msgstr "Full-time"
msgid "Fun" msgid "Fun"
msgstr "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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -980,8 +1012,13 @@ msgstr "Getting started"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Go to app" msgstr "Go to app"
@@ -1065,6 +1102,10 @@ msgstr "Importing from Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgstr "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "in"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1084,27 +1125,52 @@ msgstr "Integrations"
msgid "Interviewing" msgid "Interviewing"
msgstr "Interviewing" msgstr "Interviewing"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Invalid email address" msgstr "Invalid email address"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invalid invitation"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Invite" msgstr "Invite"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:208
msgid "Invite another" #~ msgid "Invite another"
msgstr "Invite another" #~ msgstr "Invite another"
#: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite link copied"
msgstr "Invite link copied"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Invite link copied to clipboard"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Invite links require a Team or Pro subscription. Please upgrade your workspace."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Invite member" msgstr "Invite member"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1141,7 +1207,7 @@ msgstr "Language"
msgid "Launch offer" msgid "Launch offer"
msgstr "Launch offer" msgstr "Launch offer"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Launch offer: Get unlimited members with Pro" msgstr "Launch offer: Get unlimited members with Pro"
@@ -1177,7 +1243,7 @@ msgstr "List"
msgid "List name" msgid "List name"
msgstr "List name" msgstr "List name"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Login | kan.bn" msgstr "Login | kan.bn"
@@ -1193,7 +1259,7 @@ msgstr "Long-term"
msgid "Low Priority" msgid "Low Priority"
msgstr "Low Priority" msgstr "Low Priority"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "magic link" msgstr "magic link"
@@ -1214,12 +1280,12 @@ msgstr "Medium Priority"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Members" msgstr "Members"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Members | {0}" msgstr "Members | {0}"
@@ -1227,7 +1293,7 @@ msgstr "Members | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Monthly" msgstr "Monthly"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "monthly billing" msgstr "monthly billing"
@@ -1335,6 +1401,10 @@ msgstr "No credit card required"
msgid "No lists" msgid "No lists"
msgstr "No lists" msgstr "No lists"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "No results found for \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Offer" msgstr "Offer"
@@ -1351,7 +1421,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." 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." 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:362
msgid "or" msgid "or"
msgstr "or" msgstr "or"
@@ -1371,6 +1441,14 @@ msgstr "Part-time"
msgid "Password Changed" msgid "Password Changed"
msgstr "Password Changed" msgstr "Password Changed"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Password is required to login."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Password is required to sign up."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "Password must be at least 8 characters" msgstr "Password must be at least 8 characters"
@@ -1379,7 +1457,7 @@ msgstr "Password must be at least 8 characters"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Passwords do not match" msgstr "Passwords do not match"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "Paused" msgstr "Paused"
@@ -1387,7 +1465,7 @@ msgstr "Paused"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Payment frequency" msgstr "Payment frequency"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "Pending" msgstr "Pending"
@@ -1408,19 +1486,19 @@ msgstr "Planning"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Please confirm your new password" msgstr "Please confirm your new password"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Please enter a valid email address" msgstr "Please enter a valid email address"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Please enter a valid name" msgstr "Please enter a valid name"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "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." msgid "Please select a file to upload."
msgstr "Please select a file to upload." msgstr "Please select a file to upload."
@@ -1449,10 +1527,10 @@ msgstr "Please select a file to upload."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1463,6 +1541,11 @@ msgstr "Please select a file to upload."
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Please try again later, or contact customer support." msgstr "Please try again later, or contact customer support."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Please try again later."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1482,15 +1565,15 @@ msgstr "Privacy policy"
msgid "Private" msgid "Private"
msgstr "Private" msgstr "Private"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Pro Plan" msgstr "Pro Plan"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Pro Plan ∞" msgstr "Pro Plan ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Profile image updated" msgstr "Profile image updated"
@@ -1530,7 +1613,7 @@ msgstr "Remote"
msgid "Remove" msgid "Remove"
msgstr "Remove" msgstr "Remove"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Remove member" msgstr "Remove member"
@@ -1590,7 +1673,7 @@ msgstr "Review"
msgid "Roadmap" msgid "Roadmap"
msgstr "Roadmap" msgstr "Roadmap"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Role" msgstr "Role"
@@ -1599,7 +1682,7 @@ msgid "Run on your own infrastructure"
msgstr "Run on your own infrastructure" msgstr "Run on your own infrastructure"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Save" msgstr "Save"
@@ -1611,6 +1694,10 @@ msgstr "Save time with reusable board templates."
msgid "Screening" msgid "Screening"
msgstr "Screening" msgstr "Screening"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Search boards and cards..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Select all" msgstr "Select all"
@@ -1672,25 +1759,37 @@ msgstr "Settings | Integrations"
msgid "Settings | Workspace" msgid "Settings | Workspace"
msgstr "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:100
#: src/views/home/components/Header.tsx:138 #: src/views/home/components/Header.tsx:138
msgid "Sign in" msgid "Sign in"
msgstr "Sign in" msgstr "Sign in"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "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" msgid "Sign up disabled"
msgstr "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." msgid "Sign up is currently disabled. Please try again later."
msgstr "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:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Sign up with " msgstr "Sign up with "
@@ -1714,8 +1813,12 @@ msgstr "Software Development"
msgid "Star on Github" msgid "Star on Github"
msgstr "Star on Github" msgstr "Star on Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Subscription Required"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Success" msgstr "Success"
@@ -1735,8 +1838,8 @@ msgstr "Support the development of the project"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Team Plan" msgstr "Team Plan"
@@ -1800,6 +1903,10 @@ msgstr "This board is private or does not exist"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "This will result in the permanent deletion of all data associated with this workspace."
@@ -2027,7 +2134,7 @@ msgstr "Upgrade to Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade to Pro ($29/month)" msgstr "Upgrade to Pro ($29/month)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Upgrade to Team Plan" msgstr "Upgrade to Team Plan"
@@ -2055,11 +2162,11 @@ msgstr "URL must be at least 3 characters long"
msgid "Use template" msgid "Use template"
msgstr "Use template" msgstr "Use template"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "User" msgstr "User"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "User is already a member of this workspace" msgstr "User is already a member of this workspace"
@@ -2103,7 +2210,7 @@ msgstr "We are using the <0>AGPL-3.0 license</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "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" msgid "Welcome back"
msgstr "Welcome back" msgstr "Welcome back"
@@ -2222,18 +2329,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>." 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>." msgstr "You can self-host by following the instructions in our <0>repo</0>."
#: src/components/AuthForm.tsx:221 #: src/components/AuthForm.tsx:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "You have been logged in successfully." msgstr "You have been logged in successfully."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "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:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Your account has been deleted." msgstr "Your account has been deleted."
@@ -2250,7 +2365,7 @@ msgstr "Your display name has been updated."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "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." msgid "Your profile image has been updated."
msgstr "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})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({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:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/mes" msgstr "$10/mes"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/mes" msgstr "$8/mes"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Añadir etiqueta" msgstr "Añadir etiqueta"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Añadir miembro" 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>" msgid "added label <0>{0}</0>"
msgstr "añadió la etiqueta <0>{0}</0>" msgstr "añadió la etiqueta <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Ajusta el recorte cuadrado para que se adapte a tu 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" msgid "All systems operational"
msgstr "Todos los sistemas operativos" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</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." msgid "An unexpected error occurred. Please try again later."
msgstr "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo más tarde." msgstr "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo más tarde."
#: src/views/members/components/InviteMemberForm.tsx:304
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 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Pendientes"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Kanban básico" msgstr "Kanban básico"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "facturado anualmente" msgstr "facturado anualmente"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "facturado mensualmente" msgstr "facturado mensualmente"
@@ -342,7 +346,7 @@ msgstr "Informe de error"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Cambiar contraseña"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Cambia tus preferencias de idioma." msgstr "Cambia tus preferencias de idioma."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Revisa tu bandeja de entrada" msgstr "Revisa tu bandeja de entrada"
@@ -382,8 +386,8 @@ msgstr "Nombre de la lista de verificación"
msgid "Clear filters" msgid "Clear filters"
msgstr "Borrar filtros" msgstr "Borrar filtros"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." 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." 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" msgid "Content Creation"
msgstr "Creación de contenido" msgstr "Creación de contenido"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Continuar con " msgstr "Continuar con "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Continuar con {0}" msgstr "Continuar con {0}"
@@ -494,6 +498,10 @@ msgstr "Crear tarjeta"
msgid "Create checklist" msgid "Create checklist"
msgstr "Crear lista de verificación" msgstr "Crear lista de verificación"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Crear enlace de invitación"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Crear etiqueta" msgstr "Crear etiqueta"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Crear nueva lista" msgstr "Crear nueva lista"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Crear espacio de trabajo" msgstr "Crear espacio de trabajo"
@@ -532,7 +540,7 @@ msgstr "creó la tarjeta"
msgid "Critical" msgid "Critical"
msgstr "Crítico" msgstr "Crítico"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Recorta tu avatar" msgstr "Recorta tu avatar"
@@ -561,6 +569,10 @@ msgstr "Atención al cliente"
msgid "Dark" msgid "Dark"
msgstr "Oscuro" msgstr "Oscuro"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Desactivar enlace de invitación"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Documentos"
msgid "Documentation" msgid "Documentation"
msgstr "Documentación" 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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "¿No tienes una cuenta? <0><1>Regístrate</1></0>" msgstr "¿No tienes una cuenta? <0><1>Regístrate</1></0>"
@@ -693,11 +705,11 @@ msgstr "Editar URL del espacio de trabajo"
msgid "Editing" msgid "Editing"
msgstr "Editando" msgstr "Editando"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "correo electrónico" msgstr "correo electrónico"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "Correo electrónico" msgstr "Correo electrónico"
@@ -713,11 +725,11 @@ msgstr "Introduce tu contraseña actual"
msgid "Enter your current password and choose a new secure password." msgid "Enter your current password and choose a new secure password."
msgstr "Introduce tu contraseña actual y elige una nueva contraseña segura." msgstr "Introduce tu contraseña actual y elige una nueva contraseña segura."
#: src/components/AuthForm.tsx:333 #: src/components/AuthForm.tsx:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Introduce tu dirección de correo electrónico" msgstr "Introduce tu dirección de correo electrónico"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Introduce tu nombre" msgstr "Introduce tu nombre"
@@ -725,14 +737,26 @@ msgstr "Introduce tu nombre"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Introduce tu nueva contraseña" msgstr "Introduce tu nueva contraseña"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Introduce tu contraseña" msgstr "Introduce tu contraseña"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Error"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Error al cambiar la contraseña" msgstr "Error al cambiar la contraseña"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Error al crear el enlace de invitación"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Error al desactivar el enlace de invitación"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Error al eliminar la cuenta" msgstr "Error al eliminar la cuenta"
@@ -749,8 +773,8 @@ msgstr "Error al eliminar el espacio de trabajo"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Error al desconectar Trello" msgstr "Error al desconectar Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Error al invitar al miembro" msgstr "Error al invitar al miembro"
@@ -758,7 +782,7 @@ msgstr "Error al invitar al miembro"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Error al actualizar el nombre visible" 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" msgid "Error updating profile image"
msgstr "Error al actualizar la imagen de perfil" msgstr "Error al actualizar la imagen de perfil"
@@ -774,7 +798,7 @@ msgstr "Error al actualizar el nombre del espacio de trabajo"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Error al actualizar la URL del espacio de trabajo" msgstr "Error al actualizar la URL del espacio de trabajo"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Error al actualizar la suscripción" msgstr "Error al actualizar la suscripción"
@@ -783,8 +807,8 @@ msgstr "Error al actualizar la suscripción"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Error al actualizar a Pro" msgstr "Error al actualizar a Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Error al subir la imagen de perfil" msgstr "Error al subir la imagen de perfil"
@@ -800,8 +824,16 @@ msgstr "Todo lo que necesitas, gratis para siempre. Tableros ilimitados, listas
msgid "Execution" msgid "Execution"
msgstr "Ejecución" 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:209
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) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo." msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo."
@@ -849,8 +881,8 @@ msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos p
msgid "Free" msgid "Free"
msgstr "Gratis" msgstr "Gratis"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Plan gratuito" msgstr "Plan gratuito"
@@ -866,7 +898,7 @@ msgstr "Tiempo completo"
msgid "Fun" msgid "Fun"
msgstr "Diversión" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Primeros pasos"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Ir a la aplicación" msgstr "Ir a la aplicación"
@@ -987,6 +1024,10 @@ msgstr "Importando desde Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importar tus tableros de Trello a Kan es fácil. Puedes seguir nuestra guía paso a paso <0>aquí</0>." msgstr "Importar tus tableros de Trello a Kan es fácil. Puedes seguir nuestra guía paso a paso <0>aquí</0>."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "en"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Integraciones"
msgid "Interviewing" msgid "Interviewing"
msgstr "Entrevistando" msgstr "Entrevistando"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Dirección de correo electrónico no válida" msgstr "Dirección de correo electrónico no válida"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invitación inválida"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Invitar" msgstr "Invitar"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Invitar a otro" msgstr "Enlace de invitación copiado"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Enlace de invitación copiado al portapapeles"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Los enlaces de invitación requieren una suscripción de Equipo o Pro. Por favor, actualiza tu espacio de trabajo."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Invitar miembro" msgstr "Invitar miembro"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1063,7 +1125,7 @@ msgstr "Idioma"
msgid "Launch offer" msgid "Launch offer"
msgstr "Oferta de lanzamiento" msgstr "Oferta de lanzamiento"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Oferta de lanzamiento: Obtén miembros ilimitados con Pro" msgstr "Oferta de lanzamiento: Obtén miembros ilimitados con Pro"
@@ -1099,7 +1161,7 @@ msgstr "Lista"
msgid "List name" msgid "List name"
msgstr "Nombre de la lista" msgstr "Nombre de la lista"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Iniciar sesión | kan.bn" msgstr "Iniciar sesión | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "Largo plazo"
msgid "Low Priority" msgid "Low Priority"
msgstr "Prioridad baja" msgstr "Prioridad baja"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "enlace mágico" msgstr "enlace mágico"
@@ -1136,12 +1198,12 @@ msgstr "Prioridad media"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Miembros" msgstr "Miembros"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Miembros | {0}" msgstr "Miembros | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Miembros | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Mensual" msgstr "Mensual"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "facturación mensual" msgstr "facturación mensual"
@@ -1245,6 +1307,10 @@ msgstr "No se requiere tarjeta de crédito"
msgid "No lists" msgid "No lists"
msgstr "Sin listas" msgstr "Sin listas"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "No se encontraron resultados para \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Oferta" msgstr "Oferta"
@@ -1261,7 +1327,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." 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." 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:362
msgid "or" msgid "or"
msgstr "o" msgstr "o"
@@ -1281,6 +1347,14 @@ msgstr "Tiempo parcial"
msgid "Password Changed" msgid "Password Changed"
msgstr "Contraseña cambiada" msgstr "Contraseña cambiada"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Se requiere contraseña para iniciar sesión."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Se requiere contraseña para registrarse."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "La contraseña debe tener al menos 8 caracteres" msgstr "La contraseña debe tener al menos 8 caracteres"
@@ -1289,7 +1363,7 @@ msgstr "La contraseña debe tener al menos 8 caracteres"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden" msgstr "Las contraseñas no coinciden"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "Pausado" msgstr "Pausado"
@@ -1297,7 +1371,7 @@ msgstr "Pausado"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Frecuencia de pago" msgstr "Frecuencia de pago"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "Pendiente" msgstr "Pendiente"
@@ -1318,19 +1392,19 @@ msgstr "Planificación"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Por favor, confirma tu nueva contraseña" msgstr "Por favor, confirma tu nueva contraseña"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Por favor, introduce una dirección de correo electrónico válida" msgstr "Por favor, introduce una dirección de correo electrónico válida"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Por favor, introduce un nombre válido" msgstr "Por favor, introduce un nombre válido"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Por favor, introduce una contraseña válida" 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." msgid "Please select a file to upload."
msgstr "Por favor selecciona un archivo para subir." msgstr "Por favor selecciona un archivo para subir."
@@ -1359,10 +1433,10 @@ msgstr "Por favor selecciona un archivo para subir."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Por favor selecciona un archivo para subir."
msgid "Please try again later, or contact customer support." 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." msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
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/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Política de privacidad"
msgid "Private" msgid "Private"
msgstr "Privado" msgstr "Privado"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Plan Pro" msgstr "Plan Pro"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Plan Pro ∞" msgstr "Plan Pro ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Imagen de perfil actualizada" msgstr "Imagen de perfil actualizada"
@@ -1440,7 +1519,7 @@ msgstr "Remoto"
msgid "Remove" msgid "Remove"
msgstr "Eliminar" msgstr "Eliminar"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Eliminar miembro" msgstr "Eliminar miembro"
@@ -1492,7 +1571,7 @@ msgstr "Revisión"
msgid "Roadmap" msgid "Roadmap"
msgstr "Hoja de ruta" msgstr "Hoja de ruta"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Rol" msgstr "Rol"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Ejecuta en tu propia infraestructura" msgstr "Ejecuta en tu propia infraestructura"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Guardar" msgstr "Guardar"
@@ -1513,6 +1592,10 @@ msgstr "Ahorra tiempo con plantillas de tableros reutilizables."
msgid "Screening" msgid "Screening"
msgstr "Preselección" msgstr "Preselección"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Buscar tableros y tarjetas..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Seleccionar todo" msgstr "Seleccionar todo"
@@ -1571,20 +1654,28 @@ msgstr "Configuración | Espacio de trabajo"
msgid "Sign in" msgid "Sign in"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Registrarse | kan.bn" msgstr "Registrarse | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Registro deshabilitado" 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." 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." msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Registrarse con " msgstr "Registrarse con "
@@ -1608,8 +1699,12 @@ msgstr "Desarrollo de software"
msgid "Star on Github" msgid "Star on Github"
msgstr "Estrella en Github" msgstr "Estrella en Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Suscripción requerida"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Éxito" msgstr "Éxito"
@@ -1629,8 +1724,8 @@ msgstr "Apoya el desarrollo del proyecto"
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Plan de Equipo" msgstr "Plan de Equipo"
@@ -1694,6 +1789,10 @@ msgstr "Este tablero es privado o no existe"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Esta URL de tablero ya ha sido utilizada" 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "Esto resultará en la eliminación permanente de todos los datos asociados con este espacio de trabajo."
@@ -1909,7 +2008,7 @@ msgstr "Actualizar a Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Actualizar a Pro ($29/mes)" msgstr "Actualizar a Pro ($29/mes)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Actualizar al Plan de Equipo" msgstr "Actualizar al Plan de Equipo"
@@ -1937,11 +2036,11 @@ msgstr "La URL debe tener al menos 3 caracteres"
msgid "Use template" msgid "Use template"
msgstr "Usar plantilla" msgstr "Usar plantilla"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Usuario" msgstr "Usuario"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "El usuario ya es miembro de este espacio de trabajo" msgstr "El usuario ya es miembro de este espacio de trabajo"
@@ -1985,7 +2084,7 @@ msgstr "Estamos usando la <0>licencia AGPL-3.0</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "Apenas estamos comenzando. " msgstr "Apenas estamos comenzando. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "Bienvenido de nuevo" msgstr "Bienvenido de nuevo"
@@ -2100,18 +2199,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>." 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>." msgstr "Puedes autoalojar siguiendo las instrucciones en nuestro <0>repositorio</0>."
#: src/components/AuthForm.tsx:221 #: src/components/AuthForm.tsx:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Has iniciado sesión correctamente." msgstr "Has iniciado sesión correctamente."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Te has registrado correctamente." msgstr "Te has registrado correctamente."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Tu cuenta ha sido eliminada." msgstr "Tu cuenta ha sido eliminada."
@@ -2128,7 +2235,7 @@ msgstr "Tu nombre de visualización ha sido actualizado."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "Tu contraseña ha sido cambiada." 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." msgid "Your profile image has been updated."
msgstr "Tu imagen de perfil ha sido actualizada." 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})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({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:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "10 $/mois" msgstr "10 $/mois"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "8 $/mois" msgstr "8 $/mois"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Ajouter une étiquette" msgstr "Ajouter une étiquette"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Ajouter un membre" 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>" msgid "added label <0>{0}</0>"
msgstr "a ajouté l'étiquette <0>{0}</0>" msgstr "a ajouté l'étiquette <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Ajustez le recadrage carré pour adapter votre avatar." msgstr "Ajustez le recadrage carré pour adapter votre avatar."
@@ -152,7 +152,7 @@ msgstr "Rôles d'administrateur"
msgid "All systems operational" msgid "All systems operational"
msgstr "Tous les systèmes opérationnels" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</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." msgid "An unexpected error occurred. Please try again later."
msgstr "Une erreur inattendue s'est produite. Veuillez réessayer plus tard." msgstr "Une erreur inattendue s'est produite. Veuillez réessayer plus tard."
#: src/views/members/components/InviteMemberForm.tsx:304
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 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Kanban basique" msgstr "Kanban basique"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "facturation annuelle" msgstr "facturation annuelle"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "facturation mensuelle" msgstr "facturation mensuelle"
@@ -342,7 +346,7 @@ msgstr "Rapport de bug"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Modifier le mot de passe"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Modifiez vos préférences linguistiques." msgstr "Modifiez vos préférences linguistiques."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Vérifiez votre boîte de réception" msgstr "Vérifiez votre boîte de réception"
@@ -382,8 +386,8 @@ msgstr "Nom de la checklist"
msgid "Clear filters" msgid "Clear filters"
msgstr "Effacer les filtres" msgstr "Effacer les filtres"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." 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." msgstr "Cliquez sur le lien que nous avons envoyé à {magicLinkRecipient} pour vous connecter."
@@ -459,12 +463,12 @@ msgstr "Contactez-nous"
msgid "Content Creation" msgid "Content Creation"
msgstr "Création de contenu" msgstr "Création de contenu"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Continuer avec " msgstr "Continuer avec "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Continuer avec {0}" msgstr "Continuer avec {0}"
@@ -494,6 +498,10 @@ msgstr "Créer une carte"
msgid "Create checklist" msgid "Create checklist"
msgstr "Créer une checklist" msgstr "Créer une checklist"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Créer un lien d'invitation"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Créer une étiquette" msgstr "Créer une étiquette"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Créer une nouvelle liste" msgstr "Créer une nouvelle liste"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Créer un espace de travail" msgstr "Créer un espace de travail"
@@ -532,7 +540,7 @@ msgstr "a créé la carte"
msgid "Critical" msgid "Critical"
msgstr "Critique" msgstr "Critique"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Recadrez votre avatar" msgstr "Recadrez votre avatar"
@@ -561,6 +569,10 @@ msgstr "Support client"
msgid "Dark" msgid "Dark"
msgstr "Sombre" msgstr "Sombre"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Désactiver le lien d'invitation"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Documentation"
msgid "Documentation" msgid "Documentation"
msgstr "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>" 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>" msgstr "Vous n'avez pas de compte ? <0><1>Inscrivez-vous</1></0>"
@@ -693,11 +705,11 @@ msgstr "Modifier l'URL de l'espace de travail"
msgid "Editing" msgid "Editing"
msgstr "Édition" msgstr "Édition"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "e-mail" msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
@@ -713,11 +725,11 @@ msgstr "Saisissez votre mot de passe actuel"
msgid "Enter your current password and choose a new secure password." 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é." 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:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Saisissez votre adresse e-mail" msgstr "Saisissez votre adresse e-mail"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Saisissez votre nom" msgstr "Saisissez votre nom"
@@ -725,14 +737,26 @@ msgstr "Saisissez votre nom"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Saisissez votre nouveau mot de passe" msgstr "Saisissez votre nouveau mot de passe"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Saisissez votre mot de passe" msgstr "Saisissez votre mot de passe"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Erreur"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Erreur lors du changement de mot de passe" msgstr "Erreur lors du changement de mot de passe"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Erreur lors de la création du lien d'invitation"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Erreur lors de la désactivation du lien d'invitation"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Erreur lors de la suppression du compte" msgstr "Erreur lors de la suppression du compte"
@@ -749,8 +773,8 @@ msgstr "Erreur lors de la suppression de l'espace de travail"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Erreur lors de la déconnexion de Trello" msgstr "Erreur lors de la déconnexion de Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Erreur lors de l'invitation du membre" msgstr "Erreur lors de l'invitation du membre"
@@ -758,7 +782,7 @@ msgstr "Erreur lors de l'invitation du membre"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Erreur lors de la mise à jour du nom d'affichage" 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" msgid "Error updating profile image"
msgstr "Erreur lors de la mise à jour de l'image de profil" msgstr "Erreur lors de la mise à jour de l'image de profil"
@@ -774,7 +798,7 @@ msgstr "Erreur lors de la mise à jour du nom de l'espace de travail"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail" 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:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Erreur lors de la mise à niveau de l'abonnement" msgstr "Erreur lors de la mise à niveau de l'abonnement"
@@ -783,8 +807,8 @@ msgstr "Erreur lors de la mise à niveau de l'abonnement"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Erreur lors de la mise à niveau vers Pro" msgstr "Erreur lors de la mise à niveau vers Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Erreur lors du téléchargement de l'image de profil" msgstr "Erreur lors du téléchargement de l'image de profil"
@@ -800,8 +824,16 @@ msgstr "Tout ce dont vous avez besoin, gratuit pour toujours. Tableaux illimité
msgid "Execution" msgid "Execution"
msgstr "Exécution" 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:209
msgid "Failed to copy invite link"
msgstr "Échec de la copie du lien d'invitation"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Échec de connexion avec {0}. Veuillez réessayer." msgstr "Échec de connexion avec {0}. Veuillez réessayer."
@@ -849,8 +881,8 @@ msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons
msgid "Free" msgid "Free"
msgstr "Gratuit" msgstr "Gratuit"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Forfait gratuit" msgstr "Forfait gratuit"
@@ -866,7 +898,7 @@ msgstr "Temps plein"
msgid "Fun" msgid "Fun"
msgstr "Amusant" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Premiers pas"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Accéder à l'application" msgstr "Accéder à l'application"
@@ -987,6 +1024,10 @@ msgstr "Importation depuis Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "L'importation de vos tableaux Trello dans Kan est simple. Vous pouvez suivre notre guide étape par étape <0>ici</0>." msgstr "L'importation de vos tableaux Trello dans Kan est simple. Vous pouvez suivre notre guide étape par étape <0>ici</0>."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "dans"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Intégrations"
msgid "Interviewing" msgid "Interviewing"
msgstr "Entretien" msgstr "Entretien"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Adresse e-mail invalide" msgstr "Adresse e-mail invalide"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invitation invalide"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Inviter" msgstr "Inviter"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Inviter un autre" msgstr "Lien d'invitation copié"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Lien d'invitation copié dans le presse-papiers"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Les liens d'invitation nécessitent un abonnement Team ou Pro. Veuillez mettre à niveau votre espace de travail."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Inviter un membre" msgstr "Inviter un membre"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1063,7 +1125,7 @@ msgstr "Langue"
msgid "Launch offer" msgid "Launch offer"
msgstr "Offre de lancement" msgstr "Offre de lancement"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Offre de lancement : obtenez des membres illimités avec Pro" msgstr "Offre de lancement : obtenez des membres illimités avec Pro"
@@ -1099,7 +1161,7 @@ msgstr "Liste"
msgid "List name" msgid "List name"
msgstr "Nom de la liste" msgstr "Nom de la liste"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Connexion | kan.bn" msgstr "Connexion | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "Long terme"
msgid "Low Priority" msgid "Low Priority"
msgstr "Priorité basse" msgstr "Priorité basse"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "lien magique" msgstr "lien magique"
@@ -1136,12 +1198,12 @@ msgstr "Priorité moyenne"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Membres" msgstr "Membres"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Membres | {0}" msgstr "Membres | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Membres | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Mensuel" msgstr "Mensuel"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "facturation mensuelle" msgstr "facturation mensuelle"
@@ -1245,6 +1307,10 @@ msgstr "Aucune carte de crédit requise"
msgid "No lists" msgid "No lists"
msgstr "Aucune liste" msgstr "Aucune liste"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "Aucun résultat trouvé pour \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Offre" msgstr "Offre"
@@ -1261,7 +1327,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." 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." 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:362
msgid "or" msgid "or"
msgstr "ou" msgstr "ou"
@@ -1281,6 +1347,14 @@ msgstr "Temps partiel"
msgid "Password Changed" msgid "Password Changed"
msgstr "Mot de passe modifié" msgstr "Mot de passe modifié"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Le mot de passe est requis pour se connecter."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Le mot de passe est requis pour s'inscrire."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "Le mot de passe doit comporter au moins 8 caractères" msgstr "Le mot de passe doit comporter au moins 8 caractères"
@@ -1289,7 +1363,7 @@ msgstr "Le mot de passe doit comporter au moins 8 caractères"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas" msgstr "Les mots de passe ne correspondent pas"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "En pause" msgstr "En pause"
@@ -1297,7 +1371,7 @@ msgstr "En pause"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Fréquence de paiement" msgstr "Fréquence de paiement"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "En attente" msgstr "En attente"
@@ -1318,19 +1392,19 @@ msgstr "Planification"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Veuillez confirmer votre nouveau mot de passe" msgstr "Veuillez confirmer votre nouveau mot de passe"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Veuillez saisir une adresse e-mail valide" msgstr "Veuillez saisir une adresse e-mail valide"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Veuillez saisir un nom valide" msgstr "Veuillez saisir un nom valide"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Veuillez saisir un mot de passe valide" 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." msgid "Please select a file to upload."
msgstr "Veuillez sélectionner un fichier à télécharger." msgstr "Veuillez sélectionner un fichier à télécharger."
@@ -1359,10 +1433,10 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Veuillez réessayer plus tard ou contacter le service client." msgstr "Veuillez réessayer plus tard ou contacter le service client."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Veuillez réessayer plus tard."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Politique de confidentialité"
msgid "Private" msgid "Private"
msgstr "Privé" msgstr "Privé"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Plan Pro" msgstr "Plan Pro"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Plan Pro ∞" msgstr "Plan Pro ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Image de profil mise à jour" msgstr "Image de profil mise à jour"
@@ -1440,7 +1519,7 @@ msgstr "À distance"
msgid "Remove" msgid "Remove"
msgstr "Supprimer" msgstr "Supprimer"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Supprimer le membre" msgstr "Supprimer le membre"
@@ -1492,7 +1571,7 @@ msgstr "Révision"
msgid "Roadmap" msgid "Roadmap"
msgstr "Feuille de route" msgstr "Feuille de route"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Rôle" msgstr "Rôle"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Exécutez sur votre propre infrastructure" msgstr "Exécutez sur votre propre infrastructure"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Enregistrer" msgstr "Enregistrer"
@@ -1513,6 +1592,10 @@ msgstr "Gagnez du temps avec des modèles de tableaux réutilisables."
msgid "Screening" msgid "Screening"
msgstr "Présélection" msgstr "Présélection"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Rechercher des tableaux et des cartes..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Sélectionner tout" msgstr "Sélectionner tout"
@@ -1571,20 +1654,28 @@ msgstr "Paramètres | Espace de travail"
msgid "Sign in" msgid "Sign in"
msgstr "Se connecter" msgstr "Se connecter"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Inscription | kan.bn" msgstr "Inscription | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Inscription désactivée" 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." msgid "Sign up is currently disabled. Please try again later."
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard." msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "S'inscrire avec " msgstr "S'inscrire avec "
@@ -1608,8 +1699,12 @@ msgstr "Développement logiciel"
msgid "Star on Github" msgid "Star on Github"
msgstr "Étoile sur Github" msgstr "Étoile sur Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Abonnement requis"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Succès" msgstr "Succès"
@@ -1629,8 +1724,8 @@ msgstr "Soutenir le développement du projet"
msgid "System" msgid "System"
msgstr "Système" msgstr "Système"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Forfait d'équipe" msgstr "Forfait d'équipe"
@@ -1694,6 +1789,10 @@ msgstr "Ce tableau est privé ou n'existe pas"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Cette URL de tableau est déjà utilisée" 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "Cela entraînera la suppression définitive de toutes les données associées à cet espace de travail."
@@ -1909,7 +2008,7 @@ msgstr "Passer à Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Passer à Pro (29 $/mois)" msgstr "Passer à Pro (29 $/mois)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Passer au forfait d'équipe" msgstr "Passer au forfait d'équipe"
@@ -1937,11 +2036,11 @@ msgstr "L'URL doit comporter au moins 3 caractères"
msgid "Use template" msgid "Use template"
msgstr "Utiliser le modèle" msgstr "Utiliser le modèle"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Utilisateur" msgstr "Utilisateur"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "L'utilisateur est déjà membre de cet espace de travail" msgstr "L'utilisateur est déjà membre de cet espace de travail"
@@ -1985,7 +2084,7 @@ msgstr "Nous utilisons la <0>licence AGPL-3.0</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "Nous ne faisons que commencer. " msgstr "Nous ne faisons que commencer. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "Bienvenue à nouveau" msgstr "Bienvenue à nouveau"
@@ -2100,18 +2199,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>." 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>." 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:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Vous vous êtes connecté avec succès." msgstr "Vous vous êtes connecté avec succès."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Vous vous êtes inscrit avec succès." msgstr "Vous vous êtes inscrit avec succès."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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 !" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Votre compte a été supprimé." msgstr "Votre compte a été supprimé."
@@ -2128,7 +2235,7 @@ msgstr "Votre nom d'affichage a été mis à jour."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "Votre mot de passe a été modifié." 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." msgid "Your profile image has been updated."
msgstr "Votre image de profil a été mise à jour." 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})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({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:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/mese" msgstr "$10/mese"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/mese" msgstr "$8/mese"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Aggiungi etichetta" msgstr "Aggiungi etichetta"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Aggiungi membro" msgstr "Aggiungi membro"
@@ -136,11 +136,11 @@ msgstr "ha aggiunto l'elemento <0>{0}</0> alla checklist"
msgid "added label <0>{0}</0>" msgid "added label <0>{0}</0>"
msgstr "ha aggiunto l'etichetta <0>{0}</0>" msgstr "ha aggiunto l'etichetta <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Regola il ritaglio quadrato per adattarlo al tuo avatar." msgstr "Regola il ritaglio quadrato per adattarlo al tuo avatar."
@@ -152,7 +152,7 @@ msgstr "Ruoli amministratore"
msgid "All systems operational" msgid "All systems operational"
msgstr "Tutti i sistemi operativi" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Hai già un account? <0><1>Accedi</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." msgid "An unexpected error occurred. Please try again later."
msgstr "Si è verificato un errore imprevisto. Riprova più tardi." msgstr "Si è verificato un errore imprevisto. Riprova più tardi."
#: src/views/members/components/InviteMemberForm.tsx:304
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 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Kanban base" msgstr "Kanban base"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "fatturato annualmente" msgstr "fatturato annualmente"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "fatturato mensilmente" msgstr "fatturato mensilmente"
@@ -342,7 +346,7 @@ msgstr "Segnalazione bug"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Cambia password"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Modifica le tue preferenze di lingua." msgstr "Modifica le tue preferenze di lingua."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Controlla la tua casella di posta" msgstr "Controlla la tua casella di posta"
@@ -382,8 +386,8 @@ msgstr "Nome della checklist"
msgid "Clear filters" msgid "Clear filters"
msgstr "Cancella filtri" msgstr "Cancella filtri"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Clicca sul link che abbiamo inviato a {magicLinkRecipient} per accedere." msgstr "Clicca sul link che abbiamo inviato a {magicLinkRecipient} per accedere."
@@ -459,12 +463,12 @@ msgstr "Contattaci"
msgid "Content Creation" msgid "Content Creation"
msgstr "Creazione contenuti" msgstr "Creazione contenuti"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Continua con " msgstr "Continua con "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Continua con {0}" msgstr "Continua con {0}"
@@ -494,6 +498,10 @@ msgstr "Crea carta"
msgid "Create checklist" msgid "Create checklist"
msgstr "Crea checklist" msgstr "Crea checklist"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Crea link di invito"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Crea etichetta" msgstr "Crea etichetta"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Crea nuova lista" msgstr "Crea nuova lista"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Crea spazio di lavoro" msgstr "Crea spazio di lavoro"
@@ -532,7 +540,7 @@ msgstr "ha creato la carta"
msgid "Critical" msgid "Critical"
msgstr "Critico" msgstr "Critico"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Ritaglia il tuo avatar" msgstr "Ritaglia il tuo avatar"
@@ -561,6 +569,10 @@ msgstr "Assistenza clienti"
msgid "Dark" msgid "Dark"
msgstr "Scuro" msgstr "Scuro"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Disattiva link di invito"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Documenti"
msgid "Documentation" msgid "Documentation"
msgstr "Documentazione" 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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Non hai un account? <0><1>Registrati</1></0>" msgstr "Non hai un account? <0><1>Registrati</1></0>"
@@ -693,11 +705,11 @@ msgstr "Modifica URL dell'area di lavoro"
msgid "Editing" msgid "Editing"
msgstr "Modifica" msgstr "Modifica"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "email" msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
@@ -713,11 +725,11 @@ msgstr "Inserisci la tua password attuale"
msgid "Enter your current password and choose a new secure password." msgid "Enter your current password and choose a new secure password."
msgstr "Inserisci la tua password attuale e scegli una nuova password sicura." msgstr "Inserisci la tua password attuale e scegli una nuova password sicura."
#: src/components/AuthForm.tsx:333 #: src/components/AuthForm.tsx:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Inserisci il tuo indirizzo email" msgstr "Inserisci il tuo indirizzo email"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Inserisci il tuo nome" msgstr "Inserisci il tuo nome"
@@ -725,14 +737,26 @@ msgstr "Inserisci il tuo nome"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Inserisci la tua nuova password" msgstr "Inserisci la tua nuova password"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Inserisci la tua password" msgstr "Inserisci la tua password"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Errore"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Errore durante il cambio della password" msgstr "Errore durante il cambio della password"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Errore durante la creazione del link di invito"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Errore durante la disattivazione del link di invito"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Errore durante l'eliminazione dell'account" msgstr "Errore durante l'eliminazione dell'account"
@@ -749,8 +773,8 @@ msgstr "Errore durante l'eliminazione dell'area di lavoro"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Errore durante la disconnessione da Trello" msgstr "Errore durante la disconnessione da Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Errore durante l'invito del membro" msgstr "Errore durante l'invito del membro"
@@ -758,7 +782,7 @@ msgstr "Errore durante l'invito del membro"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Errore durante l'aggiornamento del nome visualizzato" 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" msgid "Error updating profile image"
msgstr "Errore durante l'aggiornamento dell'immagine del profilo" msgstr "Errore durante l'aggiornamento dell'immagine del profilo"
@@ -774,7 +798,7 @@ msgstr "Errore durante l'aggiornamento del nome dell'area di lavoro"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro" msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Errore nell'aggiornamento dell'abbonamento" msgstr "Errore nell'aggiornamento dell'abbonamento"
@@ -783,8 +807,8 @@ msgstr "Errore nell'aggiornamento dell'abbonamento"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Errore durante l'aggiornamento a Pro" msgstr "Errore durante l'aggiornamento a Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Errore durante il caricamento dell'immagine del profilo" msgstr "Errore durante il caricamento dell'immagine del profilo"
@@ -800,8 +824,16 @@ msgstr "Tutto ciò di cui hai bisogno, gratis per sempre. Bacheche illimitate, l
msgid "Execution" msgid "Execution"
msgstr "Esecuzione" 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:209
msgid "Failed to copy invite link"
msgstr "Impossibile copiare il link di invito"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Accesso con {0} fallito. Riprova." msgstr "Accesso con {0} fallito. Riprova."
@@ -849,8 +881,8 @@ msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni pr
msgid "Free" msgid "Free"
msgstr "Gratuito" msgstr "Gratuito"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Piano gratuito" msgstr "Piano gratuito"
@@ -866,7 +898,7 @@ msgstr "Tempo pieno"
msgid "Fun" msgid "Fun"
msgstr "Divertimento" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Primi passi"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Vai all'app" msgstr "Vai all'app"
@@ -987,6 +1024,10 @@ msgstr "Importazione da Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importare le tue bacheche Trello in Kan è facile. Puoi seguire la nostra guida passo-passo <0>qui</0>." msgstr "Importare le tue bacheche Trello in Kan è facile. Puoi seguire la nostra guida passo-passo <0>qui</0>."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "in"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Integrazioni"
msgid "Interviewing" msgid "Interviewing"
msgstr "Colloquio" msgstr "Colloquio"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Indirizzo email non valido" msgstr "Indirizzo email non valido"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Invito non valido"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Invita" msgstr "Invita"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Invita un altro" msgstr "Link di invito copiato"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Link di invito copiato negli appunti"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "I link di invito richiedono un abbonamento Team o Pro. Per favore aggiorna il tuo spazio di lavoro."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Invita membro" msgstr "Invita membro"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1063,7 +1125,7 @@ msgstr "Lingua"
msgid "Launch offer" msgid "Launch offer"
msgstr "Offerta di lancio" msgstr "Offerta di lancio"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Offerta di lancio: ottieni membri illimitati con Pro" msgstr "Offerta di lancio: ottieni membri illimitati con Pro"
@@ -1099,7 +1161,7 @@ msgstr "Lista"
msgid "List name" msgid "List name"
msgstr "Nome lista" msgstr "Nome lista"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Login | kan.bn" msgstr "Login | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "A lungo termine"
msgid "Low Priority" msgid "Low Priority"
msgstr "Bassa priorità" msgstr "Bassa priorità"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "link magico" msgstr "link magico"
@@ -1136,12 +1198,12 @@ msgstr "Media priorità"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Membri" msgstr "Membri"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Membri | {0}" msgstr "Membri | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Membri | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Mensile" msgstr "Mensile"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "fatturazione mensile" msgstr "fatturazione mensile"
@@ -1245,6 +1307,10 @@ msgstr "Nessuna carta di credito richiesta"
msgid "No lists" msgid "No lists"
msgstr "Nessuna lista" msgstr "Nessuna lista"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "Nessun risultato trovato per \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Offerta" msgstr "Offerta"
@@ -1261,7 +1327,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." 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." 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:362
msgid "or" msgid "or"
msgstr "o" msgstr "o"
@@ -1281,6 +1347,14 @@ msgstr "Part-time"
msgid "Password Changed" msgid "Password Changed"
msgstr "Password modificata" msgstr "Password modificata"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "La password è necessaria per accedere."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "La password è necessaria per registrarsi."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "La password deve contenere almeno 8 caratteri" msgstr "La password deve contenere almeno 8 caratteri"
@@ -1289,7 +1363,7 @@ msgstr "La password deve contenere almeno 8 caratteri"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Le password non corrispondono" msgstr "Le password non corrispondono"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "In pausa" msgstr "In pausa"
@@ -1297,7 +1371,7 @@ msgstr "In pausa"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Frequenza di pagamento" msgstr "Frequenza di pagamento"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "In attesa" msgstr "In attesa"
@@ -1318,19 +1392,19 @@ msgstr "Pianificazione"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Conferma la tua nuova password" msgstr "Conferma la tua nuova password"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Inserisci un indirizzo email valido" msgstr "Inserisci un indirizzo email valido"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Inserisci un nome valido" msgstr "Inserisci un nome valido"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Inserisci una password valida" 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." msgid "Please select a file to upload."
msgstr "Seleziona un file da caricare." msgstr "Seleziona un file da caricare."
@@ -1359,10 +1433,10 @@ msgstr "Seleziona un file da caricare."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Seleziona un file da caricare."
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Riprova più tardi o contatta l'assistenza clienti." msgstr "Riprova più tardi o contatta l'assistenza clienti."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Riprova più tardi."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Informativa sulla privacy"
msgid "Private" msgid "Private"
msgstr "Privato" msgstr "Privato"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Piano Pro" msgstr "Piano Pro"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Piano Pro ∞" msgstr "Piano Pro ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Immagine del profilo aggiornata" msgstr "Immagine del profilo aggiornata"
@@ -1440,7 +1519,7 @@ msgstr "Remoto"
msgid "Remove" msgid "Remove"
msgstr "Rimuovi" msgstr "Rimuovi"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Rimuovi membro" msgstr "Rimuovi membro"
@@ -1492,7 +1571,7 @@ msgstr "Revisione"
msgid "Roadmap" msgid "Roadmap"
msgstr "Roadmap" msgstr "Roadmap"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Ruolo" msgstr "Ruolo"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Esegui sulla tua infrastruttura" msgstr "Esegui sulla tua infrastruttura"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Salva" msgstr "Salva"
@@ -1513,6 +1592,10 @@ msgstr "Risparmia tempo con modelli di bacheca riutilizzabili."
msgid "Screening" msgid "Screening"
msgstr "Selezione" msgstr "Selezione"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Cerca bacheche e schede..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Seleziona tutto" msgstr "Seleziona tutto"
@@ -1571,20 +1654,28 @@ msgstr "Impostazioni | Area di lavoro"
msgid "Sign in" msgid "Sign in"
msgstr "Accedi" msgstr "Accedi"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Registrati | kan.bn" msgstr "Registrati | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Registrazione disabilitata" 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." msgid "Sign up is currently disabled. Please try again later."
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi." msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Registrati con " msgstr "Registrati con "
@@ -1608,8 +1699,12 @@ msgstr "Sviluppo software"
msgid "Star on Github" msgid "Star on Github"
msgstr "Metti una stella su Github" msgstr "Metti una stella su Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Abbonamento richiesto"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Operazione riuscita" msgstr "Operazione riuscita"
@@ -1629,8 +1724,8 @@ msgstr "Sostieni lo sviluppo del progetto"
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Piano Team" msgstr "Piano Team"
@@ -1694,6 +1789,10 @@ msgstr "Questa bacheca è privata o non esiste"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Questo URL della bacheca è già stato utilizzato" 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "Questo comporterà l'eliminazione permanente di tutti i dati associati a questo spazio di lavoro."
@@ -1909,7 +2008,7 @@ msgstr "Passa a Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Passa a Pro ($29/mese)" msgstr "Passa a Pro ($29/mese)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Passa al Piano Team" msgstr "Passa al Piano Team"
@@ -1937,11 +2036,11 @@ msgstr "L'URL deve contenere almeno 3 caratteri"
msgid "Use template" msgid "Use template"
msgstr "Usa template" msgstr "Usa template"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Utente" msgstr "Utente"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "L'utente è già membro di questo spazio di lavoro" msgstr "L'utente è già membro di questo spazio di lavoro"
@@ -1985,7 +2084,7 @@ msgstr "Utilizziamo la <0>licenza AGPL-3.0</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "Siamo solo all'inizio. " msgstr "Siamo solo all'inizio. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "Bentornato" msgstr "Bentornato"
@@ -2100,18 +2199,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>." 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>." msgstr "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>repo</0>."
#: src/components/AuthForm.tsx:221 #: src/components/AuthForm.tsx:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Hai effettuato l'accesso con successo." msgstr "Hai effettuato l'accesso con successo."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Ti sei registrato con successo." msgstr "Ti sei registrato con successo."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Il tuo account è stato eliminato." msgstr "Il tuo account è stato eliminato."
@@ -2128,7 +2235,7 @@ msgstr "Il tuo nome visualizzato è stato aggiornato."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "La tua password è stata modificata." 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." msgid "Your profile image has been updated."
msgstr "La tua immagine del profilo è stata aggiornata." 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})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({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:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/maand" msgstr "$10/maand"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/maand" msgstr "$8/maand"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Label toevoegen" msgstr "Label toevoegen"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Lid toevoegen" msgstr "Lid toevoegen"
@@ -136,11 +136,11 @@ msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
msgid "added label <0>{0}</0>" msgid "added label <0>{0}</0>"
msgstr "heeft label <0>{0}</0> toegevoegd" msgstr "heeft label <0>{0}</0> toegevoegd"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." 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." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Pas de vierkante uitsnede aan zodat je avatar goed past." msgstr "Pas de vierkante uitsnede aan zodat je avatar goed past."
@@ -152,7 +152,7 @@ msgstr "Beheerdersrollen"
msgid "All systems operational" msgid "All systems operational"
msgstr "Alle systemen operationeel" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Heb je al een account? <0><1>Log 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." msgid "An unexpected error occurred. Please try again later."
msgstr "Er is een onverwachte fout opgetreden. Probeer het later opnieuw." msgstr "Er is een onverwachte fout opgetreden. Probeer het later opnieuw."
#: src/views/members/components/InviteMemberForm.tsx:304
msgid "Anyone with this link can join your workspace"
msgstr "Iedereen met deze link kan deelnemen aan je werkruimte"
#: src/components/SettingsLayout.tsx:51 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Backlog"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Basis kanban" msgstr "Basis kanban"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "jaarlijks gefactureerd" msgstr "jaarlijks gefactureerd"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "maandelijks gefactureerd" msgstr "maandelijks gefactureerd"
@@ -342,7 +346,7 @@ msgstr "Bugrapport"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Wachtwoord wijzigen"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Wijzig je taalvoorkeuren." msgstr "Wijzig je taalvoorkeuren."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Controleer je inbox" msgstr "Controleer je inbox"
@@ -382,8 +386,8 @@ msgstr "Naam checklist"
msgid "Clear filters" msgid "Clear filters"
msgstr "Filters wissen" msgstr "Filters wissen"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." 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." 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" msgid "Content Creation"
msgstr "Content creatie" msgstr "Content creatie"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Doorgaan met " msgstr "Doorgaan met "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Doorgaan met {0}" msgstr "Doorgaan met {0}"
@@ -494,6 +498,10 @@ msgstr "Maak kaart"
msgid "Create checklist" msgid "Create checklist"
msgstr "Checklist maken" msgstr "Checklist maken"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Uitnodigingslink maken"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Maak label" msgstr "Maak label"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Maak nieuwe lijst" msgstr "Maak nieuwe lijst"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Werkruimte maken" msgstr "Werkruimte maken"
@@ -532,7 +540,7 @@ msgstr "heeft de kaart aangemaakt"
msgid "Critical" msgid "Critical"
msgstr "Kritiek" msgstr "Kritiek"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Snijd je avatar bij" msgstr "Snijd je avatar bij"
@@ -561,6 +569,10 @@ msgstr "Klantenservice"
msgid "Dark" msgid "Dark"
msgstr "Donker" msgstr "Donker"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Uitnodigingslink deactiveren"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Docs"
msgid "Documentation" msgid "Documentation"
msgstr "Documentatie" 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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Heb je geen account? <0><1>Registreer je</1></0>" msgstr "Heb je geen account? <0><1>Registreer je</1></0>"
@@ -693,11 +705,11 @@ msgstr "Werkruimte-URL bewerken"
msgid "Editing" msgid "Editing"
msgstr "Bewerken" msgstr "Bewerken"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "e-mail" msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
@@ -713,11 +725,11 @@ msgstr "Voer je huidige wachtwoord in"
msgid "Enter your current password and choose a new secure password." msgid "Enter your current password and choose a new secure password."
msgstr "Voer je huidige wachtwoord in en kies een nieuw veilig wachtwoord." msgstr "Voer je huidige wachtwoord in en kies een nieuw veilig wachtwoord."
#: src/components/AuthForm.tsx:333 #: src/components/AuthForm.tsx:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Voer je e-mailadres in" msgstr "Voer je e-mailadres in"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Voer je naam in" msgstr "Voer je naam in"
@@ -725,14 +737,26 @@ msgstr "Voer je naam in"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Voer je nieuwe wachtwoord in" msgstr "Voer je nieuwe wachtwoord in"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Voer je wachtwoord in" msgstr "Voer je wachtwoord in"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Fout"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Fout bij wijzigen wachtwoord" msgstr "Fout bij wijzigen wachtwoord"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Fout bij het maken van uitnodigingslink"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Fout bij het deactiveren van uitnodigingslink"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Fout bij verwijderen account" msgstr "Fout bij verwijderen account"
@@ -749,8 +773,8 @@ msgstr "Fout bij verwijderen werkruimte"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Fout bij ontkoppelen van Trello" msgstr "Fout bij ontkoppelen van Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Fout bij het uitnodigen van lid" msgstr "Fout bij het uitnodigen van lid"
@@ -758,7 +782,7 @@ msgstr "Fout bij het uitnodigen van lid"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Fout bij bijwerken weergavenaam" msgstr "Fout bij bijwerken weergavenaam"
#: src/views/settings/components/Avatar.tsx:80 #: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image" msgid "Error updating profile image"
msgstr "Fout bij het bijwerken van profielafbeelding" msgstr "Fout bij het bijwerken van profielafbeelding"
@@ -774,7 +798,7 @@ msgstr "Fout bij bijwerken naam werkruimte"
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Fout bij het bijwerken van werkruimte-URL" msgstr "Fout bij het bijwerken van werkruimte-URL"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Fout bij het upgraden van abonnement" msgstr "Fout bij het upgraden van abonnement"
@@ -783,8 +807,8 @@ msgstr "Fout bij het upgraden van abonnement"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Fout bij upgraden naar Pro" msgstr "Fout bij upgraden naar Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Fout bij het uploaden van profielafbeelding" msgstr "Fout bij het uploaden van profielafbeelding"
@@ -800,8 +824,16 @@ msgstr "Alles wat je nodig hebt, voor altijd gratis. Onbeperkte borden, onbeperk
msgid "Execution" msgid "Execution"
msgstr "Uitvoering" 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:209
msgid "Failed to copy invite link"
msgstr "Kopiëren van uitnodigingslink mislukt"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw." msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
@@ -849,8 +881,8 @@ msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open sourc
msgid "Free" msgid "Free"
msgstr "Gratis" msgstr "Gratis"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Gratis plan" msgstr "Gratis plan"
@@ -866,7 +898,7 @@ msgstr "Fulltime"
msgid "Fun" msgid "Fun"
msgstr "Leuk" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Aan de slag"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Naar de app" msgstr "Naar de app"
@@ -987,6 +1024,10 @@ msgstr "Importeren vanuit Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Het importeren van je Trello-borden naar Kan is eenvoudig. Je kunt onze stap-voor-stap handleiding <0>hier</0> volgen." msgstr "Het importeren van je Trello-borden naar Kan is eenvoudig. Je kunt onze stap-voor-stap handleiding <0>hier</0> volgen."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "in"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Integraties"
msgid "Interviewing" msgid "Interviewing"
msgstr "Interviewen" msgstr "Interviewen"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Ongeldig e-mailadres" msgstr "Ongeldig e-mailadres"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Ongeldige uitnodiging"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Uitnodigen" msgstr "Uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Nog iemand uitnodigen" msgstr "Uitnodigingslink gekopieerd"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Uitnodigingslink gekopieerd naar klembord"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Uitnodigingslinks vereisen een Team- of Pro-abonnement. Upgrade je werkruimte."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Lid uitnodigen" msgstr "Lid uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." 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." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Junior" msgstr "Junior"
@@ -1063,7 +1125,7 @@ msgstr "Taal"
msgid "Launch offer" msgid "Launch offer"
msgstr "Introductieaanbieding" msgstr "Introductieaanbieding"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Lanceringsaanbieding: krijg onbeperkt aantal leden met Pro" msgstr "Lanceringsaanbieding: krijg onbeperkt aantal leden met Pro"
@@ -1099,7 +1161,7 @@ msgstr "Lijst"
msgid "List name" msgid "List name"
msgstr "Lijstnaam" msgstr "Lijstnaam"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Login | kan.bn" msgstr "Login | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "Lange termijn"
msgid "Low Priority" msgid "Low Priority"
msgstr "Lage prioriteit" msgstr "Lage prioriteit"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "magische link" msgstr "magische link"
@@ -1136,12 +1198,12 @@ msgstr "Gemiddelde prioriteit"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Leden" msgstr "Leden"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Leden | {0}" msgstr "Leden | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Leden | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Maandelijks" msgstr "Maandelijks"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "maandelijkse facturering" msgstr "maandelijkse facturering"
@@ -1245,6 +1307,10 @@ msgstr "Geen creditcard vereist"
msgid "No lists" msgid "No lists"
msgstr "Geen lijsten" msgstr "Geen lijsten"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "Geen resultaten gevonden voor \"{debouncedQuery}\"."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Aanbod" msgstr "Aanbod"
@@ -1261,7 +1327,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." 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." 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:362
msgid "or" msgid "or"
msgstr "of" msgstr "of"
@@ -1281,6 +1347,14 @@ msgstr "Deeltijd"
msgid "Password Changed" msgid "Password Changed"
msgstr "Wachtwoord gewijzigd" msgstr "Wachtwoord gewijzigd"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Wachtwoord is vereist om in te loggen."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Wachtwoord is vereist om je aan te melden."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "Wachtwoord moet minimaal 8 tekens bevatten" msgstr "Wachtwoord moet minimaal 8 tekens bevatten"
@@ -1289,7 +1363,7 @@ msgstr "Wachtwoord moet minimaal 8 tekens bevatten"
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen" msgstr "Wachtwoorden komen niet overeen"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "Gepauzeerd" msgstr "Gepauzeerd"
@@ -1297,7 +1371,7 @@ msgstr "Gepauzeerd"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Betalingsfrequentie" msgstr "Betalingsfrequentie"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "In behandeling" msgstr "In behandeling"
@@ -1318,19 +1392,19 @@ msgstr "Planning"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Bevestig je nieuwe wachtwoord" msgstr "Bevestig je nieuwe wachtwoord"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Voer een geldig e-mailadres in" msgstr "Voer een geldig e-mailadres in"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Voer een geldige naam in" msgstr "Voer een geldige naam in"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Voer een geldig wachtwoord in" 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." msgid "Please select a file to upload."
msgstr "Selecteer een bestand om te uploaden." msgstr "Selecteer een bestand om te uploaden."
@@ -1359,10 +1433,10 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Selecteer een bestand om te uploaden."
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice." msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Probeer het later opnieuw."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Privacybeleid"
msgid "Private" msgid "Private"
msgstr "Privé" msgstr "Privé"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Pro Plan" msgstr "Pro Plan"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Pro Plan ∞" msgstr "Pro Plan ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Profielafbeelding bijgewerkt" msgstr "Profielafbeelding bijgewerkt"
@@ -1440,7 +1519,7 @@ msgstr "Op afstand"
msgid "Remove" msgid "Remove"
msgstr "Verwijderen" msgstr "Verwijderen"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Lid verwijderen" msgstr "Lid verwijderen"
@@ -1492,7 +1571,7 @@ msgstr "Beoordeling"
msgid "Roadmap" msgid "Roadmap"
msgstr "Roadmap" msgstr "Roadmap"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Rol" msgstr "Rol"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Draai op je eigen infrastructuur" msgstr "Draai op je eigen infrastructuur"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Opslaan" msgstr "Opslaan"
@@ -1513,6 +1592,10 @@ msgstr "Bespaar tijd met herbruikbare bordsjablonen."
msgid "Screening" msgid "Screening"
msgstr "Screening" msgstr "Screening"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Zoek in borden en kaarten..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Alles selecteren" msgstr "Alles selecteren"
@@ -1571,20 +1654,28 @@ msgstr "Instellingen | Werkruimte"
msgid "Sign in" msgid "Sign in"
msgstr "Inloggen" msgstr "Inloggen"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Registreren | kan.bn" msgstr "Registreren | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Registreren uitgeschakeld" 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." msgid "Sign up is currently disabled. Please try again later."
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw." msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Registreren met " msgstr "Registreren met "
@@ -1608,8 +1699,12 @@ msgstr "Softwareontwikkeling"
msgid "Star on Github" msgid "Star on Github"
msgstr "Star op Github" msgstr "Star op Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Abonnement vereist"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Geslaagd" msgstr "Geslaagd"
@@ -1629,8 +1724,8 @@ msgstr "Ondersteun de ontwikkeling van het project"
msgid "System" msgid "System"
msgstr "Systeem" msgstr "Systeem"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Teamplan" msgstr "Teamplan"
@@ -1694,6 +1789,10 @@ msgstr "Dit bord is privé of bestaat niet"
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Deze board URL is al in gebruik" 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." 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." msgstr "Dit zal resulteren in het permanent verwijderen van alle gegevens die aan deze werkruimte zijn gekoppeld."
@@ -1909,7 +2008,7 @@ msgstr "Upgraden naar Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade naar Pro ($29/maand)" msgstr "Upgrade naar Pro ($29/maand)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Upgraden naar teamplan" msgstr "Upgraden naar teamplan"
@@ -1937,11 +2036,11 @@ msgstr "URL moet minimaal 3 tekens lang zijn"
msgid "Use template" msgid "Use template"
msgstr "Sjabloon gebruiken" msgstr "Sjabloon gebruiken"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Gebruiker" msgstr "Gebruiker"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "Gebruiker is al lid van deze werkruimte" msgstr "Gebruiker is al lid van deze werkruimte"
@@ -1985,7 +2084,7 @@ msgstr "We gebruiken de <0>AGPL-3.0 licentie</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "We zijn nog maar net begonnen. " msgstr "We zijn nog maar net begonnen. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "Welkom terug" msgstr "Welkom terug"
@@ -2100,18 +2199,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>." 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." msgstr "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
#: src/components/AuthForm.tsx:221 #: src/components/AuthForm.tsx:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Je bent succesvol ingelogd." msgstr "Je bent succesvol ingelogd."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Je bent succesvol geregistreerd." msgstr "Je bent succesvol geregistreerd."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" 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!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Je account is verwijderd." msgstr "Je account is verwijderd."
@@ -2128,7 +2235,7 @@ msgstr "Je weergavenaam is bijgewerkt."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "Je wachtwoord is gewijzigd." 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." msgid "Your profile image has been updated."
msgstr "Je profielafbeelding is bijgewerkt." 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})}}" msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Импортировать доску (1)} other {Импортировать доски ({boardCount})}}" msgstr "{boardCount, plural, one {Импортировать доску (1)} other {Импортировать доски ({boardCount})}}"
#: src/views/members/components/InviteMemberForm.tsx:92 #: src/views/members/components/InviteMemberForm.tsx:158
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$10/month" msgid "$10/month"
msgstr "$10/месяц" msgstr "$10/месяц"
#: src/views/members/components/InviteMemberForm.tsx:104 #: src/views/members/components/InviteMemberForm.tsx:170
msgid "$8/month" msgid "$8/month"
msgstr "$8/месяц" msgstr "$8/месяц"
@@ -101,7 +101,7 @@ msgid "Add label"
msgstr "Добавить метку" msgstr "Добавить метку"
#: src/views/card/components/MemberSelector.tsx:130 #: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:147 #: src/views/members/components/InviteMemberForm.tsx:250
msgid "Add member" msgid "Add member"
msgstr "Добавить участника" msgstr "Добавить участника"
@@ -136,11 +136,11 @@ msgstr "добавлен элемент контрольного списка <0
msgid "added label <0>{0}</0>" msgid "added label <0>{0}</0>"
msgstr "добавлена метка <0>{0}</0>" msgstr "добавлена метка <0>{0}</0>"
#: src/views/members/components/InviteMemberForm.tsx:187 #: src/views/members/components/InviteMemberForm.tsx:320
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat." msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
msgstr "Добавление нового участника будет стоить дополнительно {price} ({billingType}) за место." 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." msgid "Adjust the square crop to fit your avatar."
msgstr "Настройте квадратное кадрирование, чтобы оно подходило для вашего аватара." msgstr "Настройте квадратное кадрирование, чтобы оно подходило для вашего аватара."
@@ -152,7 +152,7 @@ msgstr "Роли администратора"
msgid "All systems operational" msgid "All systems operational"
msgstr "Все системы работают нормально" 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>" msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Уже есть аккаунт? <0><1>Войти</1></0>" msgstr "Уже есть аккаунт? <0><1>Войти</1></0>"
@@ -164,6 +164,10 @@ msgstr "Произошла ошибка при отключении вашего
msgid "An unexpected error occurred. Please try again later." msgid "An unexpected error occurred. Please try again later."
msgstr "Произошла непредвиденная ошибка. Пожалуйста, попробуйте позже." msgstr "Произошла непредвиденная ошибка. Пожалуйста, попробуйте позже."
#: src/views/members/components/InviteMemberForm.tsx:304
msgid "Anyone with this link can join your workspace"
msgstr "Любой, у кого есть эта ссылка, может присоединиться к вашему рабочему пространству"
#: src/components/SettingsLayout.tsx:51 #: src/components/SettingsLayout.tsx:51
msgid "API" msgid "API"
msgstr "API" msgstr "API"
@@ -246,11 +250,11 @@ msgstr "Бэклог"
msgid "Basic Kanban" msgid "Basic Kanban"
msgstr "Базовый Канбан" msgstr "Базовый Канбан"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed annually" msgid "billed annually"
msgstr "выставляется счет ежегодно" msgstr "выставляется счет ежегодно"
#: src/views/members/components/InviteMemberForm.tsx:105 #: src/views/members/components/InviteMemberForm.tsx:171
msgid "billed monthly" msgid "billed monthly"
msgstr "выставляется счет ежемесячно" msgstr "выставляется счет ежемесячно"
@@ -342,7 +346,7 @@ msgstr "Отчет об ошибке"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63 #: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76 #: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55 #: 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/ChangePasswordConfirmation.tsx:168
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88 #: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
@@ -369,8 +373,8 @@ msgstr "Изменить пароль"
msgid "Change your language preferences." msgid "Change your language preferences."
msgstr "Измените настройки языка." msgstr "Измените настройки языка."
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
#: src/views/auth/signup/index.tsx:67 #: src/views/auth/signup/index.tsx:69
msgid "Check your inbox" msgid "Check your inbox"
msgstr "Проверьте ваш почтовый ящик" msgstr "Проверьте ваш почтовый ящик"
@@ -382,8 +386,8 @@ msgstr "Название контрольного списка"
msgid "Clear filters" msgid "Clear filters"
msgstr "Очистить фильтры" msgstr "Очистить фильтры"
#: src/views/auth/login/index.tsx:46 #: src/views/auth/login/index.tsx:48
#: src/views/auth/signup/index.tsx:72 #: src/views/auth/signup/index.tsx:74
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in." msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Нажмите на ссылку, которую мы отправили на {magicLinkRecipient}, чтобы войти." msgstr "Нажмите на ссылку, которую мы отправили на {magicLinkRecipient}, чтобы войти."
@@ -459,12 +463,12 @@ msgstr "Свяжитесь с нами"
msgid "Content Creation" msgid "Content Creation"
msgstr "Создание контента" msgstr "Создание контента"
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Continue with " msgid "Continue with "
msgstr "Продолжить с " msgstr "Продолжить с "
#. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name #. placeholder {0}: key === "oidc" ? oidcProviderName : provider.name
#: src/components/AuthForm.tsx:297 #: src/components/AuthForm.tsx:348
msgid "Continue with {0}" msgid "Continue with {0}"
msgstr "Продолжить с {0}" msgstr "Продолжить с {0}"
@@ -494,6 +498,10 @@ msgstr "Создать карточку"
msgid "Create checklist" msgid "Create checklist"
msgstr "Создать чек-лист" msgstr "Создать чек-лист"
#: src/views/members/components/InviteMemberForm.tsx:342
msgid "Create invite link"
msgstr "Создать ссылку-приглашение"
#: src/components/LabelForm.tsx:238 #: src/components/LabelForm.tsx:238
msgid "Create label" msgid "Create label"
msgstr "Создать метку" msgstr "Создать метку"
@@ -520,7 +528,7 @@ msgid "Create new list"
msgstr "Создать новый список" msgstr "Создать новый список"
#: src/components/NewWorkspaceForm.tsx:384 #: src/components/NewWorkspaceForm.tsx:384
#: src/components/WorkspaceMenu.tsx:116 #: src/components/WorkspaceMenu.tsx:149
msgid "Create workspace" msgid "Create workspace"
msgstr "Создать рабочее пространство" msgstr "Создать рабочее пространство"
@@ -532,7 +540,7 @@ msgstr "создал(а) карточку"
msgid "Critical" msgid "Critical"
msgstr "Критический" msgstr "Критический"
#: src/views/settings/components/Avatar.tsx:275 #: src/views/settings/components/Avatar.tsx:272
msgid "Crop your avatar" msgid "Crop your avatar"
msgstr "Обрежьте ваш аватар" msgstr "Обрежьте ваш аватар"
@@ -561,6 +569,10 @@ msgstr "Служба поддержки"
msgid "Dark" msgid "Dark"
msgstr "Тёмный" msgstr "Тёмный"
#: src/views/members/components/InviteMemberForm.tsx:341
msgid "Deactivate invite link"
msgstr "Деактивировать ссылку-приглашение"
#: src/components/DeleteLabelConfirmation.tsx:51 #: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228 #: src/components/LabelForm.tsx:228
#: src/views/card/components/DeleteCardConfirmation.tsx:92 #: src/views/card/components/DeleteCardConfirmation.tsx:92
@@ -661,7 +673,7 @@ msgstr "Документы"
msgid "Documentation" msgid "Documentation"
msgstr "Документация" 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>" msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Нет аккаунта? <0><1>Зарегистрируйтесь</1></0>" msgstr "Нет аккаунта? <0><1>Зарегистрируйтесь</1></0>"
@@ -693,11 +705,11 @@ msgstr "Редактировать URL рабочей области"
msgid "Editing" msgid "Editing"
msgstr "Редактирование" msgstr "Редактирование"
#: src/components/AuthForm.tsx:368 #: src/components/AuthForm.tsx:418
msgid "email" msgid "email"
msgstr "email" msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:161 #: src/views/members/components/InviteMemberForm.tsx:265
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
@@ -713,11 +725,11 @@ msgstr "Введите ваш текущий пароль"
msgid "Enter your current password and choose a new secure password." msgid "Enter your current password and choose a new secure password."
msgstr "Введите ваш текущий пароль и выберите новый безопасный пароль." msgstr "Введите ваш текущий пароль и выберите новый безопасный пароль."
#: src/components/AuthForm.tsx:333 #: src/components/AuthForm.tsx:384
msgid "Enter your email address" msgid "Enter your email address"
msgstr "Введите ваш адрес электронной почты" msgstr "Введите ваш адрес электронной почты"
#: src/components/AuthForm.tsx:321 #: src/components/AuthForm.tsx:372
msgid "Enter your name" msgid "Enter your name"
msgstr "Введите ваше имя" msgstr "Введите ваше имя"
@@ -725,14 +737,26 @@ msgstr "Введите ваше имя"
msgid "Enter your new password" msgid "Enter your new password"
msgstr "Введите ваш новый пароль" msgstr "Введите ваш новый пароль"
#: src/components/AuthForm.tsx:346 #: src/components/AuthForm.tsx:397
msgid "Enter your password" msgid "Enter your password"
msgstr "Введите ваш пароль" msgstr "Введите ваш пароль"
#: src/views/members/components/InviteMemberForm.tsx:208
msgid "Error"
msgstr "Ошибка"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:89 #: src/views/settings/components/ChangePasswordConfirmation.tsx:89
msgid "Error Changing Password" msgid "Error Changing Password"
msgstr "Ошибка при изменении пароля" msgstr "Ошибка при изменении пароля"
#: src/views/members/components/InviteMemberForm.tsx:128
msgid "Error creating invite link"
msgstr "Ошибка при создании ссылки приглашения"
#: src/views/members/components/InviteMemberForm.tsx:144
msgid "Error deactivating invite link"
msgstr "Ошибка при деактивации ссылки приглашения"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:39 #: src/views/settings/components/DeleteAccountConfirmation.tsx:39
msgid "Error deleting account" msgid "Error deleting account"
msgstr "Ошибка при удалении аккаунта" msgstr "Ошибка при удалении аккаунта"
@@ -749,8 +773,8 @@ msgstr "Ошибка при удалении рабочей области"
msgid "Error disconnecting Trello" msgid "Error disconnecting Trello"
msgstr "Ошибка при отключении Trello" msgstr "Ошибка при отключении Trello"
#: src/views/members/components/InviteMemberForm.tsx:71 #: src/views/members/components/InviteMemberForm.tsx:97
#: src/views/members/components/InviteMemberForm.tsx:77 #: src/views/members/components/InviteMemberForm.tsx:103
msgid "Error inviting member" msgid "Error inviting member"
msgstr "Ошибка при приглашении участника" msgstr "Ошибка при приглашении участника"
@@ -758,7 +782,7 @@ msgstr "Ошибка при приглашении участника"
msgid "Error updating display name" msgid "Error updating display name"
msgstr "Ошибка при обновлении отображаемого имени" msgstr "Ошибка при обновлении отображаемого имени"
#: src/views/settings/components/Avatar.tsx:80 #: src/views/settings/components/Avatar.tsx:77
msgid "Error updating profile image" msgid "Error updating profile image"
msgstr "Ошибка при обновлении изображения профиля" msgstr "Ошибка при обновлении изображения профиля"
@@ -774,7 +798,7 @@ msgstr "Ошибка при обновлении имени рабочей об
msgid "Error updating workspace URL" msgid "Error updating workspace URL"
msgstr "Ошибка при обновлении URL рабочей области" msgstr "Ошибка при обновлении URL рабочей области"
#: src/views/members/components/InviteMemberForm.tsx:130 #: src/views/members/components/InviteMemberForm.tsx:233
#: src/views/settings/components/UpgradeToProConfirmation.tsx:41 #: src/views/settings/components/UpgradeToProConfirmation.tsx:41
msgid "Error upgrading subscription" msgid "Error upgrading subscription"
msgstr "Ошибка при обновлении подписки" msgstr "Ошибка при обновлении подписки"
@@ -783,8 +807,8 @@ msgstr "Ошибка при обновлении подписки"
msgid "Error upgrading to Pro" msgid "Error upgrading to Pro"
msgstr "Ошибка при обновлении до Pro" msgstr "Ошибка при обновлении до Pro"
#: src/views/settings/components/Avatar.tsx:94 #: src/views/settings/components/Avatar.tsx:91
#: src/views/settings/components/Avatar.tsx:221 #: src/views/settings/components/Avatar.tsx:218
msgid "Error uploading profile image" msgid "Error uploading profile image"
msgstr "Ошибка загрузки изображения профиля" msgstr "Ошибка загрузки изображения профиля"
@@ -800,8 +824,16 @@ msgstr "Все, что вам нужно, бесплатно навсегда.
msgid "Execution" msgid "Execution"
msgstr "Выполнение" 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:209
msgid "Failed to copy invite link"
msgstr "Не удалось скопировать ссылку приглашения"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1) #. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:269 #: src/components/AuthForm.tsx:288
msgid "Failed to login with {0}. Please try again." msgid "Failed to login with {0}. Please try again."
msgstr "Не удалось войти с {0}. Пожалуйста, попробуйте снова." msgstr "Не удалось войти с {0}. Пожалуйста, попробуйте снова."
@@ -849,8 +881,8 @@ msgstr "Для долгосрочной устойчивости мы призн
msgid "Free" msgid "Free"
msgstr "Бесплатно" msgstr "Бесплатно"
#: src/views/members/components/InviteMemberForm.tsx:193 #: src/views/members/components/InviteMemberForm.tsx:326
#: src/views/members/index.tsx:208 #: src/views/members/index.tsx:209
msgid "Free Plan" msgid "Free Plan"
msgstr "Бесплатный план" msgstr "Бесплатный план"
@@ -866,7 +898,7 @@ msgstr "Полный рабочий день"
msgid "Fun" msgid "Fun"
msgstr "Веселье" 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/Cta.tsx:61
#: src/views/home/components/Header.tsx:102 #: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141 #: src/views/home/components/Header.tsx:141
@@ -906,8 +938,13 @@ msgstr "Начало работы"
msgid "GitHub" msgid "GitHub"
msgstr "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:96
#: src/views/home/components/Header.tsx:133 #: src/views/home/components/Header.tsx:133
#: src/views/invite/index.tsx:144
msgid "Go to app" msgid "Go to app"
msgstr "Перейти в приложение" msgstr "Перейти в приложение"
@@ -987,6 +1024,10 @@ msgstr "Импорт из Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>." msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Импортировать ваши доски Trello в Kan легко. Вы можете следовать нашему пошаговому руководству <0>здесь</0>." msgstr "Импортировать ваши доски Trello в Kan легко. Вы можете следовать нашему пошаговому руководству <0>здесь</0>."
#: src/components/CommandPallette.tsx:168
msgid "in"
msgstr "в"
#: src/views/boards/components/TemplateBoards.tsx:16 #: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22 #: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45 #: src/views/boards/components/TemplateBoards.tsx:45
@@ -1006,27 +1047,48 @@ msgstr "Интеграции"
msgid "Interviewing" msgid "Interviewing"
msgstr "Собеседование" msgstr "Собеседование"
#: src/views/members/components/InviteMemberForm.tsx:40 #: src/views/members/components/InviteMemberForm.tsx:51
msgid "Invalid email address" msgid "Invalid email address"
msgstr "Недействительный адрес электронной почты" msgstr "Недействительный адрес электронной почты"
#: src/views/members/index.tsx:221 #: src/views/invite/index.tsx:105
msgid "Invalid invitation"
msgstr "Недействительное приглашение"
#: src/views/members/index.tsx:222
msgid "Invite" msgid "Invite"
msgstr "Пригласить" msgstr "Пригласить"
#: src/views/members/components/InviteMemberForm.tsx:208 #: src/views/members/components/InviteMemberForm.tsx:202
msgid "Invite another" msgid "Invite link copied"
msgstr "Пригласить ещё одного" msgstr "Ссылка приглашения скопирована"
#: src/views/members/components/InviteMemberForm.tsx:203
msgid "Invite link copied to clipboard"
msgstr "Ссылка приглашения скопирована в буфер обмена"
#: src/views/members/components/InviteMemberForm.tsx:123
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Ссылки для приглашений требуют подписки Team или Pro. Пожалуйста, обновите ваше рабочее пространство."
#: src/views/card/components/MemberSelector.tsx:111 #: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:233 #: src/views/members/components/InviteMemberForm.tsx:365
msgid "Invite member" msgid "Invite member"
msgstr "Пригласить участника" msgstr "Пригласить участника"
#: src/views/members/components/InviteMemberForm.tsx:196 #: src/views/members/components/InviteMemberForm.tsx:329
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace." msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
msgstr "Для приглашения участников необходим командный план. Вы будете перенаправлены для обновления вашего рабочего пространства." 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 #: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior" msgid "Junior"
msgstr "Младший" msgstr "Младший"
@@ -1063,7 +1125,7 @@ msgstr "Язык"
msgid "Launch offer" msgid "Launch offer"
msgstr "Стартовое предложение" msgstr "Стартовое предложение"
#: src/views/members/index.tsx:191 #: src/views/members/index.tsx:192
msgid "Launch offer: Get unlimited members with Pro" msgid "Launch offer: Get unlimited members with Pro"
msgstr "Стартовое предложение: получите неограниченное количество участников с Pro" msgstr "Стартовое предложение: получите неограниченное количество участников с Pro"
@@ -1099,7 +1161,7 @@ msgstr "Список"
msgid "List name" msgid "List name"
msgstr "Название списка" msgstr "Название списка"
#: src/views/auth/login/index.tsx:31 #: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn" msgid "Login | kan.bn"
msgstr "Вход | kan.bn" msgstr "Вход | kan.bn"
@@ -1115,7 +1177,7 @@ msgstr "Долгосрочный"
msgid "Low Priority" msgid "Low Priority"
msgstr "Низкий приоритет" msgstr "Низкий приоритет"
#: src/components/AuthForm.tsx:369 #: src/components/AuthForm.tsx:418
msgid "magic link" msgid "magic link"
msgstr "магическая ссылка" msgstr "магическая ссылка"
@@ -1136,12 +1198,12 @@ msgstr "Средний приоритет"
#: src/views/board/components/Filters.tsx:93 #: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:357 #: src/views/board/components/NewCardForm.tsx:357
#: src/views/card/index.tsx:125 #: src/views/card/index.tsx:125
#: src/views/members/index.tsx:178 #: src/views/members/index.tsx:179
msgid "Members" msgid "Members"
msgstr "Участники" msgstr "Участники"
#. placeholder {0}: workspace.name ?? "Workspace" #. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:173 #: src/views/members/index.tsx:174
msgid "Members | {0}" msgid "Members | {0}"
msgstr "Участники | {0}" msgstr "Участники | {0}"
@@ -1149,7 +1211,7 @@ msgstr "Участники | {0}"
msgid "Monthly" msgid "Monthly"
msgstr "Ежемесячно" msgstr "Ежемесячно"
#: src/views/members/components/InviteMemberForm.tsx:93 #: src/views/members/components/InviteMemberForm.tsx:159
msgid "monthly billing" msgid "monthly billing"
msgstr "ежемесячная оплата" msgstr "ежемесячная оплата"
@@ -1245,6 +1307,10 @@ msgstr "Кредитная карта не требуется"
msgid "No lists" msgid "No lists"
msgstr "Нет списков" msgstr "Нет списков"
#: src/components/CommandPallette.tsx:184
msgid "No results found for \"{debouncedQuery}\"."
msgstr "Результаты для запроса \"{debouncedQuery}\" не найдены."
#: src/views/boards/components/TemplateBoards.tsx:65 #: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer" msgid "Offer"
msgstr "Предложение" msgstr "Предложение"
@@ -1261,7 +1327,7 @@ msgstr "После удаления аккаунта возврат будет
msgid "Once you delete your workspace, there is no going back. This action cannot be undone." msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "После удаления рабочего пространства возврат будет невозможен. Это действие необратимо." msgstr "После удаления рабочего пространства возврат будет невозможен. Это действие необратимо."
#: src/components/AuthForm.tsx:311 #: src/components/AuthForm.tsx:362
msgid "or" msgid "or"
msgstr "или" msgstr "или"
@@ -1281,6 +1347,14 @@ msgstr "Частичная занятость"
msgid "Password Changed" msgid "Password Changed"
msgstr "Пароль изменён" msgstr "Пароль изменён"
#: src/components/AuthForm.tsx:255
msgid "Password is required to login."
msgstr "Пароль необходим для входа."
#: src/components/AuthForm.tsx:254
msgid "Password is required to sign up."
msgstr "Пароль необходим для регистрации."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:22 #: src/views/settings/components/ChangePasswordConfirmation.tsx:22
msgid "Password must be at least 8 characters" msgid "Password must be at least 8 characters"
msgstr "Пароль должен содержать не менее 8 символов" msgstr "Пароль должен содержать не менее 8 символов"
@@ -1289,7 +1363,7 @@ msgstr "Пароль должен содержать не менее 8 симв
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "Пароли не совпадают" msgstr "Пароли не совпадают"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Paused" msgid "Paused"
msgstr "Приостановлено" msgstr "Приостановлено"
@@ -1297,7 +1371,7 @@ msgstr "Приостановлено"
msgid "Payment frequency" msgid "Payment frequency"
msgstr "Частота платежей" msgstr "Частота платежей"
#: src/views/members/index.tsx:134 #: src/views/members/index.tsx:135
msgid "Pending" msgid "Pending"
msgstr "В ожидании" msgstr "В ожидании"
@@ -1318,19 +1392,19 @@ msgstr "Планирование"
msgid "Please confirm your new password" msgid "Please confirm your new password"
msgstr "Пожалуйста, подтвердите новый пароль" msgstr "Пожалуйста, подтвердите новый пароль"
#: src/components/AuthForm.tsx:337 #: src/components/AuthForm.tsx:388
msgid "Please enter a valid email address" msgid "Please enter a valid email address"
msgstr "Пожалуйста, введите действительный адрес электронной почты" msgstr "Пожалуйста, введите действительный адрес электронной почты"
#: src/components/AuthForm.tsx:325 #: src/components/AuthForm.tsx:376
msgid "Please enter a valid name" msgid "Please enter a valid name"
msgstr "Пожалуйста, введите действительное имя" msgstr "Пожалуйста, введите действительное имя"
#: src/components/AuthForm.tsx:350 #: src/components/AuthForm.tsx:401
msgid "Please enter a valid password" msgid "Please enter a valid password"
msgstr "Пожалуйста, введите действительный пароль" msgstr "Пожалуйста, введите действительный пароль"
#: src/views/settings/components/Avatar.tsx:95 #: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload." msgid "Please select a file to upload."
msgstr "Пожалуйста, выберите файл для загрузки." msgstr "Пожалуйста, выберите файл для загрузки."
@@ -1359,10 +1433,10 @@ msgstr "Пожалуйста, выберите файл для загрузки.
#: src/views/card/components/NewCommentForm.tsx:31 #: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:173 #: src/views/card/index.tsx:173
#: src/views/members/components/DeleteMemberConfirmation.tsx:28 #: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:78 #: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:131 #: src/views/members/components/InviteMemberForm.tsx:234
#: src/views/settings/components/Avatar.tsx:81 #: src/views/settings/components/Avatar.tsx:78
#: src/views/settings/components/Avatar.tsx:222 #: src/views/settings/components/Avatar.tsx:219
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40 #: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55 #: src/views/settings/components/UpdateDisplayNameForm.tsx:55
@@ -1373,6 +1447,11 @@ msgstr "Пожалуйста, выберите файл для загрузки.
msgid "Please try again later, or contact customer support." msgid "Please try again later, or contact customer support."
msgstr "Пожалуйста, попробуйте позже или свяжитесь со службой поддержки." msgstr "Пожалуйста, попробуйте позже или свяжитесь со службой поддержки."
#: src/views/members/components/InviteMemberForm.tsx:129
#: src/views/members/components/InviteMemberForm.tsx:145
msgid "Please try again later."
msgstr "Пожалуйста, попробуйте позже."
#: src/views/home/components/Footer.tsx:50 #: src/views/home/components/Footer.tsx:50
#: src/views/home/components/Header.tsx:15 #: src/views/home/components/Header.tsx:15
#: src/views/home/components/Pricing.tsx:85 #: src/views/home/components/Pricing.tsx:85
@@ -1392,15 +1471,15 @@ msgstr "Политика конфиденциальности"
msgid "Private" msgid "Private"
msgstr "Личное" msgstr "Личное"
#: src/views/members/index.tsx:205 #: src/views/members/index.tsx:206
msgid "Pro Plan" msgid "Pro Plan"
msgstr "Профессиональный план" msgstr "Профессиональный план"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
msgid "Pro Plan ∞" msgid "Pro Plan ∞"
msgstr "Профессиональный план ∞" msgstr "Профессиональный план ∞"
#: src/views/settings/components/Avatar.tsx:67 #: src/views/settings/components/Avatar.tsx:64
msgid "Profile image updated" msgid "Profile image updated"
msgstr "Изображение профиля обновлено" msgstr "Изображение профиля обновлено"
@@ -1440,7 +1519,7 @@ msgstr "Удалённый"
msgid "Remove" msgid "Remove"
msgstr "Удалить" msgstr "Удалить"
#: src/views/members/index.tsx:148 #: src/views/members/index.tsx:149
msgid "Remove member" msgid "Remove member"
msgstr "Удалить участника" msgstr "Удалить участника"
@@ -1492,7 +1571,7 @@ msgstr "Обзор"
msgid "Roadmap" msgid "Roadmap"
msgstr "Дорожная карта" msgstr "Дорожная карта"
#: src/views/members/index.tsx:243 #: src/views/members/index.tsx:244
msgid "Role" msgid "Role"
msgstr "Роль" msgstr "Роль"
@@ -1501,7 +1580,7 @@ msgid "Run on your own infrastructure"
msgstr "Запустите на своей инфраструктуре" msgstr "Запустите на своей инфраструктуре"
#: src/views/card/components/Comment.tsx:165 #: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:312 #: src/views/settings/components/Avatar.tsx:309
msgid "Save" msgid "Save"
msgstr "Сохранить" msgstr "Сохранить"
@@ -1513,6 +1592,10 @@ msgstr "Экономьте время с помощью шаблонов дос
msgid "Screening" msgid "Screening"
msgstr "Отбор" msgstr "Отбор"
#: src/components/CommandPallette.tsx:104
msgid "Search boards and cards..."
msgstr "Поиск досок и карточек..."
#: src/views/boards/components/ImportBoardsForm.tsx:274 #: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all" msgid "Select all"
msgstr "Выбрать все" msgstr "Выбрать все"
@@ -1571,20 +1654,28 @@ msgstr "Настройки | Рабочая область"
msgid "Sign in" msgid "Sign in"
msgstr "Войти" msgstr "Войти"
#: src/views/auth/signup/index.tsx:32 #: src/views/invite/index.tsx:154
#: src/views/auth/signup/index.tsx:57 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" msgid "Sign up | kan.bn"
msgstr "Регистрация | kan.bn" msgstr "Регистрация | kan.bn"
#: src/views/auth/signup/index.tsx:42 #: src/views/auth/signup/index.tsx:44
msgid "Sign up disabled" msgid "Sign up disabled"
msgstr "Регистрация отключена" 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." msgid "Sign up is currently disabled. Please try again later."
msgstr "Регистрация в настоящее время отключена. Пожалуйста, попробуйте позже." msgstr "Регистрация в настоящее время отключена. Пожалуйста, попробуйте позже."
#: src/components/AuthForm.tsx:366 #: src/components/AuthForm.tsx:417
msgid "Sign up with " msgid "Sign up with "
msgstr "Зарегистрироваться с " msgstr "Зарегистрироваться с "
@@ -1608,8 +1699,12 @@ msgstr "Разработка программного обеспечения"
msgid "Star on Github" msgid "Star on Github"
msgstr "Поставить звезду на Github" msgstr "Поставить звезду на Github"
#: src/components/AuthForm.tsx:203 #: src/views/members/components/InviteMemberForm.tsx:122
#: src/components/AuthForm.tsx:220 msgid "Subscription Required"
msgstr "Требуется подписка"
#: src/components/AuthForm.tsx:212
#: src/components/AuthForm.tsx:229
msgid "Success" msgid "Success"
msgstr "Успех" msgstr "Успех"
@@ -1629,8 +1724,8 @@ msgstr "Поддержите развитие проекта"
msgid "System" msgid "System"
msgstr "Система" msgstr "Система"
#: src/views/members/components/InviteMemberForm.tsx:182 #: src/views/members/components/InviteMemberForm.tsx:315
#: src/views/members/index.tsx:207 #: src/views/members/index.tsx:208
msgid "Team Plan" msgid "Team Plan"
msgstr "Командный план" msgstr "Командный план"
@@ -1694,6 +1789,10 @@ msgstr "Эта доска является приватной или не сущ
msgid "This board URL has already been taken" msgid "This board URL has already been taken"
msgstr "Этот URL доски уже занят." 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 #: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:70
msgid "This will result in the permanent deletion of all data associated with this workspace." msgid "This will result in the permanent deletion of all data associated with this workspace."
msgstr "Это приведет к безвозвратному удалению всех данных, связанных с этим рабочим пространством." msgstr "Это приведет к безвозвратному удалению всех данных, связанных с этим рабочим пространством."
@@ -1909,7 +2008,7 @@ msgstr "Обновить до Pro"
msgid "Upgrade to Pro ($29/month)" msgid "Upgrade to Pro ($29/month)"
msgstr "Обновить до Pro ($29/месяц)" msgstr "Обновить до Pro ($29/месяц)"
#: src/views/members/components/InviteMemberForm.tsx:224 #: src/views/members/components/InviteMemberForm.tsx:357
msgid "Upgrade to Team Plan" msgid "Upgrade to Team Plan"
msgstr "Обновить до командного плана" msgstr "Обновить до командного плана"
@@ -1937,11 +2036,11 @@ msgstr "URL должен содержать не менее 3 символов"
msgid "Use template" msgid "Use template"
msgstr "Использовать шаблон" msgstr "Использовать шаблон"
#: src/views/members/index.tsx:237 #: src/views/members/index.tsx:238
msgid "User" msgid "User"
msgstr "Пользователь" msgstr "Пользователь"
#: src/views/members/components/InviteMemberForm.tsx:72 #: src/views/members/components/InviteMemberForm.tsx:98
msgid "User is already a member of this workspace" msgid "User is already a member of this workspace"
msgstr "Пользователь уже является участником этого рабочего пространства" msgstr "Пользователь уже является участником этого рабочего пространства"
@@ -1985,7 +2084,7 @@ msgstr "Мы используем лицензию <0>AGPL-3.0</0>."
msgid "We're just getting started. " msgid "We're just getting started. "
msgstr "Мы только начинаем. " msgstr "Мы только начинаем. "
#: src/views/auth/login/index.tsx:41 #: src/views/auth/login/index.tsx:43
msgid "Welcome back" msgid "Welcome back"
msgstr "С возвращением" msgstr "С возвращением"
@@ -2100,18 +2199,26 @@ msgstr "Вы можете пригласить участников команд
msgid "You can self-host by following the instructions in our <0>repo</0>." msgid "You can self-host by following the instructions in our <0>repo</0>."
msgstr "Вы можете развернуть собственный хостинг, следуя инструкциям в нашем <0>репозитории</0>." msgstr "Вы можете развернуть собственный хостинг, следуя инструкциям в нашем <0>репозитории</0>."
#: src/components/AuthForm.tsx:221 #: src/components/AuthForm.tsx:230
msgid "You have been logged in successfully." msgid "You have been logged in successfully."
msgstr "Вы успешно вошли в систему." msgstr "Вы успешно вошли в систему."
#: src/components/AuthForm.tsx:204 #: src/components/AuthForm.tsx:213
msgid "You have been signed up successfully." msgid "You have been signed up successfully."
msgstr "Вы успешно зарегистрировались." msgstr "Вы успешно зарегистрировались."
#: src/views/members/components/InviteMemberForm.tsx:186 #: src/views/members/components/InviteMemberForm.tsx:319
msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!" msgid "You have unlimited seats with your Pro Plan. There is no additional charge for new members!"
msgstr "В вашем профессиональном плане неограниченное количество мест. За новых участников дополнительная плата не взимается!" 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 #: src/views/settings/components/DeleteAccountConfirmation.tsx:28
msgid "Your account has been deleted." msgid "Your account has been deleted."
msgstr "Ваш аккаунт был удалён." msgstr "Ваш аккаунт был удалён."
@@ -2128,7 +2235,7 @@ msgstr "Ваше отображаемое имя было обновлено."
msgid "Your password has been changed." msgid "Your password has been changed."
msgstr "Ваш пароль был изменён." msgstr "Ваш пароль был изменён."
#: src/views/settings/components/Avatar.tsx:68 #: src/views/settings/components/Avatar.tsx:65
msgid "Your profile image has been updated." msgid "Your profile image has been updated."
msgstr "Ваше изображение профиля было обновлено." 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 type { ReactNode } from "react";
import { useRouter } from "next/navigation"; import { useRouter, useSearchParams } from "next/navigation";
import React, { createContext, useContext, useEffect, useState } from "react"; import React, { createContext, useContext, useEffect, useState } from "react";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
@@ -46,6 +46,8 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
); );
const [hasLoaded, setHasLoaded] = useState(false); const [hasLoaded, setHasLoaded] = useState(false);
const workspacePublicId = useSearchParams().get("workspacePublicId");
const { data, isLoading } = api.workspace.all.useQuery(); const { data, isLoading } = api.workspace.all.useQuery();
const utils = api.useUtils(); const utils = api.useUtils();
@@ -67,7 +69,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
} }
const storedWorkspaceId: string | null = const storedWorkspaceId: string | null =
localStorage.getItem("workspacePublicId"); workspacePublicId ?? localStorage.getItem("workspacePublicId");
if (data.length) { if (data.length) {
const workspaces = data.map(({ workspace, role }) => ({ const workspaces = data.map(({ workspace, role }) => ({
@@ -99,6 +101,11 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
description: selectedWorkspace.workspace.description, description: selectedWorkspace.workspace.description,
role: selectedWorkspace.role, role: selectedWorkspace.role,
}); });
if (workspacePublicId) {
router.push(`/boards`);
localStorage.setItem("workspacePublicId", workspacePublicId);
}
} else { } else {
const primaryWorkspace = data[0]?.workspace; const primaryWorkspace = data[0]?.workspace;
const primaryWorkspaceRole = data[0]?.role; const primaryWorkspaceRole = data[0]?.role;
@@ -114,7 +121,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
role: primaryWorkspaceRole, role: primaryWorkspaceRole,
}); });
} }
}, [data, isLoading]); }, [data, isLoading, workspacePublicId, router]);
return ( return (
<WorkspaceContext.Provider <WorkspaceContext.Provider

View File

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

View File

@@ -1,5 +1,5 @@
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter, useSearchParams } from "next/navigation";
import { t } from "@lingui/core/macro"; import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro"; import { Trans } from "@lingui/react/macro";
import { env } from "next-runtime-env"; import { env } from "next-runtime-env";
@@ -17,6 +17,8 @@ export default function SignUpPage() {
const [isMagicLinkSent, setIsMagicLinkSent] = useState<boolean>(false); const [isMagicLinkSent, setIsMagicLinkSent] = useState<boolean>(false);
const [magicLinkRecipient, setMagicLinkRecipient] = useState<string>(""); const [magicLinkRecipient, setMagicLinkRecipient] = useState<string>("");
const redirect = useSearchParams().get("next");
const { data } = authClient.useSession(); const { data } = authClient.useSession();
if (data?.user.id) router.push("/boards"); if (data?.user.id) router.push("/boards");
@@ -86,7 +88,9 @@ export default function SignUpPage() {
<Trans> <Trans>
Already have an account?{" "} Already have an account?{" "}
<span className="underline"> <span className="underline">
<Link href="/login">Sign in</Link> <Link href={redirect ? `/login?next=${redirect}` : "/login"}>
Sign in
</Link>
</span> </span>
</Trans> </Trans>
</p> </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 { env } from "next-runtime-env";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; 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 { z } from "zod";
import type { InviteMemberInput } from "@kan/api/types"; import type { InviteMemberInput } from "@kan/api/types";
@@ -31,11 +36,17 @@ export function InviteMemberForm({
userId: string | undefined; userId: string | undefined;
}) { }) {
const utils = api.useUtils(); 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 { closeModal } = useModal();
const { workspace } = useWorkspace(); const { workspace } = useWorkspace();
const { showPopup } = usePopup(); const { showPopup } = usePopup();
const isEmailEnabled = env("NEXT_PUBLIC_DISABLE_EMAIL") !== "true";
const InviteMemberSchema = z.object({ const InviteMemberSchema = z.object({
email: z.string().email({ message: t`Invalid email address` }), email: z.string().email({ message: t`Invalid email address` }),
workspacePublicId: z.string(), workspacePublicId: z.string(),
@@ -56,6 +67,21 @@ export function InviteMemberForm({
const refetchBoards = () => utils.board.all.refetch(); 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({ const inviteMember = api.member.invite.useMutation({
onSuccess: async () => { onSuccess: async () => {
closeModal(); closeModal();
@@ -64,7 +90,7 @@ export function InviteMemberForm({
}, },
onError: (error) => { onError: (error) => {
reset(); reset();
if (!isCreateAnotherEnabled) closeModal(); if (!isShareInviteLinkEnabled) closeModal();
if (error.data?.code === "CONFLICT") { if (error.data?.code === "CONFLICT") {
showPopup({ showPopup({
@@ -82,6 +108,46 @@ export function InviteMemberForm({
}, },
}); });
const createInviteLink = api.member.createInviteLink.useMutation({
onSuccess: (data) => {
setInviteLink(data.inviteLink);
setIsLoadingInviteLink(false);
},
onError: (error) => {
setIsLoadingInviteLink(false);
setIsShareInviteLinkEnabled(false);
if (error.data?.code === "FORBIDDEN") {
showPopup({
header: t`Subscription Required`,
message: t`Invite links require a Team or Pro subscription. Please upgrade your workspace.`,
icon: "error",
});
} else {
showPopup({
header: t`Error creating invite link`,
message: t`Please try again later.`,
icon: "error",
});
}
},
});
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 teamSubscription = getSubscriptionByPlan(subscriptions, "team");
const proSubscription = getSubscriptionByPlan(subscriptions, "pro"); const proSubscription = getSubscriptionByPlan(subscriptions, "pro");
@@ -92,7 +158,7 @@ export function InviteMemberForm({
let price = t`$10/month`; let price = t`$10/month`;
let billingType = t`monthly billing`; let billingType = t`monthly billing`;
if (teamSubscription?.periodStart && teamSubscription?.periodEnd) { if (teamSubscription?.periodStart && teamSubscription.periodEnd) {
const periodStartDate = new Date(teamSubscription.periodStart); const periodStartDate = new Date(teamSubscription.periodStart);
const periodEndDate = new Date(teamSubscription.periodEnd); const periodEndDate = new Date(teamSubscription.periodEnd);
const diffInDays = Math.round( const diffInDays = Math.round(
@@ -109,6 +175,43 @@ export function InviteMemberForm({
inviteMember.mutate(member); 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 {
showPopup({
header: t`Error`,
message: t`Failed to copy invite link`,
icon: "error",
});
}
};
const handleUpgrade = async () => { const handleUpgrade = async () => {
const { data, error } = await authClient.subscription.upgrade({ const { data, error } = await authClient.subscription.upgrade({
plan: "team", plan: "team",
@@ -156,23 +259,53 @@ export function InviteMemberForm({
<HiXMark size={18} className="dark:text-dark-9000 text-light-900" /> <HiXMark size={18} className="dark:text-dark-9000 text-light-900" />
</button> </button>
</div> </div>
<Input {isEmailEnabled && (
id="email" <Input
placeholder={t`Email`} id="email"
disabled={ placeholder={t`Email`}
env("NEXT_PUBLIC_KAN_ENV") === "cloud" && disabled={
!hasTeamSubscription && env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
!hasProSubscription !hasTeamSubscription &&
} !hasProSubscription
{...register("email", { required: true })}
onKeyDown={async (e) => {
if (e.key === "Enter") {
e.preventDefault();
await handleSubmit(onSubmit)();
} }
}} {...register("email", { required: true })}
errorMessage={errors.email?.message} onKeyDown={async (e) => {
/> if (e.key === "Enter") {
e.preventDefault();
await handleSubmit(onSubmit)();
}
}}
errorMessage={errors.email?.message}
/>
)}
{(!isEmailEnabled || (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" && ( {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"> <div className="mt-3 rounded-md bg-light-100 p-3 text-xs text-light-900 dark:bg-dark-200 dark:text-dark-900">
@@ -202,33 +335,32 @@ export function InviteMemberForm({
</div> </div>
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600"> <div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
{(hasTeamSubscription || hasProSubscription) && <Toggle
env("NEXT_PUBLIC_KAN_ENV") === "cloud" && ( label={
<Toggle isShareInviteLinkEnabled
label={t`Invite another`} ? t`Deactivate invite link`
isChecked={isCreateAnotherEnabled} : t`Create invite link`
onChange={() => }
setIsCreateAnotherEnabled(!isCreateAnotherEnabled) isChecked={isShareInviteLinkEnabled}
} disabled={
/> env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
)} !hasTeamSubscription &&
!hasProSubscription
}
onChange={handleInviteLinkToggle}
/>
<div> <div>
{env("NEXT_PUBLIC_KAN_ENV") === "cloud" && {env("NEXT_PUBLIC_KAN_ENV") === "cloud" &&
!hasTeamSubscription && !hasTeamSubscription &&
!hasProSubscription ? ( !hasProSubscription ? (
<Button <Button type="button" onClick={handleUpgrade}>
type="button"
onClick={handleUpgrade}
className="inline-flex w-full justify-center rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none dark:bg-dark-1000 dark:text-dark-50"
>
{t`Upgrade to Team Plan`} {t`Upgrade to Team Plan`}
</Button> </Button>
) : ( ) : (
<Button <Button
type="submit" type="submit"
disabled={inviteMember.isPending} disabled={inviteMember.isPending || !isEmailEnabled}
isLoading={inviteMember.isPending} isLoading={inviteMember.isPending}
className="inline-flex w-full justify-center rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none dark:bg-dark-1000 dark:text-dark-50"
> >
{t`Invite member`} {t`Invite member`}
</Button> </Button>

View File

@@ -1,6 +1,7 @@
import Link from "next/link"; import Link from "next/link";
import { t } from "@lingui/core/macro"; import { t } from "@lingui/core/macro";
import { env } from "next-runtime-env"; import { env } from "next-runtime-env";
import { useEffect, useState } from "react";
import { import {
HiBolt, HiBolt,
HiEllipsisHorizontal, HiEllipsisHorizontal,

View File

@@ -25,6 +25,9 @@ services:
- SMTP_PASSWORD=${SMTP_PASSWORD} - SMTP_PASSWORD=${SMTP_PASSWORD}
- EMAIL_FROM=${EMAIL_FROM} - EMAIL_FROM=${EMAIL_FROM}
# Disable email features entirely (optional)
- NEXT_PUBLIC_DISABLE_EMAIL=${NEXT_PUBLIC_DISABLE_EMAIL}
# S3 storage (optional) # S3 storage (optional)
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID} - S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY} - S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}

View File

@@ -1,14 +1,19 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { z } from "zod"; import { z } from "zod";
import * as inviteLinkRepo from "@kan/db/repository/inviteLink.repo";
import * as memberRepo from "@kan/db/repository/member.repo"; import * as memberRepo from "@kan/db/repository/member.repo";
import * as subscriptionRepo from "@kan/db/repository/subscription.repo"; import * as subscriptionRepo from "@kan/db/repository/subscription.repo";
import * as userRepo from "@kan/db/repository/user.repo"; import * as userRepo from "@kan/db/repository/user.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.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 { updateSubscriptionSeats } from "@kan/stripe";
import { createTRPCRouter, protectedProcedure } from "../trpc"; import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
import { assertUserInWorkspace } from "../utils/auth"; import { assertUserInWorkspace } from "../utils/auth";
export const memberRouter = createTRPCRouter({ export const memberRouter = createTRPCRouter({
@@ -241,4 +246,403 @@ export const memberRouter = createTRPCRouter({
return { success: true }; 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");
// Check subscription for cloud environment
if (process.env.NEXT_PUBLIC_KAN_ENV === "cloud") {
const subscriptions = await subscriptionRepo.getByReferenceId(
ctx.db,
workspace.publicId,
);
const activeTeamSubscription = getSubscriptionByPlan(
subscriptions,
"team",
);
const activeProSubscription = getSubscriptionByPlan(
subscriptions,
"pro",
);
if (!activeTeamSubscription && !activeProSubscription) {
throw new TRPCError({
message: `Invite links require a Team or Pro subscription`,
code: "FORBIDDEN",
});
}
}
// Deactivate any existing active invite links
await inviteLinkRepo.deactivateAllActiveForWorkspace(ctx.db, {
workspaceId: workspace.id,
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

@@ -409,4 +409,80 @@ export const workspaceRouter = createTRPCRouter({
isReserved: workspaceSlug?.type === "reserved", isReserved: workspaceSlug?.type === "reserved",
}; };
}), }),
search: protectedProcedure
.meta({
openapi: {
summary: "Search boards and cards in a workspace",
method: "GET",
path: "/workspaces/{workspacePublicId}/search",
description:
"Searches for boards and cards by title within a workspace",
tags: ["Workspaces"],
protect: true,
},
})
.input(
z.object({
workspacePublicId: z.string().min(12),
query: z.string().min(1).max(100),
limit: z.number().min(1).max(50).optional().default(20),
}),
)
.output(
z.array(
z.discriminatedUnion("type", [
z.object({
publicId: z.string(),
title: z.string(),
description: z.string().nullable(),
slug: z.string(),
updatedAt: z.date().nullable(),
createdAt: z.date(),
type: z.literal("board"),
}),
z.object({
publicId: z.string(),
title: z.string(),
description: z.string().nullable(),
boardPublicId: z.string(),
boardName: z.string(),
listName: z.string(),
updatedAt: z.date().nullable(),
createdAt: z.date(),
type: z.literal("card"),
}),
]),
),
)
.query(async ({ ctx, input }) => {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
const workspace = await workspaceRepo.getByPublicId(
ctx.db,
input.workspacePublicId,
);
if (!workspace)
throw new TRPCError({
message: `Workspace not found`,
code: "NOT_FOUND",
});
await assertUserInWorkspace(ctx.db, userId, workspace.id);
const result = await workspaceRepo.searchBoardsAndCards(
ctx.db,
workspace.id,
input.query,
input.limit,
);
return result;
}),
}); });

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 $$;

View File

@@ -0,0 +1,4 @@
CREATE EXTENSION IF NOT EXISTS pg_trgm; --> statement-breakpoint
CREATE INDEX IF NOT EXISTS boards_name_trgm_idx ON board USING gin (name gin_trgm_ops);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS cards_title_trgm_idx ON card USING gin (title gin_trgm_ops);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -95,9 +95,32 @@ export const create = async (
.having(gt(countExpr, 1)); .having(gt(countExpr, 1));
if (duplicateIndices.length > 0) { if (duplicateIndices.length > 0) {
throw new Error( // Compact indices for this list to sequential values (0..n-1) preserving order
`Duplicate indices found after creating card ${result[0].id}`, await tx.execute(sql`
); WITH ordered AS (
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
FROM "card"
WHERE "listId" = ${result[0].listId} AND "deletedAt" IS NULL
)
UPDATE "card" c
SET "index" = o.new_index
FROM ordered o
WHERE c.id = o.id;
`);
// Last resort: verify fix; rollback if duplicates persist
const postFixDupes = await tx
.select({ index: cards.index, count: countExpr })
.from(cards)
.where(and(eq(cards.listId, result[0].listId), isNull(cards.deletedAt)))
.groupBy(cards.listId, cards.index)
.having(gt(countExpr, 1));
if (postFixDupes.length > 0) {
throw new Error(
`Invariant violation: duplicate card indices remain after compaction in list ${result[0].listId}`,
);
}
} }
return result[0]; return result[0];
@@ -219,11 +242,95 @@ export const bulkCreate = async (
importId?: number; importId?: number;
}[], }[],
) => { ) => {
const result = await db.insert(cards).values(cardInput).returning({ if (cardInput.length === 0) return [];
id: cards.id,
});
return result; return db.transaction(async (tx) => {
// Group incoming cards by list to compute safe, sequential indices per list
const byList = new Map<number, typeof cardInput>();
for (const item of cardInput) {
const arr = byList.get(item.listId) ?? [];
arr.push(item);
byList.set(item.listId, arr);
}
const allValuesToInsert: {
publicId: string;
title: string;
description: string;
createdBy: string;
listId: number;
index: number;
importId?: number;
}[] = [];
// For each list, append incoming cards after current max index, preserving incoming order
for (const [listId, items] of byList.entries()) {
const last = await tx.query.cards.findFirst({
columns: { index: true },
where: and(eq(cards.listId, listId), isNull(cards.deletedAt)),
orderBy: [desc(cards.index)],
});
let nextIndex = last ? last.index + 1 : 0;
const sorted = [...items].sort((a, b) => a.index - b.index);
for (const it of sorted) {
allValuesToInsert.push({
publicId: it.publicId,
title: it.title,
description: it.description,
createdBy: it.createdBy,
listId: it.listId,
index: nextIndex++,
importId: it.importId,
});
}
}
const inserted = await tx
.insert(cards)
.values(allValuesToInsert)
.returning({ id: cards.id });
// Post-insert: compact per list if duplicates exist; then verify
const countExpr = sql<number>`COUNT(*)`.mapWith(Number);
for (const listId of byList.keys()) {
const duplicateIndices = await tx
.select({ index: cards.index, count: countExpr })
.from(cards)
.where(and(eq(cards.listId, listId), isNull(cards.deletedAt)))
.groupBy(cards.listId, cards.index)
.having(gt(countExpr, 1));
if (duplicateIndices.length > 0) {
await tx.execute(sql`
WITH ordered AS (
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
FROM "card"
WHERE "listId" = ${listId} AND "deletedAt" IS NULL
)
UPDATE "card" c
SET "index" = o.new_index
FROM ordered o
WHERE c.id = o.id;
`);
const postFixDupes = await tx
.select({ index: cards.index, count: countExpr })
.from(cards)
.where(and(eq(cards.listId, listId), isNull(cards.deletedAt)))
.groupBy(cards.listId, cards.index)
.having(gt(countExpr, 1));
if (postFixDupes.length > 0) {
throw new Error(
`Invariant violation: duplicate card indices remain after compaction in list ${listId}`,
);
}
}
}
return inserted;
});
}; };
export const createCardLabelRelationship = async ( export const createCardLabelRelationship = async (
@@ -606,9 +713,53 @@ export const reorder = async (
.having(gt(countExpr, 1)); .having(gt(countExpr, 1));
if (duplicateIndices.length > 0) { if (duplicateIndices.length > 0) {
throw new Error( // Auto-heal by compacting indices for the affected list(s)
`Duplicate indices found after reordering card ${card.id}`, const affectedListIds = [currentList.id, newList?.id].filter(
(id): id is number => id !== undefined,
); );
if (affectedListIds.length === 1) {
await tx.execute(sql`
WITH ordered AS (
SELECT id, ROW_NUMBER() OVER (ORDER BY "index", id) - 1 AS new_index
FROM "card"
WHERE "listId" = ${affectedListIds[0]} AND "deletedAt" IS NULL
)
UPDATE "card" c
SET "index" = o.new_index
FROM ordered o
WHERE c.id = o.id;
`);
} else if (affectedListIds.length === 2) {
await tx.execute(sql`
WITH ordered AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY "listId" ORDER BY "index", id) - 1 AS new_index
FROM "card"
WHERE "listId" IN (${sql.join(affectedListIds, sql`,`)}) AND "deletedAt" IS NULL
)
UPDATE "card" c
SET "index" = o.new_index
FROM ordered o
WHERE c.id = o.id;
`);
}
// Verify fix and rollback if necessary
const postFixDupes = await tx
.select({ index: cards.index, count: countExpr })
.from(cards)
.where(
and(inArray(cards.listId, affectedListIds), isNull(cards.deletedAt)),
)
.groupBy(cards.listId, cards.index)
.having(gt(countExpr, 1));
if (postFixDupes.length > 0) {
throw new Error(
`Invariant violation: duplicate card indices remain after compaction for card ${card.id}`,
);
}
} }
const updatedCard = await tx.query.cards.findFirst({ const updatedCard = await tx.query.cards.findFirst({

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

@@ -1,7 +1,13 @@
import { and, eq, inArray, isNull } from "drizzle-orm"; import { and, desc, eq, ilike, inArray, isNull, or, sql } from "drizzle-orm";
import type { dbClient } from "@kan/db/client"; import type { dbClient } from "@kan/db/client";
import { boards, workspaceMembers, workspaces } from "@kan/db/schema"; import {
boards,
cards,
lists,
workspaceMembers,
workspaces,
} from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils"; import { generateUID } from "@kan/shared/utils";
export const create = async ( export const create = async (
@@ -87,11 +93,25 @@ export const getByPublicId = (db: dbClient, workspacePublicId: string) => {
publicId: true, publicId: true,
name: true, name: true,
plan: true, plan: true,
slug: true,
}, },
where: eq(workspaces.publicId, workspacePublicId), 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 = ( export const getByPublicIdWithMembers = (
db: dbClient, db: dbClient,
workspacePublicId: string, workspacePublicId: string,
@@ -260,3 +280,84 @@ export const isUserInWorkspace = async (
return result?.id !== undefined; return result?.id !== undefined;
}; };
export const searchBoardsAndCards = async (
db: dbClient,
workspaceId: number,
query: string,
limit = 20,
) => {
const searchQuery = `%${query}%`;
// Search for boards
const boardResults = await db
.select({
publicId: boards.publicId,
title: boards.name,
description: boards.description,
slug: boards.slug,
updatedAt: boards.updatedAt,
createdAt: boards.createdAt,
})
.from(boards)
.where(
and(
eq(boards.workspaceId, workspaceId),
// Combine exact and fuzzy matching
or(
ilike(boards.name, `%${query}%`), // Exact substring match
sql`similarity(${boards.name}, ${query}) > 0.2`, // Fuzzy match
),
isNull(boards.deletedAt),
),
)
.orderBy(
sql`CASE WHEN ${boards.name} ILIKE ${`%${query}%`} THEN 1 ELSE 0 END DESC`,
sql`similarity(${boards.name}, ${query}) DESC`,
desc(boards.updatedAt),
)
.limit(Math.ceil(limit * 0.4));
// Search for cards
const cardResults = await db
.select({
publicId: cards.publicId,
title: cards.title,
description: cards.description,
boardPublicId: boards.publicId,
boardName: boards.name,
listName: lists.name,
updatedAt: cards.updatedAt,
createdAt: cards.createdAt,
})
.from(cards)
.innerJoin(lists, eq(cards.listId, lists.id))
.innerJoin(boards, eq(lists.boardId, boards.id))
.where(
and(
eq(boards.workspaceId, workspaceId),
or(
ilike(cards.title, searchQuery),
sql`similarity(${cards.title}, ${query}) > 0.2`,
),
isNull(cards.deletedAt),
isNull(lists.deletedAt),
isNull(boards.deletedAt),
),
)
.orderBy(
sql`CASE WHEN ${cards.title} ILIKE ${searchQuery} THEN 1 ELSE 0 END DESC`,
sql`similarity(${cards.title}, ${query}) DESC`,
desc(cards.updatedAt),
)
.limit(Math.floor(limit * 0.6));
// Combine results
const allResults = [
...boardResults.map((board) => ({ ...board, type: "board" as const })),
...cardResults.map((card) => ({ ...card, type: "card" as const })),
];
// Ensure we don't exceed the total limit
return allResults.slice(0, limit);
};

View File

@@ -11,3 +11,4 @@ export * from "./users";
export * from "./integrations"; export * from "./integrations";
export * from "./workspaces"; export * from "./workspaces";
export * from "./subscriptions"; 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();

View File

@@ -89,6 +89,7 @@
"APPLE_CLIENT_ID", "APPLE_CLIENT_ID",
"APPLE_CLIENT_SECRET", "APPLE_CLIENT_SECRET",
"APPLE_APP_BUNDLE_IDENTIFIER", "APPLE_APP_BUNDLE_IDENTIFIER",
"NEXT_PUBLIC_DISABLE_EMAIL",
"EMAIL_FROM", "EMAIL_FROM",
"SMTP_HOST", "SMTP_HOST",
"SMTP_PORT", "SMTP_PORT",