Compare commits

..

9 Commits

Author SHA1 Message Date
Henry
44566f4838 fix: enable scroll on card page 2025-07-02 14:37:56 +01:00
Henry
30b3332d1f fix: prevent zooming on ios 2025-07-02 14:18:32 +01:00
Henry
24e418a239 fix: display theme background and set dynamic viewport height 2025-07-02 14:07:09 +01:00
Henry
4045ccbfd8 fix: add min width to dashboard 2025-07-02 13:56:35 +01:00
LovelessCodes
ec1b5d5acb feat: basic mobile support (#64)
* feat: add mobile navigation with responsive layout and theme controls

* feat: prevent workspace owners from removing themselves and update workspace dropdown styling

* feat: add useClickOutside hook and event listener utilities for improved UI interactions

* chore: improve mobile UI styling

* refactor: improve UI layout and buttons in boards/members views
feat: adjust /members layout

* fix: standardize layout containers and improve mobile navigation styling

* feat: update card view layout

* feat: add responsive layout to board view

* feat: readjust boards page layout

* feat: enhance table view on mobile for members page

* feat: extend mobile support with sliding side panels

* fix: prevent two panels from being open at the same time

* feat: close panels when clicking outside

* fix: adjust font-sizing for import source

---------

Co-authored-by: Henry <henry_ball@hotmail.co.uk>
2025-07-02 11:58:10 +01:00
LovelessCodes
316f148663 feat: add template selection when creating new boards with predefined… (#42)
* feat: add template selection when creating new boards with predefined lists

* feat: extend templates with labels, update design and add translations

* feat: add validation and error states to new board form

---------

Co-authored-by: Henry <henry_ball@hotmail.co.uk>
2025-06-29 21:53:37 +01:00
Henry
67050be27f chore: fix links in changelog 2025-06-28 22:11:22 +01:00
Henry
ff4448ebf4 chore: setup changelog (#97) 2025-06-28 22:06:58 +01:00
Henry
dd061c6d00 feat: localisation and multi-lang support (#95)
* feat: setup localisation with lingui

* Fix hydration and locale issues

* Add missing translations and tweak selector styling

* Extend language support

* Update lang support

* Extend lang support

* Fix build and add dyanmic imports
2025-06-25 21:30:24 +01:00
36 changed files with 2560 additions and 201 deletions

85
CHANGELOG.md Normal file
View File

@@ -0,0 +1,85 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/kanbn/kan/compare/v0.2.2...HEAD)
## [0.2.2](https://github.com/kanbn/kan/compare/v0.2.1...v0.2.2) - 2025-06-28
### Added
- Localization and multi-language support
- URLs are now rendered as clickable links in card descriptions
### Changed
- Improved email configuration with optional SMTP authentication
## [0.2.1](https://github.com/kanbn/kan/compare/v0.2.0...v0.2.1) - 2025-06-19
### Added
- PostHog analytics integration
- Debug logging for email functionality
- Standalone mode support for Next.js
- Environment variable for configuring web port
- Docker Compose setup with PostgreSQL
### Changed
- SMTP authentication is now optional
- Added `SMTP_SECURE` configuration option
- Improved Docker build process with better context handling
### Fixed
- Default output mode for Next.js builds
- Container environment variable configuration
- Docker Compose volume naming
- Build context and static file copying in Docker
- Comment rendering inside contenteditable elements
## [0.2.0](https://github.com/kanbn/kan/compare/v0.1.0...v0.2.0) - 2025-06-10
### Added
- Trello integration with OAuth authentication and user field mapping
- Board visibility controls with dropdown menu and success notifications
- Markdown editor for card descriptions
- Email/password authentication for self-hosters
- Account deletion functionality with cascade delete for workspaces
- Enhanced scrollbar styles for dark mode
### Changed
- Simplified auth configuration to use `NEXT_PUBLIC_BASE_URL` instead of `BETTER_AUTH_URL`
- Updated self-hosting documentation
- Improved database schema with relation names
### Fixed
- List buttons stacking issue
- Editor onChange prop is now optional
- Renamed markdown prop to content in Editor component
- Router navigation for disabled signup redirects
## [0.1.0](https://github.com/kanbn/kan/releases/tag/v0.1.0) - 2025-06-02
### Added
- Initial release of Kan
- Core project management features
- Board, list, and card management
- User authentication system
- Workspace collaboration
- Comment system
- Activity logging
- Docker deployment support
- Self-hosting capabilities
### Changed
- Updated license link in footer

View File

@@ -27,15 +27,23 @@ checksums:
An%20error%20occurred%20while%20disconnecting%20your%20Trello%20account./singular: 0aa3973b860c1faf8d9123aebf567e40
API%20keys/singular: 07f3620a30e08136f0b072c9af8d1eef
API%20Reference/singular: 7dcc877064bfdf889ec55dbc9e06a242
Applicants/singular: 4babd8331a1441e91087f855f43e57f8
Approval/singular: 2f5426445800ecd5a3102aac940d459c
Are%20you%20sure%20want%20to%20remove%20%7BentityLabel%7D%3F/singular: f9b67026c5ef86ac4d5944380d571961
Are%20you%20sure%20you%20want%20to%20delete%20the%20workspace%20%7B0%7D%3F/singular: 27ba2854202dd77c51e78c64e5c93946
Are%20you%20sure%20you%20want%20to%20delete%20this%20card%3F/singular: 131a5a7cccca7be8b32c987d9fa0b0c0
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
Are%20you%20sure%20you%20want%20to%20delete%20your%20account%3F/singular: 428b74d781063224c3e63980e1094ec3
assigned%20%3C0%3E%7BmemberName%7D%3C%2F0%3E%20to%20the%20card/singular: 4fb1c419a78a0f010a3e5790801551fc
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
Backlog/singular: 35919fd5b10ad212839a75e72829fe4e
Basic%20Kanban/singular: e46ebc406749486f3907436970d4d6c7
Billing/singular: b01dbdd049ebbd4a349fa64d6ce65a3b
Billing%20portal/singular: dc3afa14ffe19f5920992a0c9d49d525
Blog%20Post/singular: 38e027f212be445dc530e427fc642a20
Board/singular: 101ff39aab674c033c15ab978d0d8bac
Board%20name%20cannot%20exceed%20100%20characters/singular: 985c0177744ec56d8dac84f66ec284ca
Board%20name%20is%20required/singular: dbd0c6cc945ab19e702fc27f970a023b
Board%20not%20found/singular: 5af9844595fa8aed5985066620435515
Board%20URL%20can%20only%20contain%20letters%2C%20numbers%2C%20and%20hyphens/singular: ba018946ffdf85e55d701a9c27595b4d
Board%20URL%20cannot%20exceed%2060%20characters/singular: 8fd3417559a56aa42d297b14d480c382
@@ -45,6 +53,9 @@ checksums:
Board%20visibility%20updated/singular: 8e2f5d622fa9c94481e7c1629a154ecf
Boards/singular: 8fff51c5872e051beb9b718336665e80
Boards%20%7C%20%7B0%7D/singular: 70c349df806f4b2d8bd28136a45496f0
Brainstorming/singular: 736332f2e4488609e42d2be8547d296e
Bug/singular: 4509fffdb5931f8905063c80cf802d71
Bug%20Report/singular: e558d1f100e21230c2f495a8913ac5ec
Cancel/singular: 2e2a849c2223911717de8caa2c71bade
Card%20not%20found/singular: 91509e2f92b0b3b11330b6983139fdbf
Card%20title/singular: 7c34f59f4005e6cb3a6ff546ea0b96e3
@@ -52,10 +63,12 @@ checksums:
Check%20your%20inbox/singular: e9a430fcd298def74212238df0f680d6
Clear%20filters/singular: 8f40ab5af527e4b190da94e7b6221379
Click%20on%20the%20link%20we've%20sent%20to%20%7BmagicLinkRecipient%7D%20to%20sign%20in./singular: 210b6ff8727f976182ec3f29ea3c7667
Code%20Review/singular: a2da6c2339301e7c3ddf068c4ff9f7e8
Collaborate%20seamlessly%20with%20your%20team./singular: c5f10e431aaf8b51519bc009a4a4080c
Coming%20soon/singular: ee2b0671e00972773210c5be5a9ccb89
Comments/singular: 502237cd1044491c48494aa60967a985
Company/singular: 9e36d11fa82d1bd4563eef2abc4fcfba
Complete/singular: d3e36d723de0cfdea51c5b4171d30b4d
Complete%20control%20and%20ownership%3A/singular: 0d8b682ba873272217425ccfc96aa9cd
Confirm%20URL%20change/singular: e14b4ce081d1ef6194b37e1814e97b39
Connect%20Trello/singular: 4440a0b9e387ef7136e3958e7a089213
@@ -63,6 +76,7 @@ checksums:
Connect%20your%20Trello%20account%20to%20import%20boards./singular: 84a510a7485f43e43f2191bd161171d7
Contact/singular: 9afa39bc47019ee6dec6c74b6273967c
Contact%20us/singular: 694a45bc5c96f6f3a27873c1cf5a7707
Content%20Creation/singular: 4e6be22ade0188f408471325fe363575
Continue%20with%20/singular: 8ed03cf7c5e60a6edf3470a4558ff058
Continue%20with%20%7B0%7D/singular: 2eaf6e1da91e208f7c5fb6bf862fe8a6
Control%20who%20can%20view%20and%20edit%20your%20boards./singular: 2a7e0bec29bac26280de707e2fe8bce5
@@ -77,8 +91,10 @@ checksums:
Create%20new%20list/singular: ce61ca8be7b3f6c26c32b684a42a2c26
Create%20workspace/singular: 2e6718e79964ea5ce22d76c2189c77ca
created%20the%20card/singular: 605475f5aaeb4dbccbf7c4eb9107b43d
Critical/singular: eb327cd411b50aee954f8d1d215d003a
Custom%20domain/singular: b09e7a9c187b7163b4a6cfc78042fe42
Custom%20URLs%20are%20a%20premium%20feature.%20You'll%20be%20directed%20to%20upgrade%20your%20account./singular: b52e4f6122cf739c9551d29beb89b25e
Customer%20Support/singular: 50e3c77e22e41061ca85ea2f02625a2e
Dark/singular: 73e6e208ba628b26e90fcf6dce15e1b2
Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9
Delete%20account/singular: a9d11113f1a1d7e20582bdcc9633bcef
@@ -87,6 +103,7 @@ checksums:
Delete%20comment/singular: a3dae0c9ddbc73677aad9812e3dffd69
Delete%20list/singular: b694f58e4c973d8797a78e746b550b1f
Delete%20workspace/singular: 9017c821209528d9b20d40a488854cdf
Design/singular: 991b75727b6784c1a063a7462b76186d
Disconnect%20Trello/singular: a2dd737d133887d34504728c7e7f05e3
Discuss%20and%20collaborate%20on%20cards./singular: f2e87816709f602130831ead50bba457
Display%20name/singular: 725f331065e9d594d720d07b1ae51a90
@@ -98,11 +115,14 @@ checksums:
Docs/singular: 55fea190a0c0fb32acd3dc986cd3cc91
Documentation/singular: 1563fcb5ddb5037b0709ccd3dd384a92
Don't%20have%20an%20account%3F%20%3C0%3E%3C1%3ESign%20up%3C%2F1%3E%3C%2F0%3E/singular: 6ae8282ab8b4a01b4ce87b119e13714b
Done/singular: ffd408fa29d5bc9039ef8ea1b9b699bb
Edit%20board%20URL/singular: d8276dfc0189f371ec7d80a2047c07aa
Edit%20comment/singular: 7e4b46525fcb6b47b71798e31c46e374
Edit%20label/singular: 0309e0be1512b1e0b0ceb87c69a53d03
Editing/singular: 3449a7988cd69207b7c6929af1f4abf1
email/singular: f31eb214738e037d58e26149797739df
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
Enhancement/singular: 785fe23c0eef0a5b60b5b2a88151de31
Enter%20your%20email%20address/singular: 9bc008365ebe3e404e241c8ca876f56e
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
@@ -117,8 +137,11 @@ checksums:
Error%20uploading%20profile%20image/singular: 0ba02753a797a74c6ea7b622c9f69c71
Everything%20in%20the%20free%20plan%2C%20plus%3A/singular: 62b44c4973b92b806c69a4b15e0256dc
Everything%20you%20need%2C%20free%20forever.%20Unlimited%20boards%2C%20unlimited%20lists%2C%20unlimited%20cards.%20Upgrade%20any%20time./singular: fa21632ab1468edf10acda2fe7b71323
Execution/singular: cbac4a3c721123cbc6a883560bf29800
Failed%20to%20login%20with%20%7B0%7D.%20Please%20try%20again./singular: 669a4b4247a73f53fb9b8b16e42d166f
FAQs/singular: dc36d7992372ccd419b39ef51cf5b16c
Feature/singular: 58f5f3f37862b6312a2f20ec1a1fd0e8
Feature%20Request/singular: c9de91b9a7020213381977f7d147064f
Features/singular: 341ff316a339b106a178f0b8d362951b
Feedback/singular: 6fac88806e0c269a30777b283988c61c
Feedback%20sent/singular: 38a490c7ad5f1aa6013dfa879d2c7818
@@ -127,6 +150,8 @@ checksums:
For%20long-term%20sustainability%2C%20we%20recognise%20all%20good%20open%20source%20projects%20need%20a%20source%20of%20revenue.%20Ours%20comes%20from%20the%20paid%20cloud%20offering%20for%20workspaces%20with%20multiple%20users%20(free%20during%20the%20beta)%20and%20for%20custom%20workspace%20slugs.%20There's%20no%20obligation%20to%20use%20it%2C%20and%20you%20can%20self-host%20the%20software%20on%20your%20own%20infrastructure%20free%20of%20charge./singular: 4eedacd4311ff69bf0fd87083c90a268
Free/singular: 0326365539c004f6088656f692602078
Free%2C%20forever/singular: ae4f2f81e88a50b5f250ef8e8e77e74b
Full-time/singular: fe6e201f6676ae354111435cf6c76910
Fun/singular: 395bdc48e943762b6cde649f4a96771d
Get%20started/singular: 5c783951b0100a168bdd2161ff294833
Get%20Started/singular: 1d5f030c4ec9c869e647ae060518b948
Get%20started%20by%20creating%20a%20new%20board/singular: 8fe63ba47e12bbf950f3eb33d1008993
@@ -137,6 +162,8 @@ checksums:
Getting%20started/singular: 8e5e7bd026b5bec46bbfdce02ab9e0b8
GitHub/singular: 6e1cf3c00fa6fbe24afcc78ea3b5f3e4
Go%20to%20app/singular: 896d0441384dcd2bfb3b23d61ff1944d
High%20Priority/singular: 5d231ff8254aabc875f194c4b4f49c97
Hired/singular: e5a9b1bd409b007141fe3d7890022f9a
Host%20Kan%20on%20your%20own%20infrastructure.%20Ideal%20for%20organisations%20that%20need%20complete%20control%20over%20their%20data./singular: 8e7ae0783d60ef4624d3caf9bfc3747f
How%20do%20I%20get%20a%20custom%20URL%3F/singular: 5b28fb95969c0dd19e1b9c9ab8a5fb29
How%20do%20I%20import%20my%20Trello%20boards%3F/singular: 44b30a727150cb93364af0a10346012a
@@ -145,23 +172,29 @@ checksums:
How%20is%20the%20project%20funded%3F/singular: ba7e936f7b1b5faa47df59a0ef990092
I%20acknowledge%20that%20all%20of%20my%20account%20data%20will%20be%20permanently%20deleted%20and%20want%20to%20proceed./singular: 2ffc824d0b1f9e883c2e87ed4b8b40b6
I%20acknowledge%20that%20all%20of%20the%20workspace%20data%20will%20be%20permanently%20deleted%20and%20want%20to%20proceed./singular: fe1183a7439299210d8ab7379b8f4d01
Ideas/singular: 27c24b56895defecd10b0171b39bc93f
Ideas%20to%20improve%20this%20page.../singular: 285decc2cc28403fae043d9b4de97a00
Import/singular: 348b8ab981de5b7f1fca6d7302263bbd
Import%20complete/singular: 7e749df6f068b9cdf1055ea38c9a80af
Import%20failed/singular: bcec1f271c82ddffc91ebc22021b03cb
Import%20your%20Trello%20boards%20and%20hit%20the%20ground%20running./singular: d66d13649f81342f8b3a4f3b54370c20
Important/singular: 4cf0e8fc8e4e7c5c9b9458059a172a2b
Importing%20from%20Trello/singular: 1e3a46fb9bd8ce8c7d632f9555b5bd7c
Importing%20your%20Trello%20boards%20into%20Kan%20is%20easy.%20You%20can%20follow%20our%20step-by-step%20guide%20%3C0%3Ehere%3C%2F0%3E./singular: ca88dc22801fef08fee1ecfb1bf6914e
In%20Progress/singular: 3de9afebcb9d4ce8ac42e14995f79ffd
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
Invite/singular: 181884cea804cbde665f160811ee7ad0
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
Kanban%20reimagined/singular: 613ccfdd9f54c66cbf68cfa313498766
Keep%20in%20mind%20that%20this%20action%20is%20irreversible./singular: 79702b2ad3be71cb8b87f1122a60c199
Labels/singular: 6f15627a90002323eac018274b6922d6
Labels%20%26%20Filters/singular: 8f0bdd6084516f8241cb613178114390
Language/singular: 277fd1a41cc237a437cd1d5e4a80463b
Learning/singular: 90e91da3f870f065f2da9aa9adf53514
Legal/singular: 00d3f08da61a21887009819cf93fb414
License/singular: ac2bcac75151e2fcd9eb768cea275a77
Light/singular: bb78ea2c6edd8662676c81a8a13ecb93
@@ -170,7 +203,10 @@ checksums:
List%20name/singular: e925e2e6ccaf0eb4064a888aaea8d3c2
Login%20%7C%20kan.bn/singular: 42a6c8dcd73e0d46e652646dc86871eb
Logout/singular: 07948fdf20705e04a7bf68ab197512bf
Long-term/singular: 51cb6f0b112250c5a091ca5f0866904b
Low%20Priority/singular: 509b5cb7c1e8a185e0aa6d38c64c90e8
magic%20link/singular: db9d17a5bd98bba8aa0d8068c68579f3
Medium%20Priority/singular: 1f527cd6d1ed602930bcaa303f503b51
Members/singular: 0932e80cba1e3e0a7f52bb67ff31da32
Members%20%7C%20%7B0%7D/singular: a29e3e9f1076acd178c417d047584e88
Monthly/singular: 818f1192e32bb855597f930d3e78806e
@@ -184,19 +220,27 @@ checksums:
New%20import/singular: e8fddfe15dd170277df919e5d37efd47
New%20label/singular: 890040da52a88c16c249a4ac78980f81
New%20list/singular: 146c2e642b11056a0b07ed65733e4178
New%20Ticket/singular: 665ff16ec736cba20e8a1b3beb3baa09
New%20workspace/singular: 8eecf05b4ce29aa880adfed2e11476af
Newsletter/singular: dcfb9666301924431ac8ae88e5b6f9d7
Next%20Steps/singular: 12392fe73ae60b6e5a9d851256b8477e
No%20boards/singular: e4397619e69b105e4317dda4560ff4a6
No%20boards%20found/singular: e044088d2c51b6bdf660fafa86ee1e17
No%20credit%20card%20required/singular: 2090aa4171dc0b60735069f89b592883
No%20lists/singular: cedf633d99c77ff4356e089f2d98c0a6
Offer/singular: 82b4e0c9a3f5b4bd93590847de7c32a1
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%20workspace%2C%20there%20is%20no%20going%20back.%20This%20action%20cannot%20be%20undone./singular: c9ce6a516ed1f361653e8f8db3dd5ffd
or/singular: 7b133c38bec0d5ee23cc6bcf9a8de50b
Organize%20and%20find%20cards%20quickly%20with%20powerful%20filtering%20tools./singular: 1b9898c4b21e9dff413b4f76dc59db56
Own%20your%20data/singular: cc2178dac4bdf6b07f030cfc2a7510e6
Part-time/singular: 213d63da450f35dabb3ab0e35e29feed
Payment%20frequency/singular: 63ded0e4ffb462ca8bd33d38e4691d86
Pending/singular: 030a6f3395d5d4efddd3cc67d6009039
per%20user%2Fmonth/singular: 72af182c1ba6df6732640f4d8a78d360
Personal%20Project/singular: d7820b1bf4efecc61ed89234567aaa9c
Planning/singular: 353f58c75248275fe091740607501610
Please%20enter%20a%20valid%20email%20address/singular: 8de4bc8832b11b380bc4cbcedc16e48b
Please%20enter%20a%20valid%20name/singular: f2d741f1b5cae722e35cb5206786f932
Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f
@@ -209,25 +253,35 @@ checksums:
Profile%20image%20updated/singular: 1ba6609b50bc217a36ab659563e78dae
Profile%20picture/singular: d9b5e595877ffe2557486a987dd28274
Public/singular: c834f11dab0881632aded3f01d4f8fa9
Publishing/singular: d9c8862c0180d9b7bd1272d5dc0d3ac3
Question/singular: 0576462ce60d4263d7c482463fcc9547
Questions%3F/singular: c7c3a47f8b230ce7a43f3c090f21d683
Quick%20Win/singular: a03ff4c0896f14b87455510bab203511
Recruitment/singular: 78084ee4954aa22efe9ad7463d2a0c72
Remote/singular: dc3e4280dfe5c455b38ba6c8884999cf
Remove/singular: dba2fe5fe9f83f8078c687f28cba4b52
Remove%20member/singular: 1d77c2ca3768e486fd1fb5df30cb60d9
removed%20a%20label%20from%20the%20card/singular: f83ec18850a2a8a3f8242a740a04df06
removed%20a%20member%20from%20the%20card/singular: 0bd7561bb79358fde3d595c3e60a315a
removed%20label%20%3C0%3E%7Blabel%7D%3C%2F0%3E/singular: 1e7ebc1866136352bdc3cd90afc083f0
Research/singular: 3368e9638d1619babd6df9fad592274f
Resolution/singular: 6d8bd9e1bd7dae5ae38c93061d32990e
Resources/singular: ec7fb05ed963bb6781a35782b3475502
Review/singular: 299f75db25382980b2895622d7712927
Revoke/singular: be57685a85b6dfeaeb6eab4e9560b520
Roadmap/singular: c60f4a1acf30e566861bf130f13b9ae7
Role/singular: 53743bbb6ca938f5b893552e839d067f
Run%20on%20your%20own%20infrastructure/singular: eba804911562b8dbf9d69c3e27f1d708
Save/singular: f7a2929f33bc420195e59ac5a8bcd454
Save%20time%20with%20reusable%20board%20templates./singular: d0f2d7d0fd682ceaf4ca12c6353fd75a
Screening/singular: 0327bfb25db87bdacf00d4dc297f8b26
Select%20all/singular: eedc7cdb02de467c15dc418a066a77f2
Select%20source/singular: c7b0ec447415ff62856803a4d7838bd6
Self%20Host/singular: 43fbce2027548b712002e489a20a621a
Self%20host%20with%20Github/singular: 972155419bcc9f8f9bad9f5ad3538774
self-assigned%20the%20card/singular: 24a8d97bcd747643772ebe883be69698
Send/singular: 76a8497d7b546628b03bb81d5c1ce995
Senior/singular: 3fff865dc00435f82896fc302ea45630
Settings/singular: 8df6777277469c1fd88cc18dde2f1cc3
Settings%20%7C%20%7B0%7D/singular: b8fc73080bc9c8f4f1403b2a69bd1ac5
Sign%20in/singular: cb8757c7450e17de1e226e82fb0fa4a2
@@ -237,6 +291,8 @@ checksums:
Sign%20up%20with%20/singular: 103e5d75506e6835b471695d799ff580
Simple%20pricing/singular: 5aa2bece93a71947b268498a58062937
Simple%2C%20visual%20task%20management%20that%20just%20works.%20Drag%20and%20drop%20cards%2C%20collaborate%20with%20your%20team%2C%20and%20get%20more%20done./singular: f4f138f83017d43dab2882cc08e07bdb
Social%20Media/singular: 2227508afb0d38a027e323207e47d4a2
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
Success/singular: c43827becada6750f7a25890905f38b9
Support%20the%20development%20of%20the%20project/singular: c63bab228ab2b1be4370c668a99cd278
@@ -255,10 +311,12 @@ checksums:
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081
This%20workspace%20username%20has%20already%20been%20taken/singular: b7eadb89c615874f416d9658d0428c4c
To%20Do/singular: d60813ea824f373462471e092d136eed
Toggle%20menu/singular: 29dea3e0b6238874f8c7a27619df8e36
Track%20all%20card%20changes%20with%20detailed%20activity%20history./singular: 0d3bac559c71ec4b8734f9f212320de5
Trello%20disconnected/singular: 54b24a3e6c9a7eedd8c8d1060ab1175d
Trello%20imports/singular: 6827eca403faa8f89891d17827e72af9
Triaging/singular: 1d40799fcae53a8a27688fdae2a48dee
Unable%20to%20add%20comment/singular: 49bb435880817434698f31a6069564d6
Unable%20to%20create%20card/singular: 90112ea12ec6fa42097a6e022ae048a4
Unable%20to%20create%20list/singular: 7fbbf8314f8d08a4123c7daef09fed05
@@ -288,10 +346,13 @@ checksums:
updated%20the%20title/singular: 98cf8f12923ec1a58e767e3a40863b21
updated%20the%20title%20to%20%3C0%3E%7BtoTitle%7D%3C%2F0%3E/singular: 70cdf681ec2b6ef8e14397bc1f93f945
Upgrade/singular: 63c3b52882e0d779859307d672c178c2
Urgent/singular: e79afcd4398e52e10e7e8243a7eecabe
URL%20can%20only%20contain%20letters%2C%20numbers%2C%20and%20hyphens/singular: 875d37d2d920f98ef60a314eda8a5d9a
URL%20cannot%20exceed%2024%20characters/singular: 395c25732b84ac1f5b63ee310da08e93
URL%20must%20be%20at%20least%203%20characters%20long/singular: 1b74ac9ec61fd34b16530ed599009ed1
Use%20template/singular: 33f0ca0aa8f4b0de99aad267a61a094d
User/singular: 61073457a5c3901084b557d065f876be
Video/singular: 8050c90e4289b105a0780f0fdda6ff66
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
@@ -317,6 +378,7 @@ checksums:
Workspace%20name%20updated/singular: 3206ea410ee1ea4182b27ac0d89f92a1
Workspace%20slug%20updated/singular: 527b92711d38cb35b40741df43aef047
Workspace%20URL/singular: f4397a838da0f3a44cbd3ebe408ed6c3
Writing/singular: 4f5f3ee3320c252921f80c42653c5d49
Yearly/singular: 87f43e016c19cb25860f456549a2f431
Yes%2C%20we%20offer%20an%20forever%20free%20plan%20for%20individual%20use.%20No%20restrictions%2C%20no%20paywalls%2C%20no%20limits./singular: 963cee303d0ff13c1719f4575e774fe3
You%20can%20get%20a%20custom%20workspace%20URL%2C%20like%20%3C0%3Ekan.bn%2Fkan%3C%2F0%3E%2C%20by%20going%20into%20your%20%3C1%3Eworkspace%20settings%3C%2F1%3E%20and%20purchasing%20a%20pro%20workspace%20subscription.%20All%20subscriptions%20help%20fund%20the%20development%20of%20the%20project!/singular: 41dd145ef56f539e12dc064a9807c660

View File

@@ -1,11 +1,74 @@
import Link from "next/link";
import { useRef, useState } from "react";
import {
TbLayoutSidebarLeftCollapse,
TbLayoutSidebarLeftExpand,
TbLayoutSidebarRightCollapse,
TbLayoutSidebarRightExpand,
} from "react-icons/tb";
import { api } from "~/utils/api";
import { authClient } from "@kan/auth/client";
import { useClickOutside } from "~/hooks/useClickOutside";
import { useTheme } from "~/providers/theme";
import FeedbackButton from "./FeedbackButton";
import SideNavigation from "./SideNavigation";
export default function Dashboard(props: { children: React.ReactNode }) {
const { data, isLoading } = api.user.getUser.useQuery();
interface DashboardProps {
children: React.ReactNode;
rightPanel?: React.ReactNode;
hasRightPanel?: boolean;
}
export default function Dashboard({
children,
rightPanel,
hasRightPanel = false,
}: DashboardProps) {
const theme = useTheme();
const { data: session, isPending: sessionLoading } = authClient.useSession();
const [isSideNavOpen, setIsSideNavOpen] = useState(false);
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
const sideNavRef = useRef<HTMLDivElement>(null);
const rightPanelRef = useRef<HTMLDivElement>(null);
const sideNavButtonRef = useRef<HTMLButtonElement>(null);
const rightPanelButtonRef = useRef<HTMLButtonElement>(null);
const toggleSideNav = () => {
setIsSideNavOpen(!isSideNavOpen);
if (!isSideNavOpen) {
setIsRightPanelOpen(false);
}
};
const toggleRightPanel = () => {
setIsRightPanelOpen(!isRightPanelOpen);
if (!isRightPanelOpen) {
setIsSideNavOpen(false);
}
};
useClickOutside(sideNavRef, (event) => {
if (sideNavButtonRef.current?.contains(event.target as Node)) {
return;
}
if (isSideNavOpen) {
setIsSideNavOpen(false);
}
});
useClickOutside(rightPanelRef, (event) => {
if (rightPanelButtonRef.current?.contains(event.target as Node)) {
return;
}
if (isRightPanelOpen) {
setIsRightPanelOpen(false);
}
});
const isDarkMode = theme.activeTheme === "dark";
return (
<>
@@ -13,26 +76,95 @@ export default function Dashboard(props: { children: React.ReactNode }) {
html {
height: 100vh;
overflow: hidden;
min-width: 320px;
background-color: ${!isDarkMode ? "hsl(0deg 0% 97.3%)" : "#161616"};
}
`}</style>
<div className="flex h-screen min-w-[800px] flex-col items-center bg-light-100 dark:bg-dark-50">
<div className="m-auto flex h-16 min-h-16 w-full justify-between border-b border-light-600 px-5 py-2 align-middle dark:border-dark-400">
<div className="flex h-screen flex-col items-center bg-light-100 dark:bg-dark-50 md:min-w-[800px]">
<div className="flex h-12 min-h-12 w-full justify-between border-b border-light-600 px-5 py-2 align-middle dark:border-dark-400 md:h-16 md:min-h-16">
<div className="my-auto flex w-full items-center justify-between">
<Link href="/">
<button
ref={sideNavButtonRef}
onClick={toggleSideNav}
className="text-neutral-900 dark:text-dark-1000 md:hidden"
>
{isSideNavOpen ? (
<TbLayoutSidebarLeftCollapse
size={20}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarLeftExpand
size={20}
className="text-light-900 dark:text-dark-900"
/>
)}
</button>
<Link href="/" className="hidden md:block">
<h1 className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000">
kan.bn
</h1>
</Link>
<FeedbackButton />
<div className="flex items-center gap-2">
{hasRightPanel && (
<button
ref={rightPanelButtonRef}
onClick={toggleRightPanel}
className="text-neutral-900 dark:text-dark-1000 md:hidden"
>
{isRightPanelOpen ? (
<TbLayoutSidebarRightCollapse
size={20}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarRightExpand
size={20}
className="text-light-900 dark:text-dark-900"
/>
)}
</button>
)}
<div className="hidden md:block">
<FeedbackButton />
</div>
</div>
</div>
</div>
<div className="flex h-full w-full">
<SideNavigation
user={{ email: data?.email, image: data?.image }}
isLoading={isLoading}
/>
<div className="w-full overflow-hidden">{props.children}</div>
<div className="flex h-full min-h-0 w-full">
<div
ref={sideNavRef}
className={`fixed left-0 top-12 z-50 h-[calc(100dvh-3rem)] transform transition-transform duration-300 ease-in-out md:relative md:top-0 md:h-full md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
>
<SideNavigation
user={{ email: session?.user.email, image: session?.user.image }}
isLoading={sessionLoading}
/>
</div>
<div className="relative flex min-h-0 w-full overflow-hidden">
<div className="h-full w-full overflow-y-auto">{children}</div>
{/* Mobile Right Panel */}
{hasRightPanel && rightPanel && (
<div
ref={rightPanelRef}
className={`fixed right-0 top-12 z-50 h-[calc(100dvh-3rem)] w-80 transform bg-light-200 transition-transform duration-300 ease-in-out dark:bg-dark-100 md:hidden ${
isRightPanelOpen ? "translate-x-0" : "translate-x-full"
}`}
>
<div className="h-full overflow-y-auto">{rightPanel}</div>
</div>
)}
{/* Desktop Right Panel */}
{hasRightPanel && rightPanel && (
<div className="hidden md:block">{rightPanel}</div>
)}
</div>
</div>
</div>
</>

View File

@@ -55,7 +55,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
<div className="flex w-full flex-col gap-1">
<div className="relative flex">
{prefix && (
<div className="flex shrink-0 items-center rounded-l-md border border-r-0 border-light-600 px-3 text-base dark:border-dark-700 dark:text-dark-1000 sm:text-sm/6">
<div className="flex shrink-0 items-center rounded-l-md border border-r-0 border-light-600 px-3 text-sm dark:border-dark-700 dark:text-dark-1000 sm:text-sm/6">
{prefix}
</div>
)}

View File

@@ -19,10 +19,12 @@ export function NewWorkspaceForm() {
const { showPopup } = usePopup();
const { switchWorkspace } = useWorkspace();
const { register, handleSubmit } = useForm<FormValues>();
const utils = api.useUtils();
const createWorkspace = api.workspace.create.useMutation({
onSuccess: (values) => {
if (values.publicId && values.name) {
utils.workspace.all.invalidate();
switchWorkspace({
publicId: values.publicId,
name: values.name,

View File

@@ -4,6 +4,10 @@ export const PageHead = ({ title }: { title: string }) => {
return (
<Head>
<title>{title}</title>
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1"
/>
</Head>
);
};

View File

@@ -54,7 +54,7 @@ export default function SideNavigation({
return (
<>
<nav className="flex w-72 flex-col justify-between border-r border-light-600 px-3 pb-3 pt-5 dark:border-dark-400">
<nav className="flex h-full w-64 flex-col justify-between border-r border-light-600 bg-light-50 px-3 pb-3 pt-5 dark:border-dark-400 dark:bg-dark-50">
<div>
<WorkspaceMenu />
<ul role="list" className="space-y-1">

View File

@@ -0,0 +1,59 @@
import type { RefObject } from "react";
import { useEventListener } from "./useEventListener";
/** Supported event types. */
type EventType =
| "mousedown"
| "mouseup"
| "touchstart"
| "touchend"
| "focusin"
| "focusout";
/**
* Custom hook that handles clicks outside a specified element.
* @template T - The type of the element's reference.
* @param {RefObject<T> | RefObject<T>[]} ref - The React ref object(s) representing the element(s) to watch for outside clicks.
* @param {(event: MouseEvent | TouchEvent | FocusEvent) => void} handler - The callback function to be executed when a click outside the element occurs.
* @param {EventType} [eventType] - The mouse event type to listen for (optional, default is 'mousedown').
* @param {?AddEventListenerOptions} [eventListenerOptions] - The options object to be passed to the `addEventListener` method (optional).
* @returns {void}
* @example
* ```tsx
* const containerRef = useRef(null);
* useClickOutside([containerRef], () => {
* // Handle clicks outside the container.
* });
* ```
*/
export function useClickOutside<T extends HTMLElement = HTMLElement>(
ref: RefObject<T> | RefObject<T>[],
handler: (event: MouseEvent | TouchEvent | FocusEvent) => void,
eventType: EventType = "mousedown",
eventListenerOptions: AddEventListenerOptions = {},
): void {
useEventListener(
eventType,
(event) => {
const target = event.target as Node;
// Do nothing if the target is not connected element with document
if (!target.isConnected) {
return;
}
const isOutside = Array.isArray(ref)
? ref
.filter((r) => Boolean(r.current))
.every((r) => r.current && !r.current.contains(target))
: ref.current && !ref.current.contains(target);
if (isOutside) {
handler(event);
}
},
undefined,
eventListenerOptions,
);
}

View File

@@ -0,0 +1,120 @@
import type { RefObject } from "react";
import { useEffect, useRef } from "react";
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
// MediaQueryList Event based useEventListener interface
function useEventListener<K extends keyof MediaQueryListEventMap>(
eventName: K,
handler: (event: MediaQueryListEventMap[K]) => void,
element: RefObject<MediaQueryList>,
options?: boolean | AddEventListenerOptions,
): void;
// Window Event based useEventListener interface
function useEventListener<K extends keyof WindowEventMap>(
eventName: K,
handler: (event: WindowEventMap[K]) => void,
element?: undefined,
options?: boolean | AddEventListenerOptions,
): void;
// Element Event based useEventListener interface
function useEventListener<
K extends keyof HTMLElementEventMap & keyof SVGElementEventMap,
T extends Element = K extends keyof HTMLElementEventMap
? HTMLDivElement
: SVGElement,
>(
eventName: K,
handler:
| ((event: HTMLElementEventMap[K]) => void)
| ((event: SVGElementEventMap[K]) => void),
element: RefObject<T>,
options?: boolean | AddEventListenerOptions,
): void;
// Document Event based useEventListener interface
function useEventListener<K extends keyof DocumentEventMap>(
eventName: K,
handler: (event: DocumentEventMap[K]) => void,
element: RefObject<Document>,
options?: boolean | AddEventListenerOptions,
): void;
/**
* Custom hook that attaches event listeners to DOM elements, the window, or media query lists.
* @template KW - The type of event for window events.
* @template KH - The type of event for HTML or SVG element events.
* @template KM - The type of event for media query list events.
* @template T - The type of the DOM element (default is `HTMLElement`).
* @param {KW | KH | KM} eventName - The name of the event to listen for.
* @param {(event: WindowEventMap[KW] | HTMLElementEventMap[KH] | SVGElementEventMap[KH] | MediaQueryListEventMap[KM] | Event) => void} handler - The event handler function.
* @param {RefObject<T>} [element] - The DOM element or media query list to attach the event listener to (optional).
* @param {boolean | AddEventListenerOptions} [options] - An options object that specifies characteristics about the event listener (optional).
* @public
* @see [Documentation](https://usehooks-ts.com/react-hook/use-event-listener)
* @example
* ```tsx
* // Example 1: Attach a window event listener
* useEventListener('resize', handleResize);
* ```
* @example
* ```tsx
* // Example 2: Attach a document event listener with options
* const elementRef = useRef(document);
* useEventListener('click', handleClick, elementRef, { capture: true });
* ```
* @example
* ```tsx
* // Example 3: Attach an element event listener
* const buttonRef = useRef<HTMLButtonElement>(null);
* useEventListener('click', handleButtonClick, buttonRef);
* ```
*/
function useEventListener<
KW extends keyof WindowEventMap,
KH extends keyof HTMLElementEventMap & keyof SVGElementEventMap,
KM extends keyof MediaQueryListEventMap,
T extends HTMLElement | SVGAElement | MediaQueryList = HTMLElement,
>(
eventName: KW | KH | KM,
handler: (
event:
| WindowEventMap[KW]
| HTMLElementEventMap[KH]
| SVGElementEventMap[KH]
| MediaQueryListEventMap[KM]
| Event,
) => void,
element?: RefObject<T>,
options?: boolean | AddEventListenerOptions,
) {
// Create a ref that stores handler
const savedHandler = useRef(handler);
useIsomorphicLayoutEffect(() => {
savedHandler.current = handler;
}, [handler]);
useEffect(() => {
// Define the listening target
const targetElement: T | Window = element?.current ?? window;
if (!(targetElement && targetElement.addEventListener)) return;
// Create event listener that calls handler function stored in ref
const listener: typeof handler = (event) => {
savedHandler.current(event);
};
targetElement.addEventListener(eventName, listener, options);
// Remove event listener on cleanup
return () => {
targetElement.removeEventListener(eventName, listener, options);
};
}, [eventName, element, options]);
}
export { useEventListener };

View File

@@ -0,0 +1,15 @@
import { useEffect, useLayoutEffect } from "react";
/**
* Custom hook that uses either `useLayoutEffect` or `useEffect` based on the environment (client-side or server-side).
* @param {Function} effect - The effect function to be executed.
* @param {Array<any>} [dependencies] - An array of dependencies for the effect (optional).
* @example
* ```tsx
* useIsomorphicLayoutEffect(() => {
* // Code to be executed during the layout phase on the client side
* }, [dependency1, dependency2]);
* ```
*/
export const useIsomorphicLayoutEffect =
typeof window !== "undefined" ? useLayoutEffect : useEffect;

View File

@@ -124,6 +124,14 @@ msgstr "API-Schlüssel"
msgid "API Reference"
msgstr "API-Referenz"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Bewerber"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Genehmigung"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "Bist du sicher, dass du {entityLabel} entfernen möchtest?"
@@ -149,7 +157,20 @@ msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "hat <0>{memberName}</0> der Karte zugewiesen"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "Warten auf Kunden"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Backlog"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Einfaches Kanban"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Abrechnung"
@@ -157,10 +178,22 @@ msgstr "Abrechnung"
msgid "Billing portal"
msgstr "Abrechnungsportal"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Blogbeitrag"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Board"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "Der Name des Boards darf 100 Zeichen nicht überschreiten"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "Boardname ist erforderlich"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Board nicht gefunden"
@@ -199,6 +232,18 @@ msgstr "Boards"
msgid "Boards | {0}"
msgstr "Boards | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Brainstorming"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Bug"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Fehlerbericht"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -235,6 +280,10 @@ msgstr "Filter löschen"
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."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Code-Review"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Arbeite nahtlos mit deinem Team zusammen."
@@ -251,6 +300,10 @@ msgstr "Kommentare"
msgid "Company"
msgstr "Unternehmen"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Abgeschlossen"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Vollständige Kontrolle und Eigentum:"
@@ -280,6 +333,10 @@ msgstr "Kontakt"
msgid "Contact us"
msgstr "Kontaktiere uns"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Content-Erstellung"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Fortfahren mit "
@@ -299,7 +356,7 @@ msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
msgid "Create another"
msgstr "Weitere erstellen"
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Board erstellen"
@@ -341,6 +398,10 @@ msgstr "Arbeitsbereich erstellen"
msgid "created the card"
msgstr "hat die Karte erstellt"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Kritisch"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Benutzerdefinierte Domain"
@@ -349,6 +410,10 @@ msgstr "Benutzerdefinierte Domain"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Benutzerdefinierte URLs sind eine Premium-Funktion. Du wirst zur Aktualisierung deines Kontos weitergeleitet."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Kundensupport"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Dunkel"
@@ -387,6 +452,10 @@ msgstr "Liste löschen"
msgid "Delete workspace"
msgstr "Workspace löschen"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Trello trennen"
@@ -424,6 +493,7 @@ msgid "Docs"
msgstr "Dokumente"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Dokumentation"
@@ -431,6 +501,13 @@ msgstr "Dokumentation"
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Du hast noch kein Konto? <0><1>Registrieren</1></0>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Erledigt"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -444,6 +521,10 @@ msgstr "Kommentar bearbeiten"
msgid "Edit label"
msgstr "Label bearbeiten"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Bearbeitung"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "E-Mail"
@@ -452,6 +533,10 @@ msgstr "E-Mail"
msgid "Email"
msgstr "E-Mail"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Verbesserung"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Gib deine E-Mail-Adresse ein"
@@ -509,6 +594,10 @@ msgstr "Alles im kostenlosen Plan, plus:"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Alles was du brauchst, für immer kostenlos. Unbegrenzte Boards, unbegrenzte Listen, unbegrenzte Karten. Jederzeit upgraden."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Ausführung"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -519,6 +608,14 @@ msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut."
msgid "FAQs"
msgstr "Häufig gestellte Fragen"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Feature"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Feature-Anfrage"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -545,7 +642,6 @@ msgstr "Finden Sie Antworten auf häufige Fragen zum Projekt. Nicht gefunden, wo
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern (kostenlos während der Beta-Phase) und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, dieses Angebot zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
#: src/views/home/components/Pricing.tsx:32
#: src/views/home/components/Pricing.tsx:32
msgid "Free"
msgstr "Kostenlos"
@@ -554,6 +650,14 @@ msgstr "Kostenlos"
msgid "Free, forever"
msgstr "Kostenlos, für immer"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Vollzeit"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Spaß"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -599,6 +703,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Zur App"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "Hohe Priorität"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Eingestellt"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Hosten Sie Kan auf Ihrer eigenen Infrastruktur. Ideal für Organisationen, die vollständige Kontrolle über ihre Daten benötigen."
@@ -631,6 +743,10 @@ msgstr "Ich bestätige, dass alle meine Kontodaten dauerhaft gelöscht werden, u
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "Ich bestätige, dass alle Daten des Arbeitsbereichs dauerhaft gelöscht werden, und möchte fortfahren."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Ideen"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideen zur Verbesserung dieser Seite..."
@@ -651,6 +767,10 @@ msgstr "Import fehlgeschlagen"
msgid "Import your Trello boards and hit the ground running."
msgstr "Importieren Sie Ihre Trello-Boards und starten Sie sofort durch."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Wichtig"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Import von Trello"
@@ -659,6 +779,12 @@ msgstr "Import von Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Der Import Ihrer Trello-Boards in Kan ist einfach. Sie können unserer Schritt-für-Schritt-Anleitung <0>hier</0> folgen."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "In Bearbeitung"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Einzelpersonen"
@@ -667,6 +793,10 @@ msgstr "Einzelpersonen"
msgid "Integrations"
msgstr "Integrationen"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Vorstellungsgespräch"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Einladen"
@@ -676,6 +806,10 @@ msgstr "Einladen"
msgid "Invite member"
msgstr "Mitglied einladen"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban funktioniert besser im Team. Perfekt für kleine und wachsende Teams, die zusammenarbeiten möchten."
@@ -703,6 +837,10 @@ msgstr "Labels & Filter"
msgid "Language"
msgstr "Sprache"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Lernen"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Rechtliches"
@@ -735,10 +873,22 @@ msgstr "Login | kan.bn"
msgid "Logout"
msgstr "Abmelden"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "Langfristig"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Niedrige Priorität"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "Magic Link"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Mittlere Priorität"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -764,7 +914,7 @@ msgstr "hat die Karte von <0>{fromList}</0> nach <1>{toList}</1> verschoben"
msgid "moved the card to another list"
msgstr "hat die Karte in eine andere Liste verschoben"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Name"
@@ -777,7 +927,7 @@ msgstr "Brauchst du Hilfe?"
msgid "New"
msgstr "Neu"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "Neues Board"
@@ -798,10 +948,22 @@ msgstr "Neues Label"
msgid "New list"
msgstr "Neue Liste"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Neues Ticket"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Neuer Workspace"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Newsletter"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Nächste Schritte"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "Keine Boards"
@@ -818,6 +980,14 @@ msgstr "Keine Kreditkarte erforderlich"
msgid "No lists"
msgstr "Keine Listen"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Angebot"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Einarbeitung"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
@@ -838,6 +1008,10 @@ msgstr "Organisiere und finde Karten schnell mit leistungsstarken Filterwerkzeug
msgid "Own your data"
msgstr "Besitze deine Daten"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Teilzeit"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Zahlungshäufigkeit"
@@ -851,6 +1025,14 @@ msgstr "Ausstehend"
msgid "per user/month"
msgstr "pro Benutzer/Monat"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Persönliches Projekt"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Planung"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
@@ -926,10 +1108,30 @@ msgstr "Profilbild"
msgid "Public"
msgstr "Öffentlich"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Veröffentlichung"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Frage"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "Fragen?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Schneller Erfolg"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Personalbeschaffung"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "Remote"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Entfernen"
@@ -950,10 +1152,22 @@ msgstr "hat ein Mitglied von der Karte entfernt"
msgid "removed label <0>{label}</0>"
msgstr "hat Label <0>{label}</0> entfernt"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Recherche"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Lösung"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Ressourcen"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Überprüfung"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Widerrufen"
@@ -979,6 +1193,10 @@ msgstr "Speichern"
msgid "Save time with reusable board templates."
msgstr "Spare Zeit mit wiederverwendbaren Board-Vorlagen."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Vorauswahl"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Alle auswählen"
@@ -1003,6 +1221,10 @@ msgstr "hat sich selbst die Karte zugewiesen"
msgid "Send"
msgstr "Senden"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1043,6 +1265,14 @@ msgstr "Einfache Preisgestaltung"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Einfaches, visuelles Aufgabenmanagement, das einfach funktioniert. Ziehe Karten per Drag-and-drop, arbeite mit deinem Team zusammen und erledige mehr."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Social Media"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Softwareentwicklung"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Stern auf Github"
@@ -1118,6 +1348,11 @@ msgstr "Dies führt zur permanenten Löschung aller mit deinem Konto verbundenen
msgid "This workspace username has already been taken"
msgstr "Dieser Workspace-Benutzername ist bereits vergeben"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "Zu erledigen"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Menü umschalten"
@@ -1134,6 +1369,10 @@ msgstr "Trello getrennt"
msgid "Trello imports"
msgstr "Trello-importe"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Priorisierung"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Kommentar konnte nicht hinzugefügt werden"
@@ -1256,6 +1495,11 @@ msgstr "hat den Titel zu <0>{toTitle}</0> aktualisiert"
msgid "Upgrade"
msgstr "Upgrade"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Dringend"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "URL darf nur Buchstaben, Zahlen und Bindestriche enthalten"
@@ -1268,10 +1512,18 @@ msgstr "URL darf nicht länger als 24 Zeichen sein"
msgid "URL must be at least 3 characters long"
msgstr "URL muss mindestens 3 Zeichen lang sein"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Vorlage verwenden"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Benutzer"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "API-Schlüssel anzeigen und verwalten."
@@ -1374,6 +1626,10 @@ msgstr "Workspace-Slug aktualisiert"
msgid "Workspace URL"
msgstr "Workspace-URL"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Schreiben"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Jährlich"

File diff suppressed because one or more lines are too long

View File

@@ -132,6 +132,18 @@ msgstr "API keys"
msgid "API Reference"
msgstr "API Reference"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Applicants"
#: src/views/boards/components/TemplateBoards.tsx:48
#~ msgid "Applicants, Screening, Interviewing, Offer, Onboarding, Hired"
#~ msgstr "Applicants, Screening, Interviewing, Offer, Onboarding, Hired"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Approval"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "Are you sure want to remove {entityLabel}?"
@@ -157,7 +169,24 @@ msgstr "Are you sure you want to delete your account?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "assigned <0>{memberName}</0> to the card"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "Awaiting Customer"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Backlog"
#: src/views/boards/components/TemplateBoards.tsx:33
#~ msgid "Backlog, To Do, In Progress, Code Review, Done"
#~ msgstr "Backlog, To Do, In Progress, Code Review, Done"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Basic Kanban"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Billing"
@@ -165,10 +194,26 @@ msgstr "Billing"
msgid "Billing portal"
msgstr "Billing portal"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Blog Post"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Board"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "Board name cannot exceed 100 characters"
#: src/views/boards/components/NewBoardForm.tsx:21
#~ msgid "Board name cannot exceed 50 characters"
#~ msgstr "Board name cannot exceed 50 characters"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "Board name is required"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Board not found"
@@ -207,6 +252,22 @@ msgstr "Boards"
msgid "Boards | {0}"
msgstr "Boards | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Brainstorming"
#: src/views/boards/components/TemplateBoards.tsx:38
#~ msgid "Brainstorming, Writing, Editing, Design, Approval, Publishing, Done"
#~ msgstr "Brainstorming, Writing, Editing, Design, Approval, Publishing, Done"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Bug"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Bug Report"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -243,6 +304,10 @@ msgstr "Clear filters"
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."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Code Review"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Collaborate seamlessly with your team."
@@ -259,6 +324,10 @@ msgstr "Comments"
msgid "Company"
msgstr "Company"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Complete"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Complete control and ownership:"
@@ -288,6 +357,10 @@ msgstr "Contact"
msgid "Contact us"
msgstr "Contact us"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Content Creation"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continue with "
@@ -315,7 +388,7 @@ msgstr "Create another"
#~ msgid "Create API keys to access the Kan API."
#~ msgstr "Create API keys to access the Kan API."
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Create board"
@@ -357,6 +430,10 @@ msgstr "Create workspace"
msgid "created the card"
msgstr "created the card"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Critical"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Custom domain"
@@ -365,6 +442,10 @@ msgstr "Custom domain"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Custom URLs are a premium feature. You'll be directed to upgrade your account."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Customer Support"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Dark"
@@ -403,6 +484,10 @@ msgstr "Delete list"
msgid "Delete workspace"
msgstr "Delete workspace"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Disconnect Trello"
@@ -440,6 +525,7 @@ msgid "Docs"
msgstr "Docs"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Documentation"
@@ -447,6 +533,13 @@ msgstr "Documentation"
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Don't have an account? <0><1>Sign up</1></0>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Done"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -460,6 +553,10 @@ msgstr "Edit comment"
msgid "Edit label"
msgstr "Edit label"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Editing"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "email"
@@ -468,6 +565,10 @@ msgstr "email"
msgid "Email"
msgstr "Email"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Enhancement"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Enter your email address"
@@ -525,6 +626,10 @@ msgstr "Everything in the free plan, plus:"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Execution"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -535,6 +640,14 @@ msgstr "Failed to login with {0}. Please try again."
msgid "FAQs"
msgstr "FAQs"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Feature"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Feature Request"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -570,6 +683,14 @@ msgstr "Free"
msgid "Free, forever"
msgstr "Free, forever"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Full-time"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Fun"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -615,6 +736,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Go to app"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "High Priority"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Hired"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
@@ -647,10 +776,18 @@ msgstr "I acknowledge that all of my account data will be permanently deleted an
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Ideas"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideas to improve this page..."
#: src/views/boards/components/TemplateBoards.tsx:53
#~ msgid "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
#~ msgstr "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Import"
@@ -667,6 +804,10 @@ msgstr "Import failed"
msgid "Import your Trello boards and hit the ground running."
msgstr "Import your Trello boards and hit the ground running."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Important"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Importing from Trello"
@@ -675,6 +816,12 @@ msgstr "Importing from Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "In Progress"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Individuals"
@@ -683,6 +830,10 @@ msgstr "Individuals"
msgid "Integrations"
msgstr "Integrations"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Interviewing"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invite"
@@ -692,6 +843,10 @@ msgstr "Invite"
msgid "Invite member"
msgstr "Invite member"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
@@ -719,6 +874,10 @@ msgstr "Labels & Filters"
msgid "Language"
msgstr "Language"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Learning"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Legal"
@@ -751,10 +910,22 @@ msgstr "Login | kan.bn"
msgid "Logout"
msgstr "Logout"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "Long-term"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Low Priority"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "magic link"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Medium Priority"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -780,7 +951,7 @@ msgstr "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
msgid "moved the card to another list"
msgstr "moved the card to another list"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Name"
@@ -793,7 +964,7 @@ msgstr "Need help?"
msgid "New"
msgstr "New"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "New board"
@@ -814,10 +985,26 @@ msgstr "New label"
msgid "New list"
msgstr "New list"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "New Ticket"
#: src/views/boards/components/TemplateBoards.tsx:43
#~ msgid "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
#~ msgstr "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "New workspace"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Newsletter"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Next Steps"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "No boards"
@@ -834,6 +1021,14 @@ msgstr "No credit card required"
msgid "No lists"
msgstr "No lists"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Offer"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Onboarding"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Once you delete your account, there is no going back. This action cannot be undone."
@@ -854,6 +1049,10 @@ msgstr "Organize and find cards quickly with powerful filtering tools."
msgid "Own your data"
msgstr "Own your data"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Part-time"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Payment frequency"
@@ -867,6 +1066,14 @@ msgstr "Pending"
msgid "per user/month"
msgstr "per user/month"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Personal Project"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Planning"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Please enter a valid email address"
@@ -942,10 +1149,30 @@ msgstr "Profile picture"
msgid "Public"
msgstr "Public"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Publishing"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Question"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "Questions?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Quick Win"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Recruitment"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "Remote"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Remove"
@@ -966,10 +1193,22 @@ msgstr "removed a member from the card"
msgid "removed label <0>{label}</0>"
msgstr "removed label <0>{label}</0>"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Research"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Resolution"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Resources"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Review"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Revoke"
@@ -995,6 +1234,10 @@ msgstr "Save"
msgid "Save time with reusable board templates."
msgstr "Save time with reusable board templates."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Screening"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Select all"
@@ -1019,6 +1262,10 @@ msgstr "self-assigned the card"
msgid "Send"
msgstr "Send"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1059,6 +1306,14 @@ msgstr "Simple pricing"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Social Media"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Software Development"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Star on Github"
@@ -1134,6 +1389,15 @@ msgstr "This will result in the permanent deletion of all data associated with y
msgid "This workspace username has already been taken"
msgstr "This workspace username has already been taken"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "To Do"
#: src/views/boards/components/TemplateBoards.tsx:28
#~ msgid "To Do, In Progress, Done"
#~ msgstr "To Do, In Progress, Done"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Toggle menu"
@@ -1150,6 +1414,10 @@ msgstr "Trello disconnected"
msgid "Trello imports"
msgstr "Trello imports"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Triaging"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Unable to add comment"
@@ -1272,6 +1540,11 @@ msgstr "updated the title to <0>{toTitle}</0>"
msgid "Upgrade"
msgstr "Upgrade"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Urgent"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "URL can only contain letters, numbers, and hyphens"
@@ -1284,10 +1557,18 @@ msgstr "URL cannot exceed 24 characters"
msgid "URL must be at least 3 characters long"
msgstr "URL must be at least 3 characters long"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Use template"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "User"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "View and manage your API keys."
@@ -1394,6 +1675,10 @@ msgstr "Workspace slug updated"
msgid "Workspace URL"
msgstr "Workspace URL"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Writing"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Yearly"

File diff suppressed because one or more lines are too long

View File

@@ -124,6 +124,14 @@ msgstr "Claves API"
msgid "API Reference"
msgstr "Referencia de API"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Solicitantes"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Aprobación"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "¿Estás seguro de que quieres eliminar {entityLabel}?"
@@ -149,7 +157,20 @@ msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "asignó a <0>{memberName}</0> a la tarjeta"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "Esperando al cliente"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Pendientes"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Kanban básico"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturación"
@@ -157,10 +178,22 @@ msgstr "Facturación"
msgid "Billing portal"
msgstr "Portal de facturación"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Entrada de blog"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Tablero"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "El nombre del tablero no puede exceder los 100 caracteres"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "El nombre del tablero es obligatorio"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Tablero no encontrado"
@@ -199,6 +232,18 @@ msgstr "Tableros"
msgid "Boards | {0}"
msgstr "Tableros | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Lluvia de ideas"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Error"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Informe de error"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -235,6 +280,10 @@ msgstr "Borrar filtros"
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."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Revisión de código"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Colabora sin problemas con tu equipo."
@@ -251,6 +300,10 @@ msgstr "Comentarios"
msgid "Company"
msgstr "Empresa"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Completado"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Control y propiedad completos:"
@@ -280,6 +333,10 @@ msgstr "Contacto"
msgid "Contact us"
msgstr "Contáctanos"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Creación de contenido"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continuar con "
@@ -299,7 +356,7 @@ msgstr "Controla quién puede ver y editar tus tableros."
msgid "Create another"
msgstr "Crear otro"
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Crear tablero"
@@ -341,6 +398,10 @@ msgstr "Crear espacio de trabajo"
msgid "created the card"
msgstr "creó la tarjeta"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Crítico"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Dominio personalizado"
@@ -349,6 +410,10 @@ msgstr "Dominio personalizado"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Las URL personalizadas son una función premium. Serás dirigido a actualizar tu cuenta."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Atención al cliente"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Oscuro"
@@ -387,6 +452,10 @@ msgstr "Eliminar lista"
msgid "Delete workspace"
msgstr "Eliminar espacio de trabajo"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Diseño"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Desconectar Trello"
@@ -424,6 +493,7 @@ msgid "Docs"
msgstr "Documentos"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Documentación"
@@ -431,6 +501,13 @@ msgstr "Documentación"
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "¿No tienes una cuenta? <0><1>Regístrate</1></0>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Terminado"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -444,6 +521,10 @@ msgstr "Editar comentario"
msgid "Edit label"
msgstr "Editar etiqueta"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Editando"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "correo electrónico"
@@ -452,6 +533,10 @@ msgstr "correo electrónico"
msgid "Email"
msgstr "Correo electrónico"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Mejora"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Introduce tu dirección de correo electrónico"
@@ -509,6 +594,10 @@ msgstr "Todo lo que hay en el plan gratuito, más:"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Todo lo que necesitas, gratis para siempre. Tableros ilimitados, listas ilimitadas, tarjetas ilimitadas. Actualiza en cualquier momento."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Ejecución"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -519,6 +608,14 @@ msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo."
msgid "FAQs"
msgstr "Preguntas frecuentes"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Función"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Solicitud de función"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -545,7 +642,6 @@ msgstr "Encuentra respuestas a preguntas frecuentes sobre el proyecto. ¿No encu
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de pago en la nube para espacios de trabajo con múltiples usuarios (gratuita durante la beta) y para slugs personalizados de espacios de trabajo. No hay obligación de usarla, y puedes autoalojar el software en tu propia infraestructura sin costo alguno."
#: src/views/home/components/Pricing.tsx:32
#: src/views/home/components/Pricing.tsx:32
msgid "Free"
msgstr "Gratis"
@@ -554,6 +650,14 @@ msgstr "Gratis"
msgid "Free, forever"
msgstr "Gratis, para siempre"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Tiempo completo"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Diversión"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -599,6 +703,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Ir a la aplicación"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "Alta prioridad"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Contratado"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Aloja Kan en tu propia infraestructura. Ideal para organizaciones que necesitan control completo sobre sus datos."
@@ -631,6 +743,10 @@ msgstr "Reconozco que todos los datos de mi cuenta serán eliminados permanentem
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "Reconozco que todos los datos del espacio de trabajo serán eliminados permanentemente y quiero continuar."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Ideas"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideas para mejorar esta página..."
@@ -651,6 +767,10 @@ msgstr "Importación fallida"
msgid "Import your Trello boards and hit the ground running."
msgstr "Importa tus tableros de Trello y comienza a trabajar de inmediato."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Importante"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Importando desde Trello"
@@ -659,6 +779,12 @@ msgstr "Importando desde Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importar tus tableros de Trello a Kan es fácil. Puedes seguir nuestra guía paso a paso <0>aquí</0>."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "En progreso"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Individuos"
@@ -667,6 +793,10 @@ msgstr "Individuos"
msgid "Integrations"
msgstr "Integraciones"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Entrevistando"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invitar"
@@ -676,6 +806,10 @@ msgstr "Invitar"
msgid "Invite member"
msgstr "Invitar miembro"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban es mejor con un equipo. Perfecto para equipos pequeños y en crecimiento que buscan colaborar."
@@ -703,6 +837,10 @@ msgstr "Etiquetas y filtros"
msgid "Language"
msgstr "Idioma"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Aprendizaje"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Legal"
@@ -735,10 +873,22 @@ msgstr "Iniciar sesión | kan.bn"
msgid "Logout"
msgstr "Cerrar sesión"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "Largo plazo"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Prioridad baja"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "enlace mágico"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Prioridad media"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -764,7 +914,7 @@ msgstr "movió la tarjeta de <0>{fromList}</0> a<1>{toList}</1>"
msgid "moved the card to another list"
msgstr "movió la tarjeta a otra lista"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Nombre"
@@ -777,7 +927,7 @@ msgstr "¿Necesitas ayuda?"
msgid "New"
msgstr "Nuevo"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "Nuevo tablero"
@@ -798,10 +948,22 @@ msgstr "Nueva etiqueta"
msgid "New list"
msgstr "Nueva lista"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nuevo ticket"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nuevo espacio de trabajo"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Boletín"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Próximos pasos"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "Sin tableros"
@@ -818,6 +980,14 @@ msgstr "No se requiere tarjeta de crédito"
msgid "No lists"
msgstr "Sin listas"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Oferta"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Incorporación"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se puede deshacer."
@@ -838,6 +1008,10 @@ msgstr "Organiza y encuentra tarjetas rápidamente con potentes herramientas de
msgid "Own your data"
msgstr "Sé dueño de tus datos"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Tiempo parcial"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Frecuencia de pago"
@@ -851,6 +1025,14 @@ msgstr "Pendiente"
msgid "per user/month"
msgstr "por usuario/mes"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Proyecto personal"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Planificación"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Por favor, introduce una dirección de correo electrónico válida"
@@ -926,10 +1108,30 @@ msgstr "Foto de perfil"
msgid "Public"
msgstr "Público"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Publicación"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Pregunta"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "¿Preguntas?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Victoria rápida"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Reclutamiento"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "Remoto"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Eliminar"
@@ -950,10 +1152,22 @@ msgstr "eliminó un miembro de la tarjeta"
msgid "removed label <0>{label}</0>"
msgstr "eliminó la etiqueta <0>{label}</0>"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Investigación"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Resolución"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Recursos"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Revisión"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Revocar"
@@ -979,6 +1193,10 @@ msgstr "Guardar"
msgid "Save time with reusable board templates."
msgstr "Ahorra tiempo con plantillas de tableros reutilizables."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Preselección"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Seleccionar todo"
@@ -1003,6 +1221,10 @@ msgstr "se autoasignó la tarjeta"
msgid "Send"
msgstr "Enviar"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1043,6 +1265,14 @@ msgstr "Precios simples"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Gestión de tareas visual y sencilla que simplemente funciona. Arrastra y suelta tarjetas, colabora con tu equipo y logra más."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Redes sociales"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Desarrollo de software"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Estrella en Github"
@@ -1118,6 +1348,11 @@ msgstr "Esto resultará en la eliminación permanente de todos los datos asociad
msgid "This workspace username has already been taken"
msgstr "Este nombre de usuario del espacio de trabajo ya ha sido tomado"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "Por hacer"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Alternar menú"
@@ -1134,6 +1369,10 @@ msgstr "Trello desconectado"
msgid "Trello imports"
msgstr "Importaciones de Trello"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Clasificación"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "No se puede añadir el comentario"
@@ -1256,6 +1495,11 @@ msgstr "actualizó el título a <0>{toTitle}</0>"
msgid "Upgrade"
msgstr "Actualizar"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Urgente"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "La URL solo puede contener letras, números y guiones"
@@ -1268,10 +1512,18 @@ msgstr "La URL no puede exceder los 24 caracteres"
msgid "URL must be at least 3 characters long"
msgstr "La URL debe tener al menos 3 caracteres"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Usar plantilla"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Usuario"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Ver y gestionar tus claves API."
@@ -1374,6 +1626,10 @@ msgstr "Slug del espacio de trabajo actualizado"
msgid "Workspace URL"
msgstr "URL del espacio de trabajo"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Escritura"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Anual"

File diff suppressed because one or more lines are too long

View File

@@ -124,6 +124,14 @@ msgstr "Clés API"
msgid "API Reference"
msgstr "Référence API"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Candidats"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Approbation"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "Êtes-vous sûr de vouloir supprimer {entityLabel} ?"
@@ -149,7 +157,20 @@ msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "a assigné <0>{memberName}</0> à la carte"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "En attente du client"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Backlog"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Kanban basique"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturation"
@@ -157,10 +178,22 @@ msgstr "Facturation"
msgid "Billing portal"
msgstr "Portail de facturation"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Article de blog"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Tableau"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "Le nom du tableau est requis"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Tableau introuvable"
@@ -199,6 +232,18 @@ msgstr "Tableaux"
msgid "Boards | {0}"
msgstr "Tableaux | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Brainstorming"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Bug"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Rapport de bug"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -235,6 +280,10 @@ msgstr "Effacer les filtres"
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."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Revue de code"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Collaborez en toute fluidité avec votre équipe."
@@ -251,6 +300,10 @@ msgstr "Commentaires"
msgid "Company"
msgstr "Entreprise"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Terminé"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Contrôle et propriété complets :"
@@ -280,6 +333,10 @@ msgstr "Contact"
msgid "Contact us"
msgstr "Contactez-nous"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Création de contenu"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continuer avec "
@@ -299,7 +356,7 @@ msgstr "Contrôlez qui peut voir et modifier vos tableaux."
msgid "Create another"
msgstr "Créer un autre"
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Créer un tableau"
@@ -341,6 +398,10 @@ msgstr "Créer un espace de travail"
msgid "created the card"
msgstr "a créé la carte"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Critique"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Domaine personnalisé"
@@ -349,6 +410,10 @@ msgstr "Domaine personnalisé"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Les URL personnalisées sont une fonctionnalité premium. Vous serez dirigé vers la mise à niveau de votre compte."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Support client"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Sombre"
@@ -387,6 +452,10 @@ msgstr "Supprimer la liste"
msgid "Delete workspace"
msgstr "Supprimer l'espace de travail"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Déconnecter Trello"
@@ -424,6 +493,7 @@ msgid "Docs"
msgstr "Documentation"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Documentation"
@@ -431,6 +501,13 @@ msgstr "Documentation"
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>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Fait"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -444,6 +521,10 @@ msgstr "Modifier le commentaire"
msgid "Edit label"
msgstr "Modifier l'étiquette"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Édition"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "e-mail"
@@ -452,6 +533,10 @@ msgstr "e-mail"
msgid "Email"
msgstr "E-mail"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Amélioration"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Saisissez votre adresse e-mail"
@@ -509,6 +594,10 @@ msgstr "Tout ce qui est inclus dans le plan gratuit, plus :"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Tout ce dont vous avez besoin, gratuit pour toujours. Tableaux illimités, listes illimitées, cartes illimitées. Possibilité de mise à niveau à tout moment."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Exécution"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -519,6 +608,14 @@ msgstr "Échec de connexion avec {0}. Veuillez réessayer."
msgid "FAQs"
msgstr "FAQ"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Fonctionnalité"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Demande de fonctionnalité"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -545,7 +642,6 @@ msgstr "Trouvez des réponses aux questions fréquentes sur le projet. Vous ne t
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs (gratuite pendant la bêta) et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
#: src/views/home/components/Pricing.tsx:32
#: src/views/home/components/Pricing.tsx:32
msgid "Free"
msgstr "Gratuit"
@@ -554,6 +650,14 @@ msgstr "Gratuit"
msgid "Free, forever"
msgstr "Gratuit, pour toujours"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Temps plein"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Amusant"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -599,6 +703,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Accéder à l'application"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "Haute priorité"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Embauché"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Hébergez Kan sur votre propre infrastructure. Idéal pour les organisations qui ont besoin d'un contrôle total sur leurs données."
@@ -631,6 +743,10 @@ msgstr "Je reconnais que toutes les données de mon compte seront définitivemen
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "Je reconnais que toutes les données de l'espace de travail seront définitivement supprimées et je souhaite continuer."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Idées"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Idées pour améliorer cette page..."
@@ -651,6 +767,10 @@ msgstr "Échec de l'importation"
msgid "Import your Trello boards and hit the ground running."
msgstr "Importez vos tableaux Trello et commencez immédiatement."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Important"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Importation depuis Trello"
@@ -659,6 +779,12 @@ msgstr "Importation depuis Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "L'importation de vos tableaux Trello dans Kan est simple. Vous pouvez suivre notre guide étape par étape <0>ici</0>."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "En cours"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Particuliers"
@@ -667,6 +793,10 @@ msgstr "Particuliers"
msgid "Integrations"
msgstr "Intégrations"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Entretien"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Inviter"
@@ -676,6 +806,10 @@ msgstr "Inviter"
msgid "Invite member"
msgstr "Inviter un membre"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban est meilleur en équipe. Parfait pour les petites équipes et celles en croissance qui cherchent à collaborer."
@@ -703,6 +837,10 @@ msgstr "Étiquettes & filtres"
msgid "Language"
msgstr "Langue"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Apprentissage"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Mentions légales"
@@ -735,10 +873,22 @@ msgstr "Connexion | kan.bn"
msgid "Logout"
msgstr "Déconnexion"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "Long terme"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Priorité basse"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "lien magique"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Priorité moyenne"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -764,7 +914,7 @@ msgstr "a déplacé la carte de <0>{fromList}</0> vers<1>{toList}</1>"
msgid "moved the card to another list"
msgstr "a déplacé la carte vers une autre liste"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Nom"
@@ -777,7 +927,7 @@ msgstr "Besoin d'aide ?"
msgid "New"
msgstr "Nouveau"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "Nouveau tableau"
@@ -798,10 +948,22 @@ msgstr "Nouvelle étiquette"
msgid "New list"
msgstr "Nouvelle liste"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nouveau ticket"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nouvel espace de travail"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Newsletter"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Prochaines étapes"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "Aucun tableau"
@@ -818,6 +980,14 @@ msgstr "Aucune carte de crédit requise"
msgid "No lists"
msgstr "Aucune liste"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Offre"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Intégration"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
@@ -838,6 +1008,10 @@ msgstr "Organisez et trouvez rapidement des cartes avec des outils de filtrage p
msgid "Own your data"
msgstr "Maîtrisez vos données"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Temps partiel"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Fréquence de paiement"
@@ -851,6 +1025,14 @@ msgstr "En attente"
msgid "per user/month"
msgstr "par utilisateur/mois"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Projet personnel"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Planification"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Veuillez saisir une adresse e-mail valide"
@@ -926,10 +1108,30 @@ msgstr "Photo de profil"
msgid "Public"
msgstr "Public"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Publication"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Question"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "Des questions ?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Victoire rapide"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Recrutement"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "À distance"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Supprimer"
@@ -950,10 +1152,22 @@ msgstr "a retiré un membre de la carte"
msgid "removed label <0>{label}</0>"
msgstr "a supprimé l'étiquette <0>{label}</0>"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Recherche"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Résolution"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Ressources"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Révision"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Révoquer"
@@ -979,6 +1193,10 @@ msgstr "Enregistrer"
msgid "Save time with reusable board templates."
msgstr "Gagnez du temps avec des modèles de tableaux réutilisables."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Présélection"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Sélectionner tout"
@@ -1003,6 +1221,10 @@ msgstr "s'est auto-assigné la carte"
msgid "Send"
msgstr "Envoyer"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1043,6 +1265,14 @@ msgstr "Tarification simple"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Gestion de tâches visuelle et simple qui fonctionne parfaitement. Glissez-déposez des cartes, collaborez avec votre équipe et accomplissez davantage."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Réseaux sociaux"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Développement logiciel"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Étoile sur Github"
@@ -1118,6 +1348,11 @@ msgstr "Cela entraînera la suppression définitive de toutes les données assoc
msgid "This workspace username has already been taken"
msgstr "Ce nom d'utilisateur d'espace de travail est déjà pris"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "À faire"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Basculer le menu"
@@ -1134,6 +1369,10 @@ msgstr "Trello déconnecté"
msgid "Trello imports"
msgstr "Importations Trello"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Triage"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Impossible d'ajouter un commentaire"
@@ -1256,6 +1495,11 @@ msgstr "a mis à jour le titre en <0>{toTitle}</0>"
msgid "Upgrade"
msgstr "Mettre à niveau"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Urgent"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "L'URL ne peut contenir que des lettres, des chiffres et des traits d'union"
@@ -1268,10 +1512,18 @@ msgstr "L'URL ne peut pas dépasser 24 caractères"
msgid "URL must be at least 3 characters long"
msgstr "L'URL doit comporter au moins 3 caractères"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Utiliser le modèle"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Utilisateur"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Vidéo"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Consultez et gérez vos clés API."
@@ -1374,6 +1626,10 @@ msgstr "Slug de l'espace de travail mis à jour"
msgid "Workspace URL"
msgstr "URL de l'espace de travail"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Écriture"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Annuel"

File diff suppressed because one or more lines are too long

View File

@@ -124,6 +124,14 @@ msgstr "Chiavi API"
msgid "API Reference"
msgstr "Riferimento API"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Candidati"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Approvazione"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "Sei sicuro di voler rimuovere {entityLabel}?"
@@ -149,7 +157,20 @@ msgstr "Sei sicuro di voler eliminare il tuo account?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "ha assegnato <0>{memberName}</0> alla carta"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "In attesa del cliente"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Backlog"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Kanban base"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Fatturazione"
@@ -157,10 +178,22 @@ msgstr "Fatturazione"
msgid "Billing portal"
msgstr "Portale di fatturazione"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Post del blog"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Bacheca"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "Il nome della bacheca non può superare i 100 caratteri"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "Il nome della bacheca è obbligatorio"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Bacheca non trovata"
@@ -199,6 +232,18 @@ msgstr "Bacheche"
msgid "Boards | {0}"
msgstr "Bacheche | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Brainstorming"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Bug"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Segnalazione bug"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -235,6 +280,10 @@ msgstr "Cancella filtri"
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
msgstr "Clicca sul link che abbiamo inviato a {magicLinkRecipient} per accedere."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Revisione del codice"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Collabora senza problemi con il tuo team."
@@ -251,6 +300,10 @@ msgstr "Commenti"
msgid "Company"
msgstr "Azienda"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Completato"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Controllo e proprietà completi:"
@@ -280,6 +333,10 @@ msgstr "Contatti"
msgid "Contact us"
msgstr "Contattaci"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Creazione contenuti"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continua con "
@@ -299,7 +356,7 @@ msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
msgid "Create another"
msgstr "Crea un altro"
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Crea bacheca"
@@ -341,6 +398,10 @@ msgstr "Crea spazio di lavoro"
msgid "created the card"
msgstr "ha creato la carta"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Critico"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Dominio personalizzato"
@@ -349,6 +410,10 @@ msgstr "Dominio personalizzato"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Gli URL personalizzati sono una funzionalità premium. Sarai indirizzato all'aggiornamento del tuo account."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Assistenza clienti"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Scuro"
@@ -387,6 +452,10 @@ msgstr "Elimina lista"
msgid "Delete workspace"
msgstr "Elimina spazio di lavoro"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Disconnetti Trello"
@@ -424,6 +493,7 @@ msgid "Docs"
msgstr "Documenti"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Documentazione"
@@ -431,6 +501,13 @@ msgstr "Documentazione"
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Non hai un account? <0><1>Registrati</1></0>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Fatto"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -444,6 +521,10 @@ msgstr "Modifica commento"
msgid "Edit label"
msgstr "Modifica etichetta"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Modifica"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "email"
@@ -452,6 +533,10 @@ msgstr "email"
msgid "Email"
msgstr "Email"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Miglioramento"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Inserisci il tuo indirizzo email"
@@ -509,6 +594,10 @@ msgstr "Tutto ciò che è incluso nel piano gratuito, più:"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Tutto ciò di cui hai bisogno, gratis per sempre. Bacheche illimitate, liste illimitate, schede illimitate. Aggiorna in qualsiasi momento."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Esecuzione"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -519,6 +608,14 @@ msgstr "Accesso con {0} fallito. Riprova."
msgid "FAQs"
msgstr "FAQ"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Funzionalità"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Richiesta funzionalità"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -545,7 +642,6 @@ msgstr "Trova risposte alle domande comuni sul progetto. Non trovi quello che st
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per workspace con più utenti (gratuita durante la beta) e per slug di workspace personalizzati. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
#: src/views/home/components/Pricing.tsx:32
#: src/views/home/components/Pricing.tsx:32
msgid "Free"
msgstr "Gratuito"
@@ -554,6 +650,14 @@ msgstr "Gratuito"
msgid "Free, forever"
msgstr "Gratuito, per sempre"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Tempo pieno"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Divertimento"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -599,6 +703,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Vai all'app"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "Alta priorità"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Assunto"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Ospita Kan sulla tua infrastruttura. Ideale per organizzazioni che necessitano di controllo completo sui propri dati."
@@ -631,6 +743,10 @@ msgstr "Riconosco che tutti i dati del mio account saranno eliminati permanentem
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "Riconosco che tutti i dati dell'area di lavoro saranno eliminati permanentemente e voglio procedere."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Idee"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Idee per migliorare questa pagina..."
@@ -651,6 +767,10 @@ msgstr "Importazione fallita"
msgid "Import your Trello boards and hit the ground running."
msgstr "Importa le tue bacheche Trello e parti subito."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Importante"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Importazione da Trello"
@@ -659,6 +779,12 @@ msgstr "Importazione da Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Importare le tue bacheche Trello in Kan è facile. Puoi seguire la nostra guida passo-passo <0>qui</0>."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "In corso"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Privati"
@@ -667,6 +793,10 @@ msgstr "Privati"
msgid "Integrations"
msgstr "Integrazioni"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Colloquio"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invita"
@@ -676,6 +806,10 @@ msgstr "Invita"
msgid "Invite member"
msgstr "Invita membro"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban è migliore con un team. Perfetto per piccoli team in crescita che cercano di collaborare."
@@ -703,6 +837,10 @@ msgstr "Etichette & Filtri"
msgid "Language"
msgstr "Lingua"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Apprendimento"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Legale"
@@ -735,10 +873,22 @@ msgstr "Login | kan.bn"
msgid "Logout"
msgstr "Esci"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "A lungo termine"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Bassa priorità"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "link magico"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Media priorità"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -764,7 +914,7 @@ msgstr "ha spostato la scheda da <0>{fromList}</0> a<1>{toList}</1>"
msgid "moved the card to another list"
msgstr "ha spostato la scheda in un'altra lista"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Nome"
@@ -777,7 +927,7 @@ msgstr "Hai bisogno di aiuto?"
msgid "New"
msgstr "Nuovo"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "Nuova bacheca"
@@ -798,10 +948,22 @@ msgstr "Nuova etichetta"
msgid "New list"
msgstr "Nuova lista"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nuovo ticket"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nuovo spazio di lavoro"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Newsletter"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Prossimi passi"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "Nessuna bacheca"
@@ -818,6 +980,14 @@ msgstr "Nessuna carta di credito richiesta"
msgid "No lists"
msgstr "Nessuna lista"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Offerta"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Inserimento"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa azione non può essere annullata."
@@ -838,6 +1008,10 @@ msgstr "Organizza e trova le schede rapidamente con potenti strumenti di filtrag
msgid "Own your data"
msgstr "Possiedi i tuoi dati"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Part-time"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Frequenza di pagamento"
@@ -851,6 +1025,14 @@ msgstr "In attesa"
msgid "per user/month"
msgstr "per utente/mese"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Progetto personale"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Pianificazione"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Inserisci un indirizzo email valido"
@@ -926,10 +1108,30 @@ msgstr "Immagine del profilo"
msgid "Public"
msgstr "Pubblico"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Pubblicazione"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Domanda"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "Domande?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Vittoria rapida"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Reclutamento"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "Remoto"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Rimuovi"
@@ -950,10 +1152,22 @@ msgstr "ha rimosso un membro dalla scheda"
msgid "removed label <0>{label}</0>"
msgstr "ha rimosso l'etichetta <0>{label}</0>"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Ricerca"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Risoluzione"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Risorse"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Revisione"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Revoca"
@@ -979,6 +1193,10 @@ msgstr "Salva"
msgid "Save time with reusable board templates."
msgstr "Risparmia tempo con modelli di bacheca riutilizzabili."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Selezione"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Seleziona tutto"
@@ -1003,6 +1221,10 @@ msgstr "si è auto-assegnato la scheda"
msgid "Send"
msgstr "Invia"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1043,6 +1265,14 @@ msgstr "Prezzi semplici"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Gestione delle attività semplice e visuale che funziona. Trascina e rilascia le schede, collabora con il tuo team e ottieni di più."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Social media"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Sviluppo software"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Metti una stella su Github"
@@ -1118,6 +1348,11 @@ msgstr "Questo comporterà l'eliminazione permanente di tutti i dati associati a
msgid "This workspace username has already been taken"
msgstr "Questo nome utente dell'area di lavoro è già stato utilizzato"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "Da fare"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Attiva/disattiva menu"
@@ -1134,6 +1369,10 @@ msgstr "Trello disconnesso"
msgid "Trello imports"
msgstr "Importazioni da Trello"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Smistamento"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Impossibile aggiungere il commento"
@@ -1256,6 +1495,11 @@ msgstr "ha aggiornato il titolo in <0>{toTitle}</0>"
msgid "Upgrade"
msgstr "Aggiorna"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Urgente"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "L'URL può contenere solo lettere, numeri e trattini"
@@ -1268,10 +1512,18 @@ msgstr "L'URL non può superare i 24 caratteri"
msgid "URL must be at least 3 characters long"
msgstr "L'URL deve contenere almeno 3 caratteri"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Usa template"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Utente"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Visualizza e gestisci le tue chiavi API."
@@ -1374,6 +1626,10 @@ msgstr "Slug dell'area di lavoro aggiornato"
msgid "Workspace URL"
msgstr "URL dello spazio di lavoro"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Scrittura"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Annuale"

File diff suppressed because one or more lines are too long

View File

@@ -124,6 +124,14 @@ msgstr "API-sleutels"
msgid "API Reference"
msgstr "API-referentie"
#: src/views/boards/components/TemplateBoards.tsx:62
msgid "Applicants"
msgstr "Sollicitanten"
#: src/views/boards/components/TemplateBoards.tsx:33
msgid "Approval"
msgstr "Goedkeuring"
#: src/views/members/components/DeleteMemberConfirmation.tsx:47
msgid "Are you sure want to remove {entityLabel}?"
msgstr "Weet je zeker dat je {entityLabel} wilt verwijderen?"
@@ -149,7 +157,20 @@ msgstr "Weet je zeker dat je je account wilt verwijderen?"
msgid "assigned <0>{memberName}</0> to the card"
msgstr "heeft <0>{memberName}</0> aan de kaart toegewezen"
#: src/views/boards/components/TemplateBoards.tsx:46
msgid "Awaiting Customer"
msgstr "Wachten op klant"
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Backlog"
msgstr "Backlog"
#: src/views/boards/components/TemplateBoards.tsx:15
msgid "Basic Kanban"
msgstr "Basis kanban"
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturering"
@@ -157,10 +178,22 @@ msgstr "Facturering"
msgid "Billing portal"
msgstr "Factureringsportaal"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Blog Post"
msgstr "Blogbericht"
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Bord"
#: src/views/boards/components/NewBoardForm.tsx:21
msgid "Board name cannot exceed 100 characters"
msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
#: src/views/boards/components/NewBoardForm.tsx:20
msgid "Board name is required"
msgstr "Bordnaam is verplicht"
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Bord niet gevonden"
@@ -199,6 +232,18 @@ msgstr "Borden"
msgid "Boards | {0}"
msgstr "Borden | {0}"
#: src/views/boards/components/TemplateBoards.tsx:29
msgid "Brainstorming"
msgstr "Brainstormen"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Bug"
msgstr "Bug"
#: src/views/boards/components/TemplateBoards.tsx:51
msgid "Bug Report"
msgstr "Bugrapport"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:98
#: src/views/settings/components/DeleteAccountConfirmation.tsx:88
#: src/views/settings/components/CustomURLConfirmation.tsx:50
@@ -235,6 +280,10 @@ msgstr "Filters wissen"
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."
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "Code Review"
msgstr "Code review"
#: src/views/home/components/Features.tsx:84
msgid "Collaborate seamlessly with your team."
msgstr "Werk naadloos samen met je team."
@@ -251,6 +300,10 @@ msgstr "Opmerkingen"
msgid "Company"
msgstr "Bedrijf"
#: src/views/boards/components/TemplateBoards.tsx:81
msgid "Complete"
msgstr "Voltooid"
#: src/views/home/components/Pricing.tsx:70
msgid "Complete control and ownership:"
msgstr "Volledige controle en eigendom:"
@@ -280,6 +333,10 @@ msgstr "Contact"
msgid "Contact us"
msgstr "Neem contact op"
#: src/views/boards/components/TemplateBoards.tsx:27
msgid "Content Creation"
msgstr "Content creatie"
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Doorgaan met "
@@ -299,7 +356,7 @@ msgstr "Bepaal wie je borden kan bekijken en bewerken."
msgid "Create another"
msgstr "Maak nog een"
#: src/views/boards/components/NewBoardForm.tsx:77
#: src/views/boards/components/NewBoardForm.tsx:128
msgid "Create board"
msgstr "Maak bord"
@@ -341,6 +398,10 @@ msgstr "Werkruimte maken"
msgid "created the card"
msgstr "heeft de kaart aangemaakt"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Critical"
msgstr "Kritiek"
#: src/views/home/components/Pricing.tsx:74
msgid "Custom domain"
msgstr "Aangepast domein"
@@ -349,6 +410,10 @@ msgstr "Aangepast domein"
msgid "Custom URLs are a premium feature. You'll be directed to upgrade your account."
msgstr "Aangepaste URL's zijn een premium functie. Je wordt doorgestuurd om je account te upgraden."
#: src/views/boards/components/TemplateBoards.tsx:41
msgid "Customer Support"
msgstr "Klantenservice"
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Donker"
@@ -387,6 +452,10 @@ msgstr "Lijst verwijderen"
msgid "Delete workspace"
msgstr "Werkruimte verwijderen"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Design"
msgstr "Ontwerp"
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Trello ontkoppelen"
@@ -424,6 +493,7 @@ msgid "Docs"
msgstr "Docs"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Documentation"
msgstr "Documentatie"
@@ -431,6 +501,13 @@ msgstr "Documentatie"
msgid "Don't have an account? <0><1>Sign up</1></0>"
msgstr "Heb je geen account? <0><1>Registreer je</1></0>"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:35
#: src/views/boards/components/TemplateBoards.tsx:48
msgid "Done"
msgstr "Klaar"
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/BoardDropdown.tsx:15
msgid "Edit board URL"
@@ -444,6 +521,10 @@ msgstr "Reactie bewerken"
msgid "Edit label"
msgstr "Label bewerken"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Bewerken"
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "e-mail"
@@ -452,6 +533,10 @@ msgstr "e-mail"
msgid "Email"
msgstr "E-mail"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Enhancement"
msgstr "Verbetering"
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Voer je e-mailadres in"
@@ -509,6 +594,10 @@ msgstr "Alles in het gratis abonnement, plus:"
msgid "Everything you need, free forever. Unlimited boards, unlimited lists, unlimited cards. Upgrade any time."
msgstr "Alles wat je nodig hebt, voor altijd gratis. Onbeperkte borden, onbeperkte lijsten, onbeperkte kaarten. Upgrade wanneer je maar wilt."
#: src/views/boards/components/TemplateBoards.tsx:78
msgid "Execution"
msgstr "Uitvoering"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:241
msgid "Failed to login with {0}. Please try again."
@@ -519,6 +608,14 @@ msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
msgid "FAQs"
msgstr "Veelgestelde vragen"
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "Feature"
msgstr "Functie"
#: src/views/boards/components/TemplateBoards.tsx:52
msgid "Feature Request"
msgstr "Functieverzoek"
#: src/views/home/components/Header.tsx:14
#: src/views/home/components/Footer.tsx:49
#: src/views/home/components/Features.tsx:125
@@ -545,7 +642,6 @@ msgstr "Vind antwoorden op veelgestelde vragen over het project. Kun je niet vin
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers (gratis tijdens de bèta) en voor aangepaste werkruimte-slugs. Je bent niet verplicht om hiervan gebruik te maken en je kunt de software gratis op je eigen infrastructuur hosten."
#: src/views/home/components/Pricing.tsx:32
#: src/views/home/components/Pricing.tsx:32
msgid "Free"
msgstr "Gratis"
@@ -554,6 +650,14 @@ msgstr "Gratis"
msgid "Free, forever"
msgstr "Altijd gratis"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Full-time"
msgstr "Fulltime"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Fun"
msgstr "Leuk"
#: src/views/home/components/Header.tsx:102
#: src/views/home/components/Header.tsx:141
#: src/views/home/components/Cta.tsx:61
@@ -599,6 +703,14 @@ msgstr "GitHub"
msgid "Go to app"
msgstr "Naar de app"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "High Priority"
msgstr "Hoge prioriteit"
#: src/views/boards/components/TemplateBoards.tsx:67
msgid "Hired"
msgstr "Aangenomen"
#: src/views/home/components/Pricing.tsx:69
msgid "Host Kan on your own infrastructure. Ideal for organisations that need complete control over their data."
msgstr "Host Kan op je eigen infrastructuur. Ideaal voor organisaties die volledige controle over hun gegevens nodig hebben."
@@ -631,6 +743,10 @@ msgstr "Ik bevestig dat alle gegevens van mijn account permanent worden verwijde
msgid "I acknowledge that all of the workspace data will be permanently deleted and want to proceed."
msgstr "Ik bevestig dat alle gegevens van de werkruimte permanent worden verwijderd en wil doorgaan."
#: src/views/boards/components/TemplateBoards.tsx:75
msgid "Ideas"
msgstr "Ideeën"
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideeën om deze pagina te verbeteren..."
@@ -651,6 +767,10 @@ msgstr "Import mislukt"
msgid "Import your Trello boards and hit the ground running."
msgstr "Importeer je Trello-borden en ga direct aan de slag."
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Important"
msgstr "Belangrijk"
#: src/views/home/components/Footer.tsx:27
msgid "Importing from Trello"
msgstr "Importeren vanuit Trello"
@@ -659,6 +779,12 @@ msgstr "Importeren vanuit Trello"
msgid "Importing your Trello boards into Kan is easy. You can follow our step-by-step guide <0>here</0>."
msgstr "Het importeren van je Trello-borden naar Kan is eenvoudig. Je kunt onze stap-voor-stap handleiding <0>hier</0> volgen."
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
#: src/views/boards/components/TemplateBoards.tsx:45
msgid "In Progress"
msgstr "In behandeling"
#: src/views/home/components/Pricing.tsx:28
msgid "Individuals"
msgstr "Individuen"
@@ -667,6 +793,10 @@ msgstr "Individuen"
msgid "Integrations"
msgstr "Integraties"
#: src/views/boards/components/TemplateBoards.tsx:64
msgid "Interviewing"
msgstr "Interviewen"
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Uitnodigen"
@@ -676,6 +806,10 @@ msgstr "Uitnodigen"
msgid "Invite member"
msgstr "Lid uitnodigen"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Junior"
msgstr "Junior"
#: src/views/home/components/Pricing.tsx:51
msgid "Kanban is better with a team. Perfect for small and growing teams looking to collaborate."
msgstr "Kanban werkt beter met een team. Perfect voor kleine en groeiende teams die willen samenwerken."
@@ -703,6 +837,10 @@ msgstr "Labels & filters"
msgid "Language"
msgstr "Taal"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Learning"
msgstr "Leren"
#: src/views/home/components/Footer.tsx:130
msgid "Legal"
msgstr "Juridisch"
@@ -735,10 +873,22 @@ msgstr "Login | kan.bn"
msgid "Logout"
msgstr "Uitloggen"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Long-term"
msgstr "Lange termijn"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Low Priority"
msgstr "Lage prioriteit"
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "magische link"
#: src/views/boards/components/TemplateBoards.tsx:17
msgid "Medium Priority"
msgstr "Gemiddelde prioriteit"
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
@@ -764,7 +914,7 @@ msgstr "heeft de kaart verplaatst van <0>{fromList}</0> naar<1>{toList}</1>"
msgid "moved the card to another list"
msgstr "heeft de kaart naar een andere lijst verplaatst"
#: src/views/boards/components/NewBoardForm.tsx:63
#: src/views/boards/components/NewBoardForm.tsx:99
#: src/components/LabelForm.tsx:134
msgid "Name"
msgstr "Naam"
@@ -777,7 +927,7 @@ msgstr "Hulp nodig?"
msgid "New"
msgstr "Nieuw"
#: src/views/boards/components/NewBoardForm.tsx:49
#: src/views/boards/components/NewBoardForm.tsx:85
msgid "New board"
msgstr "Nieuw bord"
@@ -798,10 +948,22 @@ msgstr "Nieuw label"
msgid "New list"
msgstr "Nieuwe lijst"
#: src/views/boards/components/TemplateBoards.tsx:43
msgid "New Ticket"
msgstr "Nieuw ticket"
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nieuwe werkruimte"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Newsletter"
msgstr "Nieuwsbrief"
#: src/views/boards/components/TemplateBoards.tsx:80
msgid "Next Steps"
msgstr "Volgende stappen"
#: src/views/boards/components/BoardsList.tsx:35
msgid "No boards"
msgstr "Geen borden"
@@ -818,6 +980,14 @@ msgstr "Geen creditcard vereist"
msgid "No lists"
msgstr "Geen lijsten"
#: src/views/boards/components/TemplateBoards.tsx:65
msgid "Offer"
msgstr "Aanbod"
#: src/views/boards/components/TemplateBoards.tsx:66
msgid "Onboarding"
msgstr "Inwerktraject"
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
@@ -838,6 +1008,10 @@ msgstr "Organiseer en vind kaarten snel met krachtige filtertools."
msgid "Own your data"
msgstr "Bezit je eigen data"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Part-time"
msgstr "Deeltijd"
#: src/views/home/components/Pricing.tsx:101
msgid "Payment frequency"
msgstr "Betalingsfrequentie"
@@ -851,6 +1025,14 @@ msgstr "In behandeling"
msgid "per user/month"
msgstr "per gebruiker/maand"
#: src/views/boards/components/TemplateBoards.tsx:73
msgid "Personal Project"
msgstr "Persoonlijk project"
#: src/views/boards/components/TemplateBoards.tsx:77
msgid "Planning"
msgstr "Planning"
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Voer een geldig e-mailadres in"
@@ -926,10 +1108,30 @@ msgstr "Profielfoto"
msgid "Public"
msgstr "Openbaar"
#: src/views/boards/components/TemplateBoards.tsx:34
msgid "Publishing"
msgstr "Publiceren"
#: src/views/boards/components/TemplateBoards.tsx:53
msgid "Question"
msgstr "Vraag"
#: src/views/home/components/Faqs.tsx:147
msgid "Questions?"
msgstr "Vragen?"
#: src/views/boards/components/TemplateBoards.tsx:83
msgid "Quick Win"
msgstr "Snelle winst"
#: src/views/boards/components/TemplateBoards.tsx:60
msgid "Recruitment"
msgstr "Werving"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Remote"
msgstr "Op afstand"
#: src/views/members/components/DeleteMemberConfirmation.tsx:58
msgid "Remove"
msgstr "Verwijderen"
@@ -950,10 +1152,22 @@ msgstr "heeft een lid van de kaart verwijderd"
msgid "removed label <0>{label}</0>"
msgstr "heeft label <0>{label}</0> verwijderd"
#: src/views/boards/components/TemplateBoards.tsx:76
msgid "Research"
msgstr "Onderzoek"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Resolution"
msgstr "Oplossing"
#: src/views/home/components/Footer.tsx:113
msgid "Resources"
msgstr "Bronnen"
#: src/views/boards/components/TemplateBoards.tsx:79
msgid "Review"
msgstr "Beoordeling"
#: src/views/settings/components/CreateAPIKeyForm.tsx:49
msgid "Revoke"
msgstr "Intrekken"
@@ -979,6 +1193,10 @@ msgstr "Opslaan"
msgid "Save time with reusable board templates."
msgstr "Bespaar tijd met herbruikbare bordsjablonen."
#: src/views/boards/components/TemplateBoards.tsx:63
msgid "Screening"
msgstr "Screening"
#: src/views/boards/components/ImportBoardsForm.tsx:274
msgid "Select all"
msgstr "Alles selecteren"
@@ -1003,6 +1221,10 @@ msgstr "heeft de kaart aan zichzelf toegewezen"
msgid "Send"
msgstr "Versturen"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
@@ -1043,6 +1265,14 @@ msgstr "Eenvoudige prijzen"
msgid "Simple, visual task management that just works. Drag and drop cards, collaborate with your team, and get more done."
msgstr "Eenvoudig, visueel taakbeheer dat gewoon werkt. Sleep kaarten, werk samen met je team en krijg meer gedaan."
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Social Media"
msgstr "Social media"
#: src/views/boards/components/TemplateBoards.tsx:21
msgid "Software Development"
msgstr "Softwareontwikkeling"
#: src/views/home/index.tsx:37
msgid "Star on Github"
msgstr "Star op Github"
@@ -1118,6 +1348,11 @@ msgstr "Dit zal resulteren in het permanent verwijderen van alle gegevens die aa
msgid "This workspace username has already been taken"
msgstr "Deze werkruimtegebruikersnaam is al in gebruik"
#: src/views/boards/components/TemplateBoards.tsx:16
#: src/views/boards/components/TemplateBoards.tsx:22
msgid "To Do"
msgstr "Te doen"
#: src/views/home/components/Header.tsx:73
msgid "Toggle menu"
msgstr "Menu in-/uitschakelen"
@@ -1134,6 +1369,10 @@ msgstr "Trello ontkoppeld"
msgid "Trello imports"
msgstr "Trello-imports"
#: src/views/boards/components/TemplateBoards.tsx:44
msgid "Triaging"
msgstr "Triage"
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Kan geen reactie toevoegen"
@@ -1256,6 +1495,11 @@ msgstr "titel bijgewerkt naar <0>{toTitle}</0>"
msgid "Upgrade"
msgstr "Upgraden"
#: src/views/boards/components/TemplateBoards.tsx:37
#: src/views/boards/components/TemplateBoards.tsx:54
msgid "Urgent"
msgstr "Urgent"
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:36
msgid "URL can only contain letters, numbers, and hyphens"
msgstr "URL kan alleen letters, cijfers en koppeltekens bevatten"
@@ -1268,10 +1512,18 @@ msgstr "URL mag niet langer zijn dan 24 tekens"
msgid "URL must be at least 3 characters long"
msgstr "URL moet minimaal 3 tekens lang zijn"
#: src/views/boards/components/NewBoardForm.tsx:117
msgid "Use template"
msgstr "Sjabloon gebruiken"
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Gebruiker"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Bekijk en beheer je API-sleutels."
@@ -1374,6 +1626,10 @@ msgstr "Werkruimte-slug bijgewerkt"
msgid "Workspace URL"
msgstr "Werkruimte URL"
#: src/views/boards/components/TemplateBoards.tsx:30
msgid "Writing"
msgstr "Schrijven"
#: src/views/home/components/Pricing.tsx:19
msgid "Yearly"
msgstr "Jaarlijks"

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,7 @@ import "~/styles/globals.css";
import "~/utils/i18n";
import type { AppType } from "next/app";
import { Viewport } from "next";
import { Plus_Jakarta_Sans } from "next/font/google";
import Script from "next/script";
import { env } from "next-runtime-env";
@@ -26,6 +27,13 @@ export const metadata = {
icons: [{ rel: "icon", url: "/favicon.ico" }],
};
export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
maximumScale: 1,
userScalable: false,
};
const MyApp: AppType = ({ Component, pageProps }) => {
const posthogKey = env("NEXT_PUBLIC_POSTHOG_KEY");

View File

@@ -1,12 +1,12 @@
import { WorkspaceProvider } from "~/providers/workspace";
import Dashboard from "~/components/Dashboard";
import Popup from "~/components/Popup";
import CardView from "~/views/card";
import { WorkspaceProvider } from "~/providers/workspace";
import CardView, { CardRightPanel } from "~/views/card";
export default function CardPage() {
return (
<WorkspaceProvider>
<Dashboard>
<Dashboard hasRightPanel rightPanel={<CardRightPanel />}>
<CardView />
</Dashboard>
<Popup />

View File

@@ -2,10 +2,11 @@
@tailwind components;
@tailwind utilities;
[contenteditable=true]:empty:before {
[contenteditable="true"]:empty:before {
content: attr(placeholder);
display: block;
color: #707070;
font-size: 0.8rem;
}
.gradient-border::before {
@@ -18,7 +19,7 @@
transparent 110deg,
transparent 360deg
);
content: '';
content: "";
position: absolute;
inset: -50%;
width: 200%;

View File

@@ -240,7 +240,7 @@ export default function BoardPage() {
/>
<div className="relative flex h-full flex-col">
<PatternedBackground />
<div className="z-10 flex w-full justify-between p-8">
<div className="z-10 flex w-full flex-col justify-between p-6 md:flex-row md:p-8">
{isLoading && !boardData && (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-100" />
@@ -249,7 +249,7 @@ export default function BoardPage() {
{boardData && (
<form
onSubmit={handleSubmit(onSubmit)}
className="focus-visible:outline-none"
className="order-2 focus-visible:outline-none md:order-1"
>
<input
id="name"
@@ -261,12 +261,12 @@ export default function BoardPage() {
</form>
)}
{!boardData && !isLoading && (
<p className="block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
<p className="order-2 block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem] md:order-1">
{t`Board not found`}
</p>
)}
<div className="flex items-center space-x-2">
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
<VisibilityButton
visibility={boardData?.visibility ?? "private"}
boardPublicId={boardId ?? ""}

View File

@@ -81,7 +81,7 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => {
<Listbox.Button className="focus-ring-light-700 block w-full rounded-md border-0 bg-dark-300 bg-white/5 px-4 py-1.5 text-neutral-900 shadow-sm ring-1 ring-inset ring-light-600 focus:ring-2 focus:ring-inset dark:text-dark-1000 dark:ring-dark-700 dark:focus:ring-dark-700 sm:text-sm sm:leading-6">
<span className="flex items-center">
{integrationProviders[field.value]?.icon}
<span className="ml-2 block truncate">
<span className="ml-2 block truncate text-sm">
{integrationProviders[field.value]?.name}
</span>
</span>
@@ -113,7 +113,7 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => {
integrationProviders[integration.provider]
?.icon
}
<span className="ml-2 block truncate font-normal">
<span className="ml-2 block truncate text-sm font-normal">
{
integrationProviders[integration.provider]
?.name
@@ -125,12 +125,12 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => {
) : (
<Listbox.Option
key="trello_placeholder"
className="relative cursor-default select-none px-1"
className="font-sm relative cursor-default select-none px-1"
value="trello"
>
<div className="flex items-center rounded-[5px] p-1 hover:bg-light-200 dark:hover:bg-dark-400">
<div className="flex items-center rounded-[5px] p-1 text-sm hover:bg-light-200 dark:hover:bg-dark-400">
{integrationProviders.trello?.icon}
<span className="ml-2 block truncate font-normal">
<span className="ml-2 block truncate text-sm">
{integrationProviders.trello?.name}
</span>
</div>

View File

@@ -1,28 +1,59 @@
import { zodResolver } from "@hookform/resolvers/zod";
import { t } from "@lingui/core/macro";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { HiXMark } from "react-icons/hi2";
import { z } from "zod";
import type { NewBoardInput } from "@kan/api/types";
import type { Template } from "./TemplateBoards";
import Button from "~/components/Button";
import Input from "~/components/Input";
import Toggle from "~/components/Toggle";
import { useModal } from "~/providers/modal";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
import TemplateBoards, { getTemplates } from "./TemplateBoards";
const schema = z.object({
name: z
.string()
.min(1, { message: t`Board name is required` })
.max(100, { message: t`Board name cannot exceed 100 characters` }),
workspacePublicId: z.string(),
template: z.custom<Template | null>(),
});
interface NewBoardInputWithTemplate {
name: string;
workspacePublicId: string;
template: Template | null;
}
export function NewBoardForm() {
const utils = api.useUtils();
const { closeModal } = useModal();
const { workspace } = useWorkspace();
const [showTemplates, setShowTemplates] = useState(false);
const { register, handleSubmit } = useForm<NewBoardInput>({
const templates = getTemplates();
const {
register,
handleSubmit,
watch,
setValue,
formState: { errors },
} = useForm<NewBoardInputWithTemplate>({
resolver: zodResolver(schema),
defaultValues: {
name: "",
workspacePublicId: workspace.publicId || "",
template: null,
},
});
const currentTemplate = watch("template");
const refetchBoards = () => utils.board.all.refetch();
const createBoard = api.board.create.useMutation({
@@ -32,8 +63,13 @@ export function NewBoardForm() {
},
});
const onSubmit = (data: NewBoardInput) => {
createBoard.mutate(data);
const onSubmit = (data: NewBoardInputWithTemplate) => {
createBoard.mutate({
name: data.name,
workspacePublicId: data.workspacePublicId,
lists: data.template?.lists ?? [],
labels: data.template?.labels ?? [],
});
};
useEffect(() => {
@@ -62,6 +98,7 @@ export function NewBoardForm() {
id="name"
placeholder={t`Name`}
{...register("name", { required: true })}
errorMessage={errors.name?.message}
onKeyDown={async (e) => {
if (e.key === "Enter") {
e.preventDefault();
@@ -70,8 +107,22 @@ export function NewBoardForm() {
}}
/>
</div>
<TemplateBoards
currentBoard={currentTemplate}
setCurrentBoard={(t) => setValue("template", t)}
showTemplates={showTemplates}
/>
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Use template`}
isChecked={showTemplates}
onChange={() => {
setShowTemplates(!showTemplates);
if (!showTemplates && !currentTemplate) {
setValue("template", templates[0] ?? null);
}
}}
/>
<div>
<Button type="submit" isLoading={createBoard.isPending}>
{t`Create board`}

View File

@@ -0,0 +1,191 @@
import { t } from "@lingui/core/macro";
import { useEffect, useRef, useState } from "react";
import { HiCheckCircle } from "react-icons/hi2";
export interface Template {
id: string;
name: string;
lists: string[];
labels: string[];
}
export const getTemplates = (): Template[] => [
{
id: "basic",
name: t`Basic Kanban`,
lists: [t`To Do`, t`In Progress`, t`Done`],
labels: [t`High Priority`, t`Medium Priority`, t`Low Priority`],
},
{
id: "software-dev",
name: t`Software Development`,
lists: [t`Backlog`, t`To Do`, t`In Progress`, t`Code Review`, t`Done`],
labels: [t`Bug`, t`Feature`, t`Enhancement`, t`Critical`, t`Documentation`],
},
{
id: "content-creation",
name: t`Content Creation`,
lists: [
t`Brainstorming`,
t`Writing`,
t`Editing`,
t`Design`,
t`Approval`,
t`Publishing`,
t`Done`,
],
labels: [t`Blog Post`, t`Social Media`, t`Video`, t`Newsletter`, t`Urgent`],
},
{
id: "customer-support",
name: t`Customer Support`,
lists: [
t`New Ticket`,
t`Triaging`,
t`In Progress`,
t`Awaiting Customer`,
t`Resolution`,
t`Done`,
],
labels: [
t`Bug Report`,
t`Feature Request`,
t`Question`,
t`Urgent`,
t`Billing`,
],
},
{
id: "recruitment",
name: t`Recruitment`,
lists: [
t`Applicants`,
t`Screening`,
t`Interviewing`,
t`Offer`,
t`Onboarding`,
t`Hired`,
],
labels: [t`Remote`, t`Full-time`, t`Part-time`, t`Senior`, t`Junior`],
},
{
id: "personal-project",
name: t`Personal Project`,
lists: [
t`Ideas`,
t`Research`,
t`Planning`,
t`Execution`,
t`Review`,
t`Next Steps`,
t`Complete`,
],
labels: [t`Important`, t`Quick Win`, t`Long-term`, t`Learning`, t`Fun`],
},
];
export default function TemplateBoards({
currentBoard,
setCurrentBoard,
showTemplates,
}: {
currentBoard: Template | null;
setCurrentBoard: (board: Template | null) => void;
showTemplates: boolean;
}) {
const [showFade, setShowFade] = useState(false);
const [showTopFade, setShowTopFade] = useState(false);
const scrollRef = useRef<HTMLDivElement>(null);
const templates = getTemplates();
const handleScroll = () => {
if (!scrollRef.current) return;
const { scrollTop, scrollHeight, clientHeight } = scrollRef.current;
const isAtBottom = scrollTop + clientHeight >= scrollHeight - 5;
const isAtTop = scrollTop <= 5;
setShowFade(!isAtBottom);
setShowTopFade(!isAtTop);
};
useEffect(() => {
const scrollElement = scrollRef.current;
if (!scrollElement) return;
handleScroll();
scrollElement.addEventListener("scroll", handleScroll);
return () => scrollElement.removeEventListener("scroll", handleScroll);
}, [showTemplates]);
useEffect(() => {
if (showTemplates && currentBoard && scrollRef.current) {
const selectedElement = scrollRef.current.querySelector(
`[data-template-id="${currentBoard.id}"]`,
);
if (selectedElement) {
selectedElement.scrollIntoView({ behavior: "smooth", block: "center" });
}
}
}, [showTemplates, currentBoard]);
const handleBoardSelect = (boardId: string) => {
if (currentBoard?.id === boardId) {
setCurrentBoard(null);
} else {
setCurrentBoard(
templates.find((template) => template.id === boardId) ?? null,
);
}
};
if (!showTemplates) {
return null;
}
return (
<div className="px-5 pt-4">
<div className="relative">
<div
ref={scrollRef}
className="scroll-container -mr-2 flex max-h-[200px] flex-col gap-3 overflow-y-auto pr-2 pt-0.5"
>
{templates.map((template) => (
<label
key={template.id}
data-template-id={template.id}
onClick={() => handleBoardSelect(template.id)}
className={`scroll-container relative flex cursor-pointer rounded-lg border p-3 transition-all hover:bg-light-100 dark:hover:bg-dark-200 ${
currentBoard?.id === template.id
? "border-light-700 bg-light-100 ring-1 ring-inset ring-light-700 dark:border-dark-700 dark:bg-dark-200 dark:ring-dark-700"
: "border-light-600 dark:border-dark-600"
}`}
>
<div className="flex-1">
<h4 className="text-sm font-medium text-gray-900 dark:text-gray-100">
{template.name}
</h4>
<p className="text-xs text-light-950 dark:text-dark-900">
{template.lists.join(", ")}
</p>
</div>
{currentBoard?.id === template.id && (
<div className="absolute right-3 top-3 text-light-1000 dark:text-dark-1000">
<HiCheckCircle className="h-5 w-5" />
</div>
)}
</label>
))}
</div>
{showTopFade && (
<div className="pointer-events-none absolute left-0 right-0 top-0 h-6 bg-gradient-to-b from-white/80 to-transparent dark:from-dark-100/80" />
)}
{showFade && (
<div className="pointer-events-none absolute bottom-0 left-0 right-0 h-6 bg-gradient-to-t from-white/80 to-transparent dark:from-dark-100/80" />
)}
</div>
</div>
);
}

View File

@@ -1,6 +1,7 @@
import { t } from "@lingui/core/macro";
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
import Button from "~/components/Button";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
import { PageHead } from "~/components/PageHead";
@@ -19,38 +20,32 @@ export default function BoardsPage() {
return (
<>
<PageHead title={t`Boards | ${workspace.name ?? "Workspace"}`} />
<div className="h-full p-8">
<div className="mb-8 flex w-full justify-between">
<div className="m-auto h-full max-w-[1600px] px-5 py-6 md:px-8 md:py-8">
<div className="mb-8 flex w-full items-center justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Boards`}
</h1>
<div className="flex">
<button
<div className="flex gap-2">
<Button
type="button"
className="bg-dark-3000 mr-2 flex items-center gap-x-1.5 rounded-md border-[1px] border-light-600 px-3 py-2 text-sm text-neutral-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 dark:border-dark-600 dark:text-dark-1000"
variant="secondary"
onClick={() => openModal("IMPORT_BOARDS")}
iconLeft={
<HiArrowDownTray aria-hidden="true" className="h-4 w-4" />
}
>
<div className="flex h-5 w-5 items-center">
<HiArrowDownTray
className="-mr-0.5 h-4 w-4"
aria-hidden="true"
/>
</div>
{t`Import`}
</button>
<button
</Button>
<Button
type="button"
className="flex items-center gap-x-1.5 rounded-md bg-light-1000 px-3 py-2 text-sm font-semibold text-light-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 dark:bg-dark-1000 dark:text-dark-50"
variant="primary"
onClick={() => openModal("NEW_BOARD")}
iconLeft={
<HiOutlinePlusSmall aria-hidden="true" className="h-4 w-4" />
}
>
<div className="h-5 w-5 items-center">
<HiOutlinePlusSmall
className="-mr-0.5 h-5 w-5"
aria-hidden="true"
/>
</div>
{t`New`}
</button>
</Button>
</div>
</div>

View File

@@ -145,7 +145,7 @@ const Comment = ({
html={watch("comment")}
disabled={false}
onChange={(e) => setValue("comment", e.target.value)}
className="block w-full max-w-[800px] border-0 bg-transparent py-1.5 text-light-900 focus-visible:outline-none dark:text-dark-1000 sm:text-sm sm:leading-6"
className="block w-full max-w-[800px] border-0 bg-transparent py-1.5 text-sm text-light-900 focus-visible:outline-none dark:text-dark-1000 sm:text-sm sm:leading-6"
/>
<div className="flex justify-end space-x-2">
<Button

View File

@@ -32,29 +32,18 @@ interface FormValues {
description: string;
}
export default function CardPage() {
export function CardRightPanel() {
const router = useRouter();
const utils = api.useUtils();
const { modalContentType, entityId } = useModal();
const { showPopup } = usePopup();
const { workspace } = useWorkspace();
const cardId = Array.isArray(router.query.cardId)
? router.query.cardId[0]
: router.query.cardId;
const { data: card, isLoading } = api.card.byId.useQuery({
const { data: card } = api.card.byId.useQuery({
cardPublicId: cardId ?? "",
});
const refetchCard = async () => {
if (cardId) await utils.card.byId.refetch({ cardPublicId: cardId });
};
const board = card?.list.board;
const boardId = board?.publicId;
const labels = board?.labels;
const activities = card?.activities;
const workspaceMembers = board?.workspace.members;
const selectedLabels = card?.labels;
const selectedMembers = card?.members;
@@ -109,6 +98,59 @@ export default function CardPage() {
};
}) ?? [];
return (
<div className="h-full w-[360px] border-l-[1px] border-light-600 bg-light-200 p-8 text-light-900 dark:border-dark-400 dark:bg-dark-100 dark:text-dark-900">
<div className="mb-4 flex w-full flex-row">
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`List`}</p>
<ListSelector
cardPublicId={cardId ?? ""}
lists={formattedLists}
isLoading={!card}
/>
</div>
<div className="mb-4 flex w-full flex-row">
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`Labels`}</p>
<LabelSelector
cardPublicId={cardId ?? ""}
labels={formattedLabels}
isLoading={!card}
/>
</div>
<div className="flex w-full flex-row">
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`Members`}</p>
<MemberSelector
cardPublicId={cardId ?? ""}
members={formattedMembers}
isLoading={!card}
/>
</div>
</div>
);
}
export default function CardPage() {
const router = useRouter();
const utils = api.useUtils();
const { modalContentType, entityId } = useModal();
const { showPopup } = usePopup();
const { workspace } = useWorkspace();
const cardId = Array.isArray(router.query.cardId)
? router.query.cardId[0]
: router.query.cardId;
const { data: card, isLoading } = api.card.byId.useQuery({
cardPublicId: cardId ?? "",
});
const refetchCard = async () => {
if (cardId) await utils.card.byId.refetch({ cardPublicId: cardId });
};
const board = card?.list.board;
const boardId = board?.publicId;
const activities = card?.activities;
const updateCard = api.card.update.useMutation({
onError: () => {
showPopup({
@@ -138,8 +180,6 @@ export default function CardPage() {
});
};
const description = watch("description");
if (!cardId) return <></>;
return (
@@ -149,7 +189,7 @@ export default function CardPage() {
/>
<div className="flex h-full flex-1 flex-row">
<div className="flex h-full w-full flex-col overflow-hidden">
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto p-8">
<div className="h-full max-h-[calc(100dvh-3rem)] overflow-y-auto p-6 md:max-h-[calc(100dvh-4rem)] md:p-8">
<div className="mb-8 flex w-full items-center justify-between">
{!card && isLoading && (
<div className="flex space-x-2">
@@ -196,7 +236,7 @@ export default function CardPage() {
</div>
{card && (
<>
<div className="mb-10 flex w-full max-w-2xl justify-between">
<div className="mb-10 flex w-full max-w-2xl flex-col justify-between">
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full space-y-6"
@@ -230,32 +270,6 @@ export default function CardPage() {
)}
</div>
</div>
<div className="w-[475px] border-l-[1px] border-light-600 bg-light-200 p-8 text-light-900 dark:border-dark-400 dark:bg-dark-100 dark:text-dark-900">
<div className="mb-4 flex w-full">
<p className="my-2 w-[100px] text-sm">{t`List`}</p>
<ListSelector
cardPublicId={cardId}
lists={formattedLists}
isLoading={!card}
/>
</div>
<div className="mb-4 flex w-full">
<p className="my-2 w-[100px] text-sm">{t`Labels`}</p>
<LabelSelector
cardPublicId={cardId}
labels={formattedLabels}
isLoading={!card}
/>
</div>
<div className="flex w-full">
<p className="my-2 w-[100px] text-sm">{t`Members`}</p>
<MemberSelector
cardPublicId={cardId}
members={formattedMembers}
isLoading={!card}
/>
</div>
</div>
<Modal>
{modalContentType === "NEW_LABEL" && (

View File

@@ -2,6 +2,8 @@ import { t } from "@lingui/core/macro";
import { HiEllipsisHorizontal, HiOutlinePlusSmall } from "react-icons/hi2";
import { twMerge } from "tailwind-merge";
import { authClient } from "@kan/auth/client";
import Avatar from "~/components/Avatar";
import Button from "~/components/Button";
import Dropdown from "~/components/Dropdown";
@@ -26,6 +28,7 @@ export default function MembersPage() {
const TableRow = ({
memberPublicId,
memberId,
memberName,
memberEmail,
memberImage,
@@ -35,6 +38,7 @@ export default function MembersPage() {
showSkeleton,
}: {
memberPublicId?: string;
memberId?: string | null | undefined;
memberName?: string | null | undefined;
memberEmail?: string | null | undefined;
memberImage?: string | null | undefined;
@@ -43,13 +47,19 @@ export default function MembersPage() {
isLastRow?: boolean;
showSkeleton?: boolean;
}) => {
const { data: session } = authClient.useSession();
return (
<tr className="rounded-b-lg">
<td className={twMerge("w-[65%]", isLastRow ? "rounded-bl-lg" : "")}>
<div className="flex items-center p-4">
<td
className={twMerge(
"w-full sm:w-[65%]",
isLastRow ? "rounded-bl-lg" : "",
)}
>
<div className="flex items-center p-2 sm:p-4">
<div className="flex-shrink-0">
{showSkeleton ? (
<div className="h-9 w-9 animate-pulse rounded-full bg-light-200 dark:bg-dark-200" />
<div className="h-8 w-8 animate-pulse rounded-full bg-light-200 dark:bg-dark-200 sm:h-9 sm:w-9" />
) : (
<Avatar
name={memberName ?? ""}
@@ -63,7 +73,7 @@ export default function MembersPage() {
<div className="flex items-center">
<p
className={twMerge(
"mr-2 text-sm font-medium text-neutral-900 dark:text-dark-1000",
"mr-2 truncate text-xs font-medium text-neutral-900 dark:text-dark-1000 sm:text-sm",
showSkeleton &&
"md mb-2 h-3 w-[125px] animate-pulse rounded-sm bg-light-200 dark:bg-dark-200",
)}
@@ -73,7 +83,7 @@ export default function MembersPage() {
</div>
<p
className={twMerge(
"truncate text-sm text-dark-900",
"truncate text-xs text-dark-900 sm:text-sm",
showSkeleton &&
"h-3 w-[175px] animate-pulse rounded-sm bg-light-200 dark:bg-dark-200",
)}
@@ -86,15 +96,15 @@ export default function MembersPage() {
</td>
<td
className={twMerge(
"w-[35%] min-w-[150px]",
"w-auto min-w-[120px] sm:w-[35%] sm:min-w-[150px]",
isLastRow && "rounded-br-lg",
)}
>
<div className="flex w-full items-center justify-between px-3">
<div>
<div className="flex w-full items-center justify-between px-2 sm:px-3">
<div className="flex flex-col sm:flex-row sm:items-center">
<span
className={twMerge(
"inline-flex items-center rounded-md bg-emerald-500/10 px-1.5 py-0.5 text-[11px] font-medium text-emerald-400 ring-1 ring-inset ring-emerald-500/20",
"inline-flex items-center rounded-md bg-emerald-500/10 px-1.5 py-0.5 text-[10px] font-medium text-emerald-400 ring-1 ring-inset ring-emerald-500/20 sm:text-[11px]",
showSkeleton &&
"h-5 w-[50px] animate-pulse bg-light-200 ring-0 dark:bg-dark-200",
)}
@@ -103,7 +113,7 @@ export default function MembersPage() {
memberRole.charAt(0).toUpperCase() + memberRole.slice(1)}
</span>
{memberStatus === "invited" && (
<span className="ml-2 inline-flex items-center rounded-md bg-gray-500/10 px-1.5 py-0.5 text-[11px] font-medium text-gray-400 ring-1 ring-inset ring-gray-500/20">
<span className="mt-1 inline-flex items-center rounded-md bg-gray-500/10 px-1.5 py-0.5 text-[10px] font-medium text-gray-400 ring-1 ring-inset ring-gray-500/20 sm:ml-2 sm:mt-0 sm:text-[11px]">
{t`Pending`}
</span>
)}
@@ -114,24 +124,26 @@ export default function MembersPage() {
(workspace.role !== "admin" || showSkeleton) && "hidden",
)}
>
<Dropdown
items={[
{
label: t`Remove member`,
action: () =>
openModal(
"REMOVE_MEMBER",
memberPublicId,
memberEmail ?? "",
),
},
]}
>
<HiEllipsisHorizontal
size={25}
className="text-light-900 dark:text-dark-900"
/>
</Dropdown>
{session?.user.id !== memberId && (
<Dropdown
items={[
{
label: t`Remove member`,
action: () =>
openModal(
"REMOVE_MEMBER",
memberPublicId,
memberEmail ?? "",
),
},
]}
>
<HiEllipsisHorizontal
size={20}
className="text-light-900 dark:text-dark-900 sm:size-[25px]"
/>
</Dropdown>
)}
</div>
</div>
</td>
@@ -142,7 +154,7 @@ export default function MembersPage() {
return (
<>
<PageHead title={t`Members | ${workspace.name ?? "Workspace"}`} />
<div className="m-auto max-w-[1600px] px-28 py-12">
<div className="m-auto h-full max-w-[1600px] p-6 px-5 md:px-28 md:py-12">
<div className="mb-8 flex w-full justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Members`}
@@ -159,21 +171,21 @@ export default function MembersPage() {
</div>
<div className="mt-8 flow-root">
<div className="-mx-4 -my-2 overflow-x-visible sm:-mx-6 lg:-mx-8">
<div className="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
<div className="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
<div className="inline-block min-w-full px-4 py-2 align-middle sm:px-6 lg:px-8">
<div className="h-full shadow ring-1 ring-black ring-opacity-5 sm:rounded-lg">
<table className="min-w-full divide-y divide-light-600 dark:divide-dark-600">
<thead className="rounded-t-lg bg-light-300 dark:bg-dark-200">
<tr>
<th
scope="col"
className="w-[65%] rounded-tl-lg py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-light-900 dark:text-dark-900 sm:pl-6"
className="w-full rounded-tl-lg py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-light-900 dark:text-dark-900 sm:w-[65%] sm:pl-6"
>
{t`User`}
</th>
<th
scope="col"
className="w-[35%] rounded-tr-lg px-3 py-3.5 text-left text-sm font-semibold text-light-900 dark:text-dark-900"
className="w-auto whitespace-nowrap rounded-tr-lg px-3 py-3.5 text-left text-sm font-semibold text-light-900 dark:text-dark-900 sm:w-[35%]"
>
{t`Role`}
</th>
@@ -185,6 +197,7 @@ export default function MembersPage() {
<TableRow
key={member.publicId}
memberPublicId={member.publicId}
memberId={member.user?.id}
memberName={member.user?.name}
memberEmail={member.user?.email ?? member.email}
memberImage={member.user?.image}

View File

@@ -104,9 +104,9 @@ export default function SettingsPage() {
return (
<>
<div className="flex h-full w-full flex-col overflow-hidden">
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto">
<div className="h-full max-h-[calc(100vdh-3rem)] overflow-y-auto md:max-h-[calc(100vdh-4rem)]">
<PageHead title={t`Settings | ${workspace.name ?? "Workspace"}`} />
<div className="px-28 py-12">
<div className="m-auto max-w-[1600px] px-5 py-6 md:px-28 md:py-12">
<div className="mb-8 flex w-full justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Settings`}

View File

@@ -4,8 +4,10 @@ import { z } from "zod";
import * as boardRepo from "@kan/db/repository/board.repo";
import * as cardRepo from "@kan/db/repository/card.repo";
import * as activityRepo from "@kan/db/repository/cardActivity.repo";
import * as labelRepo from "@kan/db/repository/label.repo";
import * as listRepo from "@kan/db/repository/list.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { colours } from "@kan/shared/constants";
import { generateSlug, generateUID } from "@kan/shared/utils";
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
@@ -149,8 +151,10 @@ export const boardRouter = createTRPCRouter({
})
.input(
z.object({
name: z.string().min(1),
name: z.string().min(1).max(100),
workspacePublicId: z.string().min(12),
lists: z.array(z.string().min(1)),
labels: z.array(z.string().min(1)),
}),
)
.output(z.custom<Awaited<ReturnType<typeof boardRepo.create>>>())
@@ -199,6 +203,30 @@ export const boardRouter = createTRPCRouter({
code: "INTERNAL_SERVER_ERROR",
});
if (input.lists.length) {
const listInputs = input.lists.map((list, index) => ({
publicId: generateUID(),
name: list,
boardId: result.id,
createdBy: userId,
index,
}));
await listRepo.bulkCreate(ctx.db, listInputs);
}
if (input.labels.length) {
const labelInputs = input.labels.map((label, index) => ({
publicId: generateUID(),
name: label,
boardId: result.id,
createdBy: userId,
colourCode: colours[index % colours.length]?.code ?? "#0d9488",
}));
await labelRepo.bulkCreate(ctx.db, labelInputs);
}
return result;
}),
update: protectedProcedure
@@ -352,40 +380,40 @@ export const boardRouter = createTRPCRouter({
return { success: true };
}),
checkSlugAvailability: publicProcedure
.meta({
openapi: {
summary: "Check if a board slug is available",
method: "GET",
path: "/boards/{boardPublicId}/check-slug-availability",
description: "Checks if a board slug is available",
tags: ["Boards"],
protect: true,
},
})
.input(
z.object({
boardSlug: z
.string()
.min(3)
.max(24)
.regex(/^(?![-]+$)[a-zA-Z0-9-]+$/),
boardPublicId: z.string().min(12),
}),
)
.output(
z.object({
isReserved: z.boolean(),
}),
)
.query(async ({ ctx, input }) => {
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
ctx.db,
input.boardSlug,
input.boardPublicId,
);
return {
isReserved: !isBoardSlugAvailable,
};
checkSlugAvailability: publicProcedure
.meta({
openapi: {
summary: "Check if a board slug is available",
method: "GET",
path: "/boards/{boardPublicId}/check-slug-availability",
description: "Checks if a board slug is available",
tags: ["Boards"],
protect: true,
},
})
.input(
z.object({
boardSlug: z
.string()
.min(3)
.max(24)
.regex(/^(?![-]+$)[a-zA-Z0-9-]+$/),
boardPublicId: z.string().min(12),
}),
)
.output(
z.object({
isReserved: z.boolean(),
}),
)
.query(async ({ ctx, input }) => {
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
ctx.db,
input.boardSlug,
input.boardPublicId,
);
return {
isReserved: !isBoardSlugAvailable,
};
}),
});

View File

@@ -68,6 +68,20 @@ export const create = async (
});
};
export const bulkCreate = async (
db: dbClient,
listInput: {
publicId: string;
name: string;
createdBy: string;
boardId: number;
index: number;
importId?: number;
}[],
) => {
return db.insert(lists).values(listInput).returning();
};
export const getByPublicId = async (db: dbClient, listPublicId: string) => {
return db.query.lists.findFirst({
columns: {