Compare commits
23 Commits
fix/openap
...
feat/invit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e43ed96945 | ||
|
|
638b8b6b79 | ||
|
|
ca1dd92ab4 | ||
|
|
f8827da73a | ||
|
|
babaa9f1b1 | ||
|
|
0cefd17484 | ||
|
|
974a5ff0f3 | ||
|
|
0ec71b589d | ||
|
|
0cb69e2087 | ||
|
|
1305c55100 | ||
|
|
425c91865b | ||
|
|
a0096a9eb0 | ||
|
|
4058169079 | ||
|
|
ecc42f988f | ||
|
|
1ded560b75 | ||
|
|
f8dc062903 | ||
|
|
2169a379f2 | ||
|
|
03816b192f | ||
|
|
f4ef1217dc | ||
|
|
1c920e3983 | ||
|
|
9daf657db2 | ||
|
|
fdfd1f3d03 | ||
|
|
392be38f10 |
@@ -21,6 +21,7 @@ S3_REGION=
|
|||||||
S3_ENDPOINT=
|
S3_ENDPOINT=
|
||||||
S3_ACCESS_KEY_ID=
|
S3_ACCESS_KEY_ID=
|
||||||
S3_SECRET_ACCESS_KEY=
|
S3_SECRET_ACCESS_KEY=
|
||||||
|
S3_FORCE_PATH_STYLE=
|
||||||
NEXT_PUBLIC_STORAGE_URL=
|
NEXT_PUBLIC_STORAGE_URL=
|
||||||
NEXT_PUBLIC_AVATAR_BUCKET_NAME=
|
NEXT_PUBLIC_AVATAR_BUCKET_NAME=
|
||||||
NEXT_PUBLIC_STORAGE_DOMAIN=
|
NEXT_PUBLIC_STORAGE_DOMAIN=
|
||||||
|
|||||||
4
.vscode/launch.json
vendored
@@ -6,7 +6,7 @@
|
|||||||
"type": "node-terminal",
|
"type": "node-terminal",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"command": "pnpm dev",
|
"command": "pnpm dev",
|
||||||
"cwd": "${workspaceFolder}/apps/nextjs",
|
"cwd": "${workspaceFolder}/apps/web",
|
||||||
"skipFiles": ["<node_internals>/**"],
|
"skipFiles": ["<node_internals>/**"],
|
||||||
"sourceMaps": true,
|
"sourceMaps": true,
|
||||||
"sourceMapPathOverrides": {
|
"sourceMapPathOverrides": {
|
||||||
@@ -14,4 +14,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
38
CHANGELOG.md
@@ -5,7 +5,43 @@ 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/),
|
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).
|
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)
|
## [Unreleased](https://github.com/kanbn/kan/compare/v0.2.4...HEAD)
|
||||||
|
|
||||||
|
## [0.2.4](https://github.com/kanbn/kan/compare/v0.2.3...v0.2.4) - 2025-01-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Button to view and update board public URL directly from board page
|
||||||
|
- Redirect from root to login page for self-hosted instances
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Updated all label router endpoints to return consistent structure
|
||||||
|
- Added verbose error logging to magic link invitation process
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Updated tRPC dependencies and added OpenAPI meta to providers endpoint
|
||||||
|
|
||||||
|
## [0.2.3](https://github.com/kanbn/kan/compare/v0.2.2...v0.2.3) - 2025-07-07
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Mobile support with responsive navigation and layout
|
||||||
|
- Template selection when creating new boards with predefined lists and labels
|
||||||
|
- S3_FORCE_PATH_STYLE configuration for MinIO compatibility
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved mobile UI styling and layout containers
|
||||||
|
- Enhanced iOS mobile support with viewport fixes and zoom prevention
|
||||||
|
- Improved card view layout for mobile devices
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Mobile dashboard min-width issues
|
||||||
|
- Dynamic viewport height on mobile devices
|
||||||
|
- Scroll functionality on card pages
|
||||||
|
|
||||||
## [0.2.2](https://github.com/kanbn/kan/compare/v0.2.1...v0.2.2) - 2025-06-28
|
## [0.2.2](https://github.com/kanbn/kan/compare/v0.2.1...v0.2.2) - 2025-06-28
|
||||||
|
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ pnpm dev
|
|||||||
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
|
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
|
||||||
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
|
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
|
||||||
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
|
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
|
||||||
|
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
|
||||||
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
|
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
|
||||||
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
|
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
|
||||||
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
|
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 433 KiB After Width: | Height: | Size: 133 KiB |
@@ -6,7 +6,6 @@ checksums:
|
|||||||
"%7B0%7D%20%7C%20%7B1%7D/singular": 4628f9c6ec13c2dc2984a6ab80e19f8b
|
"%7B0%7D%20%7C%20%7B1%7D/singular": 4628f9c6ec13c2dc2984a6ab80e19f8b
|
||||||
"%7B0%7D%20labels/singular": 785f92bedf786ff3e285adfc07c69d18
|
"%7B0%7D%20labels/singular": 785f92bedf786ff3e285adfc07c69d18
|
||||||
"%7BboardCount%2C%20plural%2C%20one%20%7BImport%20board%20(1)%7D%20other%20%7BImport%20boards%20(%7BboardCount%7D)%7D%7D/singular": 72358c550bd1a99fcb6e8952f0f947ef
|
"%7BboardCount%2C%20plural%2C%20one%20%7BImport%20board%20(1)%7D%20other%20%7BImport%20boards%20(%7BboardCount%7D)%7D%7D/singular": 72358c550bd1a99fcb6e8952f0f947ef
|
||||||
"%231%20Hacker%20News/singular": de271b412c6c022d5c427d29fc70e0ba
|
|
||||||
1%20user/singular: 3b547431ab12f0fba84307e6a81109d8
|
1%20user/singular: 3b547431ab12f0fba84307e6a81109d8
|
||||||
A%20powerful%2C%20flexible%20kanban%20app%20that%20helps%20you%20organise%20work%2C%20track%20progress%2C%20and%20deliver%20results%E2%80%94all%20in%20one%20place./singular: d405b83b0d631cb72f4347c10bcbb643
|
A%20powerful%2C%20flexible%20kanban%20app%20that%20helps%20you%20organise%20work%2C%20track%20progress%2C%20and%20deliver%20results%E2%80%94all%20in%20one%20place./singular: d405b83b0d631cb72f4347c10bcbb643
|
||||||
Account%20deleted/singular: a25da96a1579c4491be0a95669ef18a4
|
Account%20deleted/singular: a25da96a1579c4491be0a95669ef18a4
|
||||||
@@ -33,6 +32,7 @@ checksums:
|
|||||||
Are%20you%20sure%20you%20want%20to%20delete%20the%20workspace%20%7B0%7D%3F/singular: 27ba2854202dd77c51e78c64e5c93946
|
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%20card%3F/singular: 131a5a7cccca7be8b32c987d9fa0b0c0
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
|
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
|
||||||
|
Are%20you%20sure%20you%20want%20to%20delete%20this%20label%3F/singular: 037fbaf1d04356937e6afb574714f51f
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20your%20account%3F/singular: 428b74d781063224c3e63980e1094ec3
|
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
|
assigned%20%3C0%3E%7BmemberName%7D%3C%2F0%3E%20to%20the%20card/singular: 4fb1c419a78a0f010a3e5790801551fc
|
||||||
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
|
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
|
||||||
@@ -119,6 +119,7 @@ checksums:
|
|||||||
Edit%20board%20URL/singular: d8276dfc0189f371ec7d80a2047c07aa
|
Edit%20board%20URL/singular: d8276dfc0189f371ec7d80a2047c07aa
|
||||||
Edit%20comment/singular: 7e4b46525fcb6b47b71798e31c46e374
|
Edit%20comment/singular: 7e4b46525fcb6b47b71798e31c46e374
|
||||||
Edit%20label/singular: 0309e0be1512b1e0b0ceb87c69a53d03
|
Edit%20label/singular: 0309e0be1512b1e0b0ceb87c69a53d03
|
||||||
|
Edit%20workspace%20URL/singular: bbae5f2f8a442947d33099979bbbe899
|
||||||
Editing/singular: 3449a7988cd69207b7c6929af1f4abf1
|
Editing/singular: 3449a7988cd69207b7c6929af1f4abf1
|
||||||
email/singular: f31eb214738e037d58e26149797739df
|
email/singular: f31eb214738e037d58e26149797739df
|
||||||
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
|
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
|
||||||
@@ -127,8 +128,10 @@ checksums:
|
|||||||
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
|
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
|
||||||
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
|
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
|
||||||
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
|
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
|
||||||
|
Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e
|
||||||
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
|
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
|
||||||
Error%20disconnecting%20Trello/singular: a8766853864eddc480113778a708871b
|
Error%20disconnecting%20Trello/singular: a8766853864eddc480113778a708871b
|
||||||
|
Error%20inviting%20member/singular: 91553b606a6ebed3534cd2e5635ce004
|
||||||
Error%20updating%20display%20name/singular: 0d7979a25d290123ed8b8906bf468f1a
|
Error%20updating%20display%20name/singular: 0d7979a25d290123ed8b8906bf468f1a
|
||||||
Error%20updating%20profile%20image/singular: 462a56a6e574abc9e13cb48f1266adad
|
Error%20updating%20profile%20image/singular: 462a56a6e574abc9e13cb48f1266adad
|
||||||
Error%20updating%20workspace%20description/singular: 7a9fd7c69b90ab848ee1f1d4a4995381
|
Error%20updating%20workspace%20description/singular: 7a9fd7c69b90ab848ee1f1d4a4995381
|
||||||
@@ -185,7 +188,9 @@ checksums:
|
|||||||
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
|
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
|
||||||
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
|
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
|
||||||
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
|
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
|
||||||
|
Invalid%20email%20address/singular: b2d9f25626f2d15c7c63e0281bccc247
|
||||||
Invite/singular: 181884cea804cbde665f160811ee7ad0
|
Invite/singular: 181884cea804cbde665f160811ee7ad0
|
||||||
|
Invite%20another/singular: acb543563dab7edbcf46060a53ade3a3
|
||||||
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
|
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
|
||||||
Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
|
Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
|
||||||
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
|
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
|
||||||
@@ -280,7 +285,7 @@ checksums:
|
|||||||
Self%20Host/singular: 43fbce2027548b712002e489a20a621a
|
Self%20Host/singular: 43fbce2027548b712002e489a20a621a
|
||||||
Self%20host%20with%20Github/singular: 972155419bcc9f8f9bad9f5ad3538774
|
Self%20host%20with%20Github/singular: 972155419bcc9f8f9bad9f5ad3538774
|
||||||
self-assigned%20the%20card/singular: 24a8d97bcd747643772ebe883be69698
|
self-assigned%20the%20card/singular: 24a8d97bcd747643772ebe883be69698
|
||||||
Send/singular: 76a8497d7b546628b03bb81d5c1ce995
|
Send%20feedback/singular: 9631cc08d49da04475b30a0d320ce97c
|
||||||
Senior/singular: 3fff865dc00435f82896fc302ea45630
|
Senior/singular: 3fff865dc00435f82896fc302ea45630
|
||||||
Settings/singular: 8df6777277469c1fd88cc18dde2f1cc3
|
Settings/singular: 8df6777277469c1fd88cc18dde2f1cc3
|
||||||
Settings%20%7C%20%7B0%7D/singular: b8fc73080bc9c8f4f1403b2a69bd1ac5
|
Settings%20%7C%20%7B0%7D/singular: b8fc73080bc9c8f4f1403b2a69bd1ac5
|
||||||
@@ -295,6 +300,7 @@ checksums:
|
|||||||
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
|
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
|
||||||
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
|
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
|
||||||
Success/singular: c43827becada6750f7a25890905f38b9
|
Success/singular: c43827becada6750f7a25890905f38b9
|
||||||
|
Support/singular: 55aab5fd0f31a9cb055a2edeeedfaf63
|
||||||
Support%20the%20development%20of%20the%20project/singular: c63bab228ab2b1be4370c668a99cd278
|
Support%20the%20development%20of%20the%20project/singular: c63bab228ab2b1be4370c668a99cd278
|
||||||
System/singular: 803281c327a02a2feba182f4a2b38311
|
System/singular: 803281c327a02a2feba182f4a2b38311
|
||||||
Teams/singular: b63448c05270497973ac4407047dae02
|
Teams/singular: b63448c05270497973ac4407047dae02
|
||||||
@@ -307,6 +313,7 @@ checksums:
|
|||||||
Theme/singular: 21fe00b7a518089576fb83c08631107a
|
Theme/singular: 21fe00b7a518089576fb83c08631107a
|
||||||
They%20won't%20be%20able%20to%20access%20this%20workspace./singular: 93b740350fe3430319fbca85349e41d9
|
They%20won't%20be%20able%20to%20access%20this%20workspace./singular: 93b740350fe3430319fbca85349e41d9
|
||||||
This%20action%20can't%20be%20undone./singular: cb222ff89715d8c971e8c25d121e1dbd
|
This%20action%20can't%20be%20undone./singular: cb222ff89715d8c971e8c25d121e1dbd
|
||||||
|
This%20board%20is%20private%20or%20does%20not%20exist/singular: a217ff3f04463b4df8c86adb6f83c6bc
|
||||||
This%20board%20URL%20has%20already%20been%20taken/singular: 1d8b40332a031b5b77a3658e48dd51ca
|
This%20board%20URL%20has%20already%20been%20taken/singular: 1d8b40332a031b5b77a3658e48dd51ca
|
||||||
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
|
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
|
||||||
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081
|
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081
|
||||||
@@ -352,11 +359,13 @@ checksums:
|
|||||||
URL%20must%20be%20at%20least%203%20characters%20long/singular: 1b74ac9ec61fd34b16530ed599009ed1
|
URL%20must%20be%20at%20least%203%20characters%20long/singular: 1b74ac9ec61fd34b16530ed599009ed1
|
||||||
Use%20template/singular: 33f0ca0aa8f4b0de99aad267a61a094d
|
Use%20template/singular: 33f0ca0aa8f4b0de99aad267a61a094d
|
||||||
User/singular: 61073457a5c3901084b557d065f876be
|
User/singular: 61073457a5c3901084b557d065f876be
|
||||||
|
User%20is%20already%20a%20member%20of%20this%20workspace/singular: bc246386f0975f750f2133222bb4735e
|
||||||
Video/singular: 8050c90e4289b105a0780f0fdda6ff66
|
Video/singular: 8050c90e4289b105a0780f0fdda6ff66
|
||||||
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
|
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
|
||||||
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
|
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
|
||||||
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
|
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
|
||||||
View%20our%20roadmap./singular: 1dd7ec80e1635951b1c90d592d1d07dc
|
View%20our%20roadmap./singular: 1dd7ec80e1635951b1c90d592d1d07dc
|
||||||
|
View%20workspace/singular: c9e4b789330b08c18ca8db7044409e5f
|
||||||
Visibility/singular: 1ff412f8fcde0f460acbf11153649646
|
Visibility/singular: 1ff412f8fcde0f460acbf11153649646
|
||||||
We%20are%20using%20the%20%3C0%3EAGPL-3.0%20license%3C%2F0%3E./singular: 08c5ddd938a2a70f61d684e41e18697a
|
We%20are%20using%20the%20%3C0%3EAGPL-3.0%20license%3C%2F0%3E./singular: 08c5ddd938a2a70f61d684e41e18697a
|
||||||
We're%20just%20getting%20started.%20/singular: 2dfa121e0ff1914e08068308a81973c0
|
We're%20just%20getting%20started.%20/singular: 2dfa121e0ff1914e08068308a81973c0
|
||||||
|
|||||||
@@ -31,9 +31,12 @@ const config = {
|
|||||||
|
|
||||||
images: {
|
images: {
|
||||||
remotePatterns: [
|
remotePatterns: [
|
||||||
|
|
||||||
{
|
{
|
||||||
protocol: "https",
|
protocol: "https",
|
||||||
hostname: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
|
hostname: process.env.S3_FORCE_PATH_STYLE === "true"
|
||||||
|
? `${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`
|
||||||
|
: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
protocol: "http",
|
protocol: "http",
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 433 KiB After Width: | Height: | Size: 133 KiB |
@@ -259,6 +259,7 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
|||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
|
key={key}
|
||||||
onClick={() => handleLoginWithProvider(key as SocialProvider)}
|
onClick={() => handleLoginWithProvider(key as SocialProvider)}
|
||||||
isLoading={isLoginWithProviderPending === key}
|
isLoading={isLoginWithProviderPending === key}
|
||||||
iconLeft={<provider.icon />}
|
iconLeft={<provider.icon />}
|
||||||
|
|||||||
@@ -86,8 +86,10 @@ export default function CheckboxDropdown({
|
|||||||
</label>
|
</label>
|
||||||
{handleEdit && (
|
{handleEdit && (
|
||||||
<button
|
<button
|
||||||
|
type="button"
|
||||||
className="invisible ml-auto group-hover:visible"
|
className="invisible ml-auto group-hover:visible"
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
handleEdit(item.key);
|
handleEdit(item.key);
|
||||||
}}
|
}}
|
||||||
@@ -100,8 +102,12 @@ export default function CheckboxDropdown({
|
|||||||
))}
|
))}
|
||||||
{handleCreate && (
|
{handleCreate && (
|
||||||
<button
|
<button
|
||||||
|
type="button"
|
||||||
className="flex w-full items-center rounded-[5px] p-2 px-2 text-[12px] text-dark-900 hover:bg-light-200 dark:hover:bg-dark-300"
|
className="flex w-full items-center rounded-[5px] p-2 px-2 text-[12px] text-dark-900 hover:bg-light-200 dark:hover:bg-dark-300"
|
||||||
onClick={() => handleCreate()}
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
handleCreate();
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<HiMiniPlus size={20} className="pr-1.5" />
|
<HiMiniPlus size={20} className="pr-1.5" />
|
||||||
{createNewItemLabel}
|
{createNewItemLabel}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import Link from "next/link";
|
|
||||||
import { useRef, useState } from "react";
|
import { useRef, useState } from "react";
|
||||||
import {
|
import {
|
||||||
TbLayoutSidebarLeftCollapse,
|
TbLayoutSidebarLeftCollapse,
|
||||||
@@ -10,7 +9,11 @@ import {
|
|||||||
import { authClient } from "@kan/auth/client";
|
import { authClient } from "@kan/auth/client";
|
||||||
|
|
||||||
import { useClickOutside } from "~/hooks/useClickOutside";
|
import { useClickOutside } from "~/hooks/useClickOutside";
|
||||||
import FeedbackButton from "./FeedbackButton";
|
import { useModal } from "~/providers/modal";
|
||||||
|
import { useTheme } from "~/providers/theme";
|
||||||
|
import { WorkspaceProvider } from "~/providers/workspace";
|
||||||
|
import FeedbackModal from "./FeedbackModal";
|
||||||
|
import Modal from "./modal";
|
||||||
import SideNavigation from "./SideNavigation";
|
import SideNavigation from "./SideNavigation";
|
||||||
|
|
||||||
interface DashboardProps {
|
interface DashboardProps {
|
||||||
@@ -19,12 +22,30 @@ interface DashboardProps {
|
|||||||
hasRightPanel?: boolean;
|
hasRightPanel?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDashboardLayout(
|
||||||
|
page: React.ReactElement,
|
||||||
|
rightPanel?: React.ReactNode,
|
||||||
|
hasRightPanel = false,
|
||||||
|
) {
|
||||||
|
return (
|
||||||
|
<WorkspaceProvider>
|
||||||
|
<Dashboard rightPanel={rightPanel} hasRightPanel={hasRightPanel}>
|
||||||
|
{page}
|
||||||
|
</Dashboard>
|
||||||
|
</WorkspaceProvider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export default function Dashboard({
|
export default function Dashboard({
|
||||||
children,
|
children,
|
||||||
rightPanel,
|
rightPanel,
|
||||||
hasRightPanel = false,
|
hasRightPanel = false,
|
||||||
}: DashboardProps) {
|
}: DashboardProps) {
|
||||||
|
const theme = useTheme();
|
||||||
|
const { modalContentType } = useModal();
|
||||||
|
|
||||||
const { data: session, isPending: sessionLoading } = authClient.useSession();
|
const { data: session, isPending: sessionLoading } = authClient.useSession();
|
||||||
|
|
||||||
const [isSideNavOpen, setIsSideNavOpen] = useState(false);
|
const [isSideNavOpen, setIsSideNavOpen] = useState(false);
|
||||||
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
|
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
|
||||||
|
|
||||||
@@ -40,6 +61,10 @@ export default function Dashboard({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const closeSideNav = () => {
|
||||||
|
setIsSideNavOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
const toggleRightPanel = () => {
|
const toggleRightPanel = () => {
|
||||||
setIsRightPanelOpen(!isRightPanelOpen);
|
setIsRightPanelOpen(!isRightPanelOpen);
|
||||||
if (!isRightPanelOpen) {
|
if (!isRightPanelOpen) {
|
||||||
@@ -65,98 +90,93 @@ export default function Dashboard({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const isDarkMode = theme.activeTheme === "dark";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<style jsx global>{`
|
<style jsx global>{`
|
||||||
html {
|
html {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
min-width: 320px;
|
||||||
|
background-color: ${!isDarkMode ? "hsl(0deg 0% 97.3%)" : "#1c1c1c"};
|
||||||
}
|
}
|
||||||
`}</style>
|
`}</style>
|
||||||
<div className="h-screen flex-col items-center bg-light-100 dark:bg-dark-50 md:flex md:min-w-[800px]">
|
<div className="relative flex h-screen flex-col bg-light-50 dark:bg-dark-50 md:bg-light-100 md:p-3 md:dark:bg-dark-100">
|
||||||
<div className="m-auto 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">
|
{/* Mobile Header */}
|
||||||
<div className="my-auto flex w-full items-center justify-between">
|
<div className="flex h-12 items-center justify-between border-b border-light-300 bg-light-50 px-3 dark:border-dark-300 dark:bg-dark-50 md:hidden">
|
||||||
|
<button
|
||||||
|
ref={sideNavButtonRef}
|
||||||
|
onClick={toggleSideNav}
|
||||||
|
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
|
||||||
|
>
|
||||||
|
{isSideNavOpen ? (
|
||||||
|
<TbLayoutSidebarLeftCollapse
|
||||||
|
size={20}
|
||||||
|
className="text-light-900 dark:text-dark-900"
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<TbLayoutSidebarLeftExpand
|
||||||
|
size={20}
|
||||||
|
className="text-light-900 dark:text-dark-900"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{hasRightPanel && (
|
||||||
<button
|
<button
|
||||||
ref={sideNavButtonRef}
|
ref={rightPanelButtonRef}
|
||||||
onClick={toggleSideNav}
|
onClick={toggleRightPanel}
|
||||||
className="text-neutral-900 dark:text-dark-1000 md:hidden"
|
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
|
||||||
>
|
>
|
||||||
{isSideNavOpen ? (
|
{isRightPanelOpen ? (
|
||||||
<TbLayoutSidebarLeftCollapse
|
<TbLayoutSidebarRightCollapse
|
||||||
size={20}
|
size={20}
|
||||||
className="text-light-900 dark:text-dark-900"
|
className="text-light-900 dark:text-dark-900"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<TbLayoutSidebarLeftExpand
|
<TbLayoutSidebarRightExpand
|
||||||
size={20}
|
size={20}
|
||||||
className="text-light-900 dark:text-dark-900"
|
className="text-light-900 dark:text-dark-900"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</button>
|
</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>
|
|
||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
<div className="flex h-full w-full">
|
<div className="flex h-[calc(100dvh-4.5rem)] min-h-0 w-full md:h-[calc(100dvh-1.5rem)]">
|
||||||
<div
|
<div
|
||||||
ref={sideNavRef}
|
ref={sideNavRef}
|
||||||
className={`fixed left-0 z-50 h-[calc(100vh-3rem)] transform transition-transform duration-300 ease-in-out md:relative md:h-[calc(100vh-4rem)] md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
|
className={`fixed top-12 z-40 h-[calc(100dvh-3rem)] w-[calc(100vw-1.5rem)] transform transition-transform duration-300 ease-in-out md:relative md:top-0 md:h-full md:w-auto md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
|
||||||
>
|
>
|
||||||
<SideNavigation
|
<SideNavigation
|
||||||
user={{ email: session?.user.email, image: session?.user.image }}
|
user={{ email: session?.user.email, image: session?.user.image }}
|
||||||
isLoading={sessionLoading}
|
isLoading={sessionLoading}
|
||||||
|
onCloseSideNav={closeSideNav}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative flex w-full overflow-hidden">
|
<div className="relative h-full min-h-0 w-full overflow-hidden md:rounded-lg md:border md:border-light-300 md:bg-light-50 md:dark:border-dark-300 md:dark:bg-dark-50">
|
||||||
<div className="w-full overflow-hidden">{children}</div>
|
<div className="relative flex h-full min-h-0 w-full overflow-hidden">
|
||||||
|
<div className="h-full w-full overflow-y-auto">{children}</div>
|
||||||
|
|
||||||
{/* Mobile Right Panel */}
|
{/* Mobile Right Panel */}
|
||||||
{hasRightPanel && rightPanel && (
|
{hasRightPanel && rightPanel && (
|
||||||
<div
|
<div
|
||||||
ref={rightPanelRef}
|
ref={rightPanelRef}
|
||||||
className={`fixed right-0 top-12 z-50 h-[calc(100vh-3rem)] w-80 transform bg-light-200 transition-transform duration-300 ease-in-out dark:bg-dark-100 md:hidden ${
|
className={`fixed right-0 top-12 z-40 h-[calc(100dvh-3rem)] w-80 transform border-l border-light-300 bg-light-200 transition-transform duration-300 ease-in-out dark:border-dark-300 dark:bg-dark-100 md:hidden ${
|
||||||
isRightPanelOpen ? "translate-x-0" : "translate-x-full"
|
isRightPanelOpen ? "translate-x-0" : "translate-x-full"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="h-full overflow-y-auto">{rightPanel}</div>
|
<div className="h-full">{rightPanel}</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Desktop Right Panel */}
|
{/* Desktop Right Panel */}
|
||||||
{hasRightPanel && rightPanel && (
|
{hasRightPanel && rightPanel && (
|
||||||
<div className="hidden md:block">{rightPanel}</div>
|
<div className="hidden md:block">{rightPanel}</div>
|
||||||
)}
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { t } from "@lingui/core/macro";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
@@ -17,8 +19,8 @@ export function DeleteLabelConfirmation({
|
|||||||
onSuccess: () => refetch(),
|
onSuccess: () => refetch(),
|
||||||
onError: () =>
|
onError: () =>
|
||||||
showPopup({
|
showPopup({
|
||||||
header: "Error deleting label",
|
header: t`Error deleting label`,
|
||||||
message: "Please try again later, or contact customer support.",
|
message: t`Please try again later, or contact customer support.`,
|
||||||
icon: "error",
|
icon: "error",
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
@@ -34,17 +36,17 @@ export function DeleteLabelConfirmation({
|
|||||||
<div className="p-5">
|
<div className="p-5">
|
||||||
<div className="flex w-full flex-col justify-between pb-4">
|
<div className="flex w-full flex-col justify-between pb-4">
|
||||||
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
||||||
Are you sure you want to delete this label?
|
{t`Are you sure you want to delete this label?`}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
||||||
{"This action can't be undone."}
|
{t`This action can't be undone.`}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-5 flex justify-end space-x-2 sm:mt-6">
|
<div className="mt-5 flex justify-end space-x-2 sm:mt-6">
|
||||||
<Button variant="secondary" onClick={() => closeModal()}>
|
<Button variant="secondary" onClick={() => closeModal()}>
|
||||||
Cancel
|
{t`Cancel`}
|
||||||
</Button>
|
</Button>
|
||||||
<Button onClick={handleDeleteLabel}>Delete</Button>
|
<Button onClick={handleDeleteLabel}>{t`Delete`}</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
ReactRenderer,
|
ReactRenderer,
|
||||||
useEditor,
|
useEditor,
|
||||||
} from "@tiptap/react";
|
} from "@tiptap/react";
|
||||||
|
import { useEffect } from "react";
|
||||||
import StarterKit from "@tiptap/starter-kit";
|
import StarterKit from "@tiptap/starter-kit";
|
||||||
import Suggestion from "@tiptap/suggestion";
|
import Suggestion from "@tiptap/suggestion";
|
||||||
import { forwardRef, useImperativeHandle, useRef, useState } from "react";
|
import { forwardRef, useImperativeHandle, useRef, useState } from "react";
|
||||||
@@ -343,14 +344,23 @@ export default function Editor({
|
|||||||
editable: !readOnly,
|
editable: !readOnly,
|
||||||
injectCSS: false,
|
injectCSS: false,
|
||||||
},
|
},
|
||||||
[content],
|
[], // creating the editor only once
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// this will sync external content changes without re-creating the editor instance
|
||||||
|
useEffect(() => {
|
||||||
|
if (!editor) return;
|
||||||
|
const currentHTML = editor.getHTML();
|
||||||
|
const safeContent = content ?? "";
|
||||||
|
if (safeContent !== currentHTML) {
|
||||||
|
editor.commands.setContent(safeContent, false);
|
||||||
|
}
|
||||||
|
}, [content, editor]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
<div ref={containerRef}>
|
||||||
<style jsx global>{`
|
<style jsx global>{`
|
||||||
.tiptap p.is-empty::before {
|
.tiptap p.is-empty::before {
|
||||||
color: #adb5bd;
|
|
||||||
content: attr(data-placeholder);
|
content: attr(data-placeholder);
|
||||||
float: left;
|
float: left;
|
||||||
height: 0;
|
height: 0;
|
||||||
@@ -363,7 +373,7 @@ export default function Editor({
|
|||||||
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
|
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
|
||||||
<EditorContent
|
<EditorContent
|
||||||
editor={editor}
|
editor={editor}
|
||||||
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-dark-800 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-black [&_p]:dark:text-white [&_ul]:!text-xs"
|
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-light-900 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-black [&_p]:dark:text-white [&_ul]:!text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,149 +0,0 @@
|
|||||||
import Link from "next/link";
|
|
||||||
import { Menu, Transition } from "@headlessui/react";
|
|
||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { Fragment, useRef, useState } from "react";
|
|
||||||
import { useForm } from "react-hook-form";
|
|
||||||
|
|
||||||
import chatIconDark from "~/assets/chat-dark.json";
|
|
||||||
import chatIconLight from "~/assets/chat-light.json";
|
|
||||||
import Button from "~/components/Button";
|
|
||||||
import Input from "~/components/Input";
|
|
||||||
import LottieIcon from "~/components/LottieIcon";
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { useTheme } from "~/providers/theme";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
interface NewFeedbackFormInput {
|
|
||||||
feedback: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const FeedbackButton: React.FC = () => {
|
|
||||||
const outsideRef = useRef<HTMLDivElement>(null);
|
|
||||||
const { activeTheme } = useTheme();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
const [isHovered, setIsHovered] = useState(false);
|
|
||||||
const [index, setIndex] = useState(0);
|
|
||||||
|
|
||||||
const { handleSubmit, setValue, watch, reset } =
|
|
||||||
useForm<NewFeedbackFormInput>({
|
|
||||||
defaultValues: {
|
|
||||||
feedback: "",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const createFeedback = api.feedback.create.useMutation({
|
|
||||||
onSuccess: async () => {
|
|
||||||
reset();
|
|
||||||
showPopup({
|
|
||||||
header: t`Feedback sent`,
|
|
||||||
message: t`Thank you for your feedback!`,
|
|
||||||
icon: "success",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onError: async () => {
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to send feedback`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleMouseEnter = () => {
|
|
||||||
setIsHovered(true);
|
|
||||||
setIndex((index) => index + 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSubmit = (values: NewFeedbackFormInput) => {
|
|
||||||
createFeedback.mutate({
|
|
||||||
feedback: values.feedback,
|
|
||||||
url: window.location.href,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div ref={outsideRef} />
|
|
||||||
<Menu as="div" className="relative inline-block text-left">
|
|
||||||
<div>
|
|
||||||
<Menu.Button
|
|
||||||
onMouseEnter={handleMouseEnter}
|
|
||||||
className="flex items-center rounded-md border-[1px] border-light-600 bg-light-50 px-2.5 py-1.5 text-sm font-normal text-neutral-900 shadow-sm dark:border-dark-400 dark:bg-dark-50 dark:text-dark-1000"
|
|
||||||
>
|
|
||||||
<LottieIcon
|
|
||||||
index={index}
|
|
||||||
json={activeTheme === "dark" ? chatIconDark : chatIconLight}
|
|
||||||
isPlaying={isHovered}
|
|
||||||
/>
|
|
||||||
<span className="ml-1">{t`Feedback`}</span>
|
|
||||||
</Menu.Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Transition
|
|
||||||
as={Fragment}
|
|
||||||
enter="transition ease-out duration-100"
|
|
||||||
enterFrom="transform opacity-0 scale-95"
|
|
||||||
enterTo="transform opacity-100 scale-100"
|
|
||||||
leave="transition ease-in duration-75"
|
|
||||||
leaveFrom="transform opacity-100 scale-100"
|
|
||||||
leaveTo="transform opacity-0 scale-95"
|
|
||||||
>
|
|
||||||
<Menu.Items
|
|
||||||
as="div"
|
|
||||||
static
|
|
||||||
className="absolute right-0 z-30 mt-2 w-[350px] origin-top-right rounded-md border border-light-200 bg-light-50 p-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-400 dark:bg-dark-300"
|
|
||||||
>
|
|
||||||
<form onSubmit={handleSubmit(onSubmit)} className="p-1">
|
|
||||||
<Input
|
|
||||||
placeholder={t`Ideas to improve this page...`}
|
|
||||||
onChange={(e) => {
|
|
||||||
setValue("feedback", e.target.value);
|
|
||||||
}}
|
|
||||||
value={watch("feedback")}
|
|
||||||
contentEditable
|
|
||||||
className="max-h-[300px] min-h-[100px]"
|
|
||||||
onKeyDown={async (e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
if (e.key === "Enter" && e.shiftKey) {
|
|
||||||
e.preventDefault();
|
|
||||||
await handleSubmit(onSubmit)();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<div className="flex flex-row items-center justify-between pt-2">
|
|
||||||
<div>
|
|
||||||
<p className="ml-2 text-xs text-neutral-900 dark:text-dark-1000">
|
|
||||||
{t`Need help?`}{" "}
|
|
||||||
<Link
|
|
||||||
href="mailto:support@kan.bn"
|
|
||||||
className="text-blue-600 underline dark:text-blue-300"
|
|
||||||
>
|
|
||||||
{t`Contact us`}
|
|
||||||
</Link>
|
|
||||||
{t`, or see our`}{" "}
|
|
||||||
<Link
|
|
||||||
href="https://docs.kan.bn"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
className="text-blue-600 underline dark:text-blue-300"
|
|
||||||
>
|
|
||||||
{t`docs`}
|
|
||||||
</Link>
|
|
||||||
.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="justify-end">
|
|
||||||
<Button size="sm" isLoading={createFeedback.isPending}>
|
|
||||||
{t`Send`}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</Menu.Items>
|
|
||||||
</Transition>
|
|
||||||
</Menu>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default FeedbackButton;
|
|
||||||
122
apps/web/src/components/FeedbackModal.tsx
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import Link from "next/link";
|
||||||
|
import { t } from "@lingui/core/macro";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
import { useForm } from "react-hook-form";
|
||||||
|
import { HiXMark } from "react-icons/hi2";
|
||||||
|
|
||||||
|
import Button from "~/components/Button";
|
||||||
|
import Input from "~/components/Input";
|
||||||
|
import { useModal } from "~/providers/modal";
|
||||||
|
import { usePopup } from "~/providers/popup";
|
||||||
|
import { api } from "~/utils/api";
|
||||||
|
|
||||||
|
interface NewFeedbackFormInput {
|
||||||
|
feedback: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function FeedbackModal() {
|
||||||
|
const { closeModal } = useModal();
|
||||||
|
const { showPopup } = usePopup();
|
||||||
|
|
||||||
|
const { handleSubmit, setValue, watch, reset } =
|
||||||
|
useForm<NewFeedbackFormInput>({
|
||||||
|
defaultValues: {
|
||||||
|
feedback: "",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const createFeedback = api.feedback.create.useMutation({
|
||||||
|
onSuccess: async () => {
|
||||||
|
reset();
|
||||||
|
closeModal();
|
||||||
|
showPopup({
|
||||||
|
header: t`Feedback sent`,
|
||||||
|
message: t`Thank you for your feedback!`,
|
||||||
|
icon: "success",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onError: async () => {
|
||||||
|
showPopup({
|
||||||
|
header: t`Unable to send feedback`,
|
||||||
|
message: t`Please try again later, or contact customer support.`,
|
||||||
|
icon: "error",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const onSubmit = (values: NewFeedbackFormInput) => {
|
||||||
|
createFeedback.mutate({
|
||||||
|
feedback: values.feedback,
|
||||||
|
url: window.location.href,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={handleSubmit(onSubmit)}>
|
||||||
|
<div className="px-5 pt-5">
|
||||||
|
<div className="flex w-full items-center justify-between pb-4">
|
||||||
|
<h2 className="text-sm font-bold text-neutral-900 dark:text-dark-1000">
|
||||||
|
{t`Feedback`}
|
||||||
|
</h2>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="rounded p-1 hover:bg-light-200 focus:outline-none dark:hover:bg-dark-300"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
closeModal();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<HiXMark size={18} className="text-light-900 dark:text-dark-900" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Input
|
||||||
|
id="feedback"
|
||||||
|
placeholder={t`Ideas to improve this page...`}
|
||||||
|
onChange={(e) => setValue("feedback", e.target.value)}
|
||||||
|
contentEditable
|
||||||
|
value={watch("feedback")}
|
||||||
|
className="min-h-[120px]"
|
||||||
|
onKeyDown={async (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
if (e.key === "Enter" && e.shiftKey) {
|
||||||
|
e.preventDefault();
|
||||||
|
await handleSubmit(onSubmit)();
|
||||||
|
}
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mt-6 flex items-center justify-between border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
||||||
|
<div className="text-xs text-neutral-600 dark:text-dark-800">
|
||||||
|
<p>
|
||||||
|
{t`Need help?`}{" "}
|
||||||
|
<Link
|
||||||
|
href="mailto:support@kan.bn"
|
||||||
|
className="text-blue-600 underline dark:text-blue-300"
|
||||||
|
>
|
||||||
|
{t`Contact us`}
|
||||||
|
</Link>
|
||||||
|
{t`, or see our`}{" "}
|
||||||
|
<Link
|
||||||
|
href="https://docs.kan.bn"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
className="text-blue-600 underline dark:text-blue-300"
|
||||||
|
>
|
||||||
|
{t`docs`}
|
||||||
|
</Link>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Button type="submit" isLoading={createFeedback.isPending}>
|
||||||
|
{t`Send feedback`}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -63,12 +63,16 @@ export function LabelForm({
|
|||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
refetch();
|
refetch();
|
||||||
if (!isCreateAnotherEnabled) closeModal();
|
if (!isCreateAnotherEnabled) {
|
||||||
reset({
|
closeModal();
|
||||||
name: "",
|
} else {
|
||||||
colour: colours[(currentColourIndex + 1) % colours.length],
|
const newFormState = {
|
||||||
isCreateAnotherEnabled,
|
name: "",
|
||||||
});
|
colour: colours[(currentColourIndex + 1) % colours.length],
|
||||||
|
isCreateAnotherEnabled,
|
||||||
|
};
|
||||||
|
reset(newFormState);
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
}
|
}
|
||||||
@@ -79,10 +83,6 @@ export function LabelForm({
|
|||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
refetch();
|
refetch();
|
||||||
closeModal();
|
closeModal();
|
||||||
reset({
|
|
||||||
name: "",
|
|
||||||
colour: colours[0],
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -229,6 +229,9 @@ export function LabelForm({
|
|||||||
<Button
|
<Button
|
||||||
type="submit"
|
type="submit"
|
||||||
isLoading={updateLabel.isPending || createLabel.isPending}
|
isLoading={updateLabel.isPending || createLabel.isPending}
|
||||||
|
disabled={
|
||||||
|
!watch("name")
|
||||||
|
}
|
||||||
>
|
>
|
||||||
{isEdit ? t`Update label` : t`Create label`}
|
{isEdit ? t`Update label` : t`Create label`}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import dynamic from "next/dynamic";
|
|||||||
|
|
||||||
const Lottie = dynamic(() => import("react-lottie-player"), { ssr: false });
|
const Lottie = dynamic(() => import("react-lottie-player"), { ssr: false });
|
||||||
|
|
||||||
type IconProps = {
|
interface IconProps {
|
||||||
isPlaying: boolean;
|
isPlaying: boolean;
|
||||||
index: number;
|
index: number;
|
||||||
json: object;
|
json: object;
|
||||||
};
|
}
|
||||||
|
|
||||||
const Icon: React.FC<IconProps> = ({ isPlaying, index, json }) => {
|
const Icon: React.FC<IconProps> = ({ isPlaying, index, json }) => {
|
||||||
return (
|
return (
|
||||||
@@ -15,7 +15,7 @@ const Icon: React.FC<IconProps> = ({ isPlaying, index, json }) => {
|
|||||||
animationData={json}
|
animationData={json}
|
||||||
play={isPlaying}
|
play={isPlaying}
|
||||||
loop={false}
|
loop={false}
|
||||||
style={{ width: 20, height: 20, fill: "white" }}
|
style={{ width: 18, height: 18, fill: "white" }}
|
||||||
rendererSettings={{ preserveAspectRatio: "xMidYMid slice" }}
|
rendererSettings={{ preserveAspectRatio: "xMidYMid slice" }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ export const PageHead = ({ title }: { title: string }) => {
|
|||||||
return (
|
return (
|
||||||
<Head>
|
<Head>
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1, maximum-scale=1"
|
||||||
|
/>
|
||||||
</Head>
|
</Head>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ const PatternedBackground = () => (
|
|||||||
<svg className="h-full w-full">
|
<svg className="h-full w-full">
|
||||||
<pattern
|
<pattern
|
||||||
id="pattern"
|
id="pattern"
|
||||||
x="0.034759358288862785"
|
x="10"
|
||||||
y="3.335370511841166"
|
y="10"
|
||||||
width="14.423223834988539"
|
width="14.423223834988539"
|
||||||
height="14.423223834988539"
|
height="14.423223834988539"
|
||||||
patternUnits="userSpaceOnUse"
|
patternUnits="userSpaceOnUse"
|
||||||
|
|||||||
@@ -1,37 +1,51 @@
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import LottieIcon from "~/components/LottieIcon";
|
import LottieIcon from "~/components/LottieIcon";
|
||||||
|
import { useIsMobile } from "~/hooks/useMediaQuery";
|
||||||
function classNames(...classes: string[]): string {
|
|
||||||
return classes.filter(Boolean).join(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
const Button: React.FC<{
|
const Button: React.FC<{
|
||||||
href: string;
|
href: string;
|
||||||
current: boolean;
|
current: boolean;
|
||||||
name: string;
|
name: string;
|
||||||
json: object;
|
json: object;
|
||||||
}> = ({ href, current, name, json }) => {
|
isCollapsed?: boolean;
|
||||||
|
onCloseSideNav?: () => void;
|
||||||
|
}> = ({ href, current, name, json, isCollapsed = false, onCloseSideNav }) => {
|
||||||
const [isHovered, setIsHovered] = useState(false);
|
const [isHovered, setIsHovered] = useState(false);
|
||||||
const [index, setIndex] = useState(0);
|
const [index, setIndex] = useState(0);
|
||||||
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
const handleMouseEnter = () => {
|
const handleMouseEnter = () => {
|
||||||
setIsHovered(true);
|
setIsHovered(true);
|
||||||
setIndex((index) => index + 1);
|
setIndex((index) => index + 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
if (onCloseSideNav && isMobile) {
|
||||||
|
onCloseSideNav();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
href={href}
|
href={href}
|
||||||
onMouseEnter={handleMouseEnter}
|
onMouseEnter={handleMouseEnter}
|
||||||
className={classNames(
|
onClick={handleClick}
|
||||||
current ? "bg-light-200 dark:bg-dark-200" : "dark:bg-dark-50",
|
className={twMerge(
|
||||||
"group flex items-center gap-x-3 rounded-md p-1.5 text-sm font-normal leading-6 text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-200",
|
"group flex h-[34px] items-center rounded-md p-1.5 text-sm font-normal leading-6 hover:bg-light-200 hover:text-light-1000 dark:hover:bg-dark-200 dark:hover:text-dark-1000",
|
||||||
|
current
|
||||||
|
? "bg-light-200 text-light-1000 dark:bg-dark-200 dark:text-dark-1000"
|
||||||
|
: "text-neutral-600 dark:bg-dark-100 dark:text-dark-900",
|
||||||
|
isCollapsed
|
||||||
|
? "justify-start gap-x-3 md:justify-center md:gap-x-0"
|
||||||
|
: "gap-x-3",
|
||||||
)}
|
)}
|
||||||
|
title={isCollapsed ? name : undefined}
|
||||||
>
|
>
|
||||||
<LottieIcon index={index} json={json} isPlaying={isHovered} />
|
<LottieIcon index={index} json={json} isPlaying={isHovered} />
|
||||||
{name}
|
<span className={twMerge(isCollapsed && "md:hidden")}>{name}</span>
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
|
import { Button } from "@headlessui/react";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import {
|
||||||
|
TbLayoutSidebarLeftCollapse,
|
||||||
|
TbLayoutSidebarLeftExpand,
|
||||||
|
} from "react-icons/tb";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import boardsIconDark from "~/assets/boards-dark.json";
|
import boardsIconDark from "~/assets/boards-dark.json";
|
||||||
import boardsIconLight from "~/assets/boards-light.json";
|
import boardsIconLight from "~/assets/boards-light.json";
|
||||||
@@ -15,6 +23,7 @@ import { useTheme } from "~/providers/theme";
|
|||||||
interface SideNavigationProps {
|
interface SideNavigationProps {
|
||||||
user: UserType;
|
user: UserType;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
|
onCloseSideNav?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface UserType {
|
interface UserType {
|
||||||
@@ -25,8 +34,28 @@ interface UserType {
|
|||||||
export default function SideNavigation({
|
export default function SideNavigation({
|
||||||
user,
|
user,
|
||||||
isLoading,
|
isLoading,
|
||||||
|
onCloseSideNav,
|
||||||
}: SideNavigationProps) {
|
}: SideNavigationProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const [isCollapsed, setIsCollapsed] = useState(false);
|
||||||
|
const [isInitialised, setIsInitialised] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const savedState = localStorage.getItem("kan_sidebar-collapsed");
|
||||||
|
if (savedState !== null) {
|
||||||
|
setIsCollapsed(JSON.parse(savedState));
|
||||||
|
}
|
||||||
|
setIsInitialised(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (isInitialised) {
|
||||||
|
localStorage.setItem(
|
||||||
|
"kan_sidebar-collapsed",
|
||||||
|
JSON.stringify(isCollapsed),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, [isCollapsed, isInitialised]);
|
||||||
|
|
||||||
const { pathname } = router;
|
const { pathname } = router;
|
||||||
|
|
||||||
@@ -52,11 +81,50 @@ export default function SideNavigation({
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const toggleCollapse = () => {
|
||||||
|
setIsCollapsed(!isCollapsed);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<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">
|
<nav
|
||||||
|
className={twMerge(
|
||||||
|
"flex h-full w-64 flex-col justify-between border-r border-light-300 bg-light-100 p-3 dark:border-dark-300 dark:bg-dark-100 md:border-r-0 md:py-0 md:pl-0",
|
||||||
|
isCollapsed && "md:w-auto",
|
||||||
|
)}
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<WorkspaceMenu />
|
<div className="hidden h-14 items-center justify-between pb-[18px] pt-1.5 md:flex">
|
||||||
|
{!isCollapsed && (
|
||||||
|
<Link href="/" className="block">
|
||||||
|
<h1 className="pl-2 text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000">
|
||||||
|
kan.bn
|
||||||
|
</h1>
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
<Button
|
||||||
|
onClick={toggleCollapse}
|
||||||
|
className={twMerge(
|
||||||
|
"flex h-8 items-center justify-center rounded-md hover:bg-light-200 dark:hover:bg-dark-200",
|
||||||
|
isCollapsed ? "w-full" : "w-8",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{isCollapsed ? (
|
||||||
|
<TbLayoutSidebarLeftExpand
|
||||||
|
size={18}
|
||||||
|
className="text-light-900 dark:text-dark-900"
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<TbLayoutSidebarLeftCollapse
|
||||||
|
size={18}
|
||||||
|
className="text-light-900 dark:text-dark-900"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div className="mx-1 mb-4 hidden w-auto border-b border-light-300 dark:border-dark-400 md:block" />
|
||||||
|
|
||||||
|
<WorkspaceMenu isCollapsed={isCollapsed} />
|
||||||
<ul role="list" className="space-y-1">
|
<ul role="list" className="space-y-1">
|
||||||
{navigation.map((item) => (
|
{navigation.map((item) => (
|
||||||
<li key={item.name}>
|
<li key={item.name}>
|
||||||
@@ -65,16 +133,23 @@ export default function SideNavigation({
|
|||||||
current={pathname.includes(item.href)}
|
current={pathname.includes(item.href)}
|
||||||
name={item.name}
|
name={item.name}
|
||||||
json={item.icon}
|
json={item.icon}
|
||||||
|
isCollapsed={isCollapsed}
|
||||||
|
onCloseSideNav={onCloseSideNav}
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<UserMenu
|
|
||||||
email={user.email ?? ""}
|
<div className="space-y-3">
|
||||||
imageUrl={user.image ?? undefined}
|
<UserMenu
|
||||||
isLoading={isLoading}
|
email={user.email ?? ""}
|
||||||
/>
|
imageUrl={user.image ?? undefined}
|
||||||
|
isLoading={isLoading}
|
||||||
|
isCollapsed={isCollapsed}
|
||||||
|
onCloseSideNav={onCloseSideNav}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
import { Menu, Transition } from "@headlessui/react";
|
import { Menu, Transition } from "@headlessui/react";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { Fragment } from "react";
|
import { Fragment } from "react";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import { authClient } from "@kan/auth/client";
|
import { authClient } from "@kan/auth/client";
|
||||||
|
|
||||||
|
import { useIsMobile } from "~/hooks/useMediaQuery";
|
||||||
|
import { useModal } from "~/providers/modal";
|
||||||
import { useTheme } from "~/providers/theme";
|
import { useTheme } from "~/providers/theme";
|
||||||
import { getAvatarUrl } from "~/utils/helpers";
|
import { getAvatarUrl } from "~/utils/helpers";
|
||||||
|
|
||||||
@@ -13,38 +17,63 @@ interface UserMenuProps {
|
|||||||
imageUrl: string | undefined;
|
imageUrl: string | undefined;
|
||||||
email: string;
|
email: string;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
}
|
isCollapsed?: boolean;
|
||||||
|
onCloseSideNav?: () => void;
|
||||||
function classNames(...classes: string[]): string {
|
|
||||||
return classes.filter(Boolean).join(" ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function UserMenu({
|
export default function UserMenu({
|
||||||
imageUrl,
|
imageUrl,
|
||||||
email,
|
email,
|
||||||
isLoading,
|
isLoading,
|
||||||
|
isCollapsed = false,
|
||||||
|
onCloseSideNav,
|
||||||
}: UserMenuProps) {
|
}: UserMenuProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { themePreference, switchTheme } = useTheme();
|
const { themePreference, switchTheme } = useTheme();
|
||||||
|
const { openModal } = useModal();
|
||||||
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
const handleLogout = async () => {
|
const handleLogout = async () => {
|
||||||
|
if (onCloseSideNav && isMobile) {
|
||||||
|
onCloseSideNav();
|
||||||
|
}
|
||||||
await authClient.signOut();
|
await authClient.signOut();
|
||||||
|
|
||||||
router.push("/login");
|
router.push("/login");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleLinkClick = () => {
|
||||||
|
if (onCloseSideNav && isMobile) {
|
||||||
|
onCloseSideNav();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleModalOpen = (modalType: string) => {
|
||||||
|
if (onCloseSideNav && isMobile) {
|
||||||
|
onCloseSideNav();
|
||||||
|
}
|
||||||
|
openModal(modalType);
|
||||||
|
};
|
||||||
|
|
||||||
const avatarUrl = imageUrl ? getAvatarUrl(imageUrl) : null;
|
const avatarUrl = imageUrl ? getAvatarUrl(imageUrl) : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Menu as="div" className="relative inline-block w-full text-left">
|
<Menu as="div" className="relative inline-block w-full text-left">
|
||||||
<div>
|
<div>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="flex">
|
<div className={twMerge(!isCollapsed && "flex")}>
|
||||||
<div className="h-[30px] w-[30px] animate-pulse rounded-full bg-light-200 dark:bg-dark-200" />
|
<div className="h-[30px] w-[30px] animate-pulse rounded-full bg-light-200 dark:bg-dark-200" />
|
||||||
<div className="mx-2 h-[30px] w-[175px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
|
<div
|
||||||
|
className={twMerge(
|
||||||
|
"mx-2 h-[30px] w-[175px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
|
||||||
|
isCollapsed && "md:hidden",
|
||||||
|
)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<Menu.Button className="flex w-full items-center rounded-md p-1.5 text-neutral-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-200 dark:hover:text-dark-1000">
|
<Menu.Button
|
||||||
|
className="flex w-full items-center rounded-md p-1.5 text-neutral-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-200 dark:hover:text-dark-1000"
|
||||||
|
title={isCollapsed ? email : undefined}
|
||||||
|
>
|
||||||
{avatarUrl ? (
|
{avatarUrl ? (
|
||||||
<Image
|
<Image
|
||||||
src={avatarUrl}
|
src={avatarUrl}
|
||||||
@@ -64,7 +93,14 @@ export default function UserMenu({
|
|||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
<span className="mx-2 truncate text-sm">{email}</span>
|
<span
|
||||||
|
className={twMerge(
|
||||||
|
"mx-2 truncate text-sm",
|
||||||
|
isCollapsed && "md:hidden",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{email}
|
||||||
|
</span>
|
||||||
</Menu.Button>
|
</Menu.Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -78,7 +114,12 @@ export default function UserMenu({
|
|||||||
leaveFrom="transform opacity-100 scale-100"
|
leaveFrom="transform opacity-100 scale-100"
|
||||||
leaveTo="transform opacity-0 scale-95"
|
leaveTo="transform opacity-0 scale-95"
|
||||||
>
|
>
|
||||||
<Menu.Items className="absolute bottom-[40px] left-0 z-10 mt-2 w-full origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300">
|
<Menu.Items
|
||||||
|
className={twMerge(
|
||||||
|
"absolute bottom-[40px] z-10 mt-2 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
|
||||||
|
isCollapsed ? "left-0 w-48" : "left-0 w-full",
|
||||||
|
)}
|
||||||
|
>
|
||||||
<div className="flex flex-col text-neutral-900 dark:text-dark-1000">
|
<div className="flex flex-col text-neutral-900 dark:text-dark-1000">
|
||||||
<div className="p-1">
|
<div className="p-1">
|
||||||
<div className="flex w-full items-center px-3 py-2 text-left text-xs">
|
<div className="flex w-full items-center px-3 py-2 text-left text-xs">
|
||||||
@@ -90,7 +131,7 @@ export default function UserMenu({
|
|||||||
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
className={classNames(
|
className={twMerge(
|
||||||
themePreference === "system" ? "visible" : "invisible",
|
themePreference === "system" ? "visible" : "invisible",
|
||||||
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
||||||
)}
|
)}
|
||||||
@@ -104,7 +145,7 @@ export default function UserMenu({
|
|||||||
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
className={classNames(
|
className={twMerge(
|
||||||
themePreference === "dark" ? "visible" : "invisible",
|
themePreference === "dark" ? "visible" : "invisible",
|
||||||
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
||||||
)}
|
)}
|
||||||
@@ -118,7 +159,7 @@ export default function UserMenu({
|
|||||||
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
className={classNames(
|
className={twMerge(
|
||||||
themePreference === "light" ? "visible" : "invisible",
|
themePreference === "light" ? "visible" : "invisible",
|
||||||
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
|
||||||
)}
|
)}
|
||||||
@@ -127,6 +168,38 @@ export default function UserMenu({
|
|||||||
</button>
|
</button>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
|
||||||
|
<Menu.Item>
|
||||||
|
<Link
|
||||||
|
href="mailto:support@kan.bn"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
onClick={handleLinkClick}
|
||||||
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
|
>
|
||||||
|
{t`Support`}
|
||||||
|
</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item>
|
||||||
|
<Link
|
||||||
|
href="https://docs.kan.bn"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
onClick={handleLinkClick}
|
||||||
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
|
>
|
||||||
|
{t`Documentation`}
|
||||||
|
</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item>
|
||||||
|
<button
|
||||||
|
onClick={() => handleModalOpen("NEW_FEEDBACK")}
|
||||||
|
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
|
||||||
|
>
|
||||||
|
{t`Feedback`}
|
||||||
|
</button>
|
||||||
|
</Menu.Item>
|
||||||
|
</div>
|
||||||
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
|
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
|
||||||
<Menu.Item>
|
<Menu.Item>
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -2,11 +2,16 @@ import { Menu, Transition } from "@headlessui/react";
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { Fragment } from "react";
|
import { Fragment } from "react";
|
||||||
import { HiCheck } from "react-icons/hi2";
|
import { HiCheck } from "react-icons/hi2";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { useWorkspace } from "~/providers/workspace";
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
|
|
||||||
export default function WorkspaceMenu() {
|
export default function WorkspaceMenu({
|
||||||
|
isCollapsed = false,
|
||||||
|
}: {
|
||||||
|
isCollapsed?: boolean;
|
||||||
|
}) {
|
||||||
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
||||||
useWorkspace();
|
useWorkspace();
|
||||||
const { openModal } = useModal();
|
const { openModal } = useModal();
|
||||||
@@ -15,22 +20,43 @@ export default function WorkspaceMenu() {
|
|||||||
<Menu as="div" className="relative inline-block w-full pb-3 text-left">
|
<Menu as="div" className="relative inline-block w-full pb-3 text-left">
|
||||||
<div>
|
<div>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="mb-1 flex p-1.5">
|
<div className={twMerge("mb-1", isCollapsed && "md:flex md:p-1.5")}>
|
||||||
<div className="h-6 w-6 animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-200" />
|
<div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
|
||||||
<div className="ml-2 h-6 w-[150px] animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-200" />
|
<div
|
||||||
|
className={twMerge(
|
||||||
|
"ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
|
||||||
|
isCollapsed && "hidden md:block",
|
||||||
|
)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<Menu.Button className="mb-1 flex w-full items-center rounded-[5px] p-1.5 hover:bg-light-200 dark:hover:bg-dark-200">
|
<Menu.Button
|
||||||
<span className="inline-flex h-6 w-6 items-center justify-center rounded-[5px] bg-indigo-700">
|
className={twMerge(
|
||||||
|
"mb-1 flex h-[34px] w-full items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
|
||||||
|
isCollapsed && "md:mb-1.5 md:h-9 md:p-1",
|
||||||
|
)}
|
||||||
|
title={isCollapsed ? workspace.name : undefined}
|
||||||
|
>
|
||||||
|
<span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
|
||||||
<span className="text-xs font-bold leading-none text-white">
|
<span className="text-xs font-bold leading-none text-white">
|
||||||
{workspace.name.charAt(0).toUpperCase()}
|
{workspace.name.charAt(0).toUpperCase()}
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<span className="ml-2 text-sm font-bold text-neutral-900 dark:text-dark-1000">
|
<span
|
||||||
|
className={twMerge(
|
||||||
|
"ml-2 text-sm font-bold text-neutral-900 dark:text-dark-1000",
|
||||||
|
isCollapsed && "md:hidden",
|
||||||
|
)}
|
||||||
|
>
|
||||||
{workspace.name}
|
{workspace.name}
|
||||||
</span>
|
</span>
|
||||||
{workspace.plan === "pro" && (
|
{workspace.plan === "pro" && (
|
||||||
<span className="ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700">
|
<span
|
||||||
|
className={twMerge(
|
||||||
|
"ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700",
|
||||||
|
isCollapsed && "md:hidden",
|
||||||
|
)}
|
||||||
|
>
|
||||||
Pro
|
Pro
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
@@ -47,7 +73,12 @@ export default function WorkspaceMenu() {
|
|||||||
leaveFrom="transform opacity-100 scale-100"
|
leaveFrom="transform opacity-100 scale-100"
|
||||||
leaveTo="transform opacity-0 scale-95"
|
leaveTo="transform opacity-0 scale-95"
|
||||||
>
|
>
|
||||||
<Menu.Items className="absolute left-0 z-10 w-full origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300">
|
<Menu.Items
|
||||||
|
className={twMerge(
|
||||||
|
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
|
||||||
|
isCollapsed ? "w-48" : "w-full",
|
||||||
|
)}
|
||||||
|
>
|
||||||
<div className="p-1">
|
<div className="p-1">
|
||||||
{availableWorkspaces.map((availableWorkspace) => (
|
{availableWorkspaces.map((availableWorkspace) => (
|
||||||
<div key={availableWorkspace.publicId} className="flex">
|
<div key={availableWorkspace.publicId} className="flex">
|
||||||
|
|||||||
@@ -7,15 +7,19 @@ interface Props {
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
modalSize?: "sm" | "md" | "lg";
|
modalSize?: "sm" | "md" | "lg";
|
||||||
positionFromTop?: "sm" | "md" | "lg";
|
positionFromTop?: "sm" | "md" | "lg";
|
||||||
|
isVisible?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Modal: React.FC<Props> = ({
|
const Modal: React.FC<Props> = ({
|
||||||
children,
|
children,
|
||||||
modalSize = "sm",
|
modalSize = "sm",
|
||||||
positionFromTop = "md",
|
positionFromTop = "md",
|
||||||
|
isVisible,
|
||||||
}) => {
|
}) => {
|
||||||
const { isOpen, closeModal } = useModal();
|
const { isOpen, closeModal } = useModal();
|
||||||
|
|
||||||
|
const shouldShow = isVisible !== undefined ? isVisible : isOpen;
|
||||||
|
|
||||||
const modalSizeMap = {
|
const modalSizeMap = {
|
||||||
sm: "max-w-[400px]",
|
sm: "max-w-[400px]",
|
||||||
md: "max-w-[550px]",
|
md: "max-w-[550px]",
|
||||||
@@ -29,7 +33,7 @@ const Modal: React.FC<Props> = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Transition.Root show={isOpen} as={Fragment}>
|
<Transition.Root show={shouldShow} as={Fragment}>
|
||||||
<Dialog as="div" className="relative z-10" onClose={closeModal}>
|
<Dialog as="div" className="relative z-10" onClose={closeModal}>
|
||||||
<Transition.Child
|
<Transition.Child
|
||||||
as={Fragment}
|
as={Fragment}
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ export const env = createEnv({
|
|||||||
S3_SECRET_ACCESS_KEY: z.string().optional(),
|
S3_SECRET_ACCESS_KEY: z.string().optional(),
|
||||||
S3_REGION: z.string().optional(),
|
S3_REGION: z.string().optional(),
|
||||||
S3_ENDPOINT: z.string().optional(),
|
S3_ENDPOINT: z.string().optional(),
|
||||||
|
S3_FORCE_PATH_STYLE: z.string().optional(),
|
||||||
EMAIL_FROM: z.string().optional(),
|
EMAIL_FROM: z.string().optional(),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
23
apps/web/src/hooks/useMediaQuery.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
export function useMediaQuery(query: string): boolean {
|
||||||
|
const [matches, setMatches] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const media = window.matchMedia(query);
|
||||||
|
setMatches(media.matches);
|
||||||
|
|
||||||
|
const listener = (event: MediaQueryListEvent) => {
|
||||||
|
setMatches(event.matches);
|
||||||
|
};
|
||||||
|
|
||||||
|
media.addEventListener("change", listener);
|
||||||
|
return () => media.removeEventListener("change", listener);
|
||||||
|
}, [query]);
|
||||||
|
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useIsMobile(): boolean {
|
||||||
|
return useMediaQuery("(max-width: 767px)");
|
||||||
|
}
|
||||||
48
apps/web/src/hooks/useModalFormState.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import { useEffect } from "react";
|
||||||
|
import { useModal } from "~/providers/modal";
|
||||||
|
|
||||||
|
interface UseModalFormStateOptions<T> {
|
||||||
|
modalType: string;
|
||||||
|
initialValues: T;
|
||||||
|
resetOnClose?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useModalFormState<T extends Record<string, any>>({
|
||||||
|
modalType,
|
||||||
|
initialValues,
|
||||||
|
resetOnClose = false,
|
||||||
|
}: UseModalFormStateOptions<T>) {
|
||||||
|
const { modalContentType, isOpen, getModalState, setModalState, clearModalState } = useModal();
|
||||||
|
|
||||||
|
const isCurrentModal = modalContentType === modalType;
|
||||||
|
const savedState = getModalState(modalType) as T | undefined;
|
||||||
|
|
||||||
|
// get current form state (using the saved values if available, otherwise the initial values)
|
||||||
|
const formState = savedState || initialValues;
|
||||||
|
|
||||||
|
const saveFormState = (state: Partial<T>) => {
|
||||||
|
if (!isCurrentModal) return;
|
||||||
|
|
||||||
|
const currentState = getModalState(modalType) || initialValues;
|
||||||
|
const newState = { ...currentState, ...state };
|
||||||
|
setModalState(modalType, newState);
|
||||||
|
};
|
||||||
|
|
||||||
|
const clearFormState = () => {
|
||||||
|
clearModalState(modalType);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (resetOnClose && !isOpen && savedState) {
|
||||||
|
clearModalState(modalType);
|
||||||
|
}
|
||||||
|
}, [isOpen, resetOnClose, savedState, modalType, clearModalState]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
formState,
|
||||||
|
saveFormState,
|
||||||
|
clearFormState,
|
||||||
|
isCurrentModal,
|
||||||
|
hasSavedState: !!savedState,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (bearbeitet)"
|
msgstr " (bearbeitet)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", oder besuche unsere"
|
msgstr ", oder besuche unsere"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} Labels"
|
msgstr "{0} Labels"
|
||||||
|
|
||||||
@@ -36,10 +36,6 @@ msgstr "{0} Labels"
|
|||||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
|
||||||
msgid "#1 Hacker News"
|
|
||||||
msgstr "#1 Hacker News"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
msgstr "1 Benutzer"
|
msgstr "1 Benutzer"
|
||||||
@@ -53,7 +49,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Konto gelöscht"
|
msgstr "Konto gelöscht"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Aktivität"
|
msgstr "Aktivität"
|
||||||
|
|
||||||
@@ -70,7 +66,7 @@ msgstr "Karte hinzufügen"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Kommentar hinzufügen..."
|
msgstr "Kommentar hinzufügen..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
|
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
|
||||||
|
|
||||||
@@ -79,7 +75,7 @@ msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Label hinzufügen"
|
msgstr "Label hinzufügen"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Mitglied hinzufügen"
|
msgstr "Mitglied hinzufügen"
|
||||||
@@ -112,11 +108,11 @@ msgstr "Alle Systeme funktionieren"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</1></0>"
|
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
|
msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "API-Schlüssel"
|
msgstr "API-Schlüssel"
|
||||||
|
|
||||||
@@ -149,6 +145,10 @@ msgstr "Bist du sicher, dass du diese Karte löschen möchtest?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
|
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
||||||
@@ -169,12 +169,12 @@ msgstr "Backlog"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Einfaches Kanban"
|
msgstr "Einfaches Kanban"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Abrechnung"
|
msgstr "Abrechnung"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Abrechnungsportal"
|
msgstr "Abrechnungsportal"
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ msgstr "Abrechnungsportal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blogbeitrag"
|
msgstr "Blogbeitrag"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
|
|
||||||
@@ -194,7 +194,8 @@ msgstr "Der Name des Boards darf 100 Zeichen nicht überschreiten"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Boardname ist erforderlich"
|
msgstr "Boardname ist erforderlich"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Board nicht gefunden"
|
msgstr "Board nicht gefunden"
|
||||||
|
|
||||||
@@ -206,7 +207,7 @@ msgstr "Board-URL darf nur Buchstaben, Zahlen und Bindestriche enthalten"
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "Board-URL darf 60 Zeichen nicht überschreiten"
|
msgstr "Board-URL darf 60 Zeichen nicht überschreiten"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "Board-URL in die Zwischenablage kopiert"
|
msgstr "Board-URL in die Zwischenablage kopiert"
|
||||||
|
|
||||||
@@ -222,13 +223,13 @@ msgstr "Board-Sichtbarkeit"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Board-Sichtbarkeit aktualisiert"
|
msgstr "Board-Sichtbarkeit aktualisiert"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Boards"
|
msgstr "Boards"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Boards | {0}"
|
msgstr "Boards | {0}"
|
||||||
|
|
||||||
@@ -251,18 +252,19 @@ msgstr "Fehlerbericht"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Karte nicht gefunden"
|
msgstr "Karte nicht gefunden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Kartentitel"
|
msgstr "Kartentitel"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Ändere die Sprache der App."
|
msgstr "Ändere die Sprache der App."
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ msgstr "Vollständige Kontrolle und Eigentum:"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "URL-Änderung bestätigen"
|
msgstr "URL-Änderung bestätigen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Trello verbinden"
|
msgstr "Trello verbinden"
|
||||||
@@ -321,7 +323,7 @@ msgstr "Trello verbinden"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Verbinde deine Lieblingstools, um deinen Arbeitsablauf zu optimieren."
|
msgstr "Verbinde deine Lieblingstools, um deinen Arbeitsablauf zu optimieren."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
|
msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
|
||||||
|
|
||||||
@@ -329,7 +331,7 @@ msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Kontaktiere uns"
|
msgstr "Kontaktiere uns"
|
||||||
|
|
||||||
@@ -337,12 +339,12 @@ msgstr "Kontaktiere uns"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Content-Erstellung"
|
msgstr "Content-Erstellung"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Fortfahren mit "
|
msgstr "Fortfahren mit "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Fortfahren mit {0}"
|
msgstr "Fortfahren mit {0}"
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
|
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Weitere erstellen"
|
msgstr "Weitere erstellen"
|
||||||
@@ -360,15 +362,15 @@ msgstr "Weitere erstellen"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Board erstellen"
|
msgstr "Board erstellen"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Karte erstellen"
|
msgstr "Karte erstellen"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Label erstellen"
|
msgstr "Label erstellen"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Liste erstellen"
|
msgstr "Liste erstellen"
|
||||||
|
|
||||||
@@ -381,16 +383,16 @@ msgid "Create new key"
|
|||||||
msgstr "Neuen Schlüssel erstellen"
|
msgstr "Neuen Schlüssel erstellen"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Neues Label erstellen"
|
msgstr "Neues Label erstellen"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Neue Liste erstellen"
|
msgstr "Neue Liste erstellen"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Arbeitsbereich erstellen"
|
msgstr "Arbeitsbereich erstellen"
|
||||||
|
|
||||||
@@ -414,18 +416,19 @@ msgstr "Benutzerdefinierte URLs sind eine Premium-Funktion. Du wirst zur Aktuali
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Kundensupport"
|
msgstr "Kundensupport"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dunkel"
|
msgstr "Dunkel"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Konto löschen"
|
msgstr "Konto löschen"
|
||||||
@@ -446,8 +449,8 @@ msgstr "Kommentar löschen"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Liste löschen"
|
msgstr "Liste löschen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Workspace löschen"
|
msgstr "Workspace löschen"
|
||||||
@@ -456,7 +459,7 @@ msgstr "Workspace löschen"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Trello trennen"
|
msgstr "Trello trennen"
|
||||||
|
|
||||||
@@ -464,7 +467,7 @@ msgstr "Trello trennen"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Diskutiere und arbeite gemeinsam an Karten."
|
msgstr "Diskutiere und arbeite gemeinsam an Karten."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Anzeigename"
|
msgstr "Anzeigename"
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ msgstr "Anzeigename aktualisiert"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "Bietet ihr einen kostenlosen Plan an?"
|
msgstr "Bietet ihr einen kostenlosen Plan an?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "Dokumente"
|
msgstr "Dokumente"
|
||||||
|
|
||||||
@@ -494,6 +497,7 @@ msgstr "Dokumente"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Dokumentation"
|
msgstr "Dokumentation"
|
||||||
|
|
||||||
@@ -521,15 +525,19 @@ msgstr "Kommentar bearbeiten"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Label bearbeiten"
|
msgstr "Label bearbeiten"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Workspace-URL bearbeiten"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Bearbeitung"
|
msgstr "Bearbeitung"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
@@ -537,15 +545,15 @@ msgstr "E-Mail"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Verbesserung"
|
msgstr "Verbesserung"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Gib deine E-Mail-Adresse ein"
|
msgstr "Gib deine E-Mail-Adresse ein"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Gib deinen Namen ein"
|
msgstr "Gib deinen Namen ein"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Gib dein Passwort ein"
|
msgstr "Gib dein Passwort ein"
|
||||||
|
|
||||||
@@ -553,19 +561,28 @@ msgstr "Gib dein Passwort ein"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Fehler beim Löschen des Kontos"
|
msgstr "Fehler beim Löschen des Kontos"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Fehler beim Löschen des Labels"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Fehler beim Löschen des Arbeitsbereichs"
|
msgstr "Fehler beim Löschen des Arbeitsbereichs"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Fehler beim Trennen von Trello"
|
msgstr "Fehler beim Trennen von Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Fehler beim Einladen des Mitglieds"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Fehler beim Aktualisieren des Anzeigenamens"
|
msgstr "Fehler beim Aktualisieren des Anzeigenamens"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Fehler beim Aktualisieren des Profilbilds"
|
msgstr "Fehler beim Aktualisieren des Profilbilds"
|
||||||
|
|
||||||
@@ -581,8 +598,8 @@ msgstr "Fehler beim Aktualisieren des Arbeitsbereichsnamens"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Fehler beim Aktualisieren der Workspace-URL"
|
msgstr "Fehler beim Aktualisieren der Workspace-URL"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Fehler beim Hochladen des Profilbilds"
|
msgstr "Fehler beim Hochladen des Profilbilds"
|
||||||
|
|
||||||
@@ -622,11 +639,12 @@ msgstr "Feature-Anfrage"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Features"
|
msgstr "Features"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Feedback"
|
msgstr "Feedback"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Feedback gesendet"
|
msgstr "Feedback gesendet"
|
||||||
|
|
||||||
@@ -642,6 +660,7 @@ 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."
|
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."
|
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
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Kostenlos"
|
msgstr "Kostenlos"
|
||||||
@@ -674,7 +693,7 @@ msgstr "Loslegen"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Beginne, indem du ein neues Board erstellst"
|
msgstr "Beginne, indem du ein neues Board erstellst"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
||||||
|
|
||||||
@@ -747,11 +766,11 @@ msgstr "Ich bestätige, dass alle Daten des Arbeitsbereichs dauerhaft gelöscht
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Ideen"
|
msgstr "Ideen"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Ideen zur Verbesserung dieser Seite..."
|
msgstr "Ideen zur Verbesserung dieser Seite..."
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importieren"
|
msgstr "Importieren"
|
||||||
|
|
||||||
@@ -797,11 +816,19 @@ msgstr "Integrationen"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Vorstellungsgespräch"
|
msgstr "Vorstellungsgespräch"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Ungültige E-Mail-Adresse"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Einladen"
|
msgstr "Einladen"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Weitere Person einladen"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Mitglied einladen"
|
msgstr "Mitglied einladen"
|
||||||
@@ -823,8 +850,8 @@ msgstr "Kanban neu gedacht"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
|
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -833,7 +860,7 @@ msgstr "Labels"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Labels & Filter"
|
msgstr "Labels & Filter"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Sprache"
|
msgstr "Sprache"
|
||||||
|
|
||||||
@@ -849,15 +876,15 @@ msgstr "Rechtliches"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "Lizenz"
|
msgstr "Lizenz"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Hell"
|
msgstr "Hell"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link kopiert"
|
msgstr "Link kopiert"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Liste"
|
msgstr "Liste"
|
||||||
|
|
||||||
@@ -869,7 +896,7 @@ msgstr "Listenname"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Login | kan.bn"
|
msgstr "Login | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
|
|
||||||
@@ -881,7 +908,7 @@ msgstr "Langfristig"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Niedrige Priorität"
|
msgstr "Niedrige Priorität"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "Magic Link"
|
msgstr "Magic Link"
|
||||||
|
|
||||||
@@ -889,16 +916,16 @@ msgstr "Magic Link"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Mittlere Priorität"
|
msgstr "Mittlere Priorität"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Mitglieder"
|
msgstr "Mitglieder"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Mitglieder | {0}"
|
msgstr "Mitglieder | {0}"
|
||||||
|
|
||||||
@@ -919,11 +946,11 @@ msgstr "hat die Karte in eine andere Liste verschoben"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "Brauchst du Hilfe?"
|
msgstr "Brauchst du Hilfe?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "Neu"
|
msgstr "Neu"
|
||||||
|
|
||||||
@@ -931,7 +958,7 @@ msgstr "Neu"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Neues Board"
|
msgstr "Neues Board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Neue Karte"
|
msgstr "Neue Karte"
|
||||||
|
|
||||||
@@ -943,7 +970,7 @@ msgstr "Neuer Import"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Neues Label"
|
msgstr "Neues Label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Neue Liste"
|
msgstr "Neue Liste"
|
||||||
@@ -952,7 +979,7 @@ msgstr "Neue Liste"
|
|||||||
msgid "New Ticket"
|
msgid "New Ticket"
|
||||||
msgstr "Neues Ticket"
|
msgstr "Neues Ticket"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "Neuer Workspace"
|
msgstr "Neuer Workspace"
|
||||||
|
|
||||||
@@ -976,7 +1003,7 @@ msgstr "Keine Boards gefunden"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Keine Kreditkarte erforderlich"
|
msgstr "Keine Kreditkarte erforderlich"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Keine Listen"
|
msgstr "Keine Listen"
|
||||||
|
|
||||||
@@ -988,15 +1015,15 @@ msgstr "Angebot"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Einarbeitung"
|
msgstr "Einarbeitung"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Sobald Sie Ihren Arbeitsbereich löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
|
msgstr "Sobald Sie Ihren Arbeitsbereich löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "oder"
|
msgstr "oder"
|
||||||
|
|
||||||
@@ -1016,7 +1043,7 @@ msgstr "Teilzeit"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Zahlungshäufigkeit"
|
msgstr "Zahlungshäufigkeit"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "Ausstehend"
|
msgstr "Ausstehend"
|
||||||
|
|
||||||
@@ -1033,19 +1060,19 @@ msgstr "Persönliches Projekt"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Planung"
|
msgstr "Planung"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
|
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Bitte gib einen gültigen Namen ein"
|
msgstr "Bitte gib einen gültigen Namen ein"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Bitte gib ein gültiges Passwort ein"
|
msgstr "Bitte gib ein gültiges Passwort ein"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
||||||
|
|
||||||
@@ -1055,10 +1082,11 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1067,14 +1095,15 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
|
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
|
||||||
|
|
||||||
@@ -1096,11 +1125,11 @@ msgstr "Datenschutzrichtlinie"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Privat"
|
msgstr "Privat"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Profilbild aktualisiert"
|
msgstr "Profilbild aktualisiert"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Profilbild"
|
msgstr "Profilbild"
|
||||||
|
|
||||||
@@ -1136,7 +1165,7 @@ msgstr "Remote"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Entfernen"
|
msgstr "Entfernen"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Mitglied entfernen"
|
msgstr "Mitglied entfernen"
|
||||||
|
|
||||||
@@ -1177,7 +1206,7 @@ msgstr "Widerrufen"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Roadmap"
|
msgstr "Roadmap"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Rolle"
|
msgstr "Rolle"
|
||||||
|
|
||||||
@@ -1217,21 +1246,21 @@ msgstr "Selbst hosten mit Github"
|
|||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "hat sich selbst die Karte zugewiesen"
|
msgstr "hat sich selbst die Karte zugewiesen"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackModal.tsx:116
|
||||||
msgid "Send"
|
msgid "Send feedback"
|
||||||
msgstr "Senden"
|
msgstr "Feedback senden"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Einstellungen"
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Einstellungen | {0}"
|
msgstr "Einstellungen | {0}"
|
||||||
|
|
||||||
@@ -1253,7 +1282,7 @@ msgstr "Registrierung deaktiviert"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
|
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "Registrieren mit "
|
msgstr "Registrieren mit "
|
||||||
|
|
||||||
@@ -1282,11 +1311,15 @@ msgstr "Stern auf Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Erfolg"
|
msgstr "Erfolg"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Support"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Unterstütze die Entwicklung des Projekts"
|
msgstr "Unterstütze die Entwicklung des Projekts"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -1302,7 +1335,7 @@ msgstr "Vorlagen"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Nutzungsbedingungen"
|
msgstr "Nutzungsbedingungen"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "Vielen Dank für dein Feedback!"
|
msgstr "Vielen Dank für dein Feedback!"
|
||||||
|
|
||||||
@@ -1319,7 +1352,7 @@ msgstr "Die open source <0/> alternative zu Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "Die Sichtbarkeit deines Boards wurde auf {0} gesetzt."
|
msgstr "Die Sichtbarkeit deines Boards wurde auf {0} gesetzt."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
|
|
||||||
@@ -1329,9 +1362,14 @@ msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
|
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "Dieses Board ist privat oder existiert nicht"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "Diese Board-URL ist bereits vergeben"
|
msgstr "Diese Board-URL ist bereits vergeben"
|
||||||
@@ -1361,7 +1399,7 @@ msgstr "Menü umschalten"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Verfolge alle kartenänderungen mit detaillierter aktivitätshistorie."
|
msgstr "Verfolge alle kartenänderungen mit detaillierter aktivitätshistorie."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello getrennt"
|
msgstr "Trello getrennt"
|
||||||
|
|
||||||
@@ -1377,7 +1415,7 @@ msgstr "Priorisierung"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Karte konnte nicht erstellt werden"
|
msgstr "Karte konnte nicht erstellt werden"
|
||||||
|
|
||||||
@@ -1385,7 +1423,7 @@ msgstr "Karte konnte nicht erstellt werden"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Liste konnte nicht erstellt werden"
|
msgstr "Liste konnte nicht erstellt werden"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "Workspace konnte nicht erstellt werden"
|
msgstr "Workspace konnte nicht erstellt werden"
|
||||||
|
|
||||||
@@ -1401,7 +1439,7 @@ msgstr "Kommentar konnte nicht gelöscht werden"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "Mitglied konnte nicht entfernt werden"
|
msgstr "Mitglied konnte nicht entfernt werden"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "Feedback konnte nicht gesendet werden"
|
msgstr "Feedback konnte nicht gesendet werden"
|
||||||
|
|
||||||
@@ -1413,8 +1451,8 @@ msgstr "Board-URL kann nicht aktualisiert werden"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Karte konnte nicht aktualisiert werden"
|
msgstr "Karte konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
@@ -1427,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Labels konnten nicht aktualisiert werden"
|
msgstr "Labels konnten nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Liste konnte nicht aktualisiert werden"
|
msgstr "Liste konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
@@ -1471,11 +1509,11 @@ msgstr "Unbegrenzte listen"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aktualisieren"
|
msgstr "Aktualisieren"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Label aktualisieren"
|
msgstr "Label aktualisieren"
|
||||||
|
|
||||||
@@ -1516,19 +1554,23 @@ msgstr "URL muss mindestens 3 Zeichen lang sein"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Vorlage verwenden"
|
msgstr "Vorlage verwenden"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Benutzer"
|
msgstr "Benutzer"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "API-Schlüssel anzeigen und verwalten."
|
msgstr "API-Schlüssel anzeigen und verwalten."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "Verwalte deine Abrechnung und dein Abonnement."
|
msgstr "Verwalte deine Abrechnung und dein Abonnement."
|
||||||
|
|
||||||
@@ -1540,6 +1582,10 @@ msgstr "Dokumentation ansehen"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Sieh dir unsere roadmap an."
|
msgstr "Sieh dir unsere roadmap an."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "Workspace anzeigen"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Sichtbarkeit"
|
msgstr "Sichtbarkeit"
|
||||||
@@ -1572,7 +1618,7 @@ msgstr "Als Trello 2011 auf den markt kam, beeindruckte es alle mit seiner sorgf
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Warum ein open source Trello entwickeln?"
|
msgstr "Warum ein open source Trello entwickeln?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Arbeitsbereich"
|
msgstr "Arbeitsbereich"
|
||||||
|
|
||||||
@@ -1580,7 +1626,7 @@ msgstr "Arbeitsbereich"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Workspace gelöscht"
|
msgstr "Workspace gelöscht"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Workspace-Beschreibung"
|
msgstr "Workspace-Beschreibung"
|
||||||
|
|
||||||
@@ -1601,8 +1647,8 @@ msgstr "Workspace-Beschreibung aktualisiert"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Workspace-mitglieder"
|
msgstr "Workspace-mitglieder"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Name des Workspaces"
|
msgstr "Name des Workspaces"
|
||||||
|
|
||||||
@@ -1622,7 +1668,7 @@ msgstr "Workspace-Name aktualisiert"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Workspace-Slug aktualisiert"
|
msgstr "Workspace-Slug aktualisiert"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "Workspace-URL"
|
msgstr "Workspace-URL"
|
||||||
|
|
||||||
@@ -1670,15 +1716,15 @@ msgstr "Deine Boards wurden importiert."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Dein Anzeigename wurde aktualisiert."
|
msgstr "Dein Anzeigename wurde aktualisiert."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "Dein Profilbild wurde aktualisiert."
|
msgstr "Dein Profilbild wurde aktualisiert."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Dein Trello-Konto wurde getrennt."
|
msgstr "Dein Trello-Konto wurde getrennt."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Dein Trello-Konto ist verbunden."
|
msgstr "Dein Trello-Konto ist verbunden."
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (edited)"
|
msgstr " (edited)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", or see our"
|
msgstr ", or see our"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} labels"
|
msgstr "{0} labels"
|
||||||
|
|
||||||
@@ -37,8 +37,8 @@ msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardC
|
|||||||
msgstr "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
#: src/views/home/index.tsx:51
|
||||||
msgid "#1 Hacker News"
|
#~ msgid "#1 Hacker News"
|
||||||
msgstr "#1 Hacker News"
|
#~ msgstr "#1 Hacker News"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
@@ -61,7 +61,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Account deleted"
|
msgstr "Account deleted"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activity"
|
msgstr "Activity"
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ msgstr "Add a card"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Add a comment..."
|
msgstr "Add a comment..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Add description... (type '/' to open commands)"
|
msgstr "Add description... (type '/' to open commands)"
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ msgstr "Add description... (type '/' to open commands)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Add label"
|
msgstr "Add label"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Add member"
|
msgstr "Add member"
|
||||||
@@ -120,11 +120,11 @@ msgstr "All systems operational"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "Already have an account? <0><1>Sign in</1></0>"
|
msgstr "Already have an account? <0><1>Sign in</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "An error occurred while disconnecting your Trello account."
|
msgstr "An error occurred while disconnecting your Trello account."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "API keys"
|
msgstr "API keys"
|
||||||
|
|
||||||
@@ -161,6 +161,10 @@ msgstr "Are you sure you want to delete this card?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Are you sure you want to delete this comment?"
|
msgstr "Are you sure you want to delete this comment?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "Are you sure you want to delete this label?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Are you sure you want to delete your account?"
|
msgstr "Are you sure you want to delete your account?"
|
||||||
@@ -185,12 +189,12 @@ msgstr "Backlog"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Basic Kanban"
|
msgstr "Basic Kanban"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Billing"
|
msgstr "Billing"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Billing portal"
|
msgstr "Billing portal"
|
||||||
|
|
||||||
@@ -198,7 +202,7 @@ msgstr "Billing portal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blog Post"
|
msgstr "Blog Post"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
|
|
||||||
@@ -214,7 +218,8 @@ msgstr "Board name cannot exceed 100 characters"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Board name is required"
|
msgstr "Board name is required"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Board not found"
|
msgstr "Board not found"
|
||||||
|
|
||||||
@@ -226,7 +231,7 @@ msgstr "Board URL can only contain letters, numbers, and hyphens"
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "Board URL cannot exceed 60 characters"
|
msgstr "Board URL cannot exceed 60 characters"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "Board URL copied to clipboard"
|
msgstr "Board URL copied to clipboard"
|
||||||
|
|
||||||
@@ -242,13 +247,13 @@ msgstr "Board visibility"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Board visibility updated"
|
msgstr "Board visibility updated"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Boards"
|
msgstr "Boards"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Boards | {0}"
|
msgstr "Boards | {0}"
|
||||||
|
|
||||||
@@ -275,18 +280,19 @@ msgstr "Bug Report"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Card not found"
|
msgstr "Card not found"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Card title"
|
msgstr "Card title"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Change the language of the app."
|
msgstr "Change the language of the app."
|
||||||
|
|
||||||
@@ -336,7 +342,7 @@ msgstr "Complete control and ownership:"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirm URL change"
|
msgstr "Confirm URL change"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Connect Trello"
|
msgstr "Connect Trello"
|
||||||
@@ -345,7 +351,7 @@ msgstr "Connect Trello"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Connect your favorite tools to streamline your workflow."
|
msgstr "Connect your favorite tools to streamline your workflow."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Connect your Trello account to import boards."
|
msgstr "Connect your Trello account to import boards."
|
||||||
|
|
||||||
@@ -353,7 +359,7 @@ msgstr "Connect your Trello account to import boards."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contact"
|
msgstr "Contact"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Contact us"
|
msgstr "Contact us"
|
||||||
|
|
||||||
@@ -361,12 +367,12 @@ msgstr "Contact us"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Content Creation"
|
msgstr "Content Creation"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Continue with "
|
msgstr "Continue with "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Continue with {0}"
|
msgstr "Continue with {0}"
|
||||||
|
|
||||||
@@ -375,7 +381,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Control who can view and edit your boards."
|
msgstr "Control who can view and edit your boards."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Create another"
|
msgstr "Create another"
|
||||||
@@ -392,15 +398,15 @@ msgstr "Create another"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Create board"
|
msgstr "Create board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Create card"
|
msgstr "Create card"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Create label"
|
msgstr "Create label"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Create list"
|
msgstr "Create list"
|
||||||
|
|
||||||
@@ -413,16 +419,16 @@ msgid "Create new key"
|
|||||||
msgstr "Create new key"
|
msgstr "Create new key"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Create new label"
|
msgstr "Create new label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Create new list"
|
msgstr "Create new list"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Create workspace"
|
msgstr "Create workspace"
|
||||||
|
|
||||||
@@ -446,18 +452,19 @@ msgstr "Custom URLs are a premium feature. You'll be directed to upgrade your ac
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Customer Support"
|
msgstr "Customer Support"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dark"
|
msgstr "Dark"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Delete"
|
msgstr "Delete"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Delete account"
|
msgstr "Delete account"
|
||||||
@@ -478,8 +485,8 @@ msgstr "Delete comment"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Delete list"
|
msgstr "Delete list"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Delete workspace"
|
msgstr "Delete workspace"
|
||||||
@@ -488,7 +495,7 @@ msgstr "Delete workspace"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Disconnect Trello"
|
msgstr "Disconnect Trello"
|
||||||
|
|
||||||
@@ -496,7 +503,7 @@ msgstr "Disconnect Trello"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Discuss and collaborate on cards."
|
msgstr "Discuss and collaborate on cards."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Display name"
|
msgstr "Display name"
|
||||||
|
|
||||||
@@ -516,7 +523,7 @@ msgstr "Display name updated"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "Do you offer a free plan?"
|
msgstr "Do you offer a free plan?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "docs"
|
msgstr "docs"
|
||||||
|
|
||||||
@@ -526,6 +533,7 @@ msgstr "Docs"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Documentation"
|
msgstr "Documentation"
|
||||||
|
|
||||||
@@ -553,15 +561,19 @@ msgstr "Edit comment"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Edit label"
|
msgstr "Edit label"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Edit workspace URL"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Editing"
|
msgstr "Editing"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "email"
|
msgstr "email"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
|
|
||||||
@@ -569,15 +581,15 @@ msgstr "Email"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Enhancement"
|
msgstr "Enhancement"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Enter your email address"
|
msgstr "Enter your email address"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Enter your name"
|
msgstr "Enter your name"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Enter your password"
|
msgstr "Enter your password"
|
||||||
|
|
||||||
@@ -585,19 +597,28 @@ msgstr "Enter your password"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Error deleting account"
|
msgstr "Error deleting account"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Error deleting label"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Error deleting workspace"
|
msgstr "Error deleting workspace"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Error disconnecting Trello"
|
msgstr "Error disconnecting Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Error inviting member"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Error updating display name"
|
msgstr "Error updating display name"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Error updating profile image"
|
msgstr "Error updating profile image"
|
||||||
|
|
||||||
@@ -613,8 +634,8 @@ msgstr "Error updating workspace name"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Error updating workspace URL"
|
msgstr "Error updating workspace URL"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Error uploading profile image"
|
msgstr "Error uploading profile image"
|
||||||
|
|
||||||
@@ -654,11 +675,12 @@ msgstr "Feature Request"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Features"
|
msgstr "Features"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Feedback"
|
msgstr "Feedback"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Feedback sent"
|
msgstr "Feedback sent"
|
||||||
|
|
||||||
@@ -707,7 +729,7 @@ msgstr "Get Started"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Get started by creating a new board"
|
msgstr "Get started by creating a new board"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Get started by creating a new list"
|
msgstr "Get started by creating a new list"
|
||||||
|
|
||||||
@@ -780,7 +802,7 @@ msgstr "I acknowledge that all of the workspace data will be permanently deleted
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Ideas"
|
msgstr "Ideas"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Ideas to improve this page..."
|
msgstr "Ideas to improve this page..."
|
||||||
|
|
||||||
@@ -788,7 +810,7 @@ msgstr "Ideas to improve this page..."
|
|||||||
#~ msgid "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
|
#~ msgid "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
|
||||||
#~ msgstr "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
|
#~ msgstr "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Import"
|
msgstr "Import"
|
||||||
|
|
||||||
@@ -834,11 +856,19 @@ msgstr "Integrations"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Interviewing"
|
msgstr "Interviewing"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Invalid email address"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Invite"
|
msgstr "Invite"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Invite another"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Invite member"
|
msgstr "Invite member"
|
||||||
@@ -860,8 +890,8 @@ msgstr "Kanban reimagined"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Keep in mind that this action is irreversible."
|
msgstr "Keep in mind that this action is irreversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -870,7 +900,7 @@ msgstr "Labels"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Labels & Filters"
|
msgstr "Labels & Filters"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Language"
|
msgstr "Language"
|
||||||
|
|
||||||
@@ -886,15 +916,15 @@ msgstr "Legal"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "License"
|
msgstr "License"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Light"
|
msgstr "Light"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link copied"
|
msgstr "Link copied"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "List"
|
msgstr "List"
|
||||||
|
|
||||||
@@ -906,7 +936,7 @@ msgstr "List name"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Login | kan.bn"
|
msgstr "Login | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Logout"
|
msgstr "Logout"
|
||||||
|
|
||||||
@@ -918,7 +948,7 @@ msgstr "Long-term"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Low Priority"
|
msgstr "Low Priority"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "magic link"
|
msgstr "magic link"
|
||||||
|
|
||||||
@@ -926,16 +956,16 @@ msgstr "magic link"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Medium Priority"
|
msgstr "Medium Priority"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Members"
|
msgstr "Members"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Members | {0}"
|
msgstr "Members | {0}"
|
||||||
|
|
||||||
@@ -956,11 +986,11 @@ msgstr "moved the card to another list"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "Need help?"
|
msgstr "Need help?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "New"
|
msgstr "New"
|
||||||
|
|
||||||
@@ -968,7 +998,7 @@ msgstr "New"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "New board"
|
msgstr "New board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "New card"
|
msgstr "New card"
|
||||||
|
|
||||||
@@ -980,7 +1010,7 @@ msgstr "New import"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "New label"
|
msgstr "New label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "New list"
|
msgstr "New list"
|
||||||
@@ -993,7 +1023,7 @@ msgstr "New Ticket"
|
|||||||
#~ msgid "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
|
#~ msgid "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
|
||||||
#~ msgstr "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
|
#~ msgstr "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "New workspace"
|
msgstr "New workspace"
|
||||||
|
|
||||||
@@ -1017,7 +1047,7 @@ msgstr "No boards found"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "No credit card required"
|
msgstr "No credit card required"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "No lists"
|
msgstr "No lists"
|
||||||
|
|
||||||
@@ -1029,15 +1059,15 @@ msgstr "Offer"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Onboarding"
|
msgstr "Onboarding"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Once you delete your account, there is no going back. This action cannot be undone."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgstr "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "or"
|
msgstr "or"
|
||||||
|
|
||||||
@@ -1057,7 +1087,7 @@ msgstr "Part-time"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Payment frequency"
|
msgstr "Payment frequency"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "Pending"
|
msgstr "Pending"
|
||||||
|
|
||||||
@@ -1074,19 +1104,19 @@ msgstr "Personal Project"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Planning"
|
msgstr "Planning"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Please enter a valid email address"
|
msgstr "Please enter a valid email address"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Please enter a valid name"
|
msgstr "Please enter a valid name"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Please enter a valid password"
|
msgstr "Please enter a valid password"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Please select a file to upload."
|
msgstr "Please select a file to upload."
|
||||||
|
|
||||||
@@ -1096,10 +1126,11 @@ msgstr "Please select a file to upload."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1108,14 +1139,15 @@ msgstr "Please select a file to upload."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Please try again later, or contact customer support."
|
msgstr "Please try again later, or contact customer support."
|
||||||
|
|
||||||
@@ -1137,11 +1169,11 @@ msgstr "Privacy policy"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Private"
|
msgstr "Private"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Profile image updated"
|
msgstr "Profile image updated"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Profile picture"
|
msgstr "Profile picture"
|
||||||
|
|
||||||
@@ -1177,7 +1209,7 @@ msgstr "Remote"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remove"
|
msgstr "Remove"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Remove member"
|
msgstr "Remove member"
|
||||||
|
|
||||||
@@ -1218,7 +1250,7 @@ msgstr "Revoke"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Roadmap"
|
msgstr "Roadmap"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Role"
|
msgstr "Role"
|
||||||
|
|
||||||
@@ -1259,20 +1291,24 @@ msgid "self-assigned the card"
|
|||||||
msgstr "self-assigned the card"
|
msgstr "self-assigned the card"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackButton.tsx:137
|
||||||
msgid "Send"
|
#~ msgid "Send"
|
||||||
msgstr "Send"
|
#~ msgstr "Send"
|
||||||
|
|
||||||
|
#: src/components/FeedbackModal.tsx:116
|
||||||
|
msgid "Send feedback"
|
||||||
|
msgstr "Send feedback"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Settings"
|
msgstr "Settings"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Settings | {0}"
|
msgstr "Settings | {0}"
|
||||||
|
|
||||||
@@ -1294,7 +1330,7 @@ msgstr "Sign up disabled"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "Sign up is currently disabled. Please try again later."
|
msgstr "Sign up is currently disabled. Please try again later."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "Sign up with "
|
msgstr "Sign up with "
|
||||||
|
|
||||||
@@ -1323,11 +1359,15 @@ msgstr "Star on Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Success"
|
msgstr "Success"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Support"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Support the development of the project"
|
msgstr "Support the development of the project"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
@@ -1343,7 +1383,7 @@ msgstr "Templates"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Terms of service"
|
msgstr "Terms of service"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "Thank you for your feedback!"
|
msgstr "Thank you for your feedback!"
|
||||||
|
|
||||||
@@ -1360,7 +1400,7 @@ msgstr "The open source <0/> alternative to Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "The visibility of your board has been set to {0}."
|
msgstr "The visibility of your board has been set to {0}."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Theme"
|
msgstr "Theme"
|
||||||
|
|
||||||
@@ -1370,9 +1410,14 @@ msgstr "They won't be able to access this workspace."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "This action can't be undone."
|
msgstr "This action can't be undone."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "This board is private or does not exist"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "This board URL has already been taken"
|
msgstr "This board URL has already been taken"
|
||||||
@@ -1406,7 +1451,7 @@ msgstr "Toggle menu"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Track all card changes with detailed activity history."
|
msgstr "Track all card changes with detailed activity history."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello disconnected"
|
msgstr "Trello disconnected"
|
||||||
|
|
||||||
@@ -1422,7 +1467,7 @@ msgstr "Triaging"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Unable to add comment"
|
msgstr "Unable to add comment"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Unable to create card"
|
msgstr "Unable to create card"
|
||||||
|
|
||||||
@@ -1430,7 +1475,7 @@ msgstr "Unable to create card"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Unable to create list"
|
msgstr "Unable to create list"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "Unable to create workspace"
|
msgstr "Unable to create workspace"
|
||||||
|
|
||||||
@@ -1446,7 +1491,7 @@ msgstr "Unable to delete comment"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "Unable to remove member"
|
msgstr "Unable to remove member"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "Unable to send feedback"
|
msgstr "Unable to send feedback"
|
||||||
|
|
||||||
@@ -1458,8 +1503,8 @@ msgstr "Unable to update board URL"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Unable to update board visibility"
|
msgstr "Unable to update board visibility"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Unable to update card"
|
msgstr "Unable to update card"
|
||||||
|
|
||||||
@@ -1472,7 +1517,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Unable to update labels"
|
msgstr "Unable to update labels"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Unable to update list"
|
msgstr "Unable to update list"
|
||||||
|
|
||||||
@@ -1516,11 +1561,11 @@ msgstr "Unlimited lists"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Update"
|
msgstr "Update"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Update label"
|
msgstr "Update label"
|
||||||
|
|
||||||
@@ -1561,19 +1606,23 @@ msgstr "URL must be at least 3 characters long"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Use template"
|
msgstr "Use template"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "User"
|
msgstr "User"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "User is already a member of this workspace"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "View and manage your API keys."
|
msgstr "View and manage your API keys."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "View and manage your billing and subscription."
|
msgstr "View and manage your billing and subscription."
|
||||||
|
|
||||||
@@ -1585,6 +1634,10 @@ msgstr "View docs"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "View our roadmap."
|
msgstr "View our roadmap."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "View workspace"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Visibility"
|
msgstr "Visibility"
|
||||||
@@ -1621,7 +1674,7 @@ msgstr "When Trello launched in 2011, it blew everyone away with its carefully d
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Why make an open source Trello?"
|
msgstr "Why make an open source Trello?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Workspace"
|
msgstr "Workspace"
|
||||||
|
|
||||||
@@ -1629,7 +1682,7 @@ msgstr "Workspace"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Workspace deleted"
|
msgstr "Workspace deleted"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Workspace description"
|
msgstr "Workspace description"
|
||||||
|
|
||||||
@@ -1650,8 +1703,8 @@ msgstr "Workspace description updated"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Workspace members"
|
msgstr "Workspace members"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Workspace name"
|
msgstr "Workspace name"
|
||||||
|
|
||||||
@@ -1671,7 +1724,7 @@ msgstr "Workspace name updated"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Workspace slug updated"
|
msgstr "Workspace slug updated"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "Workspace URL"
|
msgstr "Workspace URL"
|
||||||
|
|
||||||
@@ -1719,15 +1772,15 @@ msgstr "Your boards have been imported."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Your display name has been updated."
|
msgstr "Your display name has been updated."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "Your profile image has been updated."
|
msgstr "Your profile image has been updated."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Your Trello account has been disconnected."
|
msgstr "Your Trello account has been disconnected."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Your Trello account is connected."
|
msgstr "Your Trello account is connected."
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (editado)"
|
msgstr " (editado)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", o consulta nuestra"
|
msgstr ", o consulta nuestra"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} etiquetas"
|
msgstr "{0} etiquetas"
|
||||||
|
|
||||||
@@ -36,10 +36,6 @@ msgstr "{0} etiquetas"
|
|||||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
|
||||||
msgid "#1 Hacker News"
|
|
||||||
msgstr "#1 Hacker News"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
msgstr "1 usuario"
|
msgstr "1 usuario"
|
||||||
@@ -53,7 +49,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Cuenta eliminada"
|
msgstr "Cuenta eliminada"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Actividad"
|
msgstr "Actividad"
|
||||||
|
|
||||||
@@ -70,7 +66,7 @@ msgstr "Añadir una tarjeta"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Añadir un comentario..."
|
msgstr "Añadir un comentario..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
|
msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
|
||||||
|
|
||||||
@@ -79,7 +75,7 @@ msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Añadir etiqueta"
|
msgstr "Añadir etiqueta"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Añadir miembro"
|
msgstr "Añadir miembro"
|
||||||
@@ -112,11 +108,11 @@ msgstr "Todos los sistemas operativos"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</1></0>"
|
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
|
msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "Claves API"
|
msgstr "Claves API"
|
||||||
|
|
||||||
@@ -149,6 +145,10 @@ msgstr "¿Estás seguro de que quieres eliminar esta tarjeta?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
|
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
||||||
@@ -169,12 +169,12 @@ msgstr "Pendientes"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Kanban básico"
|
msgstr "Kanban básico"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Facturación"
|
msgstr "Facturación"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Portal de facturación"
|
msgstr "Portal de facturación"
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ msgstr "Portal de facturación"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Entrada de blog"
|
msgstr "Entrada de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tablero"
|
msgstr "Tablero"
|
||||||
|
|
||||||
@@ -194,7 +194,8 @@ msgstr "El nombre del tablero no puede exceder los 100 caracteres"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "El nombre del tablero es obligatorio"
|
msgstr "El nombre del tablero es obligatorio"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Tablero no encontrado"
|
msgstr "Tablero no encontrado"
|
||||||
|
|
||||||
@@ -206,7 +207,7 @@ msgstr "La URL del tablero solo puede contener letras, números y guiones"
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "La URL del tablero no puede exceder los 60 caracteres"
|
msgstr "La URL del tablero no puede exceder los 60 caracteres"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "URL del tablero copiada al portapapeles"
|
msgstr "URL del tablero copiada al portapapeles"
|
||||||
|
|
||||||
@@ -222,13 +223,13 @@ msgstr "Visibilidad del tablero"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Visibilidad del tablero actualizada"
|
msgstr "Visibilidad del tablero actualizada"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Tableros"
|
msgstr "Tableros"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Tableros | {0}"
|
msgstr "Tableros | {0}"
|
||||||
|
|
||||||
@@ -251,18 +252,19 @@ msgstr "Informe de error"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Tarjeta no encontrada"
|
msgstr "Tarjeta no encontrada"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Título de la tarjeta"
|
msgstr "Título de la tarjeta"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Cambiar el idioma de la aplicación."
|
msgstr "Cambiar el idioma de la aplicación."
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ msgstr "Control y propiedad completos:"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirmar cambio de URL"
|
msgstr "Confirmar cambio de URL"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Conectar Trello"
|
msgstr "Conectar Trello"
|
||||||
@@ -321,7 +323,7 @@ msgstr "Conectar Trello"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Conecta tus herramientas favoritas para agilizar tu flujo de trabajo."
|
msgstr "Conecta tus herramientas favoritas para agilizar tu flujo de trabajo."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Conecta tu cuenta de Trello para importar tableros."
|
msgstr "Conecta tu cuenta de Trello para importar tableros."
|
||||||
|
|
||||||
@@ -329,7 +331,7 @@ msgstr "Conecta tu cuenta de Trello para importar tableros."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contacto"
|
msgstr "Contacto"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Contáctanos"
|
msgstr "Contáctanos"
|
||||||
|
|
||||||
@@ -337,12 +339,12 @@ msgstr "Contáctanos"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Creación de contenido"
|
msgstr "Creación de contenido"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Continuar con "
|
msgstr "Continuar con "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Continuar con {0}"
|
msgstr "Continuar con {0}"
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Controla quién puede ver y editar tus tableros."
|
msgstr "Controla quién puede ver y editar tus tableros."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Crear otro"
|
msgstr "Crear otro"
|
||||||
@@ -360,15 +362,15 @@ msgstr "Crear otro"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Crear tablero"
|
msgstr "Crear tablero"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Crear tarjeta"
|
msgstr "Crear tarjeta"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Crear etiqueta"
|
msgstr "Crear etiqueta"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Crear lista"
|
msgstr "Crear lista"
|
||||||
|
|
||||||
@@ -381,16 +383,16 @@ msgid "Create new key"
|
|||||||
msgstr "Crear nueva clave"
|
msgstr "Crear nueva clave"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Crear nueva etiqueta"
|
msgstr "Crear nueva etiqueta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Crear nueva lista"
|
msgstr "Crear nueva lista"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Crear espacio de trabajo"
|
msgstr "Crear espacio de trabajo"
|
||||||
|
|
||||||
@@ -414,18 +416,19 @@ msgstr "Las URL personalizadas son una función premium. Serás dirigido a actua
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Atención al cliente"
|
msgstr "Atención al cliente"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Oscuro"
|
msgstr "Oscuro"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Eliminar cuenta"
|
msgstr "Eliminar cuenta"
|
||||||
@@ -446,8 +449,8 @@ msgstr "Eliminar comentario"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Eliminar lista"
|
msgstr "Eliminar lista"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Eliminar espacio de trabajo"
|
msgstr "Eliminar espacio de trabajo"
|
||||||
@@ -456,7 +459,7 @@ msgstr "Eliminar espacio de trabajo"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Diseño"
|
msgstr "Diseño"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Desconectar Trello"
|
msgstr "Desconectar Trello"
|
||||||
|
|
||||||
@@ -464,7 +467,7 @@ msgstr "Desconectar Trello"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Discute y colabora en las tarjetas."
|
msgstr "Discute y colabora en las tarjetas."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Nombre visible"
|
msgstr "Nombre visible"
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ msgstr "Nombre visible actualizado"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "¿Ofrecen un plan gratuito?"
|
msgstr "¿Ofrecen un plan gratuito?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "documentos"
|
msgstr "documentos"
|
||||||
|
|
||||||
@@ -494,6 +497,7 @@ msgstr "Documentos"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Documentación"
|
msgstr "Documentación"
|
||||||
|
|
||||||
@@ -521,15 +525,19 @@ msgstr "Editar comentario"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Editar etiqueta"
|
msgstr "Editar etiqueta"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Editar URL del espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Editando"
|
msgstr "Editando"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "correo electrónico"
|
msgstr "correo electrónico"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Correo electrónico"
|
msgstr "Correo electrónico"
|
||||||
|
|
||||||
@@ -537,15 +545,15 @@ msgstr "Correo electrónico"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Mejora"
|
msgstr "Mejora"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Introduce tu dirección de correo electrónico"
|
msgstr "Introduce tu dirección de correo electrónico"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Introduce tu nombre"
|
msgstr "Introduce tu nombre"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Introduce tu contraseña"
|
msgstr "Introduce tu contraseña"
|
||||||
|
|
||||||
@@ -553,19 +561,28 @@ msgstr "Introduce tu contraseña"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Error al eliminar la cuenta"
|
msgstr "Error al eliminar la cuenta"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Error al eliminar la etiqueta"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Error al eliminar el espacio de trabajo"
|
msgstr "Error al eliminar el espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Error al desconectar Trello"
|
msgstr "Error al desconectar Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Error al invitar al miembro"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Error al actualizar el nombre visible"
|
msgstr "Error al actualizar el nombre visible"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Error al actualizar la imagen de perfil"
|
msgstr "Error al actualizar la imagen de perfil"
|
||||||
|
|
||||||
@@ -581,8 +598,8 @@ msgstr "Error al actualizar el nombre del espacio de trabajo"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Error al actualizar la URL del espacio de trabajo"
|
msgstr "Error al actualizar la URL del espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Error al subir la imagen de perfil"
|
msgstr "Error al subir la imagen de perfil"
|
||||||
|
|
||||||
@@ -622,11 +639,12 @@ msgstr "Solicitud de función"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Características"
|
msgstr "Características"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Comentarios"
|
msgstr "Comentarios"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Comentarios enviados"
|
msgstr "Comentarios enviados"
|
||||||
|
|
||||||
@@ -642,6 +660,7 @@ 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."
|
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."
|
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
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -674,7 +693,7 @@ msgstr "Comenzar"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Comienza creando un nuevo tablero"
|
msgstr "Comienza creando un nuevo tablero"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Comienza creando una nueva lista"
|
msgstr "Comienza creando una nueva lista"
|
||||||
|
|
||||||
@@ -747,11 +766,11 @@ msgstr "Reconozco que todos los datos del espacio de trabajo serán eliminados p
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Ideas"
|
msgstr "Ideas"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Ideas para mejorar esta página..."
|
msgstr "Ideas para mejorar esta página..."
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importar"
|
msgstr "Importar"
|
||||||
|
|
||||||
@@ -797,11 +816,19 @@ msgstr "Integraciones"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Entrevistando"
|
msgstr "Entrevistando"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Dirección de correo electrónico no válida"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Invitar"
|
msgstr "Invitar"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Invitar a otro"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Invitar miembro"
|
msgstr "Invitar miembro"
|
||||||
@@ -823,8 +850,8 @@ msgstr "Kanban reinventado"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Ten en cuenta que esta acción es irreversible."
|
msgstr "Ten en cuenta que esta acción es irreversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Etiquetas"
|
msgstr "Etiquetas"
|
||||||
@@ -833,7 +860,7 @@ msgstr "Etiquetas"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Etiquetas y filtros"
|
msgstr "Etiquetas y filtros"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Idioma"
|
msgstr "Idioma"
|
||||||
|
|
||||||
@@ -849,15 +876,15 @@ msgstr "Legal"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "Licencia"
|
msgstr "Licencia"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Claro"
|
msgstr "Claro"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Enlace copiado"
|
msgstr "Enlace copiado"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lista"
|
msgstr "Lista"
|
||||||
|
|
||||||
@@ -869,7 +896,7 @@ msgstr "Nombre de la lista"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Iniciar sesión | kan.bn"
|
msgstr "Iniciar sesión | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Cerrar sesión"
|
msgstr "Cerrar sesión"
|
||||||
|
|
||||||
@@ -881,7 +908,7 @@ msgstr "Largo plazo"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Prioridad baja"
|
msgstr "Prioridad baja"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "enlace mágico"
|
msgstr "enlace mágico"
|
||||||
|
|
||||||
@@ -889,16 +916,16 @@ msgstr "enlace mágico"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Prioridad media"
|
msgstr "Prioridad media"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Miembros"
|
msgstr "Miembros"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Miembros | {0}"
|
msgstr "Miembros | {0}"
|
||||||
|
|
||||||
@@ -919,11 +946,11 @@ msgstr "movió la tarjeta a otra lista"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nombre"
|
msgstr "Nombre"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "¿Necesitas ayuda?"
|
msgstr "¿Necesitas ayuda?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "Nuevo"
|
msgstr "Nuevo"
|
||||||
|
|
||||||
@@ -931,7 +958,7 @@ msgstr "Nuevo"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nuevo tablero"
|
msgstr "Nuevo tablero"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nueva tarjeta"
|
msgstr "Nueva tarjeta"
|
||||||
|
|
||||||
@@ -943,7 +970,7 @@ msgstr "Nueva importación"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nueva etiqueta"
|
msgstr "Nueva etiqueta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nueva lista"
|
msgstr "Nueva lista"
|
||||||
@@ -952,7 +979,7 @@ msgstr "Nueva lista"
|
|||||||
msgid "New Ticket"
|
msgid "New Ticket"
|
||||||
msgstr "Nuevo ticket"
|
msgstr "Nuevo ticket"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "Nuevo espacio de trabajo"
|
msgstr "Nuevo espacio de trabajo"
|
||||||
|
|
||||||
@@ -976,7 +1003,7 @@ msgstr "No se encontraron tableros"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "No se requiere tarjeta de crédito"
|
msgstr "No se requiere tarjeta de crédito"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Sin listas"
|
msgstr "Sin listas"
|
||||||
|
|
||||||
@@ -988,15 +1015,15 @@ msgstr "Oferta"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Incorporación"
|
msgstr "Incorporación"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se puede deshacer."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Una vez que elimines tu espacio de trabajo, no hay vuelta atrás. Esta acción no se puede deshacer."
|
msgstr "Una vez que elimines tu espacio de trabajo, no hay vuelta atrás. Esta acción no se puede deshacer."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "o"
|
msgstr "o"
|
||||||
|
|
||||||
@@ -1016,7 +1043,7 @@ msgstr "Tiempo parcial"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Frecuencia de pago"
|
msgstr "Frecuencia de pago"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "Pendiente"
|
msgstr "Pendiente"
|
||||||
|
|
||||||
@@ -1033,19 +1060,19 @@ msgstr "Proyecto personal"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Planificación"
|
msgstr "Planificación"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Por favor, introduce una dirección de correo electrónico válida"
|
msgstr "Por favor, introduce una dirección de correo electrónico válida"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Por favor, introduce un nombre válido"
|
msgstr "Por favor, introduce un nombre válido"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Por favor, introduce una contraseña válida"
|
msgstr "Por favor, introduce una contraseña válida"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Por favor selecciona un archivo para subir."
|
msgstr "Por favor selecciona un archivo para subir."
|
||||||
|
|
||||||
@@ -1055,10 +1082,11 @@ msgstr "Por favor selecciona un archivo para subir."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1067,14 +1095,15 @@ msgstr "Por favor selecciona un archivo para subir."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
||||||
|
|
||||||
@@ -1096,11 +1125,11 @@ msgstr "Política de privacidad"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Privado"
|
msgstr "Privado"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Imagen de perfil actualizada"
|
msgstr "Imagen de perfil actualizada"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Foto de perfil"
|
msgstr "Foto de perfil"
|
||||||
|
|
||||||
@@ -1136,7 +1165,7 @@ msgstr "Remoto"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Eliminar miembro"
|
msgstr "Eliminar miembro"
|
||||||
|
|
||||||
@@ -1177,7 +1206,7 @@ msgstr "Revocar"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Hoja de ruta"
|
msgstr "Hoja de ruta"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Rol"
|
msgstr "Rol"
|
||||||
|
|
||||||
@@ -1217,21 +1246,21 @@ msgstr "Autoalojamiento con Github"
|
|||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "se autoasignó la tarjeta"
|
msgstr "se autoasignó la tarjeta"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackModal.tsx:116
|
||||||
msgid "Send"
|
msgid "Send feedback"
|
||||||
msgstr "Enviar"
|
msgstr "Enviar comentarios"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configuración"
|
msgstr "Configuración"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Configuración | {0}"
|
msgstr "Configuración | {0}"
|
||||||
|
|
||||||
@@ -1253,7 +1282,7 @@ msgstr "Registro deshabilitado"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
|
msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "Registrarse con "
|
msgstr "Registrarse con "
|
||||||
|
|
||||||
@@ -1282,11 +1311,15 @@ msgstr "Estrella en Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Éxito"
|
msgstr "Éxito"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Soporte"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Apoya el desarrollo del proyecto"
|
msgstr "Apoya el desarrollo del proyecto"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
@@ -1302,7 +1335,7 @@ msgstr "Plantillas"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Términos de servicio"
|
msgstr "Términos de servicio"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "¡Gracias por tus comentarios!"
|
msgstr "¡Gracias por tus comentarios!"
|
||||||
|
|
||||||
@@ -1319,7 +1352,7 @@ msgstr "La alternativa de código abierto <0/> a Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "La visibilidad de tu tablero ha sido establecida a {0}."
|
msgstr "La visibilidad de tu tablero ha sido establecida a {0}."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Tema"
|
msgstr "Tema"
|
||||||
|
|
||||||
@@ -1329,9 +1362,14 @@ msgstr "No podrán acceder a este espacio de trabajo."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Esta acción no se puede deshacer."
|
msgstr "Esta acción no se puede deshacer."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "Este tablero es privado o no existe"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "Esta URL de tablero ya ha sido utilizada"
|
msgstr "Esta URL de tablero ya ha sido utilizada"
|
||||||
@@ -1361,7 +1399,7 @@ msgstr "Alternar menú"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Rastrea todos los cambios en las tarjetas con un historial de actividad detallado."
|
msgstr "Rastrea todos los cambios en las tarjetas con un historial de actividad detallado."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello desconectado"
|
msgstr "Trello desconectado"
|
||||||
|
|
||||||
@@ -1377,7 +1415,7 @@ msgstr "Clasificación"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "No se puede añadir el comentario"
|
msgstr "No se puede añadir el comentario"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "No se puede crear la tarjeta"
|
msgstr "No se puede crear la tarjeta"
|
||||||
|
|
||||||
@@ -1385,7 +1423,7 @@ msgstr "No se puede crear la tarjeta"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "No se puede crear la lista"
|
msgstr "No se puede crear la lista"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "No se puede crear el espacio de trabajo"
|
msgstr "No se puede crear el espacio de trabajo"
|
||||||
|
|
||||||
@@ -1401,7 +1439,7 @@ msgstr "No se puede eliminar el comentario"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "No se puede eliminar al miembro"
|
msgstr "No se puede eliminar al miembro"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "No se pudieron enviar los comentarios"
|
msgstr "No se pudieron enviar los comentarios"
|
||||||
|
|
||||||
@@ -1413,8 +1451,8 @@ msgstr "No se puede actualizar la URL del tablero"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "No se puede actualizar la visibilidad del tablero"
|
msgstr "No se puede actualizar la visibilidad del tablero"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "No se puede actualizar la tarjeta"
|
msgstr "No se puede actualizar la tarjeta"
|
||||||
|
|
||||||
@@ -1427,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "No se pueden actualizar las etiquetas"
|
msgstr "No se pueden actualizar las etiquetas"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "No se puede actualizar la lista"
|
msgstr "No se puede actualizar la lista"
|
||||||
|
|
||||||
@@ -1471,11 +1509,11 @@ msgstr "Listas ilimitadas"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Actualizar"
|
msgstr "Actualizar"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Actualizar etiqueta"
|
msgstr "Actualizar etiqueta"
|
||||||
|
|
||||||
@@ -1516,19 +1554,23 @@ msgstr "La URL debe tener al menos 3 caracteres"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Usar plantilla"
|
msgstr "Usar plantilla"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Usuario"
|
msgstr "Usuario"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "El usuario ya es miembro de este espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "Ver y gestionar tus claves API."
|
msgstr "Ver y gestionar tus claves API."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "Ver y gestionar tu facturación y suscripción."
|
msgstr "Ver y gestionar tu facturación y suscripción."
|
||||||
|
|
||||||
@@ -1540,6 +1582,10 @@ msgstr "Ver documentación"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Ver nuestra hoja de ruta."
|
msgstr "Ver nuestra hoja de ruta."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "Ver espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Visibilidad"
|
msgstr "Visibilidad"
|
||||||
@@ -1572,7 +1618,7 @@ msgstr "Cuando Trello se lanzó en 2011, impresionó a todos con su simplicidad
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "¿Por qué crear un Trello de código abierto?"
|
msgstr "¿Por qué crear un Trello de código abierto?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Espacio de trabajo"
|
msgstr "Espacio de trabajo"
|
||||||
|
|
||||||
@@ -1580,7 +1626,7 @@ msgstr "Espacio de trabajo"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Espacio de trabajo eliminado"
|
msgstr "Espacio de trabajo eliminado"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Descripción del espacio de trabajo"
|
msgstr "Descripción del espacio de trabajo"
|
||||||
|
|
||||||
@@ -1601,8 +1647,8 @@ msgstr "Descripción del espacio de trabajo actualizada"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Miembros del espacio de trabajo"
|
msgstr "Miembros del espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Nombre del espacio de trabajo"
|
msgstr "Nombre del espacio de trabajo"
|
||||||
|
|
||||||
@@ -1622,7 +1668,7 @@ msgstr "Nombre del espacio de trabajo actualizado"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Slug del espacio de trabajo actualizado"
|
msgstr "Slug del espacio de trabajo actualizado"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "URL del espacio de trabajo"
|
msgstr "URL del espacio de trabajo"
|
||||||
|
|
||||||
@@ -1670,15 +1716,15 @@ msgstr "Tus tableros han sido importados."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Tu nombre de visualización ha sido actualizado."
|
msgstr "Tu nombre de visualización ha sido actualizado."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "Tu imagen de perfil ha sido actualizada."
|
msgstr "Tu imagen de perfil ha sido actualizada."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Tu cuenta de Trello ha sido desconectada."
|
msgstr "Tu cuenta de Trello ha sido desconectada."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Tu cuenta de Trello está conectada."
|
msgstr "Tu cuenta de Trello está conectada."
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (modifié)"
|
msgstr " (modifié)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", ou consultez notre"
|
msgstr ", ou consultez notre"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} étiquettes"
|
msgstr "{0} étiquettes"
|
||||||
|
|
||||||
@@ -36,10 +36,6 @@ msgstr "{0} étiquettes"
|
|||||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
|
||||||
msgid "#1 Hacker News"
|
|
||||||
msgstr "#1 Hacker News"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
msgstr "1 utilisateur"
|
msgstr "1 utilisateur"
|
||||||
@@ -53,7 +49,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Compte supprimé"
|
msgstr "Compte supprimé"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activité"
|
msgstr "Activité"
|
||||||
|
|
||||||
@@ -70,7 +66,7 @@ msgstr "Ajouter une carte"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Ajouter un commentaire..."
|
msgstr "Ajouter un commentaire..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
|
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
|
||||||
|
|
||||||
@@ -79,7 +75,7 @@ msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Ajouter une étiquette"
|
msgstr "Ajouter une étiquette"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Ajouter un membre"
|
msgstr "Ajouter un membre"
|
||||||
@@ -112,11 +108,11 @@ msgstr "Tous les systèmes opérationnels"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</1></0>"
|
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello."
|
msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "Clés API"
|
msgstr "Clés API"
|
||||||
|
|
||||||
@@ -149,6 +145,10 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette carte ?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
||||||
@@ -169,12 +169,12 @@ msgstr "Backlog"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Kanban basique"
|
msgstr "Kanban basique"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Facturation"
|
msgstr "Facturation"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Portail de facturation"
|
msgstr "Portail de facturation"
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ msgstr "Portail de facturation"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Article de blog"
|
msgstr "Article de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tableau"
|
msgstr "Tableau"
|
||||||
|
|
||||||
@@ -194,7 +194,8 @@ msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Le nom du tableau est requis"
|
msgstr "Le nom du tableau est requis"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Tableau introuvable"
|
msgstr "Tableau introuvable"
|
||||||
|
|
||||||
@@ -206,7 +207,7 @@ msgstr "L'URL du tableau ne peut contenir que des lettres, des chiffres et des t
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "L'URL du tableau ne peut pas dépasser 60 caractères"
|
msgstr "L'URL du tableau ne peut pas dépasser 60 caractères"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "URL du tableau copiée dans le presse-papiers"
|
msgstr "URL du tableau copiée dans le presse-papiers"
|
||||||
|
|
||||||
@@ -222,13 +223,13 @@ msgstr "Visibilité du tableau"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Visibilité du tableau mise à jour"
|
msgstr "Visibilité du tableau mise à jour"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Tableaux"
|
msgstr "Tableaux"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Tableaux | {0}"
|
msgstr "Tableaux | {0}"
|
||||||
|
|
||||||
@@ -251,18 +252,19 @@ msgstr "Rapport de bug"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carte introuvable"
|
msgstr "Carte introuvable"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Titre de la carte"
|
msgstr "Titre de la carte"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Changer la langue de l'application."
|
msgstr "Changer la langue de l'application."
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ msgstr "Contrôle et propriété complets :"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirmer le changement d'URL"
|
msgstr "Confirmer le changement d'URL"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Connecter Trello"
|
msgstr "Connecter Trello"
|
||||||
@@ -321,7 +323,7 @@ msgstr "Connecter Trello"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Connectez vos outils favoris pour simplifier votre flux de travail."
|
msgstr "Connectez vos outils favoris pour simplifier votre flux de travail."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Connectez votre compte Trello pour importer des tableaux."
|
msgstr "Connectez votre compte Trello pour importer des tableaux."
|
||||||
|
|
||||||
@@ -329,7 +331,7 @@ msgstr "Connectez votre compte Trello pour importer des tableaux."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contact"
|
msgstr "Contact"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Contactez-nous"
|
msgstr "Contactez-nous"
|
||||||
|
|
||||||
@@ -337,12 +339,12 @@ msgstr "Contactez-nous"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Création de contenu"
|
msgstr "Création de contenu"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Continuer avec "
|
msgstr "Continuer avec "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Continuer avec {0}"
|
msgstr "Continuer avec {0}"
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
|
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Créer un autre"
|
msgstr "Créer un autre"
|
||||||
@@ -360,15 +362,15 @@ msgstr "Créer un autre"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Créer un tableau"
|
msgstr "Créer un tableau"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Créer une carte"
|
msgstr "Créer une carte"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Créer une étiquette"
|
msgstr "Créer une étiquette"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Créer une liste"
|
msgstr "Créer une liste"
|
||||||
|
|
||||||
@@ -381,16 +383,16 @@ msgid "Create new key"
|
|||||||
msgstr "Créer une nouvelle clé"
|
msgstr "Créer une nouvelle clé"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Créer une nouvelle étiquette"
|
msgstr "Créer une nouvelle étiquette"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Créer une nouvelle liste"
|
msgstr "Créer une nouvelle liste"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Créer un espace de travail"
|
msgstr "Créer un espace de travail"
|
||||||
|
|
||||||
@@ -414,18 +416,19 @@ msgstr "Les URL personnalisées sont une fonctionnalité premium. Vous serez dir
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Support client"
|
msgstr "Support client"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Sombre"
|
msgstr "Sombre"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Supprimer le compte"
|
msgstr "Supprimer le compte"
|
||||||
@@ -446,8 +449,8 @@ msgstr "Supprimer le commentaire"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Supprimer la liste"
|
msgstr "Supprimer la liste"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Supprimer l'espace de travail"
|
msgstr "Supprimer l'espace de travail"
|
||||||
@@ -456,7 +459,7 @@ msgstr "Supprimer l'espace de travail"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Déconnecter Trello"
|
msgstr "Déconnecter Trello"
|
||||||
|
|
||||||
@@ -464,7 +467,7 @@ msgstr "Déconnecter Trello"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Discutez et collaborez sur les cartes."
|
msgstr "Discutez et collaborez sur les cartes."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Nom d'affichage"
|
msgstr "Nom d'affichage"
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ msgstr "Nom d'affichage mis à jour"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "Proposez-vous un plan gratuit ?"
|
msgstr "Proposez-vous un plan gratuit ?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "documentation"
|
msgstr "documentation"
|
||||||
|
|
||||||
@@ -494,6 +497,7 @@ msgstr "Documentation"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Documentation"
|
msgstr "Documentation"
|
||||||
|
|
||||||
@@ -521,15 +525,19 @@ msgstr "Modifier le commentaire"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Modifier l'étiquette"
|
msgstr "Modifier l'étiquette"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Modifier l'URL de l'espace de travail"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Édition"
|
msgstr "Édition"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "e-mail"
|
msgstr "e-mail"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
@@ -537,15 +545,15 @@ msgstr "E-mail"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Amélioration"
|
msgstr "Amélioration"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Saisissez votre adresse e-mail"
|
msgstr "Saisissez votre adresse e-mail"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Saisissez votre nom"
|
msgstr "Saisissez votre nom"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Saisissez votre mot de passe"
|
msgstr "Saisissez votre mot de passe"
|
||||||
|
|
||||||
@@ -553,19 +561,28 @@ msgstr "Saisissez votre mot de passe"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Erreur lors de la suppression du compte"
|
msgstr "Erreur lors de la suppression du compte"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Erreur lors de la suppression de l'étiquette"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Erreur lors de la suppression de l'espace de travail"
|
msgstr "Erreur lors de la suppression de l'espace de travail"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Erreur lors de la déconnexion de Trello"
|
msgstr "Erreur lors de la déconnexion de Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Erreur lors de l'invitation du membre"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Erreur lors de la mise à jour du nom d'affichage"
|
msgstr "Erreur lors de la mise à jour du nom d'affichage"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Erreur lors de la mise à jour de l'image de profil"
|
msgstr "Erreur lors de la mise à jour de l'image de profil"
|
||||||
|
|
||||||
@@ -581,8 +598,8 @@ msgstr "Erreur lors de la mise à jour du nom de l'espace de travail"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail"
|
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Erreur lors du téléchargement de l'image de profil"
|
msgstr "Erreur lors du téléchargement de l'image de profil"
|
||||||
|
|
||||||
@@ -622,11 +639,12 @@ msgstr "Demande de fonctionnalité"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Fonctionnalités"
|
msgstr "Fonctionnalités"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Commentaires"
|
msgstr "Commentaires"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Commentaires envoyés"
|
msgstr "Commentaires envoyés"
|
||||||
|
|
||||||
@@ -642,6 +660,7 @@ 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."
|
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."
|
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
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuit"
|
msgstr "Gratuit"
|
||||||
@@ -674,7 +693,7 @@ msgstr "Commencer"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Commencez par créer un nouveau tableau"
|
msgstr "Commencez par créer un nouveau tableau"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Commencez par créer une nouvelle liste"
|
msgstr "Commencez par créer une nouvelle liste"
|
||||||
|
|
||||||
@@ -747,11 +766,11 @@ msgstr "Je reconnais que toutes les données de l'espace de travail seront défi
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Idées"
|
msgstr "Idées"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Idées pour améliorer cette page..."
|
msgstr "Idées pour améliorer cette page..."
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importer"
|
msgstr "Importer"
|
||||||
|
|
||||||
@@ -797,11 +816,19 @@ msgstr "Intégrations"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Entretien"
|
msgstr "Entretien"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Adresse e-mail invalide"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Inviter"
|
msgstr "Inviter"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Inviter un autre"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Inviter un membre"
|
msgstr "Inviter un membre"
|
||||||
@@ -823,8 +850,8 @@ msgstr "Kanban réinventé"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Gardez à l'esprit que cette action est irréversible."
|
msgstr "Gardez à l'esprit que cette action est irréversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Étiquettes"
|
msgstr "Étiquettes"
|
||||||
@@ -833,7 +860,7 @@ msgstr "Étiquettes"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Étiquettes & filtres"
|
msgstr "Étiquettes & filtres"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Langue"
|
msgstr "Langue"
|
||||||
|
|
||||||
@@ -849,15 +876,15 @@ msgstr "Mentions légales"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "Licence"
|
msgstr "Licence"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Clair"
|
msgstr "Clair"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Lien copié"
|
msgstr "Lien copié"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Liste"
|
msgstr "Liste"
|
||||||
|
|
||||||
@@ -869,7 +896,7 @@ msgstr "Nom de la liste"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Connexion | kan.bn"
|
msgstr "Connexion | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Déconnexion"
|
msgstr "Déconnexion"
|
||||||
|
|
||||||
@@ -881,7 +908,7 @@ msgstr "Long terme"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Priorité basse"
|
msgstr "Priorité basse"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "lien magique"
|
msgstr "lien magique"
|
||||||
|
|
||||||
@@ -889,16 +916,16 @@ msgstr "lien magique"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Priorité moyenne"
|
msgstr "Priorité moyenne"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Membres"
|
msgstr "Membres"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Membres | {0}"
|
msgstr "Membres | {0}"
|
||||||
|
|
||||||
@@ -919,11 +946,11 @@ msgstr "a déplacé la carte vers une autre liste"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "Besoin d'aide ?"
|
msgstr "Besoin d'aide ?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "Nouveau"
|
msgstr "Nouveau"
|
||||||
|
|
||||||
@@ -931,7 +958,7 @@ msgstr "Nouveau"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nouveau tableau"
|
msgstr "Nouveau tableau"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nouvelle carte"
|
msgstr "Nouvelle carte"
|
||||||
|
|
||||||
@@ -943,7 +970,7 @@ msgstr "Nouvel import"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nouvelle étiquette"
|
msgstr "Nouvelle étiquette"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nouvelle liste"
|
msgstr "Nouvelle liste"
|
||||||
@@ -952,7 +979,7 @@ msgstr "Nouvelle liste"
|
|||||||
msgid "New Ticket"
|
msgid "New Ticket"
|
||||||
msgstr "Nouveau ticket"
|
msgstr "Nouveau ticket"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "Nouvel espace de travail"
|
msgstr "Nouvel espace de travail"
|
||||||
|
|
||||||
@@ -976,7 +1003,7 @@ msgstr "Aucun tableau trouvé"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Aucune carte de crédit requise"
|
msgstr "Aucune carte de crédit requise"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Aucune liste"
|
msgstr "Aucune liste"
|
||||||
|
|
||||||
@@ -988,15 +1015,15 @@ msgstr "Offre"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Intégration"
|
msgstr "Intégration"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Une fois que vous supprimez votre espace de travail, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
|
msgstr "Une fois que vous supprimez votre espace de travail, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "ou"
|
msgstr "ou"
|
||||||
|
|
||||||
@@ -1016,7 +1043,7 @@ msgstr "Temps partiel"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Fréquence de paiement"
|
msgstr "Fréquence de paiement"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "En attente"
|
msgstr "En attente"
|
||||||
|
|
||||||
@@ -1033,19 +1060,19 @@ msgstr "Projet personnel"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Planification"
|
msgstr "Planification"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Veuillez saisir une adresse e-mail valide"
|
msgstr "Veuillez saisir une adresse e-mail valide"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Veuillez saisir un nom valide"
|
msgstr "Veuillez saisir un nom valide"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Veuillez saisir un mot de passe valide"
|
msgstr "Veuillez saisir un mot de passe valide"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Veuillez sélectionner un fichier à télécharger."
|
msgstr "Veuillez sélectionner un fichier à télécharger."
|
||||||
|
|
||||||
@@ -1055,10 +1082,11 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1067,14 +1095,15 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Veuillez réessayer plus tard ou contacter le service client."
|
msgstr "Veuillez réessayer plus tard ou contacter le service client."
|
||||||
|
|
||||||
@@ -1096,11 +1125,11 @@ msgstr "Politique de confidentialité"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Privé"
|
msgstr "Privé"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Image de profil mise à jour"
|
msgstr "Image de profil mise à jour"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Photo de profil"
|
msgstr "Photo de profil"
|
||||||
|
|
||||||
@@ -1136,7 +1165,7 @@ msgstr "À distance"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Supprimer le membre"
|
msgstr "Supprimer le membre"
|
||||||
|
|
||||||
@@ -1177,7 +1206,7 @@ msgstr "Révoquer"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Feuille de route"
|
msgstr "Feuille de route"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Rôle"
|
msgstr "Rôle"
|
||||||
|
|
||||||
@@ -1217,21 +1246,21 @@ msgstr "Auto-hébergement avec Github"
|
|||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "s'est auto-assigné la carte"
|
msgstr "s'est auto-assigné la carte"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackModal.tsx:116
|
||||||
msgid "Send"
|
msgid "Send feedback"
|
||||||
msgstr "Envoyer"
|
msgstr "Envoyer des commentaires"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Paramètres"
|
msgstr "Paramètres"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Paramètres | {0}"
|
msgstr "Paramètres | {0}"
|
||||||
|
|
||||||
@@ -1253,7 +1282,7 @@ msgstr "Inscription désactivée"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
|
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "S'inscrire avec "
|
msgstr "S'inscrire avec "
|
||||||
|
|
||||||
@@ -1282,11 +1311,15 @@ msgstr "Étoile sur Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Succès"
|
msgstr "Succès"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Assistance"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Soutenir le développement du projet"
|
msgstr "Soutenir le développement du projet"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Système"
|
msgstr "Système"
|
||||||
|
|
||||||
@@ -1302,7 +1335,7 @@ msgstr "Modèles"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Conditions d'utilisation"
|
msgstr "Conditions d'utilisation"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "Merci pour vos commentaires !"
|
msgstr "Merci pour vos commentaires !"
|
||||||
|
|
||||||
@@ -1319,7 +1352,7 @@ msgstr "L'alternative open source <0/> à Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "La visibilité de votre tableau a été définie sur {0}."
|
msgstr "La visibilité de votre tableau a été définie sur {0}."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Thème"
|
msgstr "Thème"
|
||||||
|
|
||||||
@@ -1329,9 +1362,14 @@ msgstr "Ils ne pourront plus accéder à cet espace de travail."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Cette action ne peut pas être annulée."
|
msgstr "Cette action ne peut pas être annulée."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "Ce tableau est privé ou n'existe pas"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "Cette URL de tableau est déjà utilisée"
|
msgstr "Cette URL de tableau est déjà utilisée"
|
||||||
@@ -1361,7 +1399,7 @@ msgstr "Basculer le menu"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Suivez tous les changements de cartes avec un historique d'activité détaillé."
|
msgstr "Suivez tous les changements de cartes avec un historique d'activité détaillé."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello déconnecté"
|
msgstr "Trello déconnecté"
|
||||||
|
|
||||||
@@ -1377,7 +1415,7 @@ msgstr "Triage"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossible d'ajouter un commentaire"
|
msgstr "Impossible d'ajouter un commentaire"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossible de créer la carte"
|
msgstr "Impossible de créer la carte"
|
||||||
|
|
||||||
@@ -1385,7 +1423,7 @@ msgstr "Impossible de créer la carte"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Impossible de créer une liste"
|
msgstr "Impossible de créer une liste"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "Impossible de créer l'espace de travail"
|
msgstr "Impossible de créer l'espace de travail"
|
||||||
|
|
||||||
@@ -1401,7 +1439,7 @@ msgstr "Impossible de supprimer le commentaire"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "Impossible de supprimer le membre"
|
msgstr "Impossible de supprimer le membre"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "Impossible d'envoyer les commentaires"
|
msgstr "Impossible d'envoyer les commentaires"
|
||||||
|
|
||||||
@@ -1413,8 +1451,8 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossible de mettre à jour la carte"
|
msgstr "Impossible de mettre à jour la carte"
|
||||||
|
|
||||||
@@ -1427,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Impossible de mettre à jour les étiquettes"
|
msgstr "Impossible de mettre à jour les étiquettes"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Impossible de mettre à jour la liste"
|
msgstr "Impossible de mettre à jour la liste"
|
||||||
|
|
||||||
@@ -1471,11 +1509,11 @@ msgstr "Listes illimitées"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Mettre à jour"
|
msgstr "Mettre à jour"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Mettre à jour l'étiquette"
|
msgstr "Mettre à jour l'étiquette"
|
||||||
|
|
||||||
@@ -1516,19 +1554,23 @@ msgstr "L'URL doit comporter au moins 3 caractères"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Utiliser le modèle"
|
msgstr "Utiliser le modèle"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Utilisateur"
|
msgstr "Utilisateur"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "L'utilisateur est déjà membre de cet espace de travail"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Vidéo"
|
msgstr "Vidéo"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "Consultez et gérez vos clés API."
|
msgstr "Consultez et gérez vos clés API."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "Consultez et gérez votre facturation et votre abonnement."
|
msgstr "Consultez et gérez votre facturation et votre abonnement."
|
||||||
|
|
||||||
@@ -1540,6 +1582,10 @@ msgstr "Voir la documentation"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Consultez notre feuille de route."
|
msgstr "Consultez notre feuille de route."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "Voir l'espace de travail"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Visibilité"
|
msgstr "Visibilité"
|
||||||
@@ -1572,7 +1618,7 @@ msgstr "Quand Trello a été lancé en 2011, il a impressionné tout le monde pa
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Pourquoi créer un Trello open source ?"
|
msgstr "Pourquoi créer un Trello open source ?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Espace de travail"
|
msgstr "Espace de travail"
|
||||||
|
|
||||||
@@ -1580,7 +1626,7 @@ msgstr "Espace de travail"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Espace de travail supprimé"
|
msgstr "Espace de travail supprimé"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Description de l'espace de travail"
|
msgstr "Description de l'espace de travail"
|
||||||
|
|
||||||
@@ -1601,8 +1647,8 @@ msgstr "Description de l'espace de travail mise à jour"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Membres de l'espace de travail"
|
msgstr "Membres de l'espace de travail"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Nom de l'espace de travail"
|
msgstr "Nom de l'espace de travail"
|
||||||
|
|
||||||
@@ -1622,7 +1668,7 @@ msgstr "Nom de l'espace de travail mis à jour"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Slug de l'espace de travail mis à jour"
|
msgstr "Slug de l'espace de travail mis à jour"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "URL de l'espace de travail"
|
msgstr "URL de l'espace de travail"
|
||||||
|
|
||||||
@@ -1670,15 +1716,15 @@ msgstr "Vos tableaux ont été importés."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Votre nom d'affichage a été mis à jour."
|
msgstr "Votre nom d'affichage a été mis à jour."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "Votre image de profil a été mise à jour."
|
msgstr "Votre image de profil a été mise à jour."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Votre compte Trello a été déconnecté."
|
msgstr "Votre compte Trello a été déconnecté."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Votre compte Trello est connecté."
|
msgstr "Votre compte Trello est connecté."
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (modificato)"
|
msgstr " (modificato)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", o consulta i nostri"
|
msgstr ", o consulta i nostri"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} etichette"
|
msgstr "{0} etichette"
|
||||||
|
|
||||||
@@ -36,10 +36,6 @@ msgstr "{0} etichette"
|
|||||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
|
||||||
msgid "#1 Hacker News"
|
|
||||||
msgstr "#1 Hacker News"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
msgstr "1 utente"
|
msgstr "1 utente"
|
||||||
@@ -53,7 +49,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Account eliminato"
|
msgstr "Account eliminato"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Attività"
|
msgstr "Attività"
|
||||||
|
|
||||||
@@ -70,7 +66,7 @@ msgstr "Aggiungi una carta"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Aggiungi un commento..."
|
msgstr "Aggiungi un commento..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
|
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
|
||||||
|
|
||||||
@@ -79,7 +75,7 @@ msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Aggiungi etichetta"
|
msgstr "Aggiungi etichetta"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Aggiungi membro"
|
msgstr "Aggiungi membro"
|
||||||
@@ -112,11 +108,11 @@ msgstr "Tutti i sistemi operativi"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "Hai già un account? <0><1>Accedi</1></0>"
|
msgstr "Hai già un account? <0><1>Accedi</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "Si è verificato un errore durante la disconnessione del tuo account Trello."
|
msgstr "Si è verificato un errore durante la disconnessione del tuo account Trello."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "Chiavi API"
|
msgstr "Chiavi API"
|
||||||
|
|
||||||
@@ -149,6 +145,10 @@ msgstr "Sei sicuro di voler eliminare questa carta?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Sei sicuro di voler eliminare questo commento?"
|
msgstr "Sei sicuro di voler eliminare questo commento?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
||||||
@@ -169,12 +169,12 @@ msgstr "Backlog"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Kanban base"
|
msgstr "Kanban base"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Fatturazione"
|
msgstr "Fatturazione"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Portale di fatturazione"
|
msgstr "Portale di fatturazione"
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ msgstr "Portale di fatturazione"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Post del blog"
|
msgstr "Post del blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bacheca"
|
msgstr "Bacheca"
|
||||||
|
|
||||||
@@ -194,7 +194,8 @@ msgstr "Il nome della bacheca non può superare i 100 caratteri"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Il nome della bacheca è obbligatorio"
|
msgstr "Il nome della bacheca è obbligatorio"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Bacheca non trovata"
|
msgstr "Bacheca non trovata"
|
||||||
|
|
||||||
@@ -206,7 +207,7 @@ msgstr "L'URL della bacheca può contenere solo lettere, numeri e trattini"
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "L'URL della bacheca non può superare i 60 caratteri"
|
msgstr "L'URL della bacheca non può superare i 60 caratteri"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "URL della bacheca copiato negli appunti"
|
msgstr "URL della bacheca copiato negli appunti"
|
||||||
|
|
||||||
@@ -222,13 +223,13 @@ msgstr "Visibilità bacheca"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Visibilità della bacheca aggiornata"
|
msgstr "Visibilità della bacheca aggiornata"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Bacheche"
|
msgstr "Bacheche"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Bacheche | {0}"
|
msgstr "Bacheche | {0}"
|
||||||
|
|
||||||
@@ -251,18 +252,19 @@ msgstr "Segnalazione bug"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carta non trovata"
|
msgstr "Carta non trovata"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Titolo della carta"
|
msgstr "Titolo della carta"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Cambia la lingua dell'app."
|
msgstr "Cambia la lingua dell'app."
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ msgstr "Controllo e proprietà completi:"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Conferma modifica URL"
|
msgstr "Conferma modifica URL"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Connetti Trello"
|
msgstr "Connetti Trello"
|
||||||
@@ -321,7 +323,7 @@ msgstr "Connetti Trello"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Connetti i tuoi strumenti preferiti per semplificare il tuo flusso di lavoro."
|
msgstr "Connetti i tuoi strumenti preferiti per semplificare il tuo flusso di lavoro."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Connetti il tuo account Trello per importare le bacheche."
|
msgstr "Connetti il tuo account Trello per importare le bacheche."
|
||||||
|
|
||||||
@@ -329,7 +331,7 @@ msgstr "Connetti il tuo account Trello per importare le bacheche."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contatti"
|
msgstr "Contatti"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Contattaci"
|
msgstr "Contattaci"
|
||||||
|
|
||||||
@@ -337,12 +339,12 @@ msgstr "Contattaci"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Creazione contenuti"
|
msgstr "Creazione contenuti"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Continua con "
|
msgstr "Continua con "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Continua con {0}"
|
msgstr "Continua con {0}"
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
|
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Crea un altro"
|
msgstr "Crea un altro"
|
||||||
@@ -360,15 +362,15 @@ msgstr "Crea un altro"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Crea bacheca"
|
msgstr "Crea bacheca"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Crea carta"
|
msgstr "Crea carta"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Crea etichetta"
|
msgstr "Crea etichetta"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Crea lista"
|
msgstr "Crea lista"
|
||||||
|
|
||||||
@@ -381,16 +383,16 @@ msgid "Create new key"
|
|||||||
msgstr "Crea nuova chiave"
|
msgstr "Crea nuova chiave"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Crea nuova etichetta"
|
msgstr "Crea nuova etichetta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Crea nuova lista"
|
msgstr "Crea nuova lista"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Crea spazio di lavoro"
|
msgstr "Crea spazio di lavoro"
|
||||||
|
|
||||||
@@ -414,18 +416,19 @@ msgstr "Gli URL personalizzati sono una funzionalità premium. Sarai indirizzato
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Assistenza clienti"
|
msgstr "Assistenza clienti"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Scuro"
|
msgstr "Scuro"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Elimina"
|
msgstr "Elimina"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Elimina account"
|
msgstr "Elimina account"
|
||||||
@@ -446,8 +449,8 @@ msgstr "Elimina commento"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Elimina lista"
|
msgstr "Elimina lista"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Elimina spazio di lavoro"
|
msgstr "Elimina spazio di lavoro"
|
||||||
@@ -456,7 +459,7 @@ msgstr "Elimina spazio di lavoro"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Disconnetti Trello"
|
msgstr "Disconnetti Trello"
|
||||||
|
|
||||||
@@ -464,7 +467,7 @@ msgstr "Disconnetti Trello"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Discuti e collabora sulle schede."
|
msgstr "Discuti e collabora sulle schede."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Nome visualizzato"
|
msgstr "Nome visualizzato"
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ msgstr "Nome visualizzato aggiornato"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "Offrite un piano gratuito?"
|
msgstr "Offrite un piano gratuito?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "documenti"
|
msgstr "documenti"
|
||||||
|
|
||||||
@@ -494,6 +497,7 @@ msgstr "Documenti"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Documentazione"
|
msgstr "Documentazione"
|
||||||
|
|
||||||
@@ -521,15 +525,19 @@ msgstr "Modifica commento"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Modifica etichetta"
|
msgstr "Modifica etichetta"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Modifica URL dell'area di lavoro"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Modifica"
|
msgstr "Modifica"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "email"
|
msgstr "email"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
|
|
||||||
@@ -537,15 +545,15 @@ msgstr "Email"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Miglioramento"
|
msgstr "Miglioramento"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Inserisci il tuo indirizzo email"
|
msgstr "Inserisci il tuo indirizzo email"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Inserisci il tuo nome"
|
msgstr "Inserisci il tuo nome"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Inserisci la tua password"
|
msgstr "Inserisci la tua password"
|
||||||
|
|
||||||
@@ -553,19 +561,28 @@ msgstr "Inserisci la tua password"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Errore durante l'eliminazione dell'account"
|
msgstr "Errore durante l'eliminazione dell'account"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Errore durante l'eliminazione dell'etichetta"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Errore durante l'eliminazione dell'area di lavoro"
|
msgstr "Errore durante l'eliminazione dell'area di lavoro"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Errore durante la disconnessione da Trello"
|
msgstr "Errore durante la disconnessione da Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Errore durante l'invito del membro"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Errore durante l'aggiornamento del nome visualizzato"
|
msgstr "Errore durante l'aggiornamento del nome visualizzato"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Errore durante l'aggiornamento dell'immagine del profilo"
|
msgstr "Errore durante l'aggiornamento dell'immagine del profilo"
|
||||||
|
|
||||||
@@ -581,8 +598,8 @@ msgstr "Errore durante l'aggiornamento del nome dell'area di lavoro"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
|
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Errore durante il caricamento dell'immagine del profilo"
|
msgstr "Errore durante il caricamento dell'immagine del profilo"
|
||||||
|
|
||||||
@@ -622,11 +639,12 @@ msgstr "Richiesta funzionalità"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Funzionalità"
|
msgstr "Funzionalità"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Feedback"
|
msgstr "Feedback"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Feedback inviato"
|
msgstr "Feedback inviato"
|
||||||
|
|
||||||
@@ -642,6 +660,7 @@ 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."
|
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."
|
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
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuito"
|
msgstr "Gratuito"
|
||||||
@@ -674,7 +693,7 @@ msgstr "Inizia ora"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Inizia creando una nuova bacheca"
|
msgstr "Inizia creando una nuova bacheca"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Inizia creando una nuova lista"
|
msgstr "Inizia creando una nuova lista"
|
||||||
|
|
||||||
@@ -747,11 +766,11 @@ msgstr "Riconosco che tutti i dati dell'area di lavoro saranno eliminati permane
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Idee"
|
msgstr "Idee"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Idee per migliorare questa pagina..."
|
msgstr "Idee per migliorare questa pagina..."
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importa"
|
msgstr "Importa"
|
||||||
|
|
||||||
@@ -797,11 +816,19 @@ msgstr "Integrazioni"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Colloquio"
|
msgstr "Colloquio"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Indirizzo email non valido"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Invita"
|
msgstr "Invita"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Invita un altro"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Invita membro"
|
msgstr "Invita membro"
|
||||||
@@ -823,8 +850,8 @@ msgstr "Kanban reinventato"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Tieni presente che questa azione è irreversibile."
|
msgstr "Tieni presente che questa azione è irreversibile."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Etichette"
|
msgstr "Etichette"
|
||||||
@@ -833,7 +860,7 @@ msgstr "Etichette"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Etichette & Filtri"
|
msgstr "Etichette & Filtri"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Lingua"
|
msgstr "Lingua"
|
||||||
|
|
||||||
@@ -849,15 +876,15 @@ msgstr "Legale"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "Licenza"
|
msgstr "Licenza"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Chiaro"
|
msgstr "Chiaro"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link copiato"
|
msgstr "Link copiato"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lista"
|
msgstr "Lista"
|
||||||
|
|
||||||
@@ -869,7 +896,7 @@ msgstr "Nome lista"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Login | kan.bn"
|
msgstr "Login | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Esci"
|
msgstr "Esci"
|
||||||
|
|
||||||
@@ -881,7 +908,7 @@ msgstr "A lungo termine"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Bassa priorità"
|
msgstr "Bassa priorità"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "link magico"
|
msgstr "link magico"
|
||||||
|
|
||||||
@@ -889,16 +916,16 @@ msgstr "link magico"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Media priorità"
|
msgstr "Media priorità"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Membri"
|
msgstr "Membri"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Membri | {0}"
|
msgstr "Membri | {0}"
|
||||||
|
|
||||||
@@ -919,11 +946,11 @@ msgstr "ha spostato la scheda in un'altra lista"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nome"
|
msgstr "Nome"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "Hai bisogno di aiuto?"
|
msgstr "Hai bisogno di aiuto?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "Nuovo"
|
msgstr "Nuovo"
|
||||||
|
|
||||||
@@ -931,7 +958,7 @@ msgstr "Nuovo"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nuova bacheca"
|
msgstr "Nuova bacheca"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nuova carta"
|
msgstr "Nuova carta"
|
||||||
|
|
||||||
@@ -943,7 +970,7 @@ msgstr "Nuova importazione"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nuova etichetta"
|
msgstr "Nuova etichetta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nuova lista"
|
msgstr "Nuova lista"
|
||||||
@@ -952,7 +979,7 @@ msgstr "Nuova lista"
|
|||||||
msgid "New Ticket"
|
msgid "New Ticket"
|
||||||
msgstr "Nuovo ticket"
|
msgstr "Nuovo ticket"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "Nuovo spazio di lavoro"
|
msgstr "Nuovo spazio di lavoro"
|
||||||
|
|
||||||
@@ -976,7 +1003,7 @@ msgstr "Nessuna bacheca trovata"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Nessuna carta di credito richiesta"
|
msgstr "Nessuna carta di credito richiesta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Nessuna lista"
|
msgstr "Nessuna lista"
|
||||||
|
|
||||||
@@ -988,15 +1015,15 @@ msgstr "Offerta"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Inserimento"
|
msgstr "Inserimento"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa azione non può essere annullata."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Una volta eliminata l'area di lavoro, non si può tornare indietro. Questa azione non può essere annullata."
|
msgstr "Una volta eliminata l'area di lavoro, non si può tornare indietro. Questa azione non può essere annullata."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "o"
|
msgstr "o"
|
||||||
|
|
||||||
@@ -1016,7 +1043,7 @@ msgstr "Part-time"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Frequenza di pagamento"
|
msgstr "Frequenza di pagamento"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "In attesa"
|
msgstr "In attesa"
|
||||||
|
|
||||||
@@ -1033,19 +1060,19 @@ msgstr "Progetto personale"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Pianificazione"
|
msgstr "Pianificazione"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Inserisci un indirizzo email valido"
|
msgstr "Inserisci un indirizzo email valido"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Inserisci un nome valido"
|
msgstr "Inserisci un nome valido"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Inserisci una password valida"
|
msgstr "Inserisci una password valida"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Seleziona un file da caricare."
|
msgstr "Seleziona un file da caricare."
|
||||||
|
|
||||||
@@ -1055,10 +1082,11 @@ msgstr "Seleziona un file da caricare."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1067,14 +1095,15 @@ msgstr "Seleziona un file da caricare."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Riprova più tardi o contatta l'assistenza clienti."
|
msgstr "Riprova più tardi o contatta l'assistenza clienti."
|
||||||
|
|
||||||
@@ -1096,11 +1125,11 @@ msgstr "Informativa sulla privacy"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Privato"
|
msgstr "Privato"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Immagine del profilo aggiornata"
|
msgstr "Immagine del profilo aggiornata"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Immagine del profilo"
|
msgstr "Immagine del profilo"
|
||||||
|
|
||||||
@@ -1136,7 +1165,7 @@ msgstr "Remoto"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Rimuovi"
|
msgstr "Rimuovi"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Rimuovi membro"
|
msgstr "Rimuovi membro"
|
||||||
|
|
||||||
@@ -1177,7 +1206,7 @@ msgstr "Revoca"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Roadmap"
|
msgstr "Roadmap"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Ruolo"
|
msgstr "Ruolo"
|
||||||
|
|
||||||
@@ -1217,21 +1246,21 @@ msgstr "Self host con Github"
|
|||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "si è auto-assegnato la scheda"
|
msgstr "si è auto-assegnato la scheda"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackModal.tsx:116
|
||||||
msgid "Send"
|
msgid "Send feedback"
|
||||||
msgstr "Invia"
|
msgstr "Invia feedback"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Impostazioni"
|
msgstr "Impostazioni"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Impostazioni | {0}"
|
msgstr "Impostazioni | {0}"
|
||||||
|
|
||||||
@@ -1253,7 +1282,7 @@ msgstr "Registrazione disabilitata"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
|
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "Registrati con "
|
msgstr "Registrati con "
|
||||||
|
|
||||||
@@ -1282,11 +1311,15 @@ msgstr "Metti una stella su Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Operazione riuscita"
|
msgstr "Operazione riuscita"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Supporto"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Sostieni lo sviluppo del progetto"
|
msgstr "Sostieni lo sviluppo del progetto"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
@@ -1302,7 +1335,7 @@ msgstr "Template"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Termini di servizio"
|
msgstr "Termini di servizio"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "Grazie per il tuo feedback!"
|
msgstr "Grazie per il tuo feedback!"
|
||||||
|
|
||||||
@@ -1319,7 +1352,7 @@ msgstr "L'alternativa open source <0/> a Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "La visibilità della tua bacheca è stata impostata su {0}."
|
msgstr "La visibilità della tua bacheca è stata impostata su {0}."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Tema"
|
msgstr "Tema"
|
||||||
|
|
||||||
@@ -1329,9 +1362,14 @@ msgstr "Non potranno accedere a questo spazio di lavoro."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Questa azione non può essere annullata."
|
msgstr "Questa azione non può essere annullata."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "Questa bacheca è privata o non esiste"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "Questo URL della bacheca è già stato utilizzato"
|
msgstr "Questo URL della bacheca è già stato utilizzato"
|
||||||
@@ -1361,7 +1399,7 @@ msgstr "Attiva/disattiva menu"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Tieni traccia di tutte le modifiche alle schede con una cronologia dettagliata delle attività."
|
msgstr "Tieni traccia di tutte le modifiche alle schede con una cronologia dettagliata delle attività."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello disconnesso"
|
msgstr "Trello disconnesso"
|
||||||
|
|
||||||
@@ -1377,7 +1415,7 @@ msgstr "Smistamento"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossibile aggiungere il commento"
|
msgstr "Impossibile aggiungere il commento"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossibile creare la scheda"
|
msgstr "Impossibile creare la scheda"
|
||||||
|
|
||||||
@@ -1385,7 +1423,7 @@ msgstr "Impossibile creare la scheda"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Impossibile creare la lista"
|
msgstr "Impossibile creare la lista"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "Impossibile creare lo spazio di lavoro"
|
msgstr "Impossibile creare lo spazio di lavoro"
|
||||||
|
|
||||||
@@ -1401,7 +1439,7 @@ msgstr "Impossibile eliminare il commento"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "Impossibile rimuovere il membro"
|
msgstr "Impossibile rimuovere il membro"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "Impossibile inviare feedback"
|
msgstr "Impossibile inviare feedback"
|
||||||
|
|
||||||
@@ -1413,8 +1451,8 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossibile aggiornare la scheda"
|
msgstr "Impossibile aggiornare la scheda"
|
||||||
|
|
||||||
@@ -1427,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Impossibile aggiornare le etichette"
|
msgstr "Impossibile aggiornare le etichette"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Impossibile aggiornare la lista"
|
msgstr "Impossibile aggiornare la lista"
|
||||||
|
|
||||||
@@ -1471,11 +1509,11 @@ msgstr "Liste illimitate"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aggiorna"
|
msgstr "Aggiorna"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Aggiorna etichetta"
|
msgstr "Aggiorna etichetta"
|
||||||
|
|
||||||
@@ -1516,19 +1554,23 @@ msgstr "L'URL deve contenere almeno 3 caratteri"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Usa template"
|
msgstr "Usa template"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Utente"
|
msgstr "Utente"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "L'utente è già membro di questo spazio di lavoro"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "Visualizza e gestisci le tue chiavi API."
|
msgstr "Visualizza e gestisci le tue chiavi API."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
|
msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
|
||||||
|
|
||||||
@@ -1540,6 +1582,10 @@ msgstr "Visualizza documenti"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Visualizza la nostra roadmap."
|
msgstr "Visualizza la nostra roadmap."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "Visualizza spazio di lavoro"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Visibilità"
|
msgstr "Visibilità"
|
||||||
@@ -1572,7 +1618,7 @@ msgstr "Quando Trello fu lanciato nel 2011, stupì tutti con la sua semplicità
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Perché creare un Trello open source?"
|
msgstr "Perché creare un Trello open source?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Spazio di lavoro"
|
msgstr "Spazio di lavoro"
|
||||||
|
|
||||||
@@ -1580,7 +1626,7 @@ msgstr "Spazio di lavoro"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Spazio di lavoro eliminato"
|
msgstr "Spazio di lavoro eliminato"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Descrizione dello spazio di lavoro"
|
msgstr "Descrizione dello spazio di lavoro"
|
||||||
|
|
||||||
@@ -1601,8 +1647,8 @@ msgstr "Descrizione dell'area di lavoro aggiornata"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Membri del workspace"
|
msgstr "Membri del workspace"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Nome dello spazio di lavoro"
|
msgstr "Nome dello spazio di lavoro"
|
||||||
|
|
||||||
@@ -1622,7 +1668,7 @@ msgstr "Nome dello spazio di lavoro aggiornato"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Slug dell'area di lavoro aggiornato"
|
msgstr "Slug dell'area di lavoro aggiornato"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "URL dello spazio di lavoro"
|
msgstr "URL dello spazio di lavoro"
|
||||||
|
|
||||||
@@ -1670,15 +1716,15 @@ msgstr "Le tue bacheche sono state importate."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Il tuo nome visualizzato è stato aggiornato."
|
msgstr "Il tuo nome visualizzato è stato aggiornato."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "La tua immagine del profilo è stata aggiornata."
|
msgstr "La tua immagine del profilo è stata aggiornata."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Il tuo account Trello è stato disconnesso."
|
msgstr "Il tuo account Trello è stato disconnesso."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Il tuo account Trello è connesso."
|
msgstr "Il tuo account Trello è connesso."
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,18 @@ msgstr ""
|
|||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (bewerkt)"
|
msgstr " (bewerkt)"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:123
|
#: src/components/FeedbackModal.tsx:102
|
||||||
msgid ", or see our"
|
msgid ", or see our"
|
||||||
msgstr ", of bekijk onze"
|
msgstr ", of bekijk onze"
|
||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:148
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:365
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} labels"
|
msgstr "{0} labels"
|
||||||
|
|
||||||
@@ -36,10 +36,6 @@ msgstr "{0} labels"
|
|||||||
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
|
||||||
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({boardCount})}}"
|
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({boardCount})}}"
|
||||||
|
|
||||||
#: src/views/home/index.tsx:51
|
|
||||||
msgid "#1 Hacker News"
|
|
||||||
msgstr "#1 Hacker News"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:36
|
#: src/views/home/components/Pricing.tsx:36
|
||||||
msgid "1 user"
|
msgid "1 user"
|
||||||
msgstr "1 gebruiker"
|
msgstr "1 gebruiker"
|
||||||
@@ -53,7 +49,7 @@ msgid "Account deleted"
|
|||||||
msgstr "Account verwijderd"
|
msgstr "Account verwijderd"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:104
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:215
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activiteit"
|
msgstr "Activiteit"
|
||||||
|
|
||||||
@@ -70,7 +66,7 @@ msgstr "Voeg een kaart toe"
|
|||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Voeg een reactie toe..."
|
msgstr "Voeg een reactie toe..."
|
||||||
|
|
||||||
#: src/components/Editor.tsx:302
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add description... (type '/' to open commands)"
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
|
msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
|
||||||
|
|
||||||
@@ -79,7 +75,7 @@ msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
|
|||||||
msgid "Add label"
|
msgid "Add label"
|
||||||
msgstr "Label toevoegen"
|
msgstr "Label toevoegen"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:50
|
#: src/views/members/components/InviteMemberForm.tsx:85
|
||||||
#: src/views/card/components/MemberSelector.tsx:130
|
#: src/views/card/components/MemberSelector.tsx:130
|
||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Lid toevoegen"
|
msgstr "Lid toevoegen"
|
||||||
@@ -112,11 +108,11 @@ msgstr "Alle systemen operationeel"
|
|||||||
msgid "Already have an account? <0><1>Sign in</1></0>"
|
msgid "Already have an account? <0><1>Sign in</1></0>"
|
||||||
msgstr "Heb je al een account? <0><1>Log in</1></0>"
|
msgstr "Heb je al een account? <0><1>Log in</1></0>"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:77
|
#: src/views/settings/index.tsx:100
|
||||||
msgid "An error occurred while disconnecting your Trello account."
|
msgid "An error occurred while disconnecting your Trello account."
|
||||||
msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Trello-account."
|
msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Trello-account."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:229
|
#: src/views/settings/index.tsx:257
|
||||||
msgid "API keys"
|
msgid "API keys"
|
||||||
msgstr "API-sleutels"
|
msgstr "API-sleutels"
|
||||||
|
|
||||||
@@ -149,6 +145,10 @@ msgstr "Weet je zeker dat je deze kaart wilt verwijderen?"
|
|||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
|
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
|
msgid "Are you sure you want to delete this label?"
|
||||||
|
msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
|
||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
||||||
@@ -169,12 +169,12 @@ msgstr "Backlog"
|
|||||||
msgid "Basic Kanban"
|
msgid "Basic Kanban"
|
||||||
msgstr "Basis kanban"
|
msgstr "Basis kanban"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:168
|
#: src/views/settings/index.tsx:196
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:55
|
#: src/views/boards/components/TemplateBoards.tsx:55
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr "Facturering"
|
msgstr "Facturering"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:178
|
#: src/views/settings/index.tsx:206
|
||||||
msgid "Billing portal"
|
msgid "Billing portal"
|
||||||
msgstr "Factureringsportaal"
|
msgstr "Factureringsportaal"
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ msgstr "Factureringsportaal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blogbericht"
|
msgstr "Blogbericht"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bord"
|
msgstr "Bord"
|
||||||
|
|
||||||
@@ -194,7 +194,8 @@ msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Bordnaam is verplicht"
|
msgstr "Bordnaam is verplicht"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:265
|
#: src/views/public/board/index.tsx:137
|
||||||
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Bord niet gevonden"
|
msgstr "Bord niet gevonden"
|
||||||
|
|
||||||
@@ -206,7 +207,7 @@ msgstr "Board URL kan alleen letters, cijfers en koppeltekens bevatten"
|
|||||||
msgid "Board URL cannot exceed 60 characters"
|
msgid "Board URL cannot exceed 60 characters"
|
||||||
msgstr "Board URL mag niet langer zijn dan 60 tekens"
|
msgstr "Board URL mag niet langer zijn dan 60 tekens"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:53
|
#: src/views/public/board/index.tsx:59
|
||||||
msgid "Board URL copied to clipboard"
|
msgid "Board URL copied to clipboard"
|
||||||
msgstr "Board URL gekopieerd naar klembord"
|
msgstr "Board URL gekopieerd naar klembord"
|
||||||
|
|
||||||
@@ -222,13 +223,13 @@ msgstr "Bordzichtbaarheid"
|
|||||||
msgid "Board visibility updated"
|
msgid "Board visibility updated"
|
||||||
msgstr "Zichtbaarheid van bord bijgewerkt"
|
msgstr "Zichtbaarheid van bord bijgewerkt"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:25
|
#: src/views/boards/index.tsx:27
|
||||||
#: src/components/SideNavigation.tsx:39
|
#: src/components/SideNavigation.tsx:68
|
||||||
msgid "Boards"
|
msgid "Boards"
|
||||||
msgstr "Borden"
|
msgstr "Borden"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/boards/index.tsx:21
|
#: src/views/boards/index.tsx:23
|
||||||
msgid "Boards | {0}"
|
msgid "Boards | {0}"
|
||||||
msgstr "Borden | {0}"
|
msgstr "Borden | {0}"
|
||||||
|
|
||||||
@@ -251,18 +252,19 @@ msgstr "Bugrapport"
|
|||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:156
|
#: src/views/card/components/Comment.tsx:156
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuleren"
|
msgstr "Annuleren"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:193
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Kaart niet gevonden"
|
msgstr "Kaart niet gevonden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:254
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Kaarttitel"
|
msgstr "Kaarttitel"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:160
|
#: src/views/settings/index.tsx:188
|
||||||
msgid "Change the language of the app."
|
msgid "Change the language of the app."
|
||||||
msgstr "Wijzig de taal van de app."
|
msgstr "Wijzig de taal van de app."
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ msgstr "Volledige controle en eigendom:"
|
|||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "URL-wijziging bevestigen"
|
msgstr "URL-wijziging bevestigen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:205
|
#: src/views/settings/index.tsx:233
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
#: src/views/boards/components/ImportBoardsForm.tsx:157
|
||||||
msgid "Connect Trello"
|
msgid "Connect Trello"
|
||||||
msgstr "Verbind Trello"
|
msgstr "Verbind Trello"
|
||||||
@@ -321,7 +323,7 @@ msgstr "Verbind Trello"
|
|||||||
msgid "Connect your favorite tools to streamline your workflow."
|
msgid "Connect your favorite tools to streamline your workflow."
|
||||||
msgstr "Verbind je favoriete tools om je werkstroom te stroomlijnen."
|
msgstr "Verbind je favoriete tools om je werkstroom te stroomlijnen."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:192
|
#: src/views/settings/index.tsx:220
|
||||||
msgid "Connect your Trello account to import boards."
|
msgid "Connect your Trello account to import boards."
|
||||||
msgstr "Verbind je Trello-account om borden te importeren."
|
msgstr "Verbind je Trello-account om borden te importeren."
|
||||||
|
|
||||||
@@ -329,7 +331,7 @@ msgstr "Verbind je Trello-account om borden te importeren."
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contact"
|
msgstr "Contact"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:121
|
#: src/components/FeedbackModal.tsx:100
|
||||||
msgid "Contact us"
|
msgid "Contact us"
|
||||||
msgstr "Neem contact op"
|
msgstr "Neem contact op"
|
||||||
|
|
||||||
@@ -337,12 +339,12 @@ msgstr "Neem contact op"
|
|||||||
msgid "Content Creation"
|
msgid "Content Creation"
|
||||||
msgstr "Content creatie"
|
msgstr "Content creatie"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Continue with "
|
msgid "Continue with "
|
||||||
msgstr "Doorgaan met "
|
msgstr "Doorgaan met "
|
||||||
|
|
||||||
#. placeholder {0}: provider.name
|
#. placeholder {0}: provider.name
|
||||||
#: src/components/AuthForm.tsx:268
|
#: src/components/AuthForm.tsx:269
|
||||||
msgid "Continue with {0}"
|
msgid "Continue with {0}"
|
||||||
msgstr "Doorgaan met {0}"
|
msgstr "Doorgaan met {0}"
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Bepaal wie je borden kan bekijken en bewerken."
|
msgstr "Bepaal wie je borden kan bekijken en bewerken."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:391
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:212
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Maak nog een"
|
msgstr "Maak nog een"
|
||||||
@@ -360,15 +362,15 @@ msgstr "Maak nog een"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Maak bord"
|
msgstr "Maak bord"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:401
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Maak kaart"
|
msgstr "Maak kaart"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Maak label"
|
msgstr "Maak label"
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:148
|
#: src/views/board/components/NewListForm.tsx:152
|
||||||
msgid "Create list"
|
msgid "Create list"
|
||||||
msgstr "Lijst maken"
|
msgstr "Lijst maken"
|
||||||
|
|
||||||
@@ -381,16 +383,16 @@ msgid "Create new key"
|
|||||||
msgstr "Nieuwe sleutel aanmaken"
|
msgstr "Nieuwe sleutel aanmaken"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:327
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Maak nieuw label"
|
msgstr "Maak nieuw label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:327
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Maak nieuwe lijst"
|
msgstr "Maak nieuwe lijst"
|
||||||
|
|
||||||
#: src/components/WorkspaceMenu.tsx:85
|
#: src/components/WorkspaceMenu.tsx:116
|
||||||
#: src/components/NewWorkspaceForm.tsx:91
|
#: src/components/NewWorkspaceForm.tsx:93
|
||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Werkruimte maken"
|
msgstr "Werkruimte maken"
|
||||||
|
|
||||||
@@ -414,18 +416,19 @@ msgstr "Aangepaste URL's zijn een premium functie. Je wordt doorgestuurd om je a
|
|||||||
msgid "Customer Support"
|
msgid "Customer Support"
|
||||||
msgstr "Klantenservice"
|
msgstr "Klantenservice"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:112
|
#: src/components/UserMenu.tsx:153
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Donker"
|
msgstr "Donker"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:226
|
#: src/components/LabelForm.tsx:226
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Verwijderen"
|
msgstr "Verwijderen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:260
|
#: src/views/settings/index.tsx:288
|
||||||
#: src/views/settings/index.tsx:270
|
#: src/views/settings/index.tsx:298
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
|
||||||
msgid "Delete account"
|
msgid "Delete account"
|
||||||
msgstr "Account verwijderen"
|
msgstr "Account verwijderen"
|
||||||
@@ -446,8 +449,8 @@ msgstr "Reactie verwijderen"
|
|||||||
msgid "Delete list"
|
msgid "Delete list"
|
||||||
msgstr "Lijst verwijderen"
|
msgstr "Lijst verwijderen"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:242
|
#: src/views/settings/index.tsx:270
|
||||||
#: src/views/settings/index.tsx:253
|
#: src/views/settings/index.tsx:281
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
|
||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Werkruimte verwijderen"
|
msgstr "Werkruimte verwijderen"
|
||||||
@@ -456,7 +459,7 @@ msgstr "Werkruimte verwijderen"
|
|||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Ontwerp"
|
msgstr "Ontwerp"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:220
|
#: src/views/settings/index.tsx:248
|
||||||
msgid "Disconnect Trello"
|
msgid "Disconnect Trello"
|
||||||
msgstr "Trello ontkoppelen"
|
msgstr "Trello ontkoppelen"
|
||||||
|
|
||||||
@@ -464,7 +467,7 @@ msgstr "Trello ontkoppelen"
|
|||||||
msgid "Discuss and collaborate on cards."
|
msgid "Discuss and collaborate on cards."
|
||||||
msgstr "Bespreek en werk samen aan kaarten."
|
msgstr "Bespreek en werk samen aan kaarten."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:123
|
#: src/views/settings/index.tsx:149
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr "Weergavenaam"
|
msgstr "Weergavenaam"
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ msgstr "Weergavenaam bijgewerkt"
|
|||||||
msgid "Do you offer a free plan?"
|
msgid "Do you offer a free plan?"
|
||||||
msgstr "Bieden jullie een gratis abonnement aan?"
|
msgstr "Bieden jullie een gratis abonnement aan?"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:130
|
#: src/components/FeedbackModal.tsx:109
|
||||||
msgid "docs"
|
msgid "docs"
|
||||||
msgstr "docs"
|
msgstr "docs"
|
||||||
|
|
||||||
@@ -494,6 +497,7 @@ msgstr "Docs"
|
|||||||
|
|
||||||
#: src/views/home/components/Footer.tsx:77
|
#: src/views/home/components/Footer.tsx:77
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:23
|
#: src/views/boards/components/TemplateBoards.tsx:23
|
||||||
|
#: src/components/UserMenu.tsx:191
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
msgstr "Documentatie"
|
msgstr "Documentatie"
|
||||||
|
|
||||||
@@ -521,15 +525,19 @@ msgstr "Reactie bewerken"
|
|||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Label bewerken"
|
msgstr "Label bewerken"
|
||||||
|
|
||||||
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
|
||||||
|
msgid "Edit workspace URL"
|
||||||
|
msgstr "Werkruimte-URL bewerken"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:31
|
#: src/views/boards/components/TemplateBoards.tsx:31
|
||||||
msgid "Editing"
|
msgid "Editing"
|
||||||
msgstr "Bewerken"
|
msgstr "Bewerken"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:336
|
#: src/components/AuthForm.tsx:337
|
||||||
msgid "email"
|
msgid "email"
|
||||||
msgstr "e-mail"
|
msgstr "e-mail"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:99
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
@@ -537,15 +545,15 @@ msgstr "E-mail"
|
|||||||
msgid "Enhancement"
|
msgid "Enhancement"
|
||||||
msgstr "Verbetering"
|
msgstr "Verbetering"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:301
|
#: src/components/AuthForm.tsx:302
|
||||||
msgid "Enter your email address"
|
msgid "Enter your email address"
|
||||||
msgstr "Voer je e-mailadres in"
|
msgstr "Voer je e-mailadres in"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:289
|
#: src/components/AuthForm.tsx:290
|
||||||
msgid "Enter your name"
|
msgid "Enter your name"
|
||||||
msgstr "Voer je naam in"
|
msgstr "Voer je naam in"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:314
|
#: src/components/AuthForm.tsx:315
|
||||||
msgid "Enter your password"
|
msgid "Enter your password"
|
||||||
msgstr "Voer je wachtwoord in"
|
msgstr "Voer je wachtwoord in"
|
||||||
|
|
||||||
@@ -553,19 +561,28 @@ msgstr "Voer je wachtwoord in"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Fout bij verwijderen account"
|
msgstr "Fout bij verwijderen account"
|
||||||
|
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
|
msgid "Error deleting label"
|
||||||
|
msgstr "Fout bij het verwijderen van label"
|
||||||
|
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
|
||||||
msgid "Error deleting workspace"
|
msgid "Error deleting workspace"
|
||||||
msgstr "Fout bij verwijderen werkruimte"
|
msgstr "Fout bij verwijderen werkruimte"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:76
|
#: src/views/settings/index.tsx:99
|
||||||
msgid "Error disconnecting Trello"
|
msgid "Error disconnecting Trello"
|
||||||
msgstr "Fout bij ontkoppelen van Trello"
|
msgstr "Fout bij ontkoppelen van Trello"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:57
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:63
|
||||||
|
msgid "Error inviting member"
|
||||||
|
msgstr "Fout bij het uitnodigen van lid"
|
||||||
|
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
|
||||||
msgid "Error updating display name"
|
msgid "Error updating display name"
|
||||||
msgstr "Fout bij bijwerken weergavenaam"
|
msgstr "Fout bij bijwerken weergavenaam"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:37
|
#: src/views/settings/components/Avatar.tsx:39
|
||||||
msgid "Error updating profile image"
|
msgid "Error updating profile image"
|
||||||
msgstr "Fout bij het bijwerken van profielafbeelding"
|
msgstr "Fout bij het bijwerken van profielafbeelding"
|
||||||
|
|
||||||
@@ -581,8 +598,8 @@ msgstr "Fout bij bijwerken naam werkruimte"
|
|||||||
msgid "Error updating workspace URL"
|
msgid "Error updating workspace URL"
|
||||||
msgstr "Fout bij het bijwerken van werkruimte-URL"
|
msgstr "Fout bij het bijwerken van werkruimte-URL"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:54
|
#: src/views/settings/components/Avatar.tsx:56
|
||||||
#: src/views/settings/components/Avatar.tsx:95
|
#: src/views/settings/components/Avatar.tsx:97
|
||||||
msgid "Error uploading profile image"
|
msgid "Error uploading profile image"
|
||||||
msgstr "Fout bij het uploaden van profielafbeelding"
|
msgstr "Fout bij het uploaden van profielafbeelding"
|
||||||
|
|
||||||
@@ -622,11 +639,12 @@ msgstr "Functieverzoek"
|
|||||||
msgid "Features"
|
msgid "Features"
|
||||||
msgstr "Functies"
|
msgstr "Functies"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:78
|
#: src/components/UserMenu.tsx:199
|
||||||
|
#: src/components/FeedbackModal.tsx:59
|
||||||
msgid "Feedback"
|
msgid "Feedback"
|
||||||
msgstr "Feedback"
|
msgstr "Feedback"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:38
|
#: src/components/FeedbackModal.tsx:33
|
||||||
msgid "Feedback sent"
|
msgid "Feedback sent"
|
||||||
msgstr "Feedback verzonden"
|
msgstr "Feedback verzonden"
|
||||||
|
|
||||||
@@ -642,6 +660,7 @@ 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."
|
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."
|
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
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -674,7 +693,7 @@ msgstr "Aan de slag"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Begin door een nieuw bord te maken"
|
msgstr "Begin door een nieuw bord te maken"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:319
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Begin door een nieuwe lijst te maken"
|
msgstr "Begin door een nieuwe lijst te maken"
|
||||||
|
|
||||||
@@ -747,11 +766,11 @@ msgstr "Ik bevestig dat alle gegevens van de werkruimte permanent worden verwijd
|
|||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr "Ideeën"
|
msgstr "Ideeën"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:98
|
#: src/components/FeedbackModal.tsx:75
|
||||||
msgid "Ideas to improve this page..."
|
msgid "Ideas to improve this page..."
|
||||||
msgstr "Ideeën om deze pagina te verbeteren..."
|
msgstr "Ideeën om deze pagina te verbeteren..."
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:39
|
#: src/views/boards/index.tsx:38
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importeren"
|
msgstr "Importeren"
|
||||||
|
|
||||||
@@ -797,11 +816,19 @@ msgstr "Integraties"
|
|||||||
msgid "Interviewing"
|
msgid "Interviewing"
|
||||||
msgstr "Interviewen"
|
msgstr "Interviewen"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:156
|
#: src/views/members/components/InviteMemberForm.tsx:26
|
||||||
|
msgid "Invalid email address"
|
||||||
|
msgstr "Ongeldig e-mailadres"
|
||||||
|
|
||||||
|
#: src/views/members/index.tsx:169
|
||||||
msgid "Invite"
|
msgid "Invite"
|
||||||
msgstr "Uitnodigen"
|
msgstr "Uitnodigen"
|
||||||
|
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:82
|
#: src/views/members/components/InviteMemberForm.tsx:113
|
||||||
|
msgid "Invite another"
|
||||||
|
msgstr "Nog iemand uitnodigen"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:123
|
||||||
#: src/views/card/components/MemberSelector.tsx:112
|
#: src/views/card/components/MemberSelector.tsx:112
|
||||||
msgid "Invite member"
|
msgid "Invite member"
|
||||||
msgstr "Lid uitnodigen"
|
msgstr "Lid uitnodigen"
|
||||||
@@ -823,8 +850,8 @@ msgstr "Kanban opnieuw uitgevonden"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
|
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:243
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:331
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -833,7 +860,7 @@ msgstr "Labels"
|
|||||||
msgid "Labels & Filters"
|
msgid "Labels & Filters"
|
||||||
msgstr "Labels & filters"
|
msgstr "Labels & filters"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:157
|
#: src/views/settings/index.tsx:185
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Taal"
|
msgstr "Taal"
|
||||||
|
|
||||||
@@ -849,15 +876,15 @@ msgstr "Juridisch"
|
|||||||
msgid "License"
|
msgid "License"
|
||||||
msgstr "Licentie"
|
msgstr "Licentie"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:126
|
#: src/components/UserMenu.tsx:167
|
||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Licht"
|
msgstr "Licht"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:51
|
#: src/views/public/board/index.tsx:57
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link gekopieerd"
|
msgstr "Link gekopieerd"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:235
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lijst"
|
msgstr "Lijst"
|
||||||
|
|
||||||
@@ -869,7 +896,7 @@ msgstr "Lijstnaam"
|
|||||||
msgid "Login | kan.bn"
|
msgid "Login | kan.bn"
|
||||||
msgstr "Login | kan.bn"
|
msgstr "Login | kan.bn"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:136
|
#: src/components/UserMenu.tsx:209
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Uitloggen"
|
msgstr "Uitloggen"
|
||||||
|
|
||||||
@@ -881,7 +908,7 @@ msgstr "Lange termijn"
|
|||||||
msgid "Low Priority"
|
msgid "Low Priority"
|
||||||
msgstr "Lage prioriteit"
|
msgstr "Lage prioriteit"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:337
|
#: src/components/AuthForm.tsx:338
|
||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "magische link"
|
msgstr "magische link"
|
||||||
|
|
||||||
@@ -889,16 +916,16 @@ msgstr "magische link"
|
|||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Gemiddelde prioriteit"
|
msgstr "Gemiddelde prioriteit"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:148
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:251
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:44
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr "Leden"
|
msgstr "Leden"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/members/index.tsx:144
|
#: src/views/members/index.tsx:157
|
||||||
msgid "Members | {0}"
|
msgid "Members | {0}"
|
||||||
msgstr "Leden | {0}"
|
msgstr "Leden | {0}"
|
||||||
|
|
||||||
@@ -919,11 +946,11 @@ msgstr "heeft de kaart naar een andere lijst verplaatst"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Naam"
|
msgstr "Naam"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:116
|
#: src/components/FeedbackModal.tsx:95
|
||||||
msgid "Need help?"
|
msgid "Need help?"
|
||||||
msgstr "Hulp nodig?"
|
msgstr "Hulp nodig?"
|
||||||
|
|
||||||
#: src/views/boards/index.tsx:52
|
#: src/views/boards/index.tsx:48
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr "Nieuw"
|
msgstr "Nieuw"
|
||||||
|
|
||||||
@@ -931,7 +958,7 @@ msgstr "Nieuw"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nieuw bord"
|
msgstr "Nieuw bord"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:237
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nieuwe kaart"
|
msgstr "Nieuwe kaart"
|
||||||
|
|
||||||
@@ -943,7 +970,7 @@ msgstr "Nieuwe import"
|
|||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nieuw label"
|
msgstr "Nieuw label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:296
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nieuwe lijst"
|
msgstr "Nieuwe lijst"
|
||||||
@@ -952,7 +979,7 @@ msgstr "Nieuwe lijst"
|
|||||||
msgid "New Ticket"
|
msgid "New Ticket"
|
||||||
msgstr "Nieuw ticket"
|
msgstr "Nieuw ticket"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:62
|
#: src/components/NewWorkspaceForm.tsx:64
|
||||||
msgid "New workspace"
|
msgid "New workspace"
|
||||||
msgstr "Nieuwe werkruimte"
|
msgstr "Nieuwe werkruimte"
|
||||||
|
|
||||||
@@ -976,7 +1003,7 @@ msgstr "Geen borden gevonden"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Geen creditcard vereist"
|
msgstr "Geen creditcard vereist"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:316
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Geen lijsten"
|
msgstr "Geen lijsten"
|
||||||
|
|
||||||
@@ -988,15 +1015,15 @@ msgstr "Aanbod"
|
|||||||
msgid "Onboarding"
|
msgid "Onboarding"
|
||||||
msgstr "Inwerktraject"
|
msgstr "Inwerktraject"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:263
|
#: src/views/settings/index.tsx:291
|
||||||
msgid "Once you delete your account, there is no going back. This action cannot be undone."
|
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."
|
msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:245
|
#: src/views/settings/index.tsx:273
|
||||||
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
|
||||||
msgstr "Zodra je je werkruimte verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
|
msgstr "Zodra je je werkruimte verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:279
|
#: src/components/AuthForm.tsx:280
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "of"
|
msgstr "of"
|
||||||
|
|
||||||
@@ -1016,7 +1043,7 @@ msgstr "Deeltijd"
|
|||||||
msgid "Payment frequency"
|
msgid "Payment frequency"
|
||||||
msgstr "Betalingsfrequentie"
|
msgstr "Betalingsfrequentie"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:107
|
#: src/views/members/index.tsx:118
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr "In behandeling"
|
msgstr "In behandeling"
|
||||||
|
|
||||||
@@ -1033,19 +1060,19 @@ msgstr "Persoonlijk project"
|
|||||||
msgid "Planning"
|
msgid "Planning"
|
||||||
msgstr "Planning"
|
msgstr "Planning"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:305
|
#: src/components/AuthForm.tsx:306
|
||||||
msgid "Please enter a valid email address"
|
msgid "Please enter a valid email address"
|
||||||
msgstr "Voer een geldig e-mailadres in"
|
msgstr "Voer een geldig e-mailadres in"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:293
|
#: src/components/AuthForm.tsx:294
|
||||||
msgid "Please enter a valid name"
|
msgid "Please enter a valid name"
|
||||||
msgstr "Voer een geldige naam in"
|
msgstr "Voer een geldige naam in"
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:318
|
#: src/components/AuthForm.tsx:319
|
||||||
msgid "Please enter a valid password"
|
msgid "Please enter a valid password"
|
||||||
msgstr "Voer een geldig wachtwoord in"
|
msgstr "Voer een geldig wachtwoord in"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:55
|
#: src/views/settings/components/Avatar.tsx:57
|
||||||
msgid "Please select a file to upload."
|
msgid "Please select a file to upload."
|
||||||
msgstr "Selecteer een bestand om te uploaden."
|
msgstr "Selecteer een bestand om te uploaden."
|
||||||
|
|
||||||
@@ -1055,10 +1082,11 @@ msgstr "Selecteer een bestand om te uploaden."
|
|||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
|
||||||
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
|
||||||
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:38
|
#: src/views/settings/components/Avatar.tsx:40
|
||||||
#: src/views/settings/components/Avatar.tsx:96
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:116
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
@@ -1067,14 +1095,15 @@ msgstr "Selecteer een bestand om te uploaden."
|
|||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:62
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:128
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:39
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackButton.tsx:46
|
#: src/components/FeedbackModal.tsx:41
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
|
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
|
||||||
|
|
||||||
@@ -1096,11 +1125,11 @@ msgstr "Privacybeleid"
|
|||||||
msgid "Private"
|
msgid "Private"
|
||||||
msgstr "Privé"
|
msgstr "Privé"
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:24
|
#: src/views/settings/components/Avatar.tsx:26
|
||||||
msgid "Profile image updated"
|
msgid "Profile image updated"
|
||||||
msgstr "Profielafbeelding bijgewerkt"
|
msgstr "Profielafbeelding bijgewerkt"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:118
|
#: src/views/settings/index.tsx:144
|
||||||
msgid "Profile picture"
|
msgid "Profile picture"
|
||||||
msgstr "Profielfoto"
|
msgstr "Profielfoto"
|
||||||
|
|
||||||
@@ -1136,7 +1165,7 @@ msgstr "Op afstand"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Verwijderen"
|
msgstr "Verwijderen"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:120
|
#: src/views/members/index.tsx:132
|
||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Lid verwijderen"
|
msgstr "Lid verwijderen"
|
||||||
|
|
||||||
@@ -1177,7 +1206,7 @@ msgstr "Intrekken"
|
|||||||
msgid "Roadmap"
|
msgid "Roadmap"
|
||||||
msgstr "Roadmap"
|
msgstr "Roadmap"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:178
|
#: src/views/members/index.tsx:191
|
||||||
msgid "Role"
|
msgid "Role"
|
||||||
msgstr "Rol"
|
msgstr "Rol"
|
||||||
|
|
||||||
@@ -1217,21 +1246,21 @@ msgstr "Zelf hosten met Github"
|
|||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "heeft de kaart aan zichzelf toegewezen"
|
msgstr "heeft de kaart aan zichzelf toegewezen"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:137
|
#: src/components/FeedbackModal.tsx:116
|
||||||
msgid "Send"
|
msgid "Send feedback"
|
||||||
msgstr "Versturen"
|
msgstr "Feedback versturen"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:69
|
#: src/views/boards/components/TemplateBoards.tsx:69
|
||||||
msgid "Senior"
|
msgid "Senior"
|
||||||
msgstr "Senior"
|
msgstr "Senior"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:112
|
#: src/views/settings/index.tsx:138
|
||||||
#: src/components/SideNavigation.tsx:49
|
#: src/components/SideNavigation.tsx:78
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Instellingen"
|
msgstr "Instellingen"
|
||||||
|
|
||||||
#. placeholder {0}: workspace.name ?? "Workspace"
|
#. placeholder {0}: workspace.name ?? "Workspace"
|
||||||
#: src/views/settings/index.tsx:108
|
#: src/views/settings/index.tsx:134
|
||||||
msgid "Settings | {0}"
|
msgid "Settings | {0}"
|
||||||
msgstr "Instellingen | {0}"
|
msgstr "Instellingen | {0}"
|
||||||
|
|
||||||
@@ -1253,7 +1282,7 @@ msgstr "Registreren uitgeschakeld"
|
|||||||
msgid "Sign up is currently disabled. Please try again later."
|
msgid "Sign up is currently disabled. Please try again later."
|
||||||
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
|
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
|
||||||
|
|
||||||
#: src/components/AuthForm.tsx:334
|
#: src/components/AuthForm.tsx:335
|
||||||
msgid "Sign up with "
|
msgid "Sign up with "
|
||||||
msgstr "Registreren met "
|
msgstr "Registreren met "
|
||||||
|
|
||||||
@@ -1282,11 +1311,15 @@ msgstr "Star op Github"
|
|||||||
msgid "Success"
|
msgid "Success"
|
||||||
msgstr "Geslaagd"
|
msgstr "Geslaagd"
|
||||||
|
|
||||||
|
#: src/components/UserMenu.tsx:180
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Ondersteuning"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:57
|
#: src/views/home/components/Pricing.tsx:57
|
||||||
msgid "Support the development of the project"
|
msgid "Support the development of the project"
|
||||||
msgstr "Ondersteun de ontwikkeling van het project"
|
msgstr "Ondersteun de ontwikkeling van het project"
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:98
|
#: src/components/UserMenu.tsx:139
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Systeem"
|
msgstr "Systeem"
|
||||||
|
|
||||||
@@ -1302,7 +1335,7 @@ msgstr "Sjablonen"
|
|||||||
msgid "Terms of service"
|
msgid "Terms of service"
|
||||||
msgstr "Servicevoorwaarden"
|
msgstr "Servicevoorwaarden"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:39
|
#: src/components/FeedbackModal.tsx:34
|
||||||
msgid "Thank you for your feedback!"
|
msgid "Thank you for your feedback!"
|
||||||
msgstr "Bedankt voor je feedback!"
|
msgstr "Bedankt voor je feedback!"
|
||||||
|
|
||||||
@@ -1319,7 +1352,7 @@ msgstr "Het open source <0/> alternatief voor Trello"
|
|||||||
msgid "The visibility of your board has been set to {0}."
|
msgid "The visibility of your board has been set to {0}."
|
||||||
msgstr "De zichtbaarheid van je bord is ingesteld op {0}."
|
msgstr "De zichtbaarheid van je bord is ingesteld op {0}."
|
||||||
|
|
||||||
#: src/components/UserMenu.tsx:85
|
#: src/components/UserMenu.tsx:126
|
||||||
msgid "Theme"
|
msgid "Theme"
|
||||||
msgstr "Thema"
|
msgstr "Thema"
|
||||||
|
|
||||||
@@ -1329,9 +1362,14 @@ msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
|
|||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Deze actie kan niet ongedaan worden gemaakt."
|
msgstr "Deze actie kan niet ongedaan worden gemaakt."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:140
|
||||||
|
msgid "This board is private or does not exist"
|
||||||
|
msgstr "Dit bord is privé of bestaat niet"
|
||||||
|
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
|
||||||
msgid "This board URL has already been taken"
|
msgid "This board URL has already been taken"
|
||||||
msgstr "Deze board URL is al in gebruik"
|
msgstr "Deze board URL is al in gebruik"
|
||||||
@@ -1361,7 +1399,7 @@ msgstr "Menu in-/uitschakelen"
|
|||||||
msgid "Track all card changes with detailed activity history."
|
msgid "Track all card changes with detailed activity history."
|
||||||
msgstr "Volg alle kaartwijzigingen met gedetailleerde activiteitengeschiedenis."
|
msgstr "Volg alle kaartwijzigingen met gedetailleerde activiteitengeschiedenis."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:69
|
#: src/views/settings/index.tsx:92
|
||||||
msgid "Trello disconnected"
|
msgid "Trello disconnected"
|
||||||
msgstr "Trello ontkoppeld"
|
msgstr "Trello ontkoppeld"
|
||||||
|
|
||||||
@@ -1377,7 +1415,7 @@ msgstr "Triage"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kan geen reactie toevoegen"
|
msgstr "Kan geen reactie toevoegen"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:125
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Kan kaart niet aanmaken"
|
msgstr "Kan kaart niet aanmaken"
|
||||||
|
|
||||||
@@ -1385,7 +1423,7 @@ msgstr "Kan kaart niet aanmaken"
|
|||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Kan geen lijst maken"
|
msgstr "Kan geen lijst maken"
|
||||||
|
|
||||||
#: src/components/NewWorkspaceForm.tsx:38
|
#: src/components/NewWorkspaceForm.tsx:40
|
||||||
msgid "Unable to create workspace"
|
msgid "Unable to create workspace"
|
||||||
msgstr "Kan werkruimte niet aanmaken"
|
msgstr "Kan werkruimte niet aanmaken"
|
||||||
|
|
||||||
@@ -1401,7 +1439,7 @@ msgstr "Kan opmerking niet verwijderen"
|
|||||||
msgid "Unable to remove member"
|
msgid "Unable to remove member"
|
||||||
msgstr "Kan lid niet verwijderen"
|
msgstr "Kan lid niet verwijderen"
|
||||||
|
|
||||||
#: src/components/FeedbackButton.tsx:45
|
#: src/components/FeedbackModal.tsx:40
|
||||||
msgid "Unable to send feedback"
|
msgid "Unable to send feedback"
|
||||||
msgstr "Feedback kon niet worden verzonden"
|
msgstr "Feedback kon niet worden verzonden"
|
||||||
|
|
||||||
@@ -1413,8 +1451,8 @@ msgstr "Kan board URL niet bijwerken"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:115
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:188
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Kan kaart niet bijwerken"
|
msgstr "Kan kaart niet bijwerken"
|
||||||
|
|
||||||
@@ -1427,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Kan labels niet bijwerken"
|
msgstr "Kan labels niet bijwerken"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:132
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Kan lijst niet bijwerken"
|
msgstr "Kan lijst niet bijwerken"
|
||||||
|
|
||||||
@@ -1471,11 +1509,11 @@ msgstr "Onbeperkt aantal lijsten"
|
|||||||
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
|
||||||
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
|
||||||
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Bijwerken"
|
msgstr "Bijwerken"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:233
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Label bijwerken"
|
msgstr "Label bijwerken"
|
||||||
|
|
||||||
@@ -1516,19 +1554,23 @@ msgstr "URL moet minimaal 3 tekens lang zijn"
|
|||||||
msgid "Use template"
|
msgid "Use template"
|
||||||
msgstr "Sjabloon gebruiken"
|
msgstr "Sjabloon gebruiken"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:172
|
#: src/views/members/index.tsx:185
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Gebruiker"
|
msgstr "Gebruiker"
|
||||||
|
|
||||||
|
#: src/views/members/components/InviteMemberForm.tsx:58
|
||||||
|
msgid "User is already a member of this workspace"
|
||||||
|
msgstr "Gebruiker is al lid van deze werkruimte"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:37
|
#: src/views/boards/components/TemplateBoards.tsx:37
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:232
|
#: src/views/settings/index.tsx:260
|
||||||
msgid "View and manage your API keys."
|
msgid "View and manage your API keys."
|
||||||
msgstr "Bekijk en beheer je API-sleutels."
|
msgstr "Bekijk en beheer je API-sleutels."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:171
|
#: src/views/settings/index.tsx:199
|
||||||
msgid "View and manage your billing and subscription."
|
msgid "View and manage your billing and subscription."
|
||||||
msgstr "Bekijk en beheer je facturering en abonnement."
|
msgstr "Bekijk en beheer je facturering en abonnement."
|
||||||
|
|
||||||
@@ -1540,6 +1582,10 @@ msgstr "Bekijk documentatie"
|
|||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Bekijk onze roadmap."
|
msgstr "Bekijk onze roadmap."
|
||||||
|
|
||||||
|
#: src/views/public/board/index.tsx:143
|
||||||
|
msgid "View workspace"
|
||||||
|
msgstr "Werkruimte bekijken"
|
||||||
|
|
||||||
#: src/views/board/components/VisibilityButton.tsx:91
|
#: src/views/board/components/VisibilityButton.tsx:91
|
||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Zichtbaarheid"
|
msgstr "Zichtbaarheid"
|
||||||
@@ -1572,7 +1618,7 @@ msgstr "Toen Trello in 2011 werd gelanceerd, blies het iedereen omver met zijn z
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Waarom een open source Trello maken?"
|
msgstr "Waarom een open source Trello maken?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:239
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Werkruimte"
|
msgstr "Werkruimte"
|
||||||
|
|
||||||
@@ -1580,7 +1626,7 @@ msgstr "Werkruimte"
|
|||||||
msgid "Workspace deleted"
|
msgid "Workspace deleted"
|
||||||
msgstr "Werkruimte verwijderd"
|
msgstr "Werkruimte verwijderd"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:147
|
#: src/views/settings/index.tsx:175
|
||||||
msgid "Workspace description"
|
msgid "Workspace description"
|
||||||
msgstr "Werkruimte beschrijving"
|
msgstr "Werkruimte beschrijving"
|
||||||
|
|
||||||
@@ -1601,8 +1647,8 @@ msgstr "Werkruimtebeschrijving bijgewerkt"
|
|||||||
msgid "Workspace members"
|
msgid "Workspace members"
|
||||||
msgstr "Werkruimteleden"
|
msgstr "Werkruimteleden"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:130
|
#: src/views/settings/index.tsx:156
|
||||||
#: src/components/NewWorkspaceForm.tsx:78
|
#: src/components/NewWorkspaceForm.tsx:80
|
||||||
msgid "Workspace name"
|
msgid "Workspace name"
|
||||||
msgstr "Naam werkruimte"
|
msgstr "Naam werkruimte"
|
||||||
|
|
||||||
@@ -1622,7 +1668,7 @@ msgstr "Werkruimtenaam bijgewerkt"
|
|||||||
msgid "Workspace slug updated"
|
msgid "Workspace slug updated"
|
||||||
msgstr "Werkruimte-slug bijgewerkt"
|
msgstr "Werkruimte-slug bijgewerkt"
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:138
|
#: src/views/settings/index.tsx:165
|
||||||
msgid "Workspace URL"
|
msgid "Workspace URL"
|
||||||
msgstr "Werkruimte URL"
|
msgstr "Werkruimte URL"
|
||||||
|
|
||||||
@@ -1670,15 +1716,15 @@ msgstr "Je borden zijn geïmporteerd."
|
|||||||
msgid "Your display name has been updated."
|
msgid "Your display name has been updated."
|
||||||
msgstr "Je weergavenaam is bijgewerkt."
|
msgstr "Je weergavenaam is bijgewerkt."
|
||||||
|
|
||||||
#: src/views/settings/components/Avatar.tsx:25
|
#: src/views/settings/components/Avatar.tsx:27
|
||||||
msgid "Your profile image has been updated."
|
msgid "Your profile image has been updated."
|
||||||
msgstr "Je profielafbeelding is bijgewerkt."
|
msgstr "Je profielafbeelding is bijgewerkt."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:70
|
#: src/views/settings/index.tsx:93
|
||||||
msgid "Your Trello account has been disconnected."
|
msgid "Your Trello account has been disconnected."
|
||||||
msgstr "Je Trello-account is ontkoppeld."
|
msgstr "Je Trello-account is ontkoppeld."
|
||||||
|
|
||||||
#: src/views/settings/index.tsx:214
|
#: src/views/settings/index.tsx:242
|
||||||
msgid "Your Trello account is connected."
|
msgid "Your Trello account is connected."
|
||||||
msgstr "Je Trello-account is verbonden."
|
msgstr "Je Trello-account is verbonden."
|
||||||
|
|
||||||
|
|||||||
18
apps/web/src/middleware.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import type { NextRequest } from "next/server";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { env } from "next-runtime-env";
|
||||||
|
|
||||||
|
export function middleware(request: NextRequest) {
|
||||||
|
if (request.nextUrl.pathname === "/") {
|
||||||
|
if (env("NEXT_PUBLIC_KAN_ENV") !== "cloud") {
|
||||||
|
const loginUrl = new URL("/login", request.url);
|
||||||
|
return NextResponse.redirect(loginUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
matcher: ["/"],
|
||||||
|
};
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
import "~/styles/globals.css";
|
import "~/styles/globals.css";
|
||||||
import "~/utils/i18n";
|
import "~/utils/i18n";
|
||||||
|
|
||||||
import type { AppType } from "next/app";
|
import type { NextPage, Viewport } from "next";
|
||||||
import { Viewport } from "next";
|
import type { AppProps, AppType } from "next/app";
|
||||||
|
import type { ReactElement, ReactNode } from "react";
|
||||||
import { Plus_Jakarta_Sans } from "next/font/google";
|
import { Plus_Jakarta_Sans } from "next/font/google";
|
||||||
import Script from "next/script";
|
import Script from "next/script";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
@@ -34,7 +35,15 @@ export const viewport: Viewport = {
|
|||||||
userScalable: false,
|
userScalable: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const MyApp: AppType = ({ Component, pageProps }) => {
|
export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
|
||||||
|
getLayout?: (page: ReactElement) => ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
type AppPropsWithLayout = AppProps & {
|
||||||
|
Component: NextPageWithLayout;
|
||||||
|
};
|
||||||
|
|
||||||
|
const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
||||||
const posthogKey = env("NEXT_PUBLIC_POSTHOG_KEY");
|
const posthogKey = env("NEXT_PUBLIC_POSTHOG_KEY");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -50,6 +59,8 @@ const MyApp: AppType = ({ Component, pageProps }) => {
|
|||||||
}
|
}
|
||||||
}, [posthogKey]);
|
}, [posthogKey]);
|
||||||
|
|
||||||
|
const getLayout = Component.getLayout ?? ((page) => page);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<style jsx global>{`
|
<style jsx global>{`
|
||||||
@@ -75,10 +86,10 @@ const MyApp: AppType = ({ Component, pageProps }) => {
|
|||||||
<PopupProvider>
|
<PopupProvider>
|
||||||
{posthogKey ? (
|
{posthogKey ? (
|
||||||
<PostHogProvider client={posthog}>
|
<PostHogProvider client={posthog}>
|
||||||
<Component {...pageProps} />
|
{getLayout(<Component {...pageProps} />)}
|
||||||
</PostHogProvider>
|
</PostHogProvider>
|
||||||
) : (
|
) : (
|
||||||
<Component {...pageProps} />
|
getLayout(<Component {...pageProps} />)
|
||||||
)}
|
)}
|
||||||
</PopupProvider>
|
</PopupProvider>
|
||||||
</ModalProvider>
|
</ModalProvider>
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export default async function handler(
|
|||||||
const client = new S3Client({
|
const client = new S3Client({
|
||||||
region: env.S3_REGION ?? "",
|
region: env.S3_REGION ?? "",
|
||||||
endpoint: env.S3_ENDPOINT ?? "",
|
endpoint: env.S3_ENDPOINT ?? "",
|
||||||
|
forcePathStyle: env.S3_FORCE_PATH_STYLE === "true",
|
||||||
credentials: {
|
credentials: {
|
||||||
accessKeyId: env.S3_ACCESS_KEY_ID ?? "",
|
accessKeyId: env.S3_ACCESS_KEY_ID ?? "",
|
||||||
secretAccessKey: env.S3_SECRET_ACCESS_KEY ?? "",
|
secretAccessKey: env.S3_SECRET_ACCESS_KEY ?? "",
|
||||||
@@ -58,6 +59,7 @@ export default async function handler(
|
|||||||
new PutObjectCommand({
|
new PutObjectCommand({
|
||||||
Bucket: nextRuntimeEnv("NEXT_PUBLIC_AVATAR_BUCKET_NAME") ?? "",
|
Bucket: nextRuntimeEnv("NEXT_PUBLIC_AVATAR_BUCKET_NAME") ?? "",
|
||||||
Key: filename,
|
Key: filename,
|
||||||
|
ACL: "public-read",
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { type NextApiRequest, type NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
|
||||||
import { openApiDocument } from "@kan/api/openapi";
|
import { openApiDocument } from "@kan/api/openapi";
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { WorkspaceProvider } from "~/providers/workspace";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
import Dashboard from "~/components/Dashboard";
|
import { getDashboardLayout } from "~/components/Dashboard";
|
||||||
import Popup from "~/components/Popup";
|
import Popup from "~/components/Popup";
|
||||||
import BoardView from "~/views/board";
|
import BoardView from "~/views/board";
|
||||||
|
|
||||||
export default function BoardPage() {
|
const BoardPage: NextPageWithLayout = () => {
|
||||||
return (
|
return (
|
||||||
<WorkspaceProvider>
|
<>
|
||||||
<Dashboard>
|
<BoardView />
|
||||||
<BoardView />
|
|
||||||
</Dashboard>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</WorkspaceProvider>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
BoardPage.getLayout = (page) => getDashboardLayout(page);
|
||||||
|
|
||||||
|
export default BoardPage;
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { WorkspaceProvider } from "~/providers/workspace";
|
import type { NextPageWithLayout } from "../_app";
|
||||||
import Dashboard from "~/components/Dashboard";
|
import { getDashboardLayout } from "~/components/Dashboard";
|
||||||
import Popup from "~/components/Popup";
|
import Popup from "~/components/Popup";
|
||||||
import BoardsView from "~/views/boards";
|
import BoardsView from "~/views/boards";
|
||||||
|
|
||||||
export default function BoardsPage() {
|
const BoardsPage: NextPageWithLayout = () => {
|
||||||
return (
|
return (
|
||||||
<WorkspaceProvider>
|
<>
|
||||||
<Dashboard>
|
<BoardsView />
|
||||||
<BoardsView />
|
|
||||||
</Dashboard>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</WorkspaceProvider>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
BoardsPage.getLayout = (page) => getDashboardLayout(page);
|
||||||
|
|
||||||
|
export default BoardsPage;
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
import Dashboard from "~/components/Dashboard";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
|
import { getDashboardLayout } from "~/components/Dashboard";
|
||||||
import Popup from "~/components/Popup";
|
import Popup from "~/components/Popup";
|
||||||
import { WorkspaceProvider } from "~/providers/workspace";
|
|
||||||
import CardView, { CardRightPanel } from "~/views/card";
|
import CardView, { CardRightPanel } from "~/views/card";
|
||||||
|
|
||||||
export default function CardPage() {
|
const CardPage: NextPageWithLayout = () => {
|
||||||
return (
|
return (
|
||||||
<WorkspaceProvider>
|
<>
|
||||||
<Dashboard hasRightPanel rightPanel={<CardRightPanel />}>
|
<CardView />
|
||||||
<CardView />
|
|
||||||
</Dashboard>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</WorkspaceProvider>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
CardPage.getLayout = (page) =>
|
||||||
|
getDashboardLayout(page, <CardRightPanel />, true);
|
||||||
|
|
||||||
|
export default CardPage;
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { WorkspaceProvider } from "~/providers/workspace";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
import Dashboard from "~/components/Dashboard";
|
import { getDashboardLayout } from "~/components/Dashboard";
|
||||||
import Popup from "~/components/Popup";
|
import Popup from "~/components/Popup";
|
||||||
import MembersView from "~/views/members";
|
import MembersView from "~/views/members";
|
||||||
|
|
||||||
export default function MembersPage() {
|
const MembersPage: NextPageWithLayout = () => {
|
||||||
return (
|
return (
|
||||||
<WorkspaceProvider>
|
<>
|
||||||
<Dashboard>
|
<MembersView />
|
||||||
<MembersView />
|
|
||||||
</Dashboard>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</WorkspaceProvider>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
MembersPage.getLayout = (page) => getDashboardLayout(page);
|
||||||
|
|
||||||
|
export default MembersPage;
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { WorkspaceProvider } from "~/providers/workspace";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
import Dashboard from "~/components/Dashboard";
|
import { getDashboardLayout } from "~/components/Dashboard";
|
||||||
import SettingsView from "~/views/settings";
|
|
||||||
import Popup from "~/components/Popup";
|
import Popup from "~/components/Popup";
|
||||||
|
import SettingsView from "~/views/settings";
|
||||||
|
|
||||||
export default function SettingsPage() {
|
const SettingsPage: NextPageWithLayout = () => {
|
||||||
return (
|
return (
|
||||||
<WorkspaceProvider>
|
<>
|
||||||
<Dashboard>
|
<SettingsView />
|
||||||
<SettingsView />
|
|
||||||
</Dashboard>
|
|
||||||
<Popup />
|
<Popup />
|
||||||
</WorkspaceProvider>
|
</>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
SettingsPage.getLayout = (page) => getDashboardLayout(page);
|
||||||
|
|
||||||
|
export default SettingsPage;
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
import { createContext, useContext, useState } from "react";
|
import { createContext, useContext, useState } from "react";
|
||||||
|
|
||||||
|
interface ModalState {
|
||||||
|
contentType: string;
|
||||||
|
entityId?: string;
|
||||||
|
entityLabel?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
type ModalContextType = {
|
type ModalContextType = {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
openModal: (
|
openModal: (
|
||||||
@@ -11,33 +21,64 @@ type ModalContextType = {
|
|||||||
modalContentType: string;
|
modalContentType: string;
|
||||||
entityId: string;
|
entityId: string;
|
||||||
entityLabel: string;
|
entityLabel: string;
|
||||||
|
modalStates: Record<string, any>;
|
||||||
|
setModalState: (modalType: string, state: any) => void;
|
||||||
|
getModalState: (modalType: string) => any;
|
||||||
|
clearModalState: (modalType: string) => void;
|
||||||
|
clearAllModalStates: () => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface Props {
|
|
||||||
children: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ModalContext = createContext<ModalContextType | undefined>(undefined);
|
const ModalContext = createContext<ModalContextType | undefined>(undefined);
|
||||||
|
|
||||||
export const ModalProvider: React.FC<Props> = ({ children }) => {
|
export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [modalStack, setModalStack] = useState<ModalState[]>([]);
|
||||||
const [entityId, setEntityId] = useState("");
|
const [modalStates, setModalStates] = useState<Record<string, any>>({});
|
||||||
const [entityLabel, setEntityLabel] = useState("");
|
|
||||||
const [modalContentType, setModalContentType] = useState("");
|
const isOpen = modalStack.length > 0;
|
||||||
|
const currentModal = modalStack[modalStack.length - 1];
|
||||||
|
const modalContentType = currentModal?.contentType || "";
|
||||||
|
const entityId = currentModal?.entityId || "";
|
||||||
|
const entityLabel = currentModal?.entityLabel || "";
|
||||||
|
|
||||||
const openModal = (
|
const openModal = (
|
||||||
contentType: string,
|
contentType: string,
|
||||||
entityId?: string,
|
entityId?: string,
|
||||||
entityLabel?: string,
|
entityLabel?: string,
|
||||||
) => {
|
) => {
|
||||||
setIsOpen(true);
|
const newModal: ModalState = { contentType, entityId, entityLabel };
|
||||||
setModalContentType(contentType);
|
setModalStack(prev => [...prev, newModal]);
|
||||||
if (entityId) setEntityId(entityId);
|
|
||||||
if (entityLabel) setEntityLabel(entityLabel);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const closeModal = () => {
|
const closeModal = () => {
|
||||||
setIsOpen(false);
|
setModalStack(prev => {
|
||||||
|
if (prev.length <= 1) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return prev.slice(0, -1);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const setModalState = (modalType: string, state: any) => {
|
||||||
|
setModalStates(prev => ({
|
||||||
|
...prev,
|
||||||
|
[modalType]: state
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getModalState = (modalType: string) => {
|
||||||
|
return modalStates[modalType];
|
||||||
|
};
|
||||||
|
|
||||||
|
const clearModalState = (modalType: string) => {
|
||||||
|
setModalStates(prev => {
|
||||||
|
const newStates = { ...prev };
|
||||||
|
delete newStates[modalType];
|
||||||
|
return newStates;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const clearAllModalStates = () => {
|
||||||
|
setModalStates({});
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -49,6 +90,11 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
modalContentType,
|
modalContentType,
|
||||||
entityId,
|
entityId,
|
||||||
entityLabel,
|
entityLabel,
|
||||||
|
modalStates,
|
||||||
|
setModalState,
|
||||||
|
getModalState,
|
||||||
|
clearModalState,
|
||||||
|
clearAllModalStates,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import Editor from "~/components/Editor";
|
|||||||
import Input from "~/components/Input";
|
import Input from "~/components/Input";
|
||||||
import LabelIcon from "~/components/LabelIcon";
|
import LabelIcon from "~/components/LabelIcon";
|
||||||
import Toggle from "~/components/Toggle";
|
import Toggle from "~/components/Toggle";
|
||||||
|
import { useModalFormState } from "~/hooks/useModalFormState";
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
@@ -49,17 +50,24 @@ export function NewCardForm({
|
|||||||
|
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
|
|
||||||
|
// persists the form values
|
||||||
|
const { formState, saveFormState } = useModalFormState<NewCardFormInput>({
|
||||||
|
modalType: "NEW_CARD",
|
||||||
|
initialValues: {
|
||||||
|
title: "",
|
||||||
|
description: "",
|
||||||
|
listPublicId,
|
||||||
|
labelPublicIds: [],
|
||||||
|
memberPublicIds: [],
|
||||||
|
isCreateAnotherEnabled: false,
|
||||||
|
position: "start",
|
||||||
|
},
|
||||||
|
resetOnClose: true,
|
||||||
|
});
|
||||||
|
|
||||||
const { register, handleSubmit, reset, setValue, watch } =
|
const { register, handleSubmit, reset, setValue, watch } =
|
||||||
useForm<NewCardFormInput>({
|
useForm<NewCardFormInput>({
|
||||||
defaultValues: {
|
values: formState,
|
||||||
title: "",
|
|
||||||
description: "",
|
|
||||||
listPublicId,
|
|
||||||
labelPublicIds: [],
|
|
||||||
memberPublicIds: [],
|
|
||||||
isCreateAnotherEnabled: false,
|
|
||||||
position: "start",
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const labelPublicIds = watch("labelPublicIds") || [];
|
const labelPublicIds = watch("labelPublicIds") || [];
|
||||||
@@ -67,6 +75,15 @@ export function NewCardForm({
|
|||||||
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
||||||
const position = watch("position");
|
const position = watch("position");
|
||||||
const title = watch("title");
|
const title = watch("title");
|
||||||
|
const description = watch("description");
|
||||||
|
|
||||||
|
// saving form state whenever form values change
|
||||||
|
useEffect(() => {
|
||||||
|
const subscription = watch((data) => {
|
||||||
|
saveFormState(data as NewCardFormInput);
|
||||||
|
});
|
||||||
|
return () => subscription.unsubscribe();
|
||||||
|
}, [watch, saveFormState]);
|
||||||
|
|
||||||
const { data: boardData } = api.board.byId.useQuery(queryParams, {
|
const { data: boardData } = api.board.byId.useQuery(queryParams, {
|
||||||
enabled: !!boardPublicId,
|
enabled: !!boardPublicId,
|
||||||
@@ -131,17 +148,24 @@ export function NewCardForm({
|
|||||||
},
|
},
|
||||||
onSuccess: async () => {
|
onSuccess: async () => {
|
||||||
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
||||||
if (!isCreateAnotherEnabled) closeModal();
|
if (!isCreateAnotherEnabled) {
|
||||||
|
// close modal (state will auto-clear due to resetOnClose: true)
|
||||||
|
closeModal();
|
||||||
|
} else {
|
||||||
|
// reset form for creating another card
|
||||||
|
const newFormState = {
|
||||||
|
title: "",
|
||||||
|
description: "",
|
||||||
|
listPublicId: watch("listPublicId"),
|
||||||
|
labelPublicIds: [],
|
||||||
|
memberPublicIds: [],
|
||||||
|
isCreateAnotherEnabled,
|
||||||
|
position,
|
||||||
|
};
|
||||||
|
reset(newFormState);
|
||||||
|
saveFormState(newFormState);
|
||||||
|
}
|
||||||
await utils.board.byId.invalidate(queryParams);
|
await utils.board.byId.invalidate(queryParams);
|
||||||
reset({
|
|
||||||
title: "",
|
|
||||||
description: "",
|
|
||||||
listPublicId: watch("listPublicId"),
|
|
||||||
labelPublicIds: [],
|
|
||||||
memberPublicIds: [],
|
|
||||||
isCreateAnotherEnabled,
|
|
||||||
position,
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -264,8 +288,11 @@ export function NewCardForm({
|
|||||||
<div className="mt-2">
|
<div className="mt-2">
|
||||||
<div className="block max-h-48 min-h-24 w-full overflow-y-auto rounded-md border-0 bg-dark-300 bg-white/5 px-3 py-2 text-sm shadow-sm ring-1 ring-inset ring-light-600 focus-within:ring-2 focus-within:ring-inset focus-within:ring-light-700 dark:ring-dark-700 dark:focus-within:ring-dark-700 sm:leading-6">
|
<div className="block max-h-48 min-h-24 w-full overflow-y-auto rounded-md border-0 bg-dark-300 bg-white/5 px-3 py-2 text-sm shadow-sm ring-1 ring-inset ring-light-600 focus-within:ring-2 focus-within:ring-inset focus-within:ring-light-700 dark:ring-dark-700 dark:focus-within:ring-dark-700 sm:leading-6">
|
||||||
<Editor
|
<Editor
|
||||||
content=""
|
content={description}
|
||||||
onChange={(value) => setValue("description", value)}
|
onChange={(value) => {
|
||||||
|
setValue("description", value);
|
||||||
|
saveFormState({ ...formState, description: value });
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -145,7 +145,12 @@ export function NewListForm({
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<Button type="submit">{t`Create list`}</Button>
|
<Button
|
||||||
|
type="submit"
|
||||||
|
disabled={createList.isPending || !watch("name")}
|
||||||
|
>
|
||||||
|
{t`Create list`}
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import Link from "next/link";
|
||||||
|
import { env } from "next-runtime-env";
|
||||||
|
import { HiLink } from "react-icons/hi";
|
||||||
|
|
||||||
|
const UpdateBoardSlugButton = ({
|
||||||
|
handleOnClick,
|
||||||
|
workspaceSlug,
|
||||||
|
boardSlug,
|
||||||
|
isLoading,
|
||||||
|
}: {
|
||||||
|
handleOnClick: () => void;
|
||||||
|
workspaceSlug: string;
|
||||||
|
boardSlug: string;
|
||||||
|
isLoading: boolean;
|
||||||
|
}) => {
|
||||||
|
if (!isLoading && (!workspaceSlug || !boardSlug)) return <></>;
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="hidden h-[36px] w-[225px] animate-pulse rounded-full bg-light-200 dark:bg-dark-100 xl:flex" />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
onClick={handleOnClick}
|
||||||
|
className="hidden cursor-pointer items-center gap-2 rounded-full border-[1px] bg-light-50 p-1 pl-4 pr-1 text-sm text-light-950 hover:bg-light-100 dark:border-dark-600 dark:bg-dark-50 dark:text-dark-900 dark:hover:bg-dark-100 xl:flex"
|
||||||
|
>
|
||||||
|
<div className="flex items-center">
|
||||||
|
<span>
|
||||||
|
{env("NEXT_PUBLIC_KAN_ENV") === "cloud"
|
||||||
|
? "kan.bn"
|
||||||
|
: env("NEXT_PUBLIC_BASE_URL")}
|
||||||
|
</span>
|
||||||
|
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
|
||||||
|
<span>{workspaceSlug}</span>
|
||||||
|
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
|
||||||
|
<span>{boardSlug}</span>
|
||||||
|
</div>
|
||||||
|
<Link
|
||||||
|
href={`${env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/${boardSlug}`}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
className="flex h-7 w-7 items-center justify-center rounded-full hover:bg-light-200 dark:hover:bg-dark-200"
|
||||||
|
>
|
||||||
|
<HiLink className="h-[13px] w-[13px]" />
|
||||||
|
</Link>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UpdateBoardSlugButton;
|
||||||
@@ -135,7 +135,7 @@ export function UpdateBoardSlugForm({
|
|||||||
? t`This board URL has already been taken`
|
? t`This board URL has already been taken`
|
||||||
: undefined)
|
: undefined)
|
||||||
}
|
}
|
||||||
prefix={`${env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/`}
|
prefix={`${env("NEXT_PUBLIC_KAN_ENV") === "cloud" ? "kan.bn" : env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/`}
|
||||||
onKeyDown={async (e) => {
|
onKeyDown={async (e) => {
|
||||||
if (e.key === "Enter") {
|
if (e.key === "Enter") {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -152,7 +152,14 @@ export function UpdateBoardSlugForm({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
||||||
<div>
|
<div className="flex items-center gap-2">
|
||||||
|
<Button
|
||||||
|
variant="secondary"
|
||||||
|
href="/settings?edit=workspace_url"
|
||||||
|
onClick={closeModal}
|
||||||
|
>
|
||||||
|
{t`Edit workspace URL`}
|
||||||
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="submit"
|
type="submit"
|
||||||
isLoading={updateBoardSlug.isPending}
|
isLoading={updateBoardSlug.isPending}
|
||||||
@@ -160,7 +167,8 @@ export function UpdateBoardSlugForm({
|
|||||||
!isDirty ||
|
!isDirty ||
|
||||||
updateBoardSlug.isPending ||
|
updateBoardSlug.isPending ||
|
||||||
errors.slug?.message !== undefined ||
|
errors.slug?.message !== undefined ||
|
||||||
isBoardSlugAvailable?.isReserved
|
isBoardSlugAvailable?.isReserved ||
|
||||||
|
checkBoardSlugAvailability.isLoading
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{t`Update`}
|
{t`Update`}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import type { UpdateBoardInput } from "@kan/api/types";
|
|||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
|
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import { LabelForm } from "~/components/LabelForm";
|
import { LabelForm } from "~/components/LabelForm";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
@@ -32,6 +33,7 @@ import Filters from "./components/Filters";
|
|||||||
import List from "./components/List";
|
import List from "./components/List";
|
||||||
import { NewCardForm } from "./components/NewCardForm";
|
import { NewCardForm } from "./components/NewCardForm";
|
||||||
import { NewListForm } from "./components/NewListForm";
|
import { NewListForm } from "./components/NewListForm";
|
||||||
|
import UpdateBoardSlugButton from "./components/UpdateBoardSlugButton";
|
||||||
import { UpdateBoardSlugForm } from "./components/UpdateBoardSlugForm";
|
import { UpdateBoardSlugForm } from "./components/UpdateBoardSlugForm";
|
||||||
import VisibilityButton from "./components/VisibilityButton";
|
import VisibilityButton from "./components/VisibilityButton";
|
||||||
|
|
||||||
@@ -43,7 +45,7 @@ export default function BoardPage() {
|
|||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
const { openModal, modalContentType, entityId } = useModal();
|
const { openModal, modalContentType, entityId, isOpen } = useModal();
|
||||||
const [selectedPublicListId, setSelectedPublicListId] =
|
const [selectedPublicListId, setSelectedPublicListId] =
|
||||||
useState<PublicListId>("");
|
useState<PublicListId>("");
|
||||||
const [isInitialLoading, setIsInitialLoading] = useState(true);
|
const [isInitialLoading, setIsInitialLoading] = useState(true);
|
||||||
@@ -233,6 +235,97 @@ export default function BoardPage() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const renderModalContent = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "DELETE_BOARD"}
|
||||||
|
>
|
||||||
|
<DeleteBoardConfirmation boardPublicId={boardId ?? ""} />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "DELETE_LIST"}
|
||||||
|
>
|
||||||
|
<DeleteListConfirmation
|
||||||
|
listPublicId={selectedPublicListId}
|
||||||
|
queryParams={queryParams}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="md"
|
||||||
|
isVisible={isOpen && modalContentType === "NEW_CARD"}
|
||||||
|
>
|
||||||
|
<NewCardForm
|
||||||
|
boardPublicId={boardId ?? ""}
|
||||||
|
listPublicId={selectedPublicListId}
|
||||||
|
queryParams={queryParams}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "NEW_LIST"}
|
||||||
|
>
|
||||||
|
<NewListForm
|
||||||
|
boardPublicId={boardId ?? ""}
|
||||||
|
queryParams={queryParams}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
|
||||||
|
>
|
||||||
|
<NewWorkspaceForm />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "NEW_LABEL"}
|
||||||
|
>
|
||||||
|
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchBoard} />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "EDIT_LABEL"}
|
||||||
|
>
|
||||||
|
<LabelForm
|
||||||
|
boardPublicId={boardId ?? ""}
|
||||||
|
refetch={refetchBoard}
|
||||||
|
isEdit
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "DELETE_LABEL"}
|
||||||
|
>
|
||||||
|
<DeleteLabelConfirmation
|
||||||
|
refetch={refetchBoard}
|
||||||
|
labelPublicId={entityId}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "UPDATE_BOARD_SLUG"}
|
||||||
|
>
|
||||||
|
<UpdateBoardSlugForm
|
||||||
|
boardPublicId={boardId ?? ""}
|
||||||
|
workspaceSlug={workspace.slug ?? ""}
|
||||||
|
boardSlug={boardData?.slug ?? ""}
|
||||||
|
queryParams={queryParams}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageHead
|
<PageHead
|
||||||
@@ -267,6 +360,12 @@ export default function BoardPage() {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
|
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
|
||||||
|
<UpdateBoardSlugButton
|
||||||
|
handleOnClick={() => openModal("UPDATE_BOARD_SLUG")}
|
||||||
|
isLoading={isLoading}
|
||||||
|
workspaceSlug={workspace.slug ?? ""}
|
||||||
|
boardSlug={boardData?.slug ?? ""}
|
||||||
|
/>
|
||||||
<VisibilityButton
|
<VisibilityButton
|
||||||
visibility={boardData?.visibility ?? "private"}
|
visibility={boardData?.visibility ?? "private"}
|
||||||
boardPublicId={boardId ?? ""}
|
boardPublicId={boardId ?? ""}
|
||||||
@@ -358,7 +457,7 @@ export default function BoardPage() {
|
|||||||
<div
|
<div
|
||||||
ref={provided.innerRef}
|
ref={provided.innerRef}
|
||||||
{...provided.droppableProps}
|
{...provided.droppableProps}
|
||||||
className="scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-w-[8px] z-10 h-full max-h-[calc(100vh-265px)] min-h-[2rem] overflow-y-auto pr-1 scrollbar dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-600"
|
className="scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-w-[8px] z-10 h-full max-h-[calc(100vh-225px)] min-h-[2rem] overflow-y-auto pr-1 scrollbar dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-600"
|
||||||
>
|
>
|
||||||
{list.cards.map((card, index) => (
|
{list.cards.map((card, index) => (
|
||||||
<Draggable
|
<Draggable
|
||||||
@@ -414,55 +513,7 @@ export default function BoardPage() {
|
|||||||
</>
|
</>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
<Modal modalSize={modalContentType === "NEW_CARD" ? "md" : "sm"}>
|
{renderModalContent()}
|
||||||
{modalContentType === "DELETE_BOARD" && (
|
|
||||||
<DeleteBoardConfirmation boardPublicId={boardId ?? ""} />
|
|
||||||
)}
|
|
||||||
{modalContentType === "DELETE_LIST" && (
|
|
||||||
<DeleteListConfirmation
|
|
||||||
listPublicId={selectedPublicListId}
|
|
||||||
queryParams={queryParams}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{modalContentType === "NEW_CARD" && (
|
|
||||||
<NewCardForm
|
|
||||||
boardPublicId={boardId ?? ""}
|
|
||||||
listPublicId={selectedPublicListId}
|
|
||||||
queryParams={queryParams}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{modalContentType === "NEW_LIST" && (
|
|
||||||
<NewListForm
|
|
||||||
boardPublicId={boardId ?? ""}
|
|
||||||
queryParams={queryParams}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
|
||||||
{modalContentType === "NEW_LABEL" && (
|
|
||||||
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchBoard} />
|
|
||||||
)}
|
|
||||||
{modalContentType === "EDIT_LABEL" && (
|
|
||||||
<LabelForm
|
|
||||||
boardPublicId={boardId ?? ""}
|
|
||||||
refetch={refetchBoard}
|
|
||||||
isEdit
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{modalContentType === "DELETE_LABEL" && (
|
|
||||||
<DeleteLabelConfirmation
|
|
||||||
refetch={refetchBoard}
|
|
||||||
labelPublicId={entityId}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{modalContentType === "UPDATE_BOARD_SLUG" && (
|
|
||||||
<UpdateBoardSlugForm
|
|
||||||
boardPublicId={boardId ?? ""}
|
|
||||||
workspaceSlug={workspace.slug ?? ""}
|
|
||||||
boardSlug={boardData?.slug ?? ""}
|
|
||||||
queryParams={queryParams}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</Modal>
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export function BoardsList() {
|
|||||||
|
|
||||||
if (isLoading)
|
if (isLoading)
|
||||||
return (
|
return (
|
||||||
<div className="xxl:grid-cols-7 grid w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
|
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3 2xl:grid-cols-7">
|
||||||
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
@@ -45,12 +45,12 @@ export function BoardsList() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-7">
|
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3 2xl:grid-cols-7">
|
||||||
{data?.map((board) => (
|
{data?.map((board) => (
|
||||||
<Link key={board.publicId} href={`boards/${board.publicId}`}>
|
<Link key={board.publicId} href={`boards/${board.publicId}`}>
|
||||||
<div className="align-center relative mr-5 flex h-[150px] w-full items-center justify-center rounded-md border border-dashed border-light-400 bg-light-50 shadow-sm hover:bg-light-200 dark:border-dark-600 dark:bg-dark-50 dark:hover:bg-dark-100">
|
<div className="align-center relative mr-5 flex h-[150px] w-full items-center justify-center rounded-md border border-dashed border-light-400 bg-light-50 shadow-sm hover:bg-light-200 dark:border-dark-600 dark:bg-dark-50 dark:hover:bg-dark-100">
|
||||||
<PatternedBackground />
|
<PatternedBackground />
|
||||||
<p className="text-md px-4 font-bold text-neutral-900 dark:text-dark-1000">
|
<p className="px-4 text-[14px] font-bold text-neutral-700 dark:text-dark-1000">
|
||||||
{board.name}
|
{board.name}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { t } from "@lingui/core/macro";
|
|||||||
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
|
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
import { PageHead } from "~/components/PageHead";
|
import { PageHead } from "~/components/PageHead";
|
||||||
@@ -20,8 +21,8 @@ export default function BoardsPage() {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageHead title={t`Boards | ${workspace.name ?? "Workspace"}`} />
|
<PageHead title={t`Boards | ${workspace.name ?? "Workspace"}`} />
|
||||||
<div className="m-auto h-full max-w-[1600px] px-5 py-6 md:px-8 md:py-8">
|
<div className="m-auto h-full max-w-[1100px] p-6 px-5 md:px-28 md:py-12">
|
||||||
<div className="mb-8 flex w-full items-center justify-between">
|
<div className="relative z-10 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]">
|
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
{t`Boards`}
|
{t`Boards`}
|
||||||
</h1>
|
</h1>
|
||||||
@@ -49,7 +50,8 @@ export default function BoardsPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal>
|
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
|
||||||
|
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
|
||||||
{modalContentType === "NEW_BOARD" && <NewBoardForm />}
|
{modalContentType === "NEW_BOARD" && <NewBoardForm />}
|
||||||
{modalContentType === "IMPORT_BOARDS" && <ImportBoardsForm />}
|
{modalContentType === "IMPORT_BOARDS" && <ImportBoardsForm />}
|
||||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ export default function LabelSelector({
|
|||||||
</Menu.Button>
|
</Menu.Button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 pl-2 text-left text-sm text-neutral-900 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
|
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
|
||||||
<HiMiniPlus size={22} className="pr-2" />
|
<HiMiniPlus size={22} className="pr-2" />
|
||||||
{t`Add label`}
|
{t`Add label`}
|
||||||
</Menu.Button>
|
</Menu.Button>
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export default function ListSelector({
|
|||||||
}}
|
}}
|
||||||
asChild
|
asChild
|
||||||
>
|
>
|
||||||
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
|
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
|
||||||
{selectedList?.value}
|
{selectedList?.value}
|
||||||
</Menu.Button>
|
</Menu.Button>
|
||||||
</CheckboxDropdown>
|
</CheckboxDropdown>
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ export default function MemberSelector({
|
|||||||
createNewItemLabel={t`Invite member`}
|
createNewItemLabel={t`Invite member`}
|
||||||
asChild
|
asChild
|
||||||
>
|
>
|
||||||
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 py-1 pl-2 text-left text-sm text-neutral-900 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
|
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
|
||||||
{selectedMembers.length ? (
|
{selectedMembers.length ? (
|
||||||
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
|
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
|
||||||
{selectedMembers.map(({ value, imageUrl }) => (
|
{selectedMembers.map(({ value, imageUrl }) => (
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ const NewCommentForm = ({ cardPublicId }: { cardPublicId: string }) => {
|
|||||||
return (
|
return (
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit(onSubmit)}
|
onSubmit={handleSubmit(onSubmit)}
|
||||||
className="flex w-full max-w-[1000px] flex-col rounded-xl border border-light-600 bg-light-200 p-4 text-light-900 focus-visible:outline-none dark:border-dark-400 dark:bg-dark-100 dark:text-dark-1000 sm:text-sm sm:leading-6"
|
className="flex w-full max-w-[800px] flex-col rounded-xl border border-light-600 bg-light-100 p-4 text-light-900 focus-visible:outline-none dark:border-dark-400 dark:bg-dark-100 dark:text-dark-1000 sm:text-sm sm:leading-6"
|
||||||
>
|
>
|
||||||
<ContentEditable
|
<ContentEditable
|
||||||
placeholder={t`Add a comment...`}
|
placeholder={t`Add a comment...`}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { IoChevronForwardSharp } from "react-icons/io5";
|
|||||||
|
|
||||||
import Avatar from "~/components/Avatar";
|
import Avatar from "~/components/Avatar";
|
||||||
import Editor from "~/components/Editor";
|
import Editor from "~/components/Editor";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import { LabelForm } from "~/components/LabelForm";
|
import { LabelForm } from "~/components/LabelForm";
|
||||||
import LabelIcon from "~/components/LabelIcon";
|
import LabelIcon from "~/components/LabelIcon";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
@@ -99,7 +100,7 @@ export function CardRightPanel() {
|
|||||||
}) ?? [];
|
}) ?? [];
|
||||||
|
|
||||||
return (
|
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="h-full w-[360px] border-l-[1px] border-light-300 bg-light-50 p-8 text-light-900 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900">
|
||||||
<div className="mb-4 flex w-full flex-row">
|
<div className="mb-4 flex w-full flex-row">
|
||||||
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`List`}</p>
|
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`List`}</p>
|
||||||
<ListSelector
|
<ListSelector
|
||||||
@@ -188,9 +189,9 @@ export default function CardPage() {
|
|||||||
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
|
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
|
||||||
/>
|
/>
|
||||||
<div className="flex h-full flex-1 flex-row">
|
<div className="flex h-full flex-1 flex-row">
|
||||||
<div className="flex h-full w-full flex-col overflow-hidden">
|
<div className="m-auto flex h-full w-full max-w-[800px] flex-col overflow-hidden">
|
||||||
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto p-6 md: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">
|
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
|
||||||
{!card && isLoading && (
|
{!card && isLoading && (
|
||||||
<div className="flex space-x-2">
|
<div className="flex space-x-2">
|
||||||
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
||||||
@@ -250,7 +251,7 @@ export default function CardPage() {
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div className="border-t-[1px] border-light-600 pt-12 dark:border-dark-400">
|
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
|
||||||
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
||||||
{t`Activity`}
|
{t`Activity`}
|
||||||
</h2>
|
</h2>
|
||||||
@@ -271,7 +272,8 @@ export default function CardPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal>
|
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
|
||||||
|
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
|
||||||
{modalContentType === "NEW_LABEL" && (
|
{modalContentType === "NEW_LABEL" && (
|
||||||
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchCard} />
|
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchCard} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export default function HomeView() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative overflow-hidden rounded-full bg-gradient-to-b from-light-300 to-light-400 p-[2px] dark:from-dark-300 dark:to-dark-400">
|
{/* <div className="relative overflow-hidden rounded-full bg-gradient-to-b from-light-300 to-light-400 p-[2px] dark:from-dark-300 dark:to-dark-400">
|
||||||
<div className="relative z-10 rounded-full bg-light-50 dark:bg-dark-50">
|
<div className="relative z-10 rounded-full bg-light-50 dark:bg-dark-50">
|
||||||
<Link
|
<Link
|
||||||
href="https://news.ycombinator.com/item?id=44157177"
|
href="https://news.ycombinator.com/item?id=44157177"
|
||||||
@@ -58,7 +58,7 @@ export default function HomeView() {
|
|||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> */}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="mt-2 text-center text-4xl font-bold text-light-1000 dark:text-dark-1000 lg:text-5xl">
|
<p className="mt-2 text-center text-4xl font-bold text-light-1000 dark:text-dark-1000 lg:text-5xl">
|
||||||
|
|||||||
@@ -1,26 +1,43 @@
|
|||||||
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { useEffect } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import { HiXMark } from "react-icons/hi2";
|
import { HiXMark } from "react-icons/hi2";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
import type { InviteMemberInput } from "@kan/api/types";
|
import type { InviteMemberInput } from "@kan/api/types";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import Input from "~/components/Input";
|
import Input from "~/components/Input";
|
||||||
|
import Toggle from "~/components/Toggle";
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
|
import { usePopup } from "~/providers/popup";
|
||||||
import { useWorkspace } from "~/providers/workspace";
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
|
||||||
export function InviteMemberForm() {
|
export function InviteMemberForm() {
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
|
const [isCreateAnotherEnabled, setIsCreateAnotherEnabled] = useState(false);
|
||||||
const { closeModal } = useModal();
|
const { closeModal } = useModal();
|
||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
|
const { showPopup } = usePopup();
|
||||||
|
|
||||||
const { register, handleSubmit } = useForm<InviteMemberInput>({
|
const InviteMemberSchema = z.object({
|
||||||
|
email: z.string().email({ message: t`Invalid email address` }),
|
||||||
|
workspacePublicId: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const {
|
||||||
|
register,
|
||||||
|
handleSubmit,
|
||||||
|
reset,
|
||||||
|
formState: { errors },
|
||||||
|
} = useForm<InviteMemberInput>({
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
email: "",
|
email: "",
|
||||||
workspacePublicId: workspace.publicId || "",
|
workspacePublicId: workspace.publicId || "",
|
||||||
},
|
},
|
||||||
|
resolver: zodResolver(InviteMemberSchema),
|
||||||
});
|
});
|
||||||
|
|
||||||
const refetchBoards = () => utils.board.all.refetch();
|
const refetchBoards = () => utils.board.all.refetch();
|
||||||
@@ -31,6 +48,24 @@ export function InviteMemberForm() {
|
|||||||
await utils.workspace.byId.refetch();
|
await utils.workspace.byId.refetch();
|
||||||
await refetchBoards();
|
await refetchBoards();
|
||||||
},
|
},
|
||||||
|
onError: (error) => {
|
||||||
|
reset();
|
||||||
|
if (!isCreateAnotherEnabled) closeModal();
|
||||||
|
|
||||||
|
if (error.data?.code === "CONFLICT") {
|
||||||
|
showPopup({
|
||||||
|
header: t`Error inviting member`,
|
||||||
|
message: t`User is already a member of this workspace`,
|
||||||
|
icon: "error",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
showPopup({
|
||||||
|
header: t`Error inviting member`,
|
||||||
|
message: t`Please try again later, or contact customer support.`,
|
||||||
|
icon: "error",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const onSubmit = (data: InviteMemberInput) => {
|
const onSubmit = (data: InviteMemberInput) => {
|
||||||
@@ -69,10 +104,16 @@ export function InviteMemberForm() {
|
|||||||
await handleSubmit(onSubmit)();
|
await handleSubmit(onSubmit)();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
errorMessage={errors.email?.message}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
||||||
|
<Toggle
|
||||||
|
label={t`Invite another`}
|
||||||
|
isChecked={isCreateAnotherEnabled}
|
||||||
|
onChange={() => setIsCreateAnotherEnabled(!isCreateAnotherEnabled)}
|
||||||
|
/>
|
||||||
<div>
|
<div>
|
||||||
<Button
|
<Button
|
||||||
type="submit"
|
type="submit"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { authClient } from "@kan/auth/client";
|
|||||||
import Avatar from "~/components/Avatar";
|
import Avatar from "~/components/Avatar";
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import Dropdown from "~/components/Dropdown";
|
import Dropdown from "~/components/Dropdown";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
import { PageHead } from "~/components/PageHead";
|
import { PageHead } from "~/components/PageHead";
|
||||||
@@ -96,7 +97,7 @@ export default function MembersPage() {
|
|||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
className={twMerge(
|
className={twMerge(
|
||||||
"w-auto min-w-[120px] sm:w-[35%] sm:min-w-[150px]",
|
"w-auto min-w-[120px] overflow-visible sm:w-[35%] sm:min-w-[150px]",
|
||||||
isLastRow && "rounded-br-lg",
|
isLastRow && "rounded-br-lg",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
@@ -120,7 +121,7 @@ export default function MembersPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className={twMerge(
|
className={twMerge(
|
||||||
"relative",
|
"relative z-50",
|
||||||
(workspace.role !== "admin" || showSkeleton) && "hidden",
|
(workspace.role !== "admin" || showSkeleton) && "hidden",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
@@ -154,7 +155,7 @@ export default function MembersPage() {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageHead title={t`Members | ${workspace.name ?? "Workspace"}`} />
|
<PageHead title={t`Members | ${workspace.name ?? "Workspace"}`} />
|
||||||
<div className="m-auto h-full max-w-[1600px] p-6 px-5 md:px-28 md:py-12">
|
<div className="m-auto h-full max-w-[1100px] p-6 px-5 md:px-28 md:py-12">
|
||||||
<div className="mb-8 flex w-full justify-between">
|
<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]">
|
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
{t`Members`}
|
{t`Members`}
|
||||||
@@ -171,10 +172,10 @@ export default function MembersPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-8 flow-root">
|
<div className="mt-8 flow-root">
|
||||||
<div className="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
<div className="-mx-4 -my-2 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="inline-block min-w-full overflow-x-auto px-4 py-2 pb-16 align-middle sm:px-6 lg:px-8">
|
||||||
<div className="h-full shadow ring-1 ring-black ring-opacity-5 sm:rounded-lg">
|
<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">
|
<table className="min-w-full divide-y divide-light-600 overflow-visible dark:divide-dark-600">
|
||||||
<thead className="rounded-t-lg bg-light-300 dark:bg-dark-200">
|
<thead className="rounded-t-lg bg-light-300 dark:bg-dark-200">
|
||||||
<tr>
|
<tr>
|
||||||
<th
|
<th
|
||||||
@@ -191,7 +192,7 @@ export default function MembersPage() {
|
|||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody className="divide-y divide-light-600 bg-light-50 dark:divide-dark-600 dark:bg-dark-100">
|
<tbody className="divide-y divide-light-600 overflow-visible bg-light-50 dark:divide-dark-600 dark:bg-dark-100">
|
||||||
{!isLoading &&
|
{!isLoading &&
|
||||||
data?.members.map((member, index) => (
|
data?.members.map((member, index) => (
|
||||||
<TableRow
|
<TableRow
|
||||||
@@ -221,7 +222,8 @@ export default function MembersPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal>
|
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
|
||||||
|
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
|
||||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
||||||
{modalContentType === "INVITE_MEMBER" && <InviteMemberForm />}
|
{modalContentType === "INVITE_MEMBER" && <InviteMemberForm />}
|
||||||
{modalContentType === "REMOVE_MEMBER" && <DeleteMemberConfirmation />}
|
{modalContentType === "REMOVE_MEMBER" && <DeleteMemberConfirmation />}
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ import { useRouter } from "next/router";
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { keepPreviousData } from "@tanstack/react-query";
|
import { keepPreviousData } from "@tanstack/react-query";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { HiLink } from "react-icons/hi2";
|
import { HiLink, HiOutlineLockClosed } from "react-icons/hi2";
|
||||||
|
|
||||||
|
import Button from "~/components/Button";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { PageHead } from "~/components/PageHead";
|
import { PageHead } from "~/components/PageHead";
|
||||||
import PatternedBackground from "~/components/PatternedBackground";
|
import PatternedBackground from "~/components/PatternedBackground";
|
||||||
@@ -28,9 +29,14 @@ export default function PublicBoardView() {
|
|||||||
? router.query.boardSlug[0]
|
? router.query.boardSlug[0]
|
||||||
: router.query.boardSlug;
|
: router.query.boardSlug;
|
||||||
|
|
||||||
|
const workspaceSlug = Array.isArray(router.query.workspaceSlug)
|
||||||
|
? router.query.workspaceSlug[0]
|
||||||
|
: router.query.workspaceSlug;
|
||||||
|
|
||||||
const { data, isLoading } = api.board.bySlug.useQuery(
|
const { data, isLoading } = api.board.bySlug.useQuery(
|
||||||
{
|
{
|
||||||
boardSlug: boardSlug ?? "",
|
boardSlug: boardSlug ?? "",
|
||||||
|
workspaceSlug: workspaceSlug ?? "",
|
||||||
members: formatToArray(router.query.members),
|
members: formatToArray(router.query.members),
|
||||||
labels: formatToArray(router.query.labels),
|
labels: formatToArray(router.query.labels),
|
||||||
},
|
},
|
||||||
@@ -105,26 +111,41 @@ export default function PublicBoardView() {
|
|||||||
{data?.name}
|
{data?.name}
|
||||||
</h1>
|
</h1>
|
||||||
)}
|
)}
|
||||||
<div className="flex items-center space-x-2">
|
{data && (
|
||||||
<Filters
|
<div className="flex items-center space-x-2">
|
||||||
labels={data?.labels ?? []}
|
<Filters
|
||||||
members={[]}
|
labels={data.labels ?? []}
|
||||||
isLoading={isLoading}
|
members={[]}
|
||||||
/>
|
isLoading={isLoading}
|
||||||
</div>
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300">
|
<div className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative h-full flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300">
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="ml-[2rem] flex">
|
<div className="ml-[2rem] flex">
|
||||||
<div className="0 mr-5 h-[500px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="0 mr-5 h-[500px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
<div className="0 mr-5 h-[275px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="0 mr-5 h-[275px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
<div className="0 mr-5 h-[375px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
<div className="0 mr-5 h-[375px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
|
||||||
</div>
|
</div>
|
||||||
|
) : !data ? (
|
||||||
|
<div className="z-10 flex h-full w-full flex-col items-center justify-center space-y-8 pb-[150px]">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<HiOutlineLockClosed className="h-10 w-10 text-light-800 dark:text-dark-800" />
|
||||||
|
<p className="mb-2 mt-4 text-[14px] font-bold text-light-1000 dark:text-dark-950">
|
||||||
|
{t`Board not found`}
|
||||||
|
</p>
|
||||||
|
<p className="text-[14px] text-light-900 dark:text-dark-900">
|
||||||
|
{t`This board is private or does not exist`}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<Button href={`/${workspaceSlug}`}>{t`View workspace`}</Button>
|
||||||
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<div className="min-w-[2rem]" />
|
<div className="min-w-[2rem]" />
|
||||||
{data?.lists.map((list) => (
|
{data.lists.map((list) => (
|
||||||
<div
|
<div
|
||||||
key={list.publicId}
|
key={list.publicId}
|
||||||
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100"
|
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100"
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import { t } from "@lingui/core/macro";
|
|||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
|
import { generateUID } from "@kan/shared/utils";
|
||||||
|
|
||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
import { getAvatarUrl } from "~/utils/helpers";
|
import { getAvatarUrl } from "~/utils/helpers";
|
||||||
@@ -58,7 +60,7 @@ export default function Avatar({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const fileExt = file.name.split(".").pop();
|
const fileExt = file.name.split(".").pop();
|
||||||
const fileName = `${userId}/avatar.${fileExt}`;
|
const fileName = `${userId}/avatar-${generateUID()}.${fileExt}`;
|
||||||
|
|
||||||
setUploading(true);
|
setUploading(true);
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
import { useRouter } from "next/router";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
import { useEffect } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
import { HiMiniArrowTopRightOnSquare } from "react-icons/hi2";
|
import { HiMiniArrowTopRightOnSquare } from "react-icons/hi2";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import { LanguageSelector } from "~/components/LanguageSelector";
|
import { LanguageSelector } from "~/components/LanguageSelector";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
@@ -27,6 +29,9 @@ export default function SettingsPage() {
|
|||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
|
const router = useRouter();
|
||||||
|
const workspaceUrlSectionRef = useRef<HTMLDivElement>(null);
|
||||||
|
const scrollContainerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
const { data } = api.user.getUser.useQuery();
|
const { data } = api.user.getUser.useQuery();
|
||||||
|
|
||||||
@@ -59,6 +64,24 @@ export default function SettingsPage() {
|
|||||||
};
|
};
|
||||||
}, [refetchIntegrations]);
|
}, [refetchIntegrations]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
router.query.edit === "workspace_url" &&
|
||||||
|
workspaceUrlSectionRef.current &&
|
||||||
|
scrollContainerRef.current
|
||||||
|
) {
|
||||||
|
const element = workspaceUrlSectionRef.current;
|
||||||
|
const container = scrollContainerRef.current;
|
||||||
|
|
||||||
|
container.scrollTop = element.offsetTop - 40;
|
||||||
|
|
||||||
|
const input = element.querySelector('input[type="text"]');
|
||||||
|
if (input instanceof HTMLInputElement) {
|
||||||
|
input.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [router.query.edit]);
|
||||||
|
|
||||||
const { mutateAsync: disconnectTrello } =
|
const { mutateAsync: disconnectTrello } =
|
||||||
api.integration.disconnect.useMutation({
|
api.integration.disconnect.useMutation({
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
@@ -104,9 +127,12 @@ export default function SettingsPage() {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="flex h-full w-full flex-col overflow-hidden">
|
<div className="flex h-full w-full flex-col overflow-hidden">
|
||||||
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto">
|
<div
|
||||||
|
ref={scrollContainerRef}
|
||||||
|
className="h-full max-h-[calc(100vdh-3rem)] overflow-y-auto md:max-h-[calc(100vdh-4rem)]"
|
||||||
|
>
|
||||||
<PageHead title={t`Settings | ${workspace.name ?? "Workspace"}`} />
|
<PageHead title={t`Settings | ${workspace.name ?? "Workspace"}`} />
|
||||||
<div className="m-auto max-w-[1600px] px-5 py-6 md:px-28 md:py-12">
|
<div className="m-auto max-w-[1100px] px-5 py-6 md:px-28 md:py-12">
|
||||||
<div className="mb-8 flex w-full justify-between">
|
<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]">
|
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
{t`Settings`}
|
{t`Settings`}
|
||||||
@@ -134,14 +160,16 @@ export default function SettingsPage() {
|
|||||||
workspaceName={workspace.name}
|
workspaceName={workspace.name}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
|
<div ref={workspaceUrlSectionRef}>
|
||||||
{t`Workspace URL`}
|
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
|
||||||
</h2>
|
{t`Workspace URL`}
|
||||||
<UpdateWorkspaceUrlForm
|
</h2>
|
||||||
workspacePublicId={workspace.publicId}
|
<UpdateWorkspaceUrlForm
|
||||||
workspaceUrl={workspace.slug ?? ""}
|
workspacePublicId={workspace.publicId}
|
||||||
workspacePlan={workspace.plan ?? "free"}
|
workspaceUrl={workspace.slug ?? ""}
|
||||||
/>
|
workspacePlan={workspace.plan ?? "free"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
|
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
|
||||||
{t`Workspace description`}
|
{t`Workspace description`}
|
||||||
@@ -273,7 +301,8 @@ export default function SettingsPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal>
|
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
|
||||||
|
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
|
||||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
||||||
{modalContentType === "DELETE_WORKSPACE" && (
|
{modalContentType === "DELETE_WORKSPACE" && (
|
||||||
<DeleteWorkspaceConfirmation />
|
<DeleteWorkspaceConfirmation />
|
||||||
|
|||||||
@@ -23,19 +23,22 @@ services:
|
|||||||
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
|
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
|
||||||
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
|
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
|
||||||
|
|
||||||
# SMTP
|
# Email
|
||||||
- SMTP_HOST=${SMTP_HOST}
|
- SMTP_HOST=${SMTP_HOST}
|
||||||
- SMTP_PORT=${SMTP_PORT}
|
- SMTP_PORT=${SMTP_PORT}
|
||||||
- SMTP_USER=${SMTP_USER}
|
- SMTP_USER=${SMTP_USER}
|
||||||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||||||
- SMTP_SECURE=${SMTP_SECURE}
|
- SMTP_SECURE=${SMTP_SECURE}
|
||||||
- EMAIL_FROM=${EMAIL_FROM}
|
- EMAIL_FROM=${EMAIL_FROM}
|
||||||
|
- PLUNK_API_KEY=${PLUNK_API_KEY}
|
||||||
|
- PLUNK_API_URL=${PLUNK_API_URL}
|
||||||
|
|
||||||
# S3 storage
|
# S3 storage
|
||||||
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
||||||
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
|
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
|
||||||
- S3_REGION=${S3_REGION}
|
- S3_REGION=${S3_REGION}
|
||||||
- S3_ENDPOINT=${S3_ENDPOINT}
|
- S3_ENDPOINT=${S3_ENDPOINT}
|
||||||
|
- S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
|
||||||
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
|
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
|
||||||
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
||||||
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ services:
|
|||||||
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
|
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
|
||||||
- S3_REGION=${S3_REGION}
|
- S3_REGION=${S3_REGION}
|
||||||
- S3_ENDPOINT=${S3_ENDPOINT}
|
- S3_ENDPOINT=${S3_ENDPOINT}
|
||||||
|
- S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
|
||||||
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
|
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
|
||||||
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
||||||
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
"@kan/stripe": "workspace:^",
|
"@kan/stripe": "workspace:^",
|
||||||
"@trpc/server": "catalog:",
|
"@trpc/server": "catalog:",
|
||||||
"superjson": "2.2.1",
|
"superjson": "2.2.1",
|
||||||
"trpc-to-openapi": "^2.1.0",
|
"trpc-to-openapi": "^2.3.2",
|
||||||
"zod": "catalog:"
|
"zod": "catalog:"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -111,15 +111,21 @@ export const boardRouter = createTRPCRouter({
|
|||||||
.meta({
|
.meta({
|
||||||
openapi: {
|
openapi: {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
path: "/board/{boardSlug}",
|
path: "/workspaces/{workspaceSlug}/boards/{boardSlug}",
|
||||||
summary: "Get board by slug",
|
summary: "Get board by slug",
|
||||||
description: "Retrieves a board by its slug",
|
description:
|
||||||
|
"Retrieves a board by its slug within a specific workspace",
|
||||||
tags: ["Boards"],
|
tags: ["Boards"],
|
||||||
protect: false,
|
protect: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.input(
|
.input(
|
||||||
z.object({
|
z.object({
|
||||||
|
workspaceSlug: z
|
||||||
|
.string()
|
||||||
|
.min(3)
|
||||||
|
.max(24)
|
||||||
|
.regex(/^(?![-]+$)[a-zA-Z0-9-]+$/),
|
||||||
boardSlug: z
|
boardSlug: z
|
||||||
.string()
|
.string()
|
||||||
.min(3)
|
.min(3)
|
||||||
@@ -131,10 +137,26 @@ export const boardRouter = createTRPCRouter({
|
|||||||
)
|
)
|
||||||
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
|
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
|
||||||
.query(async ({ ctx, input }) => {
|
.query(async ({ ctx, input }) => {
|
||||||
const result = await boardRepo.getBySlug(ctx.db, input.boardSlug, {
|
const workspace = await workspaceRepo.getBySlugWithBoards(
|
||||||
members: input.members ?? [],
|
ctx.db,
|
||||||
labels: input.labels ?? [],
|
input.workspaceSlug,
|
||||||
});
|
);
|
||||||
|
|
||||||
|
if (!workspace)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Workspace with slug ${input.workspaceSlug} not found`,
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await boardRepo.getBySlug(
|
||||||
|
ctx.db,
|
||||||
|
input.boardSlug,
|
||||||
|
workspace.id,
|
||||||
|
{
|
||||||
|
members: input.members ?? [],
|
||||||
|
labels: input.labels ?? [],
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}),
|
}),
|
||||||
@@ -276,6 +298,21 @@ export const boardRouter = createTRPCRouter({
|
|||||||
|
|
||||||
await assertUserInWorkspace(ctx.db, userId, board.workspaceId);
|
await assertUserInWorkspace(ctx.db, userId, board.workspaceId);
|
||||||
|
|
||||||
|
if (input.slug) {
|
||||||
|
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
|
||||||
|
ctx.db,
|
||||||
|
input.slug,
|
||||||
|
board.workspaceId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isBoardSlugAvailable) {
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Board slug ${input.slug} is not available`,
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const result = await boardRepo.update(ctx.db, {
|
const result = await boardRepo.update(ctx.db, {
|
||||||
name: input.name,
|
name: input.name,
|
||||||
slug: input.slug,
|
slug: input.slug,
|
||||||
@@ -407,11 +444,23 @@ export const boardRouter = createTRPCRouter({
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.query(async ({ ctx, input }) => {
|
.query(async ({ ctx, input }) => {
|
||||||
|
const board = await boardRepo.getWorkspaceAndBoardIdByBoardPublicId(
|
||||||
|
ctx.db,
|
||||||
|
input.boardPublicId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!board)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Board with public ID ${input.boardPublicId} not found`,
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
});
|
||||||
|
|
||||||
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
|
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
|
||||||
ctx.db,
|
ctx.db,
|
||||||
input.boardSlug,
|
input.boardSlug,
|
||||||
input.boardPublicId,
|
board.workspaceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isReserved: !isBoardSlugAvailable,
|
isReserved: !isBoardSlugAvailable,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ export const importRouter = createTRPCRouter({
|
|||||||
protect: true,
|
protect: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
.input(z.void())
|
||||||
.output(z.array(z.object({ id: z.string(), name: z.string() })))
|
.output(z.array(z.object({ id: z.string(), name: z.string() })))
|
||||||
.query(async ({ ctx }) => {
|
.query(async ({ ctx }) => {
|
||||||
const apiKey = apiKeys.trello;
|
const apiKey = apiKeys.trello;
|
||||||
|
|||||||
@@ -15,22 +15,47 @@ export const apiKeys = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const integrationRouter = createTRPCRouter({
|
export const integrationRouter = createTRPCRouter({
|
||||||
providers: protectedProcedure.query(async ({ ctx }) => {
|
providers: protectedProcedure
|
||||||
const user = ctx.user;
|
.meta({
|
||||||
|
openapi: {
|
||||||
|
summary: "Get integration providers",
|
||||||
|
method: "GET",
|
||||||
|
path: "/integration/providers",
|
||||||
|
description: "Retrieves all integration providers for the user",
|
||||||
|
tags: ["Integration"],
|
||||||
|
protect: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.input(z.void())
|
||||||
|
.output(
|
||||||
|
z.array(
|
||||||
|
z.object({
|
||||||
|
expiresAt: z.date(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date().nullable(),
|
||||||
|
userId: z.string(),
|
||||||
|
accessToken: z.string(),
|
||||||
|
refreshToken: z.string().nullable(),
|
||||||
|
provider: z.string(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.query(async ({ ctx }) => {
|
||||||
|
const user = ctx.user;
|
||||||
|
|
||||||
if (!user)
|
if (!user)
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
message: "User not authenticated",
|
message: "User not authenticated",
|
||||||
code: "UNAUTHORIZED",
|
code: "UNAUTHORIZED",
|
||||||
});
|
});
|
||||||
|
|
||||||
const integrations = await integrationsRepo.getProvidersForUser(
|
const integrations = await integrationsRepo.getProvidersForUser(
|
||||||
ctx.db,
|
ctx.db,
|
||||||
user.id,
|
user.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
return integrations;
|
return integrations;
|
||||||
}),
|
}),
|
||||||
disconnect: protectedProcedure
|
disconnect: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
openapi: {
|
openapi: {
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ import * as labelRepo from "@kan/db/repository/label.repo";
|
|||||||
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
||||||
import { assertUserInWorkspace } from "../utils/auth";
|
import { assertUserInWorkspace } from "../utils/auth";
|
||||||
|
|
||||||
|
const labelSchema = z.object({
|
||||||
|
publicId: z.string(),
|
||||||
|
name: z.string(),
|
||||||
|
colourCode: z.string().nullable(),
|
||||||
|
});
|
||||||
|
|
||||||
export const labelRouter = createTRPCRouter({
|
export const labelRouter = createTRPCRouter({
|
||||||
byPublicId: protectedProcedure
|
byPublicId: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
@@ -21,7 +27,7 @@ export const labelRouter = createTRPCRouter({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
.input(z.object({ labelPublicId: z.string().min(12) }))
|
.input(z.object({ labelPublicId: z.string().min(12) }))
|
||||||
.output(z.custom<Awaited<ReturnType<typeof labelRepo.getByPublicId>>>())
|
.output(labelSchema)
|
||||||
.query(async ({ ctx, input }) => {
|
.query(async ({ ctx, input }) => {
|
||||||
const userId = ctx.user?.id;
|
const userId = ctx.user?.id;
|
||||||
|
|
||||||
@@ -52,7 +58,11 @@ export const labelRouter = createTRPCRouter({
|
|||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return {
|
||||||
|
publicId: result.publicId,
|
||||||
|
name: result.name,
|
||||||
|
colourCode: result.colourCode,
|
||||||
|
};
|
||||||
}),
|
}),
|
||||||
create: protectedProcedure
|
create: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
@@ -72,7 +82,7 @@ export const labelRouter = createTRPCRouter({
|
|||||||
colourCode: z.string().length(7),
|
colourCode: z.string().length(7),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.output(z.custom<Awaited<ReturnType<typeof labelRepo.create>>>())
|
.output(labelSchema)
|
||||||
.mutation(async ({ ctx, input }) => {
|
.mutation(async ({ ctx, input }) => {
|
||||||
const userId = ctx.user?.id;
|
const userId = ctx.user?.id;
|
||||||
|
|
||||||
@@ -108,7 +118,11 @@ export const labelRouter = createTRPCRouter({
|
|||||||
code: "INTERNAL_SERVER_ERROR",
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return {
|
||||||
|
publicId: result.publicId,
|
||||||
|
name: result.name,
|
||||||
|
colourCode: result.colourCode,
|
||||||
|
};
|
||||||
}),
|
}),
|
||||||
update: protectedProcedure
|
update: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
@@ -128,7 +142,7 @@ export const labelRouter = createTRPCRouter({
|
|||||||
colourCode: z.string().length(7),
|
colourCode: z.string().length(7),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.output(z.custom<Awaited<ReturnType<typeof labelRepo.update>>>())
|
.output(labelSchema)
|
||||||
.mutation(async ({ ctx, input }) => {
|
.mutation(async ({ ctx, input }) => {
|
||||||
const userId = ctx.user?.id;
|
const userId = ctx.user?.id;
|
||||||
|
|
||||||
@@ -153,7 +167,17 @@ export const labelRouter = createTRPCRouter({
|
|||||||
|
|
||||||
const result = await labelRepo.update(ctx.db, input);
|
const result = await labelRepo.update(ctx.db, input);
|
||||||
|
|
||||||
return result;
|
if (!result)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Failed to update label`,
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
publicId: result.publicId,
|
||||||
|
name: result.name,
|
||||||
|
colourCode: result.colourCode,
|
||||||
|
};
|
||||||
}),
|
}),
|
||||||
delete: protectedProcedure
|
delete: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { TRPCError } from "@trpc/server";
|
import { TRPCError } from "@trpc/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
import { authClient } from "@kan/auth/client";
|
|
||||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||||
import * as userRepo from "@kan/db/repository/user.repo";
|
import * as userRepo from "@kan/db/repository/user.repo";
|
||||||
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||||
@@ -57,7 +56,7 @@ export const memberRouter = createTRPCRouter({
|
|||||||
if (isInvitedEmailAlreadyMember) {
|
if (isInvitedEmailAlreadyMember) {
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
message: `User with email ${input.email} is already a member of this workspace`,
|
message: `User with email ${input.email} is already a member of this workspace`,
|
||||||
code: "BAD_REQUEST",
|
code: "CONFLICT",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,16 +77,28 @@ export const memberRouter = createTRPCRouter({
|
|||||||
code: "INTERNAL_SERVER_ERROR",
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
});
|
});
|
||||||
|
|
||||||
const { error } = await authClient.signIn.magicLink({
|
const { status } = await ctx.auth.api.signInMagicLink({
|
||||||
email: input.email,
|
email: input.email,
|
||||||
callbackURL: `/boards?type=invite&memberPublicId=${invite.publicId}`,
|
callbackURL: `/boards?type=invite&memberPublicId=${invite.publicId}`,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error)
|
if (!status) {
|
||||||
|
console.error("Failed to send magic link invitation:", {
|
||||||
|
email: input.email,
|
||||||
|
callbackURL: `/boards?type=invite&memberPublicId=${invite.publicId}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
await memberRepo.softDelete(ctx.db, {
|
||||||
|
memberId: invite.id,
|
||||||
|
deletedAt: new Date(),
|
||||||
|
deletedBy: userId,
|
||||||
|
});
|
||||||
|
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
message: `Failed to send magic link to user with email ${input.email}`,
|
message: `Failed to send magic link invitation to user with email ${input.email}.`,
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return invite;
|
return invite;
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -20,58 +20,73 @@ export interface User {
|
|||||||
stripeCustomerId?: string | null | undefined;
|
stripeCustomerId?: string | null | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createAuthWithHeaders = (
|
||||||
|
auth: ReturnType<typeof initAuth>,
|
||||||
|
headers: Headers,
|
||||||
|
) => {
|
||||||
|
return {
|
||||||
|
api: {
|
||||||
|
getSession: () => auth.api.getSession({ headers }),
|
||||||
|
signInMagicLink: (input: { email: string; callbackURL: string }) =>
|
||||||
|
auth.api.signInMagicLink({
|
||||||
|
headers,
|
||||||
|
body: { email: input.email, callbackURL: input.callbackURL },
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
interface CreateContextOptions {
|
interface CreateContextOptions {
|
||||||
user: User | null | undefined;
|
user: User | null | undefined;
|
||||||
db: dbClient;
|
db: dbClient;
|
||||||
|
auth: ReturnType<typeof createAuthWithHeaders>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createInnerTRPCContext = (opts: CreateContextOptions) => {
|
export const createInnerTRPCContext = (opts: CreateContextOptions) => {
|
||||||
return {
|
return {
|
||||||
user: opts.user,
|
user: opts.user,
|
||||||
db: opts.db,
|
db: opts.db,
|
||||||
|
auth: opts.auth,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createTRPCContext = async ({ req }: CreateNextContextOptions) => {
|
export const createTRPCContext = async ({ req }: CreateNextContextOptions) => {
|
||||||
const db = createDrizzleClient();
|
const db = createDrizzleClient();
|
||||||
const auth = initAuth(db);
|
const baseAuth = initAuth(db);
|
||||||
|
const headers = new Headers(req.headers as Record<string, string>);
|
||||||
|
const auth = createAuthWithHeaders(baseAuth, headers);
|
||||||
|
|
||||||
const session = await auth.api.getSession({
|
const session = await auth.api.getSession();
|
||||||
// @ts-expect-error
|
|
||||||
headers: new Headers(req.headers),
|
|
||||||
});
|
|
||||||
|
|
||||||
return createInnerTRPCContext({ db, user: session?.user });
|
return createInnerTRPCContext({ db, user: session?.user, auth });
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createNextApiContext = async (req: NextApiRequest) => {
|
export const createNextApiContext = async (req: NextApiRequest) => {
|
||||||
const db = createDrizzleClient();
|
const db = createDrizzleClient();
|
||||||
const auth = initAuth(db);
|
const baseAuth = initAuth(db);
|
||||||
|
const headers = new Headers(req.headers as Record<string, string>);
|
||||||
|
const auth = createAuthWithHeaders(baseAuth, headers);
|
||||||
|
|
||||||
const session = await auth.api.getSession({
|
const session = await auth.api.getSession();
|
||||||
// @ts-expect-error
|
|
||||||
headers: new Headers(req.headers),
|
|
||||||
});
|
|
||||||
|
|
||||||
return createInnerTRPCContext({ db, user: session?.user });
|
return createInnerTRPCContext({ db, user: session?.user, auth });
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createRESTContext = async ({ req }: CreateNextContextOptions) => {
|
export const createRESTContext = async ({ req }: CreateNextContextOptions) => {
|
||||||
const db = createDrizzleClient();
|
const db = createDrizzleClient();
|
||||||
const auth = initAuth(db);
|
const baseAuth = initAuth(db);
|
||||||
|
const headers = new Headers(req.headers as Record<string, string>);
|
||||||
|
const auth = createAuthWithHeaders(baseAuth, headers);
|
||||||
|
|
||||||
let session;
|
let session;
|
||||||
try {
|
try {
|
||||||
session = await auth.api.getSession({
|
session = await auth.api.getSession();
|
||||||
// @ts-expect-error
|
|
||||||
headers: new Headers(req.headers),
|
|
||||||
});
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error getting session, ", error);
|
console.error("Error getting session, ", error);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return createInnerTRPCContext({ db, user: session?.user });
|
return createInnerTRPCContext({ db, user: session?.user, auth });
|
||||||
};
|
};
|
||||||
|
|
||||||
const t = initTRPC
|
const t = initTRPC
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import type { dbClient } from "@kan/db/client";
|
|||||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||||
import * as userRepo from "@kan/db/repository/user.repo";
|
import * as userRepo from "@kan/db/repository/user.repo";
|
||||||
import * as schema from "@kan/db/schema";
|
import * as schema from "@kan/db/schema";
|
||||||
import { sendEmail } from "@kan/email";
|
import { cloudMailerClient, sendEmail } from "@kan/email";
|
||||||
import { createStripeClient } from "@kan/stripe";
|
import { createStripeClient } from "@kan/stripe";
|
||||||
|
|
||||||
export const configuredProviders = socialProviderList.reduce<
|
export const configuredProviders = socialProviderList.reduce<
|
||||||
@@ -84,7 +84,7 @@ export const socialProvidersPlugin = () => ({
|
|||||||
method: "GET",
|
method: "GET",
|
||||||
},
|
},
|
||||||
async (ctx) =>
|
async (ctx) =>
|
||||||
ctx.json(ctx.context.socialProviders.map((p) => p.name.toLowerCase())),
|
ctx.json(ctx.context.socialProviders.map((p) => p.id.toLowerCase())),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -166,13 +166,34 @@ export const initAuth = (db: dbClient) => {
|
|||||||
databaseHooks: {
|
databaseHooks: {
|
||||||
user: {
|
user: {
|
||||||
create: {
|
create: {
|
||||||
before() {
|
async before(user) {
|
||||||
if (env("NEXT_PUBLIC_DISABLE_SIGN_UP")?.toLowerCase() === "true") {
|
if (env("NEXT_PUBLIC_DISABLE_SIGN_UP")?.toLowerCase() === "true") {
|
||||||
return Promise.resolve(false);
|
const pendingInvitation = await memberRepo.getByEmailAndStatus(
|
||||||
|
db,
|
||||||
|
user.email,
|
||||||
|
"invited",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!pendingInvitation) {
|
||||||
|
return Promise.resolve(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve(true);
|
||||||
}
|
}
|
||||||
return Promise.resolve(true);
|
return Promise.resolve(true);
|
||||||
},
|
},
|
||||||
async after(user) {
|
async after(user) {
|
||||||
|
if (cloudMailerClient) {
|
||||||
|
await cloudMailerClient.events.track({
|
||||||
|
event: "user-signup",
|
||||||
|
email: user.email,
|
||||||
|
data: {
|
||||||
|
name: user.name,
|
||||||
|
userId: user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
user.image &&
|
user.image &&
|
||||||
!user.image.includes(process.env.NEXT_PUBLIC_STORAGE_DOMAIN!)
|
!user.image.includes(process.env.NEXT_PUBLIC_STORAGE_DOMAIN!)
|
||||||
@@ -181,6 +202,7 @@ export const initAuth = (db: dbClient) => {
|
|||||||
const client = new S3Client({
|
const client = new S3Client({
|
||||||
region: env("S3_REGION") ?? "",
|
region: env("S3_REGION") ?? "",
|
||||||
endpoint: env("S3_ENDPOINT") ?? "",
|
endpoint: env("S3_ENDPOINT") ?? "",
|
||||||
|
forcePathStyle: env("S3_FORCE_PATH_STYLE") === "true",
|
||||||
credentials: {
|
credentials: {
|
||||||
accessKeyId: env("S3_ACCESS_KEY_ID") ?? "",
|
accessKeyId: env("S3_ACCESS_KEY_ID") ?? "",
|
||||||
secretAccessKey: env("S3_SECRET_ACCESS_KEY") ?? "",
|
secretAccessKey: env("S3_SECRET_ACCESS_KEY") ?? "",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { and, asc, desc, eq, exists, inArray, isNull, or, sql } from "drizzle-orm";
|
import { and, asc, desc, eq, inArray, isNull, or } from "drizzle-orm";
|
||||||
|
|
||||||
import type { dbClient } from "@kan/db/client";
|
import type { dbClient } from "@kan/db/client";
|
||||||
import type { BoardVisibilityStatus } from "@kan/db/schema";
|
import type { BoardVisibilityStatus } from "@kan/db/schema";
|
||||||
@@ -201,6 +201,7 @@ export const getByPublicId = async (
|
|||||||
export const getBySlug = async (
|
export const getBySlug = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
boardSlug: string,
|
boardSlug: string,
|
||||||
|
workspaceId: number,
|
||||||
filters: {
|
filters: {
|
||||||
members: string[];
|
members: string[];
|
||||||
labels: string[];
|
labels: string[];
|
||||||
@@ -293,6 +294,7 @@ export const getBySlug = async (
|
|||||||
},
|
},
|
||||||
where: and(
|
where: and(
|
||||||
eq(boards.slug, boardSlug),
|
eq(boards.slug, boardSlug),
|
||||||
|
eq(boards.workspaceId, workspaceId),
|
||||||
isNull(boards.deletedAt),
|
isNull(boards.deletedAt),
|
||||||
eq(boards.visibility, "public"),
|
eq(boards.visibility, "public"),
|
||||||
),
|
),
|
||||||
@@ -481,30 +483,18 @@ export const getWorkspaceAndBoardIdByBoardPublicId = async (
|
|||||||
export const isBoardSlugAvailable = async (
|
export const isBoardSlugAvailable = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
boardSlug: string,
|
boardSlug: string,
|
||||||
boardPublicId: string,
|
workspaceId: number,
|
||||||
) => {
|
) => {
|
||||||
const result = await db
|
const result = await db.query.boards.findFirst({
|
||||||
.select({ id: boards.id })
|
columns: {
|
||||||
.from(boards)
|
id: true,
|
||||||
.where(
|
},
|
||||||
and(
|
where: and(
|
||||||
eq(boards.publicId, boardPublicId),
|
eq(boards.slug, boardSlug),
|
||||||
exists(
|
eq(boards.workspaceId, workspaceId),
|
||||||
db
|
isNull(boards.deletedAt),
|
||||||
.select({ id: boards.id })
|
),
|
||||||
.from(boards)
|
});
|
||||||
.where(
|
|
||||||
and(
|
|
||||||
eq(boards.slug, boardSlug),
|
|
||||||
eq(boards.workspaceId, sql`${boards.workspaceId}`), // Reference outer query's workspaceId
|
|
||||||
isNull(boards.deletedAt),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.limit(1),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.limit(1);
|
|
||||||
|
|
||||||
return result.length === 0;
|
return result === undefined;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,7 +23,12 @@ export const create = async (
|
|||||||
createdBy: labelInput.createdBy,
|
createdBy: labelInput.createdBy,
|
||||||
boardId: labelInput.boardId,
|
boardId: labelInput.boardId,
|
||||||
})
|
})
|
||||||
.returning({ id: labels.id });
|
.returning({
|
||||||
|
id: labels.id,
|
||||||
|
publicId: labels.publicId,
|
||||||
|
name: labels.name,
|
||||||
|
colourCode: labels.colourCode,
|
||||||
|
});
|
||||||
|
|
||||||
if (labelInput.cardId && result) {
|
if (labelInput.cardId && result) {
|
||||||
await db.insert(cardsToLabels).values({
|
await db.insert(cardsToLabels).values({
|
||||||
@@ -91,6 +96,7 @@ export const update = async (
|
|||||||
.where(eq(labels.publicId, labelInput.labelPublicId))
|
.where(eq(labels.publicId, labelInput.labelPublicId))
|
||||||
.returning({
|
.returning({
|
||||||
id: labels.id,
|
id: labels.id,
|
||||||
|
publicId: labels.publicId,
|
||||||
name: labels.name,
|
name: labels.name,
|
||||||
colourCode: labels.colourCode,
|
colourCode: labels.colourCode,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -41,6 +41,20 @@ export const getByPublicId = async (db: dbClient, publicId: string) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getByEmailAndStatus = async (
|
||||||
|
db: dbClient,
|
||||||
|
email: string,
|
||||||
|
status: MemberStatus,
|
||||||
|
) => {
|
||||||
|
return db.query.workspaceMembers.findFirst({
|
||||||
|
where: and(
|
||||||
|
eq(workspaceMembers.email, email),
|
||||||
|
eq(workspaceMembers.status, status),
|
||||||
|
isNull(workspaceMembers.deletedAt),
|
||||||
|
),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const acceptInvite = async (
|
export const acceptInvite = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
args: { memberId: number; userId: string },
|
args: { memberId: number; userId: string },
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@plunk/node": "^3.0.3",
|
||||||
"@react-email/components": "^0.0.25",
|
"@react-email/components": "^0.0.25",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.3",
|
||||||
"react-email": "^3.0.1"
|
"react-email": "^3.0.1"
|
||||||
|
|||||||
8
packages/email/src/cloudMailerClient.tsx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import Plunk from "@plunk/node";
|
||||||
|
|
||||||
|
export const cloudMailerClient =
|
||||||
|
process.env.NEXT_PUBLIC_KAN_ENV === "cloud"
|
||||||
|
? new Plunk(process.env.PLUNK_API_KEY ?? "", {
|
||||||
|
baseUrl: process.env.PLUNK_API_URL,
|
||||||
|
})
|
||||||
|
: null;
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
export const name = "email";
|
export const name = "email";
|
||||||
|
|
||||||
export { sendEmail } from "./sendEmail";
|
export { sendEmail } from "./sendEmail";
|
||||||
|
export { cloudMailerClient } from "./cloudMailerClient";
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { render } from "@react-email/render";
|
import { render } from "@react-email/render";
|
||||||
import nodemailer from "nodemailer";
|
import nodemailer from "nodemailer";
|
||||||
|
|
||||||
|
import { cloudMailerClient } from "./cloudMailerClient";
|
||||||
import JoinWorkspaceTemplate from "./templates/join-workspace";
|
import JoinWorkspaceTemplate from "./templates/join-workspace";
|
||||||
import MagicLinkTemplate from "./templates/magic-link";
|
import MagicLinkTemplate from "./templates/magic-link";
|
||||||
import ResetPasswordTemplate from "./templates/reset-password";
|
import ResetPasswordTemplate from "./templates/reset-password";
|
||||||
@@ -44,6 +45,15 @@ export const sendEmail = async (
|
|||||||
html,
|
html,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (cloudMailerClient) {
|
||||||
|
const response = await cloudMailerClient.emails.send({
|
||||||
|
...options,
|
||||||
|
body: html,
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
const response = await transporter.sendMail(options);
|
const response = await transporter.sendMail(options);
|
||||||
|
|
||||||
if (!response.accepted.length) {
|
if (!response.accepted.length) {
|
||||||
|
|||||||
166
pnpm-lock.yaml
generated
@@ -10,14 +10,14 @@ catalogs:
|
|||||||
specifier: ^5.59.15
|
specifier: ^5.59.15
|
||||||
version: 5.62.7
|
version: 5.62.7
|
||||||
'@trpc/client':
|
'@trpc/client':
|
||||||
specifier: ^11.0.0-rc.477
|
specifier: ^11.4.3
|
||||||
version: 11.0.0-rc.660
|
version: 11.4.3
|
||||||
'@trpc/react-query':
|
'@trpc/react-query':
|
||||||
specifier: ^11.0.0-rc.477
|
specifier: ^11.4.3
|
||||||
version: 11.0.0-rc.660
|
version: 11.4.3
|
||||||
'@trpc/server':
|
'@trpc/server':
|
||||||
specifier: ^11.0.0-rc.477
|
specifier: ^11.4.3
|
||||||
version: 11.0.0-rc.660
|
version: 11.4.3
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^9.12.0
|
specifier: ^9.12.0
|
||||||
version: 9.16.0
|
version: 9.16.0
|
||||||
@@ -140,16 +140,16 @@ importers:
|
|||||||
version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
||||||
'@trpc/client':
|
'@trpc/client':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
|
version: 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
|
||||||
'@trpc/next':
|
'@trpc/next':
|
||||||
specifier: ^11.0.0-rc.660
|
specifier: ^11.0.0-rc.660
|
||||||
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
||||||
'@trpc/react-query':
|
'@trpc/react-query':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
version: 11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
||||||
'@trpc/server':
|
'@trpc/server':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 11.0.0-rc.660(typescript@5.7.2)
|
version: 11.4.3(typescript@5.7.2)
|
||||||
aws-sdk:
|
aws-sdk:
|
||||||
specifier: ^2.1692.0
|
specifier: ^2.1692.0
|
||||||
version: 2.1692.0
|
version: 2.1692.0
|
||||||
@@ -291,13 +291,13 @@ importers:
|
|||||||
version: link:../stripe
|
version: link:../stripe
|
||||||
'@trpc/server':
|
'@trpc/server':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 11.0.0-rc.660(typescript@5.7.2)
|
version: 11.4.3(typescript@5.7.2)
|
||||||
superjson:
|
superjson:
|
||||||
specifier: 2.2.1
|
specifier: 2.2.1
|
||||||
version: 2.2.1
|
version: 2.2.1
|
||||||
trpc-to-openapi:
|
trpc-to-openapi:
|
||||||
specifier: ^2.1.0
|
specifier: ^2.3.2
|
||||||
version: 2.1.0(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0)
|
version: 2.3.2(@trpc/server@11.4.3(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0)
|
||||||
zod:
|
zod:
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 3.24.0
|
version: 3.24.0
|
||||||
@@ -409,6 +409,9 @@ importers:
|
|||||||
|
|
||||||
packages/email:
|
packages/email:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@plunk/node':
|
||||||
|
specifier: ^3.0.3
|
||||||
|
version: 3.0.3
|
||||||
'@react-email/components':
|
'@react-email/components':
|
||||||
specifier: ^0.0.25
|
specifier: ^0.0.25
|
||||||
version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
@@ -2194,6 +2197,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
'@plunk/node@3.0.3':
|
||||||
|
resolution: {integrity: sha512-f3NT418/EdLjebQ4arAwR64cnz7d5H7i1CeKh8+B0cVBrwzHvF+Q+QkhutF+FAp49yuI/BYc71qQH+RFc2fxxQ==}
|
||||||
|
|
||||||
'@popperjs/core@2.11.8':
|
'@popperjs/core@2.11.8':
|
||||||
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
||||||
|
|
||||||
@@ -2818,11 +2824,11 @@ packages:
|
|||||||
'@tootallnate/quickjs-emscripten@0.23.0':
|
'@tootallnate/quickjs-emscripten@0.23.0':
|
||||||
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
|
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
|
||||||
|
|
||||||
'@trpc/client@11.0.0-rc.660':
|
'@trpc/client@11.4.3':
|
||||||
resolution: {integrity: sha512-bNpkZEfyMGKHynYFxdLpY8nJ1n7E3JHKcd4Pe2cagmpkzOEF9tFT3kzNf+eLI8XMG8196lTRR0J0W2/1Q8/cug==}
|
resolution: {integrity: sha512-i2suttUCfColktXT8bqex5kHW5jpT15nwUh0hGSDiW1keN621kSUQKcLJ095blqQAUgB+lsmgSqSMmB4L9shQQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@trpc/server': 11.0.0-rc.660+74625d5e4
|
'@trpc/server': 11.4.3
|
||||||
typescript: '>=5.6.2'
|
typescript: '>=5.7.2'
|
||||||
|
|
||||||
'@trpc/next@11.0.0-rc.660':
|
'@trpc/next@11.0.0-rc.660':
|
||||||
resolution: {integrity: sha512-LQHdiVED8h+CJEAy/X9PDmY3fM8VPdZ+3bVkbmEiP4xoNnSKRTbSbknFyRzG9M2AogfIafF4zAZVwOvCxexyGw==}
|
resolution: {integrity: sha512-LQHdiVED8h+CJEAy/X9PDmY3fM8VPdZ+3bVkbmEiP4xoNnSKRTbSbknFyRzG9M2AogfIafF4zAZVwOvCxexyGw==}
|
||||||
@@ -2841,20 +2847,20 @@ packages:
|
|||||||
'@trpc/react-query':
|
'@trpc/react-query':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@trpc/react-query@11.0.0-rc.660':
|
'@trpc/react-query@11.4.3':
|
||||||
resolution: {integrity: sha512-U2BHtYVt+8jt0a8Nrrk5cep8O1UZRxtTCBHtXie9kmJyQWWml43KfHxL5ssnFywaFrDZQz6Ec7kIoOxR/CQNfg==}
|
resolution: {integrity: sha512-z+jhAiOBD22NNhHtvF0iFp9hO36YFA7M8AiUu/XtNmMxyLd3Y9/d1SMjMwlTdnGqxEGPo41VEWBrdhDUGtUuHg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@tanstack/react-query': ^5.59.15
|
'@tanstack/react-query': ^5.80.3
|
||||||
'@trpc/client': 11.0.0-rc.660+74625d5e4
|
'@trpc/client': 11.4.3
|
||||||
'@trpc/server': 11.0.0-rc.660+74625d5e4
|
'@trpc/server': 11.4.3
|
||||||
react: '>=18.2.0'
|
react: '>=18.2.0'
|
||||||
react-dom: '>=18.2.0'
|
react-dom: '>=18.2.0'
|
||||||
typescript: '>=5.6.2'
|
typescript: '>=5.7.2'
|
||||||
|
|
||||||
'@trpc/server@11.0.0-rc.660':
|
'@trpc/server@11.4.3':
|
||||||
resolution: {integrity: sha512-QUapcZCNOpHT7ng9LceGc9ImkboWd0Go9ryrduZpL+p4jdfaC6409AQ3x4XEW6Wu3yBmZAn4CywCsDrDhjDy/w==}
|
resolution: {integrity: sha512-wnWq3wiLlMOlYkaIZz+qbuYA5udPTLS4GVVRyFkr6aT83xpdCHyVtURT+u4hSoIrOXQM9OPCNXSXsAujWZDdaw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '>=5.6.2'
|
typescript: '>=5.7.2'
|
||||||
|
|
||||||
'@tsconfig/node10@1.0.11':
|
'@tsconfig/node10@1.0.11':
|
||||||
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
|
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
|
||||||
@@ -3575,10 +3581,6 @@ packages:
|
|||||||
config-chain@1.1.13:
|
config-chain@1.1.13:
|
||||||
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
|
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
|
||||||
|
|
||||||
consola@3.2.3:
|
|
||||||
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
|
|
||||||
engines: {node: ^14.18.0 || >=16.10.0}
|
|
||||||
|
|
||||||
constant-case@2.0.0:
|
constant-case@2.0.0:
|
||||||
resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==}
|
resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==}
|
||||||
|
|
||||||
@@ -3629,8 +3631,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
crossws@0.3.1:
|
crossws@0.3.5:
|
||||||
resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==}
|
resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
|
||||||
|
|
||||||
css-box-model@1.2.1:
|
css-box-model@1.2.1:
|
||||||
resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
|
resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
|
||||||
@@ -4444,8 +4446,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
|
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
|
||||||
engines: {node: '>=6.0'}
|
engines: {node: '>=6.0'}
|
||||||
|
|
||||||
h3@1.13.0:
|
h3@1.15.1:
|
||||||
resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==}
|
resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==}
|
||||||
|
|
||||||
handlebars@4.7.8:
|
handlebars@4.7.8:
|
||||||
resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
|
resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
|
||||||
@@ -4977,9 +4979,6 @@ packages:
|
|||||||
lodash.castarray@4.4.0:
|
lodash.castarray@4.4.0:
|
||||||
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
|
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
|
||||||
|
|
||||||
lodash.clonedeep@4.5.0:
|
|
||||||
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
|
|
||||||
|
|
||||||
lodash.get@4.4.2:
|
lodash.get@4.4.2:
|
||||||
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
|
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
|
||||||
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
|
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
|
||||||
@@ -5340,11 +5339,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mime@3.0.0:
|
|
||||||
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
|
||||||
engines: {node: '>=10.0.0'}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
mimic-fn@2.1.0:
|
mimic-fn@2.1.0:
|
||||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -5497,9 +5491,6 @@ packages:
|
|||||||
no-case@2.3.2:
|
no-case@2.3.2:
|
||||||
resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==}
|
resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==}
|
||||||
|
|
||||||
node-fetch-native@1.6.4:
|
|
||||||
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
|
|
||||||
|
|
||||||
node-fetch@2.7.0:
|
node-fetch@2.7.0:
|
||||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||||
engines: {node: 4.x || >=6.0.0}
|
engines: {node: 4.x || >=6.0.0}
|
||||||
@@ -5513,6 +5504,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
|
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
node-mock-http@1.0.1:
|
||||||
|
resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==}
|
||||||
|
|
||||||
node-plop@0.26.3:
|
node-plop@0.26.3:
|
||||||
resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==}
|
resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==}
|
||||||
engines: {node: '>=8.9.4'}
|
engines: {node: '>=8.9.4'}
|
||||||
@@ -5576,9 +5570,6 @@ packages:
|
|||||||
obuf@1.1.2:
|
obuf@1.1.2:
|
||||||
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
|
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
|
||||||
|
|
||||||
ohash@1.1.4:
|
|
||||||
resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
|
|
||||||
|
|
||||||
on-exit-leak-free@2.1.2:
|
on-exit-leak-free@2.1.2:
|
||||||
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
|
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
@@ -5597,8 +5588,8 @@ packages:
|
|||||||
openapi-types@12.1.3:
|
openapi-types@12.1.3:
|
||||||
resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==}
|
resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==}
|
||||||
|
|
||||||
openapi3-ts@4.3.3:
|
openapi3-ts@4.4.0:
|
||||||
resolution: {integrity: sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==}
|
resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==}
|
||||||
|
|
||||||
optionator@0.9.4:
|
optionator@0.9.4:
|
||||||
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
||||||
@@ -6736,12 +6727,12 @@ packages:
|
|||||||
trough@2.2.0:
|
trough@2.2.0:
|
||||||
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
|
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
|
||||||
|
|
||||||
trpc-to-openapi@2.1.0:
|
trpc-to-openapi@2.3.2:
|
||||||
resolution: {integrity: sha512-LODbI2a9LQamLpEz9hsqeMJBxpNT8KqfyICJhTVe8JBPZM8DvUkoICPlsdHf1KJVteoem/LlbwkD7loKYPWP1Q==}
|
resolution: {integrity: sha512-uDZou+5a+H77yhiqfzVRBXzTSX8/mQUGeFpr8+VtZmpzUBOmv5XYbyEtWpG7fOdGWZkB99wuuKeWUwNwwOGaXQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@trpc/server': ^11.0.0-rc.648
|
'@trpc/server': ^11.1.0
|
||||||
zod: ^3.23.8
|
zod: ^3.23.8
|
||||||
zod-openapi: ^4.1.0
|
zod-openapi: 4.2.4
|
||||||
|
|
||||||
ts-api-utils@1.4.3:
|
ts-api-utils@1.4.3:
|
||||||
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
|
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
|
||||||
@@ -6874,9 +6865,6 @@ packages:
|
|||||||
undici-types@6.19.8:
|
undici-types@6.19.8:
|
||||||
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
|
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
|
||||||
|
|
||||||
unenv@1.10.0:
|
|
||||||
resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
|
|
||||||
|
|
||||||
unified@10.1.2:
|
unified@10.1.2:
|
||||||
resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
|
resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
|
||||||
|
|
||||||
@@ -8928,6 +8916,10 @@ snapshots:
|
|||||||
'@pkgjs/parseargs@0.11.0':
|
'@pkgjs/parseargs@0.11.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
'@plunk/node@3.0.3':
|
||||||
|
dependencies:
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@popperjs/core@2.11.8': {}
|
'@popperjs/core@2.11.8': {}
|
||||||
|
|
||||||
'@react-aria/focus@3.19.0(react@18.3.1)':
|
'@react-aria/focus@3.19.0(react@18.3.1)':
|
||||||
@@ -9709,33 +9701,33 @@ snapshots:
|
|||||||
|
|
||||||
'@tootallnate/quickjs-emscripten@0.23.0': {}
|
'@tootallnate/quickjs-emscripten@0.23.0': {}
|
||||||
|
|
||||||
'@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)':
|
'@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
|
'@trpc/server': 11.4.3(typescript@5.7.2)
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
|
|
||||||
'@trpc/next@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
|
'@trpc/next@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@trpc/client': 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
|
'@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
|
||||||
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
|
'@trpc/server': 11.4.3(typescript@5.7.2)
|
||||||
next: 15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
next: 15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@tanstack/react-query': 5.62.7(react@18.3.1)
|
'@tanstack/react-query': 5.62.7(react@18.3.1)
|
||||||
'@trpc/react-query': 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
'@trpc/react-query': 11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
|
||||||
|
|
||||||
'@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
|
'@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tanstack/react-query': 5.62.7(react@18.3.1)
|
'@tanstack/react-query': 5.62.7(react@18.3.1)
|
||||||
'@trpc/client': 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
|
'@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
|
||||||
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
|
'@trpc/server': 11.4.3(typescript@5.7.2)
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
|
|
||||||
'@trpc/server@11.0.0-rc.660(typescript@5.7.2)':
|
'@trpc/server@11.4.3(typescript@5.7.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
|
|
||||||
@@ -10615,8 +10607,6 @@ snapshots:
|
|||||||
ini: 1.3.8
|
ini: 1.3.8
|
||||||
proto-list: 1.2.4
|
proto-list: 1.2.4
|
||||||
|
|
||||||
consola@3.2.3: {}
|
|
||||||
|
|
||||||
constant-case@2.0.0:
|
constant-case@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
snake-case: 2.1.0
|
snake-case: 2.1.0
|
||||||
@@ -10668,7 +10658,7 @@ snapshots:
|
|||||||
shebang-command: 2.0.0
|
shebang-command: 2.0.0
|
||||||
which: 2.0.2
|
which: 2.0.2
|
||||||
|
|
||||||
crossws@0.3.1:
|
crossws@0.3.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
uncrypto: 0.1.3
|
uncrypto: 0.1.3
|
||||||
|
|
||||||
@@ -11642,18 +11632,17 @@ snapshots:
|
|||||||
section-matter: 1.0.0
|
section-matter: 1.0.0
|
||||||
strip-bom-string: 1.0.0
|
strip-bom-string: 1.0.0
|
||||||
|
|
||||||
h3@1.13.0:
|
h3@1.15.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
cookie-es: 1.2.2
|
cookie-es: 1.2.2
|
||||||
crossws: 0.3.1
|
crossws: 0.3.5
|
||||||
defu: 6.1.4
|
defu: 6.1.4
|
||||||
destr: 2.0.3
|
destr: 2.0.3
|
||||||
iron-webcrypto: 1.2.1
|
iron-webcrypto: 1.2.1
|
||||||
ohash: 1.1.4
|
node-mock-http: 1.0.1
|
||||||
radix3: 1.1.2
|
radix3: 1.1.2
|
||||||
ufo: 1.5.4
|
ufo: 1.5.4
|
||||||
uncrypto: 0.1.3
|
uncrypto: 0.1.3
|
||||||
unenv: 1.10.0
|
|
||||||
|
|
||||||
handlebars@4.7.8:
|
handlebars@4.7.8:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -12195,8 +12184,6 @@ snapshots:
|
|||||||
|
|
||||||
lodash.castarray@4.4.0: {}
|
lodash.castarray@4.4.0: {}
|
||||||
|
|
||||||
lodash.clonedeep@4.5.0: {}
|
|
||||||
|
|
||||||
lodash.get@4.4.2: {}
|
lodash.get@4.4.2: {}
|
||||||
|
|
||||||
lodash.isplainobject@4.0.6: {}
|
lodash.isplainobject@4.0.6: {}
|
||||||
@@ -12938,8 +12925,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mime-db: 1.52.0
|
mime-db: 1.52.0
|
||||||
|
|
||||||
mime@3.0.0: {}
|
|
||||||
|
|
||||||
mimic-fn@2.1.0: {}
|
mimic-fn@2.1.0: {}
|
||||||
|
|
||||||
mini-svg-data-uri@1.4.4: {}
|
mini-svg-data-uri@1.4.4: {}
|
||||||
@@ -13076,8 +13061,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lower-case: 1.1.4
|
lower-case: 1.1.4
|
||||||
|
|
||||||
node-fetch-native@1.6.4: {}
|
|
||||||
|
|
||||||
node-fetch@2.7.0:
|
node-fetch@2.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
whatwg-url: 5.0.0
|
whatwg-url: 5.0.0
|
||||||
@@ -13085,6 +13068,8 @@ snapshots:
|
|||||||
node-gyp-build@4.8.4:
|
node-gyp-build@4.8.4:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
node-mock-http@1.0.1: {}
|
||||||
|
|
||||||
node-plop@0.26.3:
|
node-plop@0.26.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime-corejs3': 7.26.0
|
'@babel/runtime-corejs3': 7.26.0
|
||||||
@@ -13155,8 +13140,6 @@ snapshots:
|
|||||||
|
|
||||||
obuf@1.1.2: {}
|
obuf@1.1.2: {}
|
||||||
|
|
||||||
ohash@1.1.4: {}
|
|
||||||
|
|
||||||
on-exit-leak-free@2.1.2: {}
|
on-exit-leak-free@2.1.2: {}
|
||||||
|
|
||||||
once@1.4.0:
|
once@1.4.0:
|
||||||
@@ -13175,7 +13158,7 @@ snapshots:
|
|||||||
|
|
||||||
openapi-types@12.1.3: {}
|
openapi-types@12.1.3: {}
|
||||||
|
|
||||||
openapi3-ts@4.3.3:
|
openapi3-ts@4.4.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
yaml: 2.6.1
|
yaml: 2.6.1
|
||||||
|
|
||||||
@@ -14518,13 +14501,12 @@ snapshots:
|
|||||||
|
|
||||||
trough@2.2.0: {}
|
trough@2.2.0: {}
|
||||||
|
|
||||||
trpc-to-openapi@2.1.0(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0):
|
trpc-to-openapi@2.3.2(@trpc/server@11.4.3(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
|
'@trpc/server': 11.4.3(typescript@5.7.2)
|
||||||
co-body: 6.2.0
|
co-body: 6.2.0
|
||||||
h3: 1.13.0
|
h3: 1.15.1
|
||||||
lodash.clonedeep: 4.5.0
|
openapi3-ts: 4.4.0
|
||||||
openapi3-ts: 4.3.3
|
|
||||||
zod: 3.24.0
|
zod: 3.24.0
|
||||||
zod-openapi: 4.1.0(zod@3.24.0)
|
zod-openapi: 4.1.0(zod@3.24.0)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@@ -14668,14 +14650,6 @@ snapshots:
|
|||||||
|
|
||||||
undici-types@6.19.8: {}
|
undici-types@6.19.8: {}
|
||||||
|
|
||||||
unenv@1.10.0:
|
|
||||||
dependencies:
|
|
||||||
consola: 3.2.3
|
|
||||||
defu: 6.1.4
|
|
||||||
mime: 3.0.0
|
|
||||||
node-fetch-native: 1.6.4
|
|
||||||
pathe: 1.1.2
|
|
||||||
|
|
||||||
unified@10.1.2:
|
unified@10.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/unist': 2.0.11
|
'@types/unist': 2.0.11
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ packages:
|
|||||||
|
|
||||||
catalog:
|
catalog:
|
||||||
"@tanstack/react-query": ^5.59.15
|
"@tanstack/react-query": ^5.59.15
|
||||||
"@trpc/client": ^11.0.0-rc.477
|
"@trpc/client": ^11.4.3
|
||||||
"@trpc/react-query": ^11.0.0-rc.477
|
"@trpc/react-query": ^11.4.3
|
||||||
"@trpc/server": ^11.0.0-rc.477
|
"@trpc/server": ^11.4.3
|
||||||
eslint: ^9.12.0
|
eslint: ^9.12.0
|
||||||
prettier: ^3.3.3
|
prettier: ^3.3.3
|
||||||
tailwindcss: ^3.4.14
|
tailwindcss: ^3.4.14
|
||||||
|
|||||||
@@ -106,9 +106,12 @@
|
|||||||
"S3_ACCESS_KEY_ID",
|
"S3_ACCESS_KEY_ID",
|
||||||
"S3_SECRET_ACCESS_KEY",
|
"S3_SECRET_ACCESS_KEY",
|
||||||
"S3_ENDPOINT",
|
"S3_ENDPOINT",
|
||||||
|
"S3_FORCE_PATH_STYLE",
|
||||||
"PORT",
|
"PORT",
|
||||||
"BETTER_AUTH_SECRET",
|
"BETTER_AUTH_SECRET",
|
||||||
"BETTER_AUTH_TRUSTED_ORIGINS"
|
"BETTER_AUTH_TRUSTED_ORIGINS",
|
||||||
|
"PLUNK_API_KEY",
|
||||||
|
"PLUNK_API_URL"
|
||||||
],
|
],
|
||||||
"globalPassThroughEnv": [
|
"globalPassThroughEnv": [
|
||||||
"NODE_ENV",
|
"NODE_ENV",
|
||||||
|
|||||||