Compare commits

...

7 Commits

Author SHA1 Message Date
Henry
4f4f507b58 fix: toggle spacing 2026-04-17 22:19:41 +01:00
Henry
d839195ad2 refactor: clean up 2026-04-17 22:07:55 +01:00
Henry
9815b5f273 feat(cloud): enable upgrading new and existing workspaces onto team/pro 2026-04-17 21:45:04 +01:00
Henry
25490b2223 feat(cloud): temporarily disable context menu 2026-04-11 08:17:59 +01:00
hjball
b3108942db chore: compile translations 2026-04-11 07:01:09 +00:00
hjball
2ba759966e chore: update translations 2026-04-11 07:01:05 +00:00
Henry
7045cd8e25 feat(cloud): improved workspace onboarding (#462)
* feat: setup onboarding and select plan page

* feat: add workspace details step

* refactor: optimize board rendering in workspace details

* feat: tweak padding in boards mockup

* fix: validate/convert slug input

* refactor: tweak onboarding steps UX

* feat: add team to workspace plans

* feat: allow setting description when creating a workspace

* feat: add logging to next api routes

* feat: create worspace on checkout.session.completed

* chore: update types

* refactor: improve webhook logs

* feat: create workspace on successful activation

* feat: set slug on workspace name change

* feat: add returnUrl params
2026-04-11 07:59:26 +01:00
54 changed files with 7512 additions and 741 deletions

View File

@@ -103,9 +103,9 @@ checksums:
tMYIu7/message: 8b1f0bb96a905646ecfad1cfdfa42168
tMYIu7/origin/0/0: d77eb1f90f2fa86a55181629d88d237a
tMYIu7/translation: 8b1f0bb96a905646ecfad1cfdfa42168
UGCIzB/translation: f7b6699c16726afc48f1e1d1339b2e7e
UGCIzB/message: f7b6699c16726afc48f1e1d1339b2e7e
UGCIzB/origin/0/0: 0eeeb7e68164ff118040918f1ef00a7a
UGCIzB/translation: f7b6699c16726afc48f1e1d1339b2e7e
B3xxao/message: 9d80becc4fe65a74e0004e4fd290735d
B3xxao/origin/0/0: 6812b79a8fdc3527586b523d4c137340
B3xxao/translation: 9d80becc4fe65a74e0004e4fd290735d
@@ -238,6 +238,9 @@ checksums:
ZXSPJt/message: 1b5749b0cca6a62d75a577bee6804074
ZXSPJt/origin/0/0: 0627e0040ca4939c9a57349e98c51797
ZXSPJt/translation: 1b5749b0cca6a62d75a577bee6804074
YkfDoz/translation: 5d4f1c56f4e9e579ec9967ca68cc64ac
YkfDoz/message: 5d4f1c56f4e9e579ec9967ca68cc64ac
YkfDoz/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
3bqt9U/message: 2366ed295eb2c03c425559c24cb31606
3bqt9U/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
3bqt9U/translation: 2366ed295eb2c03c425559c24cb31606
@@ -319,6 +322,9 @@ checksums:
1rWxEw/message: 122c108794f321c10e05a08f09b11457
1rWxEw/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
1rWxEw/translation: 122c108794f321c10e05a08f09b11457
iH8pgl/translation: f541015a827e37cb3b1234e56bc2aa3c
iH8pgl/message: f541015a827e37cb3b1234e56bc2aa3c
iH8pgl/origin/0/0: 69d8634b177fdf937764b406fd477547
KNKCTb/message: 35919fd5b10ad212839a75e72829fe4e
KNKCTb/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
KNKCTb/translation: 35919fd5b10ad212839a75e72829fe4e
@@ -337,6 +343,9 @@ checksums:
UoSI%2Bi/message: 47f1051a134e111930be7f94179df4c8
UoSI%2Bi/origin/0/0: fadd5a5b6963ec5f261072f7e8d2140b
UoSI%2Bi/translation: 47f1051a134e111930be7f94179df4c8
zt%2F6cS/translation: aadb69a7f7421be6bb022fbde08a6d77
zt%2F6cS/message: aadb69a7f7421be6bb022fbde08a6d77
zt%2F6cS/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
qaS%2B1%2F/message: 4e25347caf65e1b63bec90e101b86ddd
qaS%2B1%2F/origin/0/0: fadd5a5b6963ec5f261072f7e8d2140b
qaS%2B1%2F/translation: 4e25347caf65e1b63bec90e101b86ddd
@@ -526,20 +535,21 @@ checksums:
dEgA5A/origin/6/0: d55f532bb5ae247e3a018978be0da463
dEgA5A/origin/7/0: 4b4f55c033add8db69178563832227c6
dEgA5A/origin/8/0: 68450df287fb46ea629e818732c1291a
dEgA5A/origin/9/0: 03c00909b41be01231cd3e843c8ee44e
dEgA5A/origin/10/0: 0627e0040ca4939c9a57349e98c51797
dEgA5A/origin/11/0: 15792234f408027822ee71ccddde6f9b
dEgA5A/origin/12/0: 5c60161e173f5eae9276d8e4c70b4ebb
dEgA5A/origin/13/0: a1fde3fcce608870830f168f027727ff
dEgA5A/origin/14/0: 83911e3eacbad4583e2b1647a784d154
dEgA5A/origin/15/0: dbad0c8d7863cb41f5495264f82e7081
dEgA5A/origin/9/0: 15ea2dfd5eae4e05b226b1320103476e
dEgA5A/origin/10/0: 03c00909b41be01231cd3e843c8ee44e
dEgA5A/origin/11/0: 0627e0040ca4939c9a57349e98c51797
dEgA5A/origin/12/0: 15792234f408027822ee71ccddde6f9b
dEgA5A/origin/13/0: 5c60161e173f5eae9276d8e4c70b4ebb
dEgA5A/origin/14/0: a1fde3fcce608870830f168f027727ff
dEgA5A/origin/15/0: 83911e3eacbad4583e2b1647a784d154
dEgA5A/origin/16/0: dbad0c8d7863cb41f5495264f82e7081
dEgA5A/translation: 2e2a849c2223911717de8caa2c71bade
kryGs%2B/message: bba0beaced7ea954ceb980f2b022ffee
kryGs%2B/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
kryGs%2B/translation: bba0beaced7ea954ceb980f2b022ffee
sU2uWc/translation: 3fe52244676faf64e5266b6713d01e07
sU2uWc/message: 3fe52244676faf64e5266b6713d01e07
sU2uWc/origin/0/0: 97bd206a05414e2a571020d64e166093
sU2uWc/translation: 3fe52244676faf64e5266b6713d01e07
fEY2vP/message: 91509e2f92b0b3b11330b6983139fdbf
fEY2vP/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
fEY2vP/origin/1/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
@@ -583,6 +593,9 @@ checksums:
EH8IL3/origin/0/0: c0b59968b2b234167c488a05cc38710b
EH8IL3/origin/1/0: fadd5a5b6963ec5f261072f7e8d2140b
EH8IL3/translation: 6f79129c8f08ee54d858a2af57d16dd9
zMquA7/translation: 38ff8d574865bb71d2f620bc4ba98c20
zMquA7/message: 38ff8d574865bb71d2f620bc4ba98c20
zMquA7/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
VHS0aJ/message: 31d0962985c83a29558c98a765bb1b16
VHS0aJ/origin/0/0: 15792234f408027822ee71ccddde6f9b
VHS0aJ/translation: 31d0962985c83a29558c98a765bb1b16
@@ -688,6 +701,10 @@ checksums:
AX4ktp/message: 4e6be22ade0188f408471325fe363575
AX4ktp/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
AX4ktp/translation: 4e6be22ade0188f408471325fe363575
xGVfLh/translation: 3cfba90b4600131e82fc4260c568d044
xGVfLh/message: 3cfba90b4600131e82fc4260c568d044
xGVfLh/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
xGVfLh/origin/1/0: 69d8634b177fdf937764b406fd477547
J2Wbjt/message: 8ed03cf7c5e60a6edf3470a4558ff058
J2Wbjt/origin/0/0: d96af8a06c2e38a72238bcd16e426859
J2Wbjt/translation: 8ed03cf7c5e60a6edf3470a4558ff058
@@ -707,18 +724,18 @@ checksums:
F0YmUY/message: 9def232c9163d109f0e9093684cfe75f
F0YmUY/origin/0/0: 1b05beba6bdd908015fa8e798717f024
F0YmUY/translation: 9def232c9163d109f0e9093684cfe75f
0utuU6/translation: 9d7e453b24dfaf217352aeadc262074d
0utuU6/message: 9d7e453b24dfaf217352aeadc262074d
0utuU6/origin/0/0: 97bd206a05414e2a571020d64e166093
fDQ7hA/translation: 1d24ecbad9f2f0081ab51c7366e40506
0utuU6/translation: 9d7e453b24dfaf217352aeadc262074d
fDQ7hA/message: 1d24ecbad9f2f0081ab51c7366e40506
fDQ7hA/origin/0/0: 97bd206a05414e2a571020d64e166093
1bJKhj/translation: f61803ac8da8253e4ba35f92b3af1101
fDQ7hA/translation: 1d24ecbad9f2f0081ab51c7366e40506
1bJKhj/message: f61803ac8da8253e4ba35f92b3af1101
1bJKhj/origin/0/0: 0eeeb7e68164ff118040918f1ef00a7a
uvH2xS/translation: ecc2617544a6d385d18678577fa112fd
1bJKhj/translation: f61803ac8da8253e4ba35f92b3af1101
uvH2xS/message: ecc2617544a6d385d18678577fa112fd
uvH2xS/origin/0/0: 97bd206a05414e2a571020d64e166093
uvH2xS/translation: ecc2617544a6d385d18678577fa112fd
9PaIxv/message: da95932e7a1465a5d21aa3b855a46dc2
9PaIxv/origin/0/0: c0b59968b2b234167c488a05cc38710b
9PaIxv/translation: da95932e7a1465a5d21aa3b855a46dc2
@@ -815,6 +832,9 @@ checksums:
7RpHg%2F/origin/0/0: c0b59968b2b234167c488a05cc38710b
7RpHg%2F/origin/1/0: c0b59968b2b234167c488a05cc38710b
7RpHg%2F/translation: 66f702512197d25cfdb117f2415ecd88
ZDPJBc/translation: f9154d0c02a7db907f0a33fb5edd4be1
ZDPJBc/message: f9154d0c02a7db907f0a33fb5edd4be1
ZDPJBc/origin/0/0: 69d8634b177fdf937764b406fd477547
j9IZZ0/message: 7ba841d0946eb04fa3d17d74365be37b
j9IZZ0/origin/0/0: ff4a160eca5f8da4f075fd1dd6061fa6
j9IZZ0/origin/1/0: dbad0c8d7863cb41f5495264f82e7081
@@ -970,16 +990,16 @@ checksums:
zxKs%2By/message: 0b6c8ad7aba0873b7e212d5f1949ca97
zxKs%2By/origin/0/0: db1e755dc7d73e037f425111bf7c30a6
zxKs%2By/translation: 0b6c8ad7aba0873b7e212d5f1949ca97
euc6Ns/translation: 27756566785c2b8463e21582c4bb619b
euc6Ns/message: 27756566785c2b8463e21582c4bb619b
euc6Ns/origin/0/0: 97bd206a05414e2a571020d64e166093
BTDPLo/translation: f6a33afcf5ff1489551c94867e083dca
euc6Ns/translation: 27756566785c2b8463e21582c4bb619b
BTDPLo/message: f6a33afcf5ff1489551c94867e083dca
BTDPLo/origin/0/0: 97bd206a05414e2a571020d64e166093
BTDPLo/origin/1/0: 0eeeb7e68164ff118040918f1ef00a7a
06EQqT/translation: e9f56489fb395a890ae2557200c29a36
BTDPLo/translation: f6a33afcf5ff1489551c94867e083dca
06EQqT/message: e9f56489fb395a890ae2557200c29a36
06EQqT/origin/0/0: 97bd206a05414e2a571020d64e166093
06EQqT/translation: e9f56489fb395a890ae2557200c29a36
ePK91l/message: eee7f39ff90b18852afc1671f21fbaa9
ePK91l/origin/0/0: b697a20a9536be4dd8ecd143461eafc7
ePK91l/origin/1/0: dc1a240d2d0cccb102c67ca311d4e457
@@ -1026,9 +1046,12 @@ checksums:
IqjpYe/message: 81d41cf573a7109c376d30d905beb596
IqjpYe/origin/0/0: 5f6c4a0c9be5098099167871ae1564af
IqjpYe/translation: 81d41cf573a7109c376d30d905beb596
bFREhu/translation: b2cc9a311fc28d1594252f697c7f5342
bFREhu/message: b2cc9a311fc28d1594252f697c7f5342
bFREhu/origin/0/0: 97bd206a05414e2a571020d64e166093
bFREhu/translation: b2cc9a311fc28d1594252f697c7f5342
SUXBxp/translation: 76e841ae8ec3340d7d0a5c2191abbea4
SUXBxp/message: 76e841ae8ec3340d7d0a5c2191abbea4
SUXBxp/origin/0/0: 69d8634b177fdf937764b406fd477547
0%2BewPp/message: 785fe23c0eef0a5b60b5b2a88151de31
0%2BewPp/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
0%2BewPp/origin/1/0: eb63312c63f6c8d2a5b6520c89012123
@@ -1214,10 +1237,12 @@ checksums:
"%2B3TYXa/origin/0/0": 4980d8e27a628e7cd9a70b839d844083
"%2B3TYXa/translation": 9fa1c942feb40d6350322b71561df789
2POOFK/message: 0326365539c004f6088656f692602078
2POOFK/origin/0/0: c0b59968b2b234167c488a05cc38710b
2POOFK/origin/1/0: 9737a9cef0646ff4bbd942b1924b9a2c
2POOFK/origin/2/0: 9737a9cef0646ff4bbd942b1924b9a2c
2POOFK/origin/3/0: fadd5a5b6963ec5f261072f7e8d2140b
2POOFK/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
2POOFK/origin/1/0: 15ea2dfd5eae4e05b226b1320103476e
2POOFK/origin/2/0: c0b59968b2b234167c488a05cc38710b
2POOFK/origin/3/0: 9737a9cef0646ff4bbd942b1924b9a2c
2POOFK/origin/4/0: 9737a9cef0646ff4bbd942b1924b9a2c
2POOFK/origin/5/0: fadd5a5b6963ec5f261072f7e8d2140b
2POOFK/translation: 0326365539c004f6088656f692602078
uP4V6I/message: 2d403501f0488ec7d4eac979faf051a2
uP4V6I/origin/0/0: fadd5a5b6963ec5f261072f7e8d2140b
@@ -1307,6 +1332,9 @@ checksums:
csFbe%2B/message: e4e58e33d637282d141df466d729bc7c
csFbe%2B/origin/0/0: 94d3e20c29bb517dd394711d7524e478
csFbe%2B/translation: e4e58e33d637282d141df466d729bc7c
SUvm1Y/translation: 6c0f26526f77e9abb92fb2b1106a66db
SUvm1Y/message: 6c0f26526f77e9abb92fb2b1106a66db
SUvm1Y/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
cdyS7J/message: 0f10050aeed2555a34fe3c27ce616607
cdyS7J/origin/0/0: c0b59968b2b234167c488a05cc38710b
cdyS7J/origin/1/0: c0b59968b2b234167c488a05cc38710b
@@ -1556,10 +1584,10 @@ checksums:
DbZgsJ/message: 7a1c63b75cea690b3fda6c3f203e31ff
DbZgsJ/origin/0/0: 0ad2af981579a62b084b3d41462c5546
DbZgsJ/translation: 7a1c63b75cea690b3fda6c3f203e31ff
hB02vO/translation: c13aa2a155ab4aff1c8fed6650a94e1a
hB02vO/message: c13aa2a155ab4aff1c8fed6650a94e1a
hB02vO/origin/0/0: fc68b5394b9b466d5d67df855060544d
hB02vO/origin/1/0: 0eeeb7e68164ff118040918f1ef00a7a
hB02vO/translation: c13aa2a155ab4aff1c8fed6650a94e1a
IDvohQ/message: 35d0822f65971b97774b962561b02649
IDvohQ/origin/0/0: 1d6b5f88cdad160a67842f6b65387448
IDvohQ/translation: 35d0822f65971b97774b962561b02649
@@ -1567,6 +1595,9 @@ checksums:
jl3aEJ/placeholders/0/0: 06f23520ebabfffed4999b5bcf61c9cd
jl3aEJ/origin/0/0: 1d6b5f88cdad160a67842f6b65387448
jl3aEJ/translation: 4c38799ff25321ea25017bf4cd8e2e4f
vo2a%2Ba/translation: fcf0f06f8b64b458c7ca6d95541a3cc8
vo2a%2Ba/message: fcf0f06f8b64b458c7ca6d95541a3cc8
vo2a%2Ba/origin/0/0: 69d8634b177fdf937764b406fd477547
agPptk/message: 43983f2178fb28aacaef6c5f41282c4a
agPptk/origin/0/0: 3de48fb04f7df9bdbe399911cdb3fe86
agPptk/translation: 43983f2178fb28aacaef6c5f41282c4a
@@ -1597,18 +1628,19 @@ checksums:
hty0d5/origin/0/0: 04c86ea96f180745739d59e822da4026
hty0d5/translation: b4b1c8396e445e8b7956c747da2cf601
"%2B8Nek%2F/message": 818f1192e32bb855597f930d3e78806e
"%2B8Nek%2F/origin/0/0": 9737a9cef0646ff4bbd942b1924b9a2c
"%2B8Nek%2F/origin/1/0": 82a5cf8d69f098641eb357bf102cd504
"%2B8Nek%2F/origin/0/0": 15ea2dfd5eae4e05b226b1320103476e
"%2B8Nek%2F/origin/1/0": 9737a9cef0646ff4bbd942b1924b9a2c
"%2B8Nek%2F/origin/2/0": 82a5cf8d69f098641eb357bf102cd504
"%2B8Nek%2F/translation": 818f1192e32bb855597f930d3e78806e
vneRvS/message: e228107df80015377112d41f4f155cb3
vneRvS/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
vneRvS/translation: e228107df80015377112d41f4f155cb3
51UCsN/translation: ce14fde5e972c2b5276c25ddded817c4
51UCsN/message: ce14fde5e972c2b5276c25ddded817c4
51UCsN/origin/0/0: 0eeeb7e68164ff118040918f1ef00a7a
J4%2BOTA/translation: 6ad27e803483208b5313660b7b5791d3
51UCsN/translation: ce14fde5e972c2b5276c25ddded817c4
J4%2BOTA/message: 6ad27e803483208b5313660b7b5791d3
J4%2BOTA/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
J4%2BOTA/translation: 6ad27e803483208b5313660b7b5791d3
BOqTi5/message: 11edf0427766c26db541d46379dc3c16
BOqTi5/placeholders/0/0: 9db68a4b386b9fa1fd1d5797c32be100
BOqTi5/placeholders/1/0: b837a9e8bd06b58be95699b3ee663f43
@@ -1836,6 +1868,9 @@ checksums:
8RdLDU/message: d7820b1bf4efecc61ed89234567aaa9c
8RdLDU/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
8RdLDU/translation: d7820b1bf4efecc61ed89234567aaa9c
Oi%2BJ%2BN/translation: 313804fe615d51e0f0cbd599161d1ade
Oi%2BJ%2BN/message: 313804fe615d51e0f0cbd599161d1ade
Oi%2BJ%2BN/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
Iqh0Uv/message: 0cc9dcd6ac624383e9977f66d4b3b777
Iqh0Uv/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
Iqh0Uv/origin/1/0: eb63312c63f6c8d2a5b6520c89012123
@@ -1908,15 +1943,17 @@ checksums:
tyHiOa/origin/36/0: 8628ddb6f4ded25c0f17e2cbda8207d3
tyHiOa/origin/37/0: 8628ddb6f4ded25c0f17e2cbda8207d3
tyHiOa/origin/38/0: 7493592314bc3b96ad96127a949ba1ba
tyHiOa/origin/39/0: 03c00909b41be01231cd3e843c8ee44e
tyHiOa/origin/40/0: 5c60161e173f5eae9276d8e4c70b4ebb
tyHiOa/origin/41/0: 83911e3eacbad4583e2b1647a784d154
tyHiOa/origin/42/0: d465da67c0a870d198eb7f313569c137
tyHiOa/origin/43/0: 33bf266228f835e12c0bfb0e5efb3be9
tyHiOa/origin/44/0: ff48991e314b0b3e989a4dac59860fd5
tyHiOa/origin/45/0: 30791e26a172d47d3cb0693e82679246
tyHiOa/origin/46/0: dbad0c8d7863cb41f5495264f82e7081
tyHiOa/origin/47/0: 0dccc39d0debbf3e089cb6d292de762b
tyHiOa/origin/39/0: 69d8634b177fdf937764b406fd477547
tyHiOa/origin/40/0: 69d8634b177fdf937764b406fd477547
tyHiOa/origin/41/0: 03c00909b41be01231cd3e843c8ee44e
tyHiOa/origin/42/0: 5c60161e173f5eae9276d8e4c70b4ebb
tyHiOa/origin/43/0: 83911e3eacbad4583e2b1647a784d154
tyHiOa/origin/44/0: d465da67c0a870d198eb7f313569c137
tyHiOa/origin/45/0: 33bf266228f835e12c0bfb0e5efb3be9
tyHiOa/origin/46/0: ff48991e314b0b3e989a4dac59860fd5
tyHiOa/origin/47/0: 30791e26a172d47d3cb0693e82679246
tyHiOa/origin/48/0: dbad0c8d7863cb41f5495264f82e7081
tyHiOa/origin/49/0: 0dccc39d0debbf3e089cb6d292de762b
tyHiOa/translation: 21ffcf0b00e7cd7b64f7454a95762e1d
PZCqeW/message: 325dea6dd0348a27a6818db2c1340c98
PZCqeW/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
@@ -1930,9 +1967,9 @@ checksums:
fuwKpE/origin/4/0: 9c8b544f5db130cd7c5eda9064ba3957
fuwKpE/origin/5/0: faa8a2576972b4eb31565d8ea6098f43
fuwKpE/translation: 346a18a54564881c888b95873d03df44
nYNMZZ/translation: d5a8a1b38eaf02d02cd6ac2211b42a92
nYNMZZ/message: d5a8a1b38eaf02d02cd6ac2211b42a92
nYNMZZ/origin/0/0: 97bd206a05414e2a571020d64e166093
nYNMZZ/translation: d5a8a1b38eaf02d02cd6ac2211b42a92
aHCEmh/message: ce27f1aeacccc542a174c4b2bce022b0
aHCEmh/origin/0/0: 98e2302d0d8d12ce65c4140b87450673
aHCEmh/origin/1/0: 634473ef965836871efe40875a36b6ab
@@ -1954,8 +1991,9 @@ checksums:
zwBp5t/origin/0/0: d6920b20329a9efe5985a39a295d83e1
zwBp5t/translation: d740d0660e68c61db1853489356030ae
3fPjUY/message: 682b3c9feab30112b4454cb5bb7974b1
3fPjUY/origin/0/0: c0b59968b2b234167c488a05cc38710b
3fPjUY/origin/1/0: fadd5a5b6963ec5f261072f7e8d2140b
3fPjUY/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
3fPjUY/origin/1/0: c0b59968b2b234167c488a05cc38710b
3fPjUY/origin/2/0: fadd5a5b6963ec5f261072f7e8d2140b
3fPjUY/translation: 682b3c9feab30112b4454cb5bb7974b1
oyRjD%2F/message: 76a09fd843b496610f8cf1dced417b62
oyRjD%2F/origin/0/0: 7493592314bc3b96ad96127a949ba1ba
@@ -2065,6 +2103,7 @@ checksums:
"%2FgaSVU/origin/0/0": 98e2302d0d8d12ce65c4140b87450673
"%2FgaSVU/origin/1/0": 634473ef965836871efe40875a36b6ab
"%2FgaSVU/origin/2/0": 634473ef965836871efe40875a36b6ab
"%2FgaSVU/origin/3/0": 69d8634b177fdf937764b406fd477547
"%2FgaSVU/translation": c60f4a1acf30e566861bf130f13b9ae7
GDvlUT/message: 53743bbb6ca938f5b893552e839d067f
GDvlUT/origin/0/0: 7493592314bc3b96ad96127a949ba1ba
@@ -2113,9 +2152,9 @@ checksums:
K3iLeO/message: e3bf6f95419169f460fb6918a0afc512
K3iLeO/origin/0/0: 5e2ed4920ffd2f535ece848ff44900bd
K3iLeO/translation: e3bf6f95419169f460fb6918a0afc512
zYRVNp/translation: 8b36455dd5b43e56d2ab06e522c3bacc
zYRVNp/message: 8b36455dd5b43e56d2ab06e522c3bacc
zYRVNp/origin/0/0: 97bd206a05414e2a571020d64e166093
zYRVNp/translation: 8b36455dd5b43e56d2ab06e522c3bacc
wgNoIs/message: eedc7cdb02de467c15dc418a066a77f2
wgNoIs/origin/0/0: 3c57a918258af4b44c187f58d203345f
wgNoIs/origin/1/0: 3c57a918258af4b44c187f58d203345f
@@ -2152,6 +2191,9 @@ checksums:
Eit43O/message: b5d9a1edd988f455041aee9fa7fb3d63
Eit43O/origin/0/0: 1d6b5f88cdad160a67842f6b65387448
Eit43O/translation: b5d9a1edd988f455041aee9fa7fb3d63
JjEJSy/translation: 0154ff378b3f4329871378229e269fc7
JjEJSy/message: 0154ff378b3f4329871378229e269fc7
JjEJSy/origin/0/0: 69d8634b177fdf937764b406fd477547
Tz0i8g/message: 8df6777277469c1fd88cc18dde2f1cc3
Tz0i8g/origin/0/0: 77c9f6139024b2069e4fdc5120f69cb5
Tz0i8g/origin/1/0: 94d3e20c29bb517dd394711d7524e478
@@ -2186,6 +2228,10 @@ checksums:
n1ekoW/message: ec7b8f314fe9bc6591006707484ede61
n1ekoW/origin/0/0: 6cda8b872e4902cbc0191d9375adf4ef
n1ekoW/translation: ec7b8f314fe9bc6591006707484ede61
fcWrnU/translation: 6d842546a84e919c519bf8cbffdf25a0
fcWrnU/message: 6d842546a84e919c519bf8cbffdf25a0
fcWrnU/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
fcWrnU/origin/1/0: 69d8634b177fdf937764b406fd477547
mErq7F/message: 0dd2ae69be4618c1f9e615774a4509ca
mErq7F/origin/0/0: 6cda8b872e4902cbc0191d9375adf4ef
mErq7F/translation: 0dd2ae69be4618c1f9e615774a4509ca
@@ -2221,6 +2267,9 @@ checksums:
wIb7Ng/message: 67659097ef6bcb194839858b2c4f3a3c
wIb7Ng/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
wIb7Ng/translation: 67659097ef6bcb194839858b2c4f3a3c
6sKjjx/translation: 50861c0881fe87a77412417e5ffb3fbb
6sKjjx/message: 50861c0881fe87a77412417e5ffb3fbb
6sKjjx/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
vnS6Rf/message: 003f7f93d44b0f5c2e40bf24e7af3bd7
vnS6Rf/origin/0/0: c0b59968b2b234167c488a05cc38710b
vnS6Rf/translation: 003f7f93d44b0f5c2e40bf24e7af3bd7
@@ -2260,6 +2309,9 @@ checksums:
D%2BNlUC/message: 803281c327a02a2feba182f4a2b38311
D%2BNlUC/origin/0/0: 358ea1b5babb2e9ccbf1a4c9f89dd3a5
D%2BNlUC/translation: 803281c327a02a2feba182f4a2b38311
KM6m8p/translation: c621ea9404a37af289def443b309bf1b
KM6m8p/message: c621ea9404a37af289def443b309bf1b
KM6m8p/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
bff61F/message: 3f0ae9c914f16ceb9a0d7db868f4aa20
bff61F/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
bff61F/origin/1/0: 7493592314bc3b96ad96127a949ba1ba
@@ -2311,9 +2363,9 @@ checksums:
C6gv54/message: 1573c77059bc92df17e661befda8d9b7
C6gv54/origin/0/0: 0ad2af981579a62b084b3d41462c5546
C6gv54/translation: 1573c77059bc92df17e661befda8d9b7
nKBUeF/translation: 07e3ce10820b8ab28643e38b2ed51f64
nKBUeF/message: 07e3ce10820b8ab28643e38b2ed51f64
nKBUeF/origin/0/0: 97bd206a05414e2a571020d64e166093
nKBUeF/translation: 07e3ce10820b8ab28643e38b2ed51f64
jlB2RY/message: 67a76bf346ab4b48563269e9d941a64a
jlB2RY/origin/0/0: 0627e0040ca4939c9a57349e98c51797
jlB2RY/translation: 67a76bf346ab4b48563269e9d941a64a
@@ -2365,6 +2417,12 @@ checksums:
vlxQFL/message: 730f33b8f1fc002c4f393ccd262b6664
vlxQFL/origin/0/0: afee530613110e248ffde6b56872ebed
vlxQFL/translation: 730f33b8f1fc002c4f393ccd262b6664
HQVm6e/translation: ec66b543a593e9dabf47de5979892d8d
HQVm6e/message: ec66b543a593e9dabf47de5979892d8d
HQVm6e/origin/0/0: 69d8634b177fdf937764b406fd477547
gKmoow/translation: 83997c77cb0dc8c8c90f7ab706aa817f
gKmoow/message: 83997c77cb0dc8c8c90f7ab706aa817f
gKmoow/origin/0/0: 69d8634b177fdf937764b406fd477547
OAYToL/message: 1c989752736fa41ecdd68ea890f16a15
OAYToL/origin/0/0: 15792234f408027822ee71ccddde6f9b
OAYToL/translation: 1c989752736fa41ecdd68ea890f16a15
@@ -2386,9 +2444,9 @@ checksums:
MHrjPM/message: 344e64395eaff6822a57d18623853e1a
MHrjPM/origin/0/0: a50c4fbde8da6e0a77c4e0aef0b44dea
MHrjPM/translation: 344e64395eaff6822a57d18623853e1a
wK4OTM/translation: b2a89bfd8e13d77f626e84840602a603
wK4OTM/message: b2a89bfd8e13d77f626e84840602a603
wK4OTM/origin/0/0: 97bd206a05414e2a571020d64e166093
wK4OTM/translation: b2a89bfd8e13d77f626e84840602a603
Se%2FUIp/message: d60813ea824f373462471e092d136eed
Se%2FUIp/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
Se%2FUIp/origin/1/0: eb63312c63f6c8d2a5b6520c89012123
@@ -2451,6 +2509,7 @@ checksums:
YcyP2z/translation: 7495f1434c9188849bffd015811d5337
MxQXhL/message: c1c949477e121d73ed6683eddf9cd874
MxQXhL/origin/0/0: ff4a160eca5f8da4f075fd1dd6061fa6
MxQXhL/origin/1/0: 69d8634b177fdf937764b406fd477547
MxQXhL/translation: c1c949477e121d73ed6683eddf9cd874
WHHLh9/message: 99d0b17b78d44e15f13d876d155f0efc
WHHLh9/origin/0/0: 3a89a46ac678e34dc8eb687b07a4ad4b
@@ -2467,12 +2526,12 @@ checksums:
2QGEbi/message: 550198b2c87f06726a843c79c1026ed9
2QGEbi/origin/0/0: 4b4f55c033add8db69178563832227c6
2QGEbi/translation: 550198b2c87f06726a843c79c1026ed9
Oo4E6p/translation: af985cf72c47df76e2f2139a427d9948
Oo4E6p/message: af985cf72c47df76e2f2139a427d9948
Oo4E6p/origin/0/0: 97bd206a05414e2a571020d64e166093
K7k9u3/translation: 1cf9d227042f6a65adba38cb7296830d
Oo4E6p/translation: af985cf72c47df76e2f2139a427d9948
K7k9u3/message: 1cf9d227042f6a65adba38cb7296830d
K7k9u3/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
K7k9u3/translation: 1cf9d227042f6a65adba38cb7296830d
8yFGGF/message: 39025a0c53818438829603d213baef06
8yFGGF/origin/0/0: 68450df287fb46ea629e818732c1291a
8yFGGF/translation: 39025a0c53818438829603d213baef06
@@ -2485,6 +2544,9 @@ checksums:
A8jqN7/message: 656c93265d7e2bef1245b17d85f85ae5
A8jqN7/origin/0/0: 1fd8ccf586705354bcae6e1186108fc7
A8jqN7/translation: 656c93265d7e2bef1245b17d85f85ae5
Q60WUZ/translation: 4284c33aed2f2c5e004ed0a7d7d9bf87
Q60WUZ/message: 4284c33aed2f2c5e004ed0a7d7d9bf87
Q60WUZ/origin/0/0: 69d8634b177fdf937764b406fd477547
T7Mywq/message: 62899897d7bffcb1df3af77d460f0881
T7Mywq/origin/0/0: 0ad2af981579a62b084b3d41462c5546
T7Mywq/translation: 62899897d7bffcb1df3af77d460f0881
@@ -2577,6 +2639,9 @@ checksums:
mx8%2B1u/origin/3/0: fadd5a5b6963ec5f261072f7e8d2140b
mx8%2B1u/origin/4/0: dbad0c8d7863cb41f5495264f82e7081
mx8%2B1u/translation: f2949ca2dc18b0063af92e60779abb65
8AwlaR/translation: acb1fdc14ed875815ae9f8a5254bc634
8AwlaR/message: acb1fdc14ed875815ae9f8a5254bc634
8AwlaR/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
Ws%2B3X%2B/message: 905b10eeb09fdc5ac7fc757e935ee757
Ws%2B3X%2B/origin/0/0: fadd5a5b6963ec5f261072f7e8d2140b
Ws%2B3X%2B/translation: 905b10eeb09fdc5ac7fc757e935ee757
@@ -2617,6 +2682,7 @@ checksums:
IelE1h/translation: 972773025e763ddf53273df6d37a729a
cWtfn1/message: 9a91ea70f5eb55aac96640bf0fd7feff
cWtfn1/origin/0/0: ff4a160eca5f8da4f075fd1dd6061fa6
cWtfn1/origin/1/0: 69d8634b177fdf937764b406fd477547
cWtfn1/translation: 9a91ea70f5eb55aac96640bf0fd7feff
b3Thhd/message: 5b7b755f05330164dbfb00096c500ee3
b3Thhd/origin/0/0: 12c1fab543c8848bcb10107d47336736
@@ -2748,7 +2814,8 @@ checksums:
UlhdTP/origin/0/0: 83911e3eacbad4583e2b1647a784d154
UlhdTP/translation: bc5c267ce3f04de94ff1379cf2ca48a3
chyf4J/message: 7159d620b7ef5c5afef734989a5be08b
chyf4J/origin/0/0: 5f6c4a0c9be5098099167871ae1564af
chyf4J/origin/0/0: 69d8634b177fdf937764b406fd477547
chyf4J/origin/1/0: 5f6c4a0c9be5098099167871ae1564af
chyf4J/translation: 7159d620b7ef5c5afef734989a5be08b
Ax%2FhYa/message: d0e83b9a0304d7c36cf8c85d98783ce2
Ax%2FhYa/origin/0/0: 33bf266228f835e12c0bfb0e5efb3be9
@@ -2766,7 +2833,8 @@ checksums:
wtxjAY/translation: 1857292f9567c556c781a23bd7e10544
CozWO1/message: 855614bbf862fd6a9f6a3e76943f92d4
CozWO1/origin/0/0: ff4a160eca5f8da4f075fd1dd6061fa6
CozWO1/origin/1/0: 5f6c4a0c9be5098099167871ae1564af
CozWO1/origin/1/0: 69d8634b177fdf937764b406fd477547
CozWO1/origin/2/0: 5f6c4a0c9be5098099167871ae1564af
CozWO1/translation: 855614bbf862fd6a9f6a3e76943f92d4
ghSJ4U/message: 681f86c9ca31699fc5a3ca3790e5972c
ghSJ4U/origin/0/0: ff4a160eca5f8da4f075fd1dd6061fa6
@@ -2809,6 +2877,9 @@ checksums:
RtlIYB/message: df4783d593505766d78c5bc08d3d48ac
RtlIYB/origin/0/0: 627b72cd19a7154ae1c28cbd7ca0c730
RtlIYB/translation: df4783d593505766d78c5bc08d3d48ac
3WXdoZ/translation: 4cbeab40f77975492a23eec428732440
3WXdoZ/message: 4cbeab40f77975492a23eec428732440
3WXdoZ/origin/0/0: 69d8634b177fdf937764b406fd477547
aelko%2B/message: 41dd145ef56f539e12dc064a9807c660
aelko%2B/origin/0/0: 4980d8e27a628e7cd9a70b839d844083
aelko%2B/translation: 41dd145ef56f539e12dc064a9807c660
@@ -2852,6 +2923,9 @@ checksums:
GoDLB9/message: 8c8d944e07388c5877effdb2c2803dcf
GoDLB9/origin/0/0: 5c60161e173f5eae9276d8e4c70b4ebb
GoDLB9/translation: 8c8d944e07388c5877effdb2c2803dcf
c4nMcR/translation: bf4f697079eef51c3ebe46ce79063895
c4nMcR/message: bf4f697079eef51c3ebe46ce79063895
c4nMcR/origin/0/0: 15ea2dfd5eae4e05b226b1320103476e
evg7%2BA/message: 403972e7a25afc2415762c1c2b1ec868
evg7%2BA/origin/0/0: 3c57a918258af4b44c187f58d203345f
evg7%2BA/translation: 403972e7a25afc2415762c1c2b1ec868
@@ -2888,6 +2962,12 @@ checksums:
25fAUC/message: 3e4cce96bc1197a1caa2b7fb4d3c7e53
25fAUC/origin/0/0: d1e1d7ccce60e05570bedfbb93fc9416
25fAUC/translation: 3e4cce96bc1197a1caa2b7fb4d3c7e53
GRAGsB/translation: 751a534fd6e62a92ff64c46894c7db86
GRAGsB/message: 751a534fd6e62a92ff64c46894c7db86
GRAGsB/origin/0/0: 69d8634b177fdf937764b406fd477547
j0o6ml/translation: 1e036ffca9d9cb9e2941b83fbbf375c0
j0o6ml/message: 1e036ffca9d9cb9e2941b83fbbf375c0
j0o6ml/origin/0/0: 69d8634b177fdf937764b406fd477547
GnSSGm/message: 98de6f65c567c6654cc0adce3c9d5656
GnSSGm/origin/0/0: 33bf266228f835e12c0bfb0e5efb3be9
GnSSGm/translation: 98de6f65c567c6654cc0adce3c9d5656
@@ -2900,6 +2980,10 @@ checksums:
Hg1qE9/message: c808949b9b2b4a9aba2472f5d1050167
Hg1qE9/origin/0/0: 30791e26a172d47d3cb0693e82679246
Hg1qE9/translation: c808949b9b2b4a9aba2472f5d1050167
OTxjpR/translation: 370a32c49489db61978ac91b55699c24
OTxjpR/message: 370a32c49489db61978ac91b55699c24
OTxjpR/origin/0/0: 69d8634b177fdf937764b406fd477547
OTxjpR/origin/1/0: 69d8634b177fdf937764b406fd477547
4DOCMI/message: 0b48896061a1124501fdaba026804148
4DOCMI/origin/0/0: a50c4fbde8da6e0a77c4e0aef0b44dea
4DOCMI/translation: 0b48896061a1124501fdaba026804148

View File

@@ -1,4 +1,6 @@
import { useTheme } from "next-themes";
import { useRouter } from "next/navigation";
import { env } from "next-runtime-env";
import { useEffect, useRef, useState } from "react";
import {
TbLayoutSidebarLeftCollapse,
@@ -43,6 +45,7 @@ export default function Dashboard({
const { resolvedTheme } = useTheme();
const { openModal } = useModal();
const { availableWorkspaces, hasLoaded } = useWorkspace();
const router = useRouter();
const { data: session, isPending: sessionLoading } = authClient.useSession();
const { data: user, isLoading: userLoading } = api.user.getUser.useQuery(
@@ -98,9 +101,13 @@ export default function Dashboard({
useEffect(() => {
if (hasLoaded && availableWorkspaces.length === 0) {
openModal("NEW_WORKSPACE", undefined, undefined, false);
if (env("NEXT_PUBLIC_KAN_ENV") === "cloud") {
router.push(`/onboarding/select-plan?returnUrl=${encodeURIComponent(window.location.pathname)}`);
} else {
openModal("NEW_WORKSPACE", undefined, undefined, false);
}
}
}, [hasLoaded, availableWorkspaces.length, openModal]);
}, [hasLoaded, availableWorkspaces.length, openModal, router]);
const isDarkMode = resolvedTheme === "dark";

View File

@@ -88,7 +88,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
</button>
)}
{iconRight && type !== "password" && (
<div className="absolute right-3 top-1/2 -translate-y-1/2">
<div className="absolute right-3 top-1/2 -translate-y-1/2 leading-[0]">
{iconRight}
</div>
)}

View File

@@ -207,7 +207,7 @@ export function LabelForm({
/>
</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
{!isEdit && (
<Toggle
label={t`Create another`}

View File

@@ -114,42 +114,6 @@ export function NewWorkspaceForm() {
weekStartDay: 1,
});
// If in cloud and Pro toggle is enabled, create checkout session for pro
if (env("NEXT_PUBLIC_KAN_ENV") === "cloud" && isProToggleEnabled) {
try {
const response = await fetch(
"/api/stripe/create_checkout_session",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
slug: slug || undefined,
workspacePublicId: values.publicId,
cancelUrl: "/settings/workspace?upgrade=pro",
successUrl: "/boards",
}),
},
);
const data = await response.json();
const url = (data as { url: string }).url;
if (url) {
window.location.href = url;
return; // Don't close modal if redirecting to checkout
}
} catch (error) {
console.error("Error creating checkout session:", error);
showPopup({
header: t`Error upgrading to Pro`,
message: t`Workspace created successfully. You can upgrade later in settings.`,
icon: "warning",
});
}
}
closeModal();
}
},
@@ -361,7 +325,7 @@ export function NewWorkspaceForm() {
</div>
<div
className={twMerge(
"mt-6 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600",
"mt-6 flex items-center justify-end space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600",
!showProBenefits && "mt-12",
)}
>

View File

@@ -7,15 +7,17 @@ const Toggle = ({
label,
disabled,
showLabel = true,
labelPosition = "before",
}: {
isChecked: boolean;
onChange: () => void;
label: string;
disabled?: boolean;
showLabel?: boolean;
labelPosition?: "before" | "after";
}) => (
<div className="mr-4 flex items-center justify-end">
{showLabel && (
<div className="flex items-center">
{showLabel && labelPosition === "before" && (
<span className="mr-2 text-xs text-light-900 dark:text-dark-900">
{label}
</span>
@@ -38,6 +40,11 @@ const Toggle = ({
)}
/>
</Switch>
{showLabel && labelPosition === "after" && (
<span className="ml-2 text-xs text-light-900 dark:text-dark-900">
{label}
</span>
)}
</div>
);

View File

@@ -1,5 +1,7 @@
import { Button, Menu, Transition } from "@headlessui/react";
import { t } from "@lingui/core/macro";
import { useRouter } from "next/navigation";
import { env } from "next-runtime-env";
import { Fragment, useState } from "react";
import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
import { twMerge } from "tailwind-merge";
@@ -18,6 +20,7 @@ export default function WorkspaceMenu({
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
useWorkspace();
const { openModal } = useModal();
const router = useRouter();
const [isOpen, setIsOpen] = useState(false);
const { tooltipContent: commandPaletteShortcutTooltipContent } =
@@ -147,7 +150,11 @@ export default function WorkspaceMenu({
<div className="border-t-[1px] border-light-600 p-1 dark:border-dark-500">
<Menu.Item>
<button
onClick={() => openModal("NEW_WORKSPACE")}
onClick={() =>
env("NEXT_PUBLIC_KAN_ENV") === "cloud"
? router.push(`/onboarding/select-plan?returnUrl=${encodeURIComponent(window.location.pathname)}`)
: openModal("NEW_WORKSPACE")
}
className="flex w-full items-center justify-between rounded-[5px] px-3 py-2 text-left text-xs text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
>
{t`Create workspace`}

View File

@@ -239,11 +239,11 @@
"translation": "Aktivitätsprotokolle"
},
"UGCIzB": {
"translation": "Label hinzufügen / bearbeiten",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Label hinzufügen / bearbeiten"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
},
"YkfDoz": {
"translation": "Jährlich",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Wartet auf Kunden"
},
"iH8pgl": {
"translation": "Zurück",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Ideal für kleine und wachsende Teams, die zusammenarbeiten müssen"
},
"zt/6cS": {
"translation": "Ideal für kleine Teams, die gemeinsam arbeiten und schneller vorankommen möchten.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Karte"
},
"sU2uWc": {
"translation": "Karte dupliziert",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Karte dupliziert"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklisten"
},
"zMquA7": {
"translation": "Tarif wählen",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Content-Erstellung"
},
"xGVfLh": {
"translation": "Weiter",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Karten-Link kopieren"
},
"0utuU6": {
"translation": "Checklisten kopieren",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Checklisten kopieren"
},
"fDQ7hA": {
"translation": "Labels kopieren",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Labels kopieren"
},
"1bJKhj": {
"translation": "Link zur Karte kopieren",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Link zur Karte kopieren"
},
"uvH2xS": {
"translation": "Mitglieder kopieren",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Mitglieder kopieren"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Workspace erstellen"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Benutzerdefinierter Benutzername"
},
"ZDPJBc": {
"translation": "Benutzerdefinierte Benutzernamen erfordern ein Upgrade auf einen Pro-Tarif",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Morgen fällig"
},
"euc6Ns": {
"translation": "Duplizieren",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplizieren"
},
"BTDPLo": {
"translation": "Karte duplizieren",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Karte duplizieren"
},
"06EQqT": {
"translation": "Wird dupliziert…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Wird dupliziert…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "E-Mail-Sichtbarkeit"
},
"bFREhu": {
"translation": "Ende der Liste",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Ende der Liste"
},
"SUXBxp": {
"translation": "Technik",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Zu Vorlagen gehen"
},
"SUvm1Y": {
"translation": "Gut geeignet für Einsteiger, die nur die wichtigsten Funktionen benötigen.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Vorlage erstellen"
},
"hB02vO": {
"translation": "Mitglieder verwalten",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Mitglieder verwalten"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "hat Checklistenelement <0>{0}</0> als unvollständig markiert"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "Monatliche Abrechnung"
},
"51UCsN": {
"translation": "In andere Liste verschieben",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "In andere Liste verschieben"
},
"J4+OTA": {
"translation": "In Liste verschieben",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "In Liste verschieben"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Befehlsmenü öffnen"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Persönliches Projekt"
},
"Oi+J+N": {
"translation": "Wählen Sie einen Tarif, um loszulegen. Alle kostenpflichtigen Tarife beinhalten eine 14-tägige kostenlose Testphase.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Bitte versuchen Sie es erneut."
},
"nYNMZZ": {
"translation": "Position in Liste (0 = erste, leer lassen für Ende)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Position in Liste (0 = erste, leer lassen für Ende)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Roadmap"
},
@@ -4949,13 +5032,13 @@
"translation": "Sehen Sie, was unsere Nutzer über Kan sagen"
},
"zYRVNp": {
"translation": "Liste auswählen",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Liste auswählen"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "hat das Fälligkeitsdatum festgelegt"
},
"JjEJSy": {
"translation": "Richten Sie Ihren Workspace ein",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Anmelden"
},
"fcWrnU": {
"translation": "Abmelden",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Softwareentwicklung"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "System"
},
"KM6m8p": {
"translation": "Team",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "Das Board wurde wiederhergestellt."
},
"nKBUeF": {
"translation": "Die Karte wurde dupliziert.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "Die Karte wurde dupliziert."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "Die Berechtigungen dieses Mitglieds wurden auf die Standardwerte seiner Rolle zurückgesetzt."
},
"HQVm6e": {
"translation": "Diese URL ist bereits vergeben",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Diese URL ist reserviert",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Titel"
},
"wK4OTM": {
"translation": "Titel (optional)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Titel (optional)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Workspace konnte nicht erstellt werden"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Kommentar konnte nicht gelöscht werden"
},
"Oo4E6p": {
"translation": "Karte konnte nicht dupliziert werden",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Karte konnte nicht dupliziert werden"
},
"K7k9u3": {
"translation": "Karte konnte nicht verschoben werden",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Karte konnte nicht verschoben werden"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Feedback konnte nicht gesendet werden"
},
"Q60WUZ": {
"translation": "Checkout kann nicht gestartet werden",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Unbegrenzte Mitglieder"
},
"8AwlaR": {
"translation": "Unbegrenzte Mitglieder und ein individueller Workspace-Benutzername für Teams, die wachsen möchten.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Auf Pro upgraden (29 $/Monat)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Workspace-Beschreibung"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Workspace-Name"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Sie sind dabei, Ihr Passwort zu ändern."
},
"3WXdoZ": {
"translation": "Sie können diese später jederzeit in den Einstellungen ändern.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Ihr Konto wurde gelöscht."
},
"c4nMcR": {
"translation": "Ihr Avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Ihrem Abmelde-Link fehlt ein Token. Bitte öffnen Sie die neueste E-Mail und versuchen Sie es erneut."
},
"GRAGsB": {
"translation": "Ihr Workspace",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Ihre Workspace-Beschreibung",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "Ihr Workspace-Slug wurde aktualisiert."
},
"OTxjpR": {
"translation": "ihr-workspace",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -401,7 +401,6 @@
"translation": "Activity logs"
},
"UGCIzB": {
"translation": "Add / edit label",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
@@ -410,7 +409,8 @@
"src/views/board/components/CardContextMenu.tsx",
50
]
]
],
"translation": "Add / edit label"
},
"B3xxao": {
"message": "Add a card",
@@ -938,6 +938,18 @@
],
"translation": "An unexpected error occurred. Please try again later."
},
"YkfDoz": {
"translation": "Annual",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
63
]
]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -1262,6 +1274,18 @@
],
"translation": "Awaiting Customer"
},
"iH8pgl": {
"translation": "Back",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
275
]
]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -1334,6 +1358,18 @@
],
"translation": "Best for small and growing teams that need collaboration"
},
"zt/6cS": {
"translation": "Best for small teams who want to collaborate and move faster together.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
86
]
]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -2091,6 +2127,10 @@
"src/views/members/components/DeleteMemberConfirmation.tsx",
55
],
[
"src/views/onboarding/select-plan/index.tsx",
209
],
[
"src/views/settings/components/Avatar.tsx",
287
@@ -2135,7 +2175,6 @@
"translation": "Card"
},
"sU2uWc": {
"translation": "Card duplicated",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
@@ -2144,7 +2183,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
67
]
]
],
"translation": "Card duplicated"
},
"fEY2vP": {
"message": "Card not found",
@@ -2318,6 +2358,18 @@
],
"translation": "Checklists"
},
"zMquA7": {
"translation": "Choose a plan",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
122
]
]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -2738,6 +2790,22 @@
],
"translation": "Content Creation"
},
"xGVfLh": {
"translation": "Continue",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
212
],
[
"src/views/onboarding/workspace-details/index.tsx",
291
]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -2815,7 +2883,6 @@
"translation": "Copy card link"
},
"0utuU6": {
"translation": "Copy checklists",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
@@ -2824,10 +2891,10 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
257
]
]
],
"translation": "Copy checklists"
},
"fDQ7hA": {
"translation": "Copy labels",
"message": "Copy labels",
"placeholders": {},
"comments": [],
@@ -2836,10 +2903,10 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
221
]
]
],
"translation": "Copy labels"
},
"1bJKhj": {
"translation": "Copy link to card",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
@@ -2848,10 +2915,10 @@
"src/views/board/components/CardContextMenu.tsx",
62
]
]
],
"translation": "Copy link to card"
},
"uvH2xS": {
"translation": "Copy members",
"message": "Copy members",
"placeholders": {},
"comments": [],
@@ -2860,7 +2927,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
239
]
]
],
"translation": "Copy members"
},
"9PaIxv": {
"message": "Core features",
@@ -3081,7 +3149,7 @@
],
[
"src/components/WorkspaceMenu.tsx",
153
160
]
],
"translation": "Create workspace"
@@ -3246,6 +3314,18 @@
],
"translation": "Custom username"
},
"ZDPJBc": {
"translation": "Custom usernames require upgrading to a Pro plan",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
220
]
]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -3867,7 +3947,6 @@
"translation": "Due tomorrow"
},
"euc6Ns": {
"translation": "Duplicate",
"message": "Duplicate",
"placeholders": {},
"comments": [],
@@ -3876,10 +3955,10 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
279
]
]
],
"translation": "Duplicate"
},
"BTDPLo": {
"translation": "Duplicate card",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
@@ -3892,10 +3971,10 @@
"src/views/board/components/CardContextMenu.tsx",
68
]
]
],
"translation": "Duplicate card"
},
"06EQqT": {
"translation": "Duplicating…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
@@ -3904,7 +3983,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
279
]
]
],
"translation": "Duplicating…"
},
"ePK91l": {
"message": "Edit",
@@ -4091,7 +4171,6 @@
"translation": "Email visibility"
},
"bFREhu": {
"translation": "End of list",
"message": "End of list",
"placeholders": {},
"comments": [],
@@ -4100,6 +4179,19 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
200
]
],
"translation": "End of list"
},
"SUXBxp": {
"translation": "Engineering",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
161
]
]
},
"0+ewPp": {
@@ -4843,6 +4935,14 @@
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
77
],
[
"src/views/onboarding/select-plan/index.tsx",
78
],
[
"src/views/pricing/components/FeatureComparisonTable.tsx",
331
@@ -5214,6 +5314,18 @@
],
"translation": "Go to templates"
},
"SUvm1Y": {
"translation": "Good for individuals starting out who just need the essentials.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
79
]
]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -6219,7 +6331,6 @@
"translation": "Make template"
},
"hB02vO": {
"translation": "Manage members",
"message": "Manage members",
"placeholders": {},
"comments": [],
@@ -6232,7 +6343,8 @@
"src/views/board/components/CardContextMenu.tsx",
38
]
]
],
"translation": "Manage members"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -6262,6 +6374,18 @@
],
"translation": "marked checklist item <0>{0}</0> as incomplete"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
161
]
]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -6383,6 +6507,10 @@
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
62
],
[
"src/views/pricing/components/Pricing.tsx",
14
@@ -6407,7 +6535,6 @@
"translation": "monthly billing"
},
"51UCsN": {
"translation": "Move to another list",
"message": "Move to another list",
"placeholders": {},
"comments": [],
@@ -6416,10 +6543,10 @@
"src/views/board/components/CardContextMenu.tsx",
44
]
]
],
"translation": "Move to another list"
},
"J4+OTA": {
"translation": "Move to list",
"message": "Move to list",
"placeholders": {},
"comments": [],
@@ -6428,7 +6555,8 @@
"src/views/board/components/CardContextMoveListModal.tsx",
70
]
]
],
"translation": "Move to list"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -6984,7 +7112,7 @@
"origin": [
[
"src/components/WorkspaceMenu.tsx",
31
34
]
],
"translation": "Open command menu"
@@ -7337,6 +7465,18 @@
],
"translation": "Personal Project"
},
"Oi+J+N": {
"translation": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
125
]
]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -7626,6 +7766,14 @@
"src/views/members/index.tsx",
66
],
[
"src/views/onboarding/workspace-details/index.tsx",
101
],
[
"src/views/onboarding/workspace-details/index.tsx",
150
],
[
"src/views/settings/components/Avatar.tsx",
200
@@ -7714,7 +7862,6 @@
"translation": "Please try again."
},
"nYNMZZ": {
"translation": "Position in list (0 = first, leave empty for end)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
@@ -7723,7 +7870,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
193
]
]
],
"translation": "Position in list (0 = first, leave empty for end)"
},
"aHCEmh": {
"message": "Pricing",
@@ -7810,6 +7958,10 @@
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
91
],
[
"src/views/pricing/components/FeatureComparisonTable.tsx",
333
@@ -8252,6 +8404,10 @@
[
"src/views/home/components/Header.tsx",
28
],
[
"src/views/onboarding/workspace-details/index.tsx",
161
]
],
"translation": "Roadmap"
@@ -8445,7 +8601,6 @@
"translation": "See what our users are saying about Kan"
},
"zYRVNp": {
"translation": "Select a list",
"message": "Select a list",
"placeholders": {},
"comments": [],
@@ -8454,7 +8609,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
131
]
]
],
"translation": "Select a list"
},
"wgNoIs": {
"message": "Select all",
@@ -8600,6 +8756,18 @@
],
"translation": "set the due date"
},
"JjEJSy": {
"translation": "Set up your workspace",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
179
]
]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -8736,6 +8904,22 @@
],
"translation": "Sign In"
},
"fcWrnU": {
"translation": "Sign out",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
284
],
[
"src/views/onboarding/workspace-details/index.tsx",
362
]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -8876,6 +9060,18 @@
],
"translation": "Software Development"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
76
]
]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -9032,6 +9228,18 @@
],
"translation": "System"
},
"KM6m8p": {
"translation": "Team",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
83
]
]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -9237,7 +9445,6 @@
"translation": "The board has been unarchived."
},
"nKBUeF": {
"translation": "The card has been duplicated.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
@@ -9246,7 +9453,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
69
]
]
],
"translation": "The card has been duplicated."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -9452,6 +9660,30 @@
],
"translation": "This member's permissions have been reset to their role defaults."
},
"HQVm6e": {
"translation": "This URL has already been taken",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
73
]
]
},
"gKmoow": {
"translation": "This URL is reserved",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
75
]
]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -9537,7 +9769,6 @@
"translation": "Title"
},
"wK4OTM": {
"translation": "Title (optional)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
@@ -9546,7 +9777,8 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
180
]
]
],
"translation": "Title (optional)"
},
"Se/UIp": {
"message": "To Do",
@@ -9796,6 +10028,10 @@
[
"src/components/NewWorkspaceForm.tsx",
158
],
[
"src/views/onboarding/workspace-details/index.tsx",
100
]
],
"translation": "Unable to create workspace"
@@ -9861,7 +10097,6 @@
"translation": "Unable to delete comment"
},
"Oo4E6p": {
"translation": "Unable to duplicate card",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
@@ -9870,10 +10105,10 @@
"src/views/board/components/CardContextDuplicateModal.tsx",
75
]
]
],
"translation": "Unable to duplicate card"
},
"K7k9u3": {
"translation": "Unable to move card",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
@@ -9882,7 +10117,8 @@
"src/views/board/components/CardContextMoveListModal.tsx",
41
]
]
],
"translation": "Unable to move card"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -9932,6 +10168,18 @@
],
"translation": "Unable to send feedback"
},
"Q60WUZ": {
"translation": "Unable to start checkout",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
149
]
]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -10300,6 +10548,18 @@
],
"translation": "Unlimited members"
},
"8AwlaR": {
"translation": "Unlimited members and a custom workspace username for teams ready to scale.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
94
]
]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -10460,6 +10720,10 @@
[
"src/components/NewWorkspaceForm.tsx",
373
],
[
"src/views/onboarding/workspace-details/index.tsx",
243
]
],
"translation": "Upgrade to Pro ($29/month)"
@@ -10985,6 +11249,10 @@
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
253
],
[
"src/views/settings/WorkspaceSettings.tsx",
82
@@ -11057,6 +11325,10 @@
"src/components/NewWorkspaceForm.tsx",
263
],
[
"src/views/onboarding/workspace-details/index.tsx",
188
],
[
"src/views/settings/WorkspaceSettings.tsx",
63
@@ -11228,6 +11500,18 @@
],
"translation": "You are about to change your password."
},
"3WXdoZ": {
"translation": "You can always change these later in settings.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
182
]
]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -11400,6 +11684,18 @@
],
"translation": "Your account has been deleted."
},
"c4nMcR": {
"translation": "Your avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/select-plan/index.tsx",
229
]
]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -11544,6 +11840,30 @@
],
"translation": "Your unsubscribe link is missing a token. Please open the latest email and try again."
},
"GRAGsB": {
"translation": "Your workspace",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
322
]
]
},
"j0o6ml": {
"translation": "Your workspace description",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
325
]
]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -11592,6 +11912,22 @@
],
"translation": "Your workspace slug has been updated."
},
"OTxjpR": {
"translation": "your-workspace",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
[
"src/views/onboarding/workspace-details/index.tsx",
197
],
[
"src/views/onboarding/workspace-details/index.tsx",
198
]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Registros de actividad"
},
"UGCIzB": {
"translation": "Añadir / editar etiqueta",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Añadir / editar etiqueta"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Se produjo un error inesperado. Por favor, inténtalo de nuevo más tarde."
},
"YkfDoz": {
"translation": "Anual",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Esperando al cliente"
},
"iH8pgl": {
"translation": "Atrás",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Ideal para equipos pequeños y en crecimiento que necesitan colaboración"
},
"zt/6cS": {
"translation": "Ideal para equipos pequeños que desean colaborar y avanzar más rápido juntos.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Tarjeta"
},
"sU2uWc": {
"translation": "Tarjeta duplicada",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Tarjeta duplicada"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Listas de verificación"
},
"zMquA7": {
"translation": "Elige un plan",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Creación de contenido"
},
"xGVfLh": {
"translation": "Continuar",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Copiar enlace de la tarjeta"
},
"0utuU6": {
"translation": "Copiar listas de verificación",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Copiar listas de verificación"
},
"fDQ7hA": {
"translation": "Copiar etiquetas",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Copiar etiquetas"
},
"1bJKhj": {
"translation": "Copiar enlace a la tarjeta",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Copiar enlace a la tarjeta"
},
"uvH2xS": {
"translation": "Copiar miembros",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Copiar miembros"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Crear espacio de trabajo"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Nombre de usuario personalizado"
},
"ZDPJBc": {
"translation": "Los nombres de usuario personalizados requieren actualizar a un plan Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Vence mañana"
},
"euc6Ns": {
"translation": "Duplicar",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplicar"
},
"BTDPLo": {
"translation": "Duplicar tarjeta",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Duplicar tarjeta"
},
"06EQqT": {
"translation": "Duplicando…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplicando…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Visibilidad del email"
},
"bFREhu": {
"translation": "Fin de la lista",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Fin de la lista"
},
"SUXBxp": {
"translation": "Ingeniería",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Ir a plantillas"
},
"SUvm1Y": {
"translation": "Ideal para personas que comienzan y solo necesitan lo esencial.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Crear plantilla"
},
"hB02vO": {
"translation": "Gestionar miembros",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Gestionar miembros"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "marcó el elemento de la lista de verificación <0>{0}</0> como incompleto"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "facturación mensual"
},
"51UCsN": {
"translation": "Mover a otra lista",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Mover a otra lista"
},
"J4+OTA": {
"translation": "Mover a lista",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Mover a lista"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Abrir menú de comandos"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Proyecto personal"
},
"Oi+J+N": {
"translation": "Elige un plan para comenzar. Todos los planes de pago incluyen una prueba gratuita de 14 días.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Por favor, inténtalo de nuevo."
},
"nYNMZZ": {
"translation": "Posición en la lista (0 = primero, dejar vacío para el final)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Posición en la lista (0 = primero, dejar vacío para el final)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Hoja de ruta"
},
@@ -4949,13 +5032,13 @@
"translation": "Mira lo que nuestros usuarios dicen sobre Kan"
},
"zYRVNp": {
"translation": "Seleccionar una lista",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Seleccionar una lista"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "estableció la fecha de vencimiento"
},
"JjEJSy": {
"translation": "Configura tu espacio de trabajo",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Iniciar sesión"
},
"fcWrnU": {
"translation": "Cerrar sesión",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Desarrollo de software"
},
"6sKjjx": {
"translation": "Individual",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Sistema"
},
"KM6m8p": {
"translation": "Equipo",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "El tablero ha sido desarchivado."
},
"nKBUeF": {
"translation": "La tarjeta ha sido duplicada.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "La tarjeta ha sido duplicada."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "Los permisos de este miembro se han restablecido a los valores predeterminados de su rol."
},
"HQVm6e": {
"translation": "Esta URL ya está en uso",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Esta URL está reservada",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Título"
},
"wK4OTM": {
"translation": "Título (opcional)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Título (opcional)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "No se pudo crear el espacio de trabajo"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "No se pudo eliminar el comentario"
},
"Oo4E6p": {
"translation": "No se puede duplicar la tarjeta",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "No se puede duplicar la tarjeta"
},
"K7k9u3": {
"translation": "No se puede mover la tarjeta",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "No se puede mover la tarjeta"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "No se pudo enviar el comentario"
},
"Q60WUZ": {
"translation": "No se pudo iniciar el proceso de pago",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Miembros ilimitados"
},
"8AwlaR": {
"translation": "Miembros ilimitados y un nombre de usuario personalizado para el espacio de trabajo para equipos listos para escalar.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Actualizar a Pro ($29/mes)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Descripción del espacio de trabajo"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Nombre del espacio de trabajo"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Estás a punto de cambiar tu contraseña."
},
"3WXdoZ": {
"translation": "Siempre puedes cambiar esto más tarde en la configuración.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Tu cuenta ha sido eliminada."
},
"c4nMcR": {
"translation": "Tu avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Tu enlace de cancelación de suscripción no tiene un token. Por favor, abre el último correo electrónico e inténtalo de nuevo."
},
"GRAGsB": {
"translation": "Tu espacio de trabajo",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Descripción de tu espacio de trabajo",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "El slug de tu espacio de trabajo ha sido actualizado."
},
"OTxjpR": {
"translation": "tu-espacio-de-trabajo",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Journaux d'activité"
},
"UGCIzB": {
"translation": "Ajouter / modifier l'étiquette",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Ajouter / modifier l'étiquette"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Une erreur inattendue s'est produite. Veuillez réessayer ultérieurement."
},
"YkfDoz": {
"translation": "Annuel",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "En attente du client"
},
"iH8pgl": {
"translation": "Retour",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Idéal pour les petites équipes en croissance qui ont besoin de collaboration"
},
"zt/6cS": {
"translation": "Idéal pour les petites équipes qui souhaitent collaborer et avancer plus rapidement ensemble.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Carte"
},
"sU2uWc": {
"translation": "Carte dupliquée",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Carte dupliquée"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklists"
},
"zMquA7": {
"translation": "Choisir un forfait",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Création de contenu"
},
"xGVfLh": {
"translation": "Continuer",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Copier le lien de la carte"
},
"0utuU6": {
"translation": "Copier les listes de contrôle",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Copier les listes de contrôle"
},
"fDQ7hA": {
"translation": "Copier les étiquettes",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Copier les étiquettes"
},
"1bJKhj": {
"translation": "Copier le lien vers la carte",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Copier le lien vers la carte"
},
"uvH2xS": {
"translation": "Copier les membres",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Copier les membres"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Créer un espace de travail"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Nom d'utilisateur personnalisé"
},
"ZDPJBc": {
"translation": "Les noms d'utilisateur personnalisés nécessitent une mise à niveau vers un forfait Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Échéance demain"
},
"euc6Ns": {
"translation": "Dupliquer",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Dupliquer"
},
"BTDPLo": {
"translation": "Dupliquer la carte",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Dupliquer la carte"
},
"06EQqT": {
"translation": "Duplication en cours…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplication en cours…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Visibilité de l'e-mail"
},
"bFREhu": {
"translation": "Fin de la liste",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Fin de la liste"
},
"SUXBxp": {
"translation": "Ingénierie",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Aller aux modèles"
},
"SUvm1Y": {
"translation": "Idéal pour les particuliers qui débutent et qui ont simplement besoin de l'essentiel.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Créer un modèle"
},
"hB02vO": {
"translation": "Gérer les membres",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Gérer les membres"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "a marqué l'élément de checklist <0>{0}</0> comme incomplet"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "facturation mensuelle"
},
"51UCsN": {
"translation": "Déplacer vers une autre liste",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Déplacer vers une autre liste"
},
"J4+OTA": {
"translation": "Déplacer vers la liste",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Déplacer vers la liste"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Ouvrir le menu de commandes"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Projet personnel"
},
"Oi+J+N": {
"translation": "Choisissez un forfait pour commencer. Tous les forfaits payants incluent un essai gratuit de 14 jours.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Veuillez réessayer."
},
"nYNMZZ": {
"translation": "Position dans la liste (0 = premier, laisser vide pour la fin)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Position dans la liste (0 = premier, laisser vide pour la fin)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Roadmap"
},
@@ -4949,13 +5032,13 @@
"translation": "Découvrez ce que nos utilisateurs disent de Kan"
},
"zYRVNp": {
"translation": "Sélectionner une liste",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Sélectionner une liste"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "a défini la date d'échéance"
},
"JjEJSy": {
"translation": "Configurer votre espace de travail",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Se connecter"
},
"fcWrnU": {
"translation": "Se déconnecter",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Développement logiciel"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Système"
},
"KM6m8p": {
"translation": "Équipe",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "Le tableau a été désarchivé."
},
"nKBUeF": {
"translation": "La carte a été dupliquée.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "La carte a été dupliquée."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "Les permissions de ce membre ont été réinitialisées aux valeurs par défaut de son rôle."
},
"HQVm6e": {
"translation": "Cette URL est déjà prise",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Cette URL est réservée",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Titre"
},
"wK4OTM": {
"translation": "Titre (facultatif)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Titre (facultatif)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Impossible de créer l'espace de travail"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Impossible de supprimer le commentaire"
},
"Oo4E6p": {
"translation": "Impossible de dupliquer la carte",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Impossible de dupliquer la carte"
},
"K7k9u3": {
"translation": "Impossible de déplacer la carte",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Impossible de déplacer la carte"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Impossible d'envoyer le feedback"
},
"Q60WUZ": {
"translation": "Impossible de démarrer le paiement",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Membres illimités"
},
"8AwlaR": {
"translation": "Membres illimités et un nom d'utilisateur d'espace de travail personnalisé pour les équipes prêtes à évoluer.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Passer à Pro (29 $/mois)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Description de l'espace de travail"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Nom de l'espace de travail"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Vous êtes sur le point de modifier votre mot de passe."
},
"3WXdoZ": {
"translation": "Vous pourrez toujours modifier ces paramètres plus tard dans les réglages.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Votre compte a été supprimé."
},
"c4nMcR": {
"translation": "Votre avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Votre lien de désinscription ne contient pas de jeton. Veuillez ouvrir le dernier e-mail et réessayer."
},
"GRAGsB": {
"translation": "Votre espace de travail",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "La description de votre espace de travail",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "L'identifiant de votre espace de travail a été mis à jour."
},
"OTxjpR": {
"translation": "votre-espace-de-travail",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Registri attività"
},
"UGCIzB": {
"translation": "Aggiungi / modifica etichetta",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Aggiungi / modifica etichetta"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Si è verificato un errore imprevisto. Riprova più tardi."
},
"YkfDoz": {
"translation": "Annuale",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "In attesa del cliente"
},
"iH8pgl": {
"translation": "Indietro",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Ideale per piccoli team in crescita che necessitano di collaborazione"
},
"zt/6cS": {
"translation": "Ideale per piccoli team che vogliono collaborare e muoversi più velocemente insieme.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Card"
},
"sU2uWc": {
"translation": "Scheda duplicata",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Scheda duplicata"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklist"
},
"zMquA7": {
"translation": "Scegli un piano",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Creazione di contenuti"
},
"xGVfLh": {
"translation": "Continua",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Copia link card"
},
"0utuU6": {
"translation": "Copia checklist",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Copia checklist"
},
"fDQ7hA": {
"translation": "Copia etichette",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Copia etichette"
},
"1bJKhj": {
"translation": "Copia link alla scheda",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Copia link alla scheda"
},
"uvH2xS": {
"translation": "Copia membri",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Copia membri"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Crea workspace"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Username personalizzato"
},
"ZDPJBc": {
"translation": "I nomi utente personalizzati richiedono l'aggiornamento a un piano Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Scadenza domani"
},
"euc6Ns": {
"translation": "Duplica",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplica"
},
"BTDPLo": {
"translation": "Duplica scheda",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Duplica scheda"
},
"06EQqT": {
"translation": "Duplicazione in corso…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplicazione in corso…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Visibilità email"
},
"bFREhu": {
"translation": "Fine dell'elenco",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Fine dell'elenco"
},
"SUXBxp": {
"translation": "Ingegneria",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Vai ai modelli"
},
"SUvm1Y": {
"translation": "Perfetto per chi inizia e ha bisogno solo delle funzionalità essenziali.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Crea template"
},
"hB02vO": {
"translation": "Gestisci membri",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Gestisci membri"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "ha contrassegnato l'elemento della checklist <0>{0}</0> come incompleto"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "fatturazione mensile"
},
"51UCsN": {
"translation": "Sposta in un altro elenco",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Sposta in un altro elenco"
},
"J4+OTA": {
"translation": "Sposta nell'elenco",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Sposta nell'elenco"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Apri menu comandi"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Progetto personale"
},
"Oi+J+N": {
"translation": "Scegli un piano per iniziare. Tutti i piani a pagamento includono una prova gratuita di 14 giorni.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Riprova."
},
"nYNMZZ": {
"translation": "Posizione nell'elenco (0 = primo, lascia vuoto per la fine)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Posizione nell'elenco (0 = primo, lascia vuoto per la fine)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Roadmap"
},
@@ -4949,13 +5032,13 @@
"translation": "Scopri cosa dicono i nostri utenti su Kan"
},
"zYRVNp": {
"translation": "Seleziona un elenco",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Seleziona un elenco"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "ha impostato la scadenza"
},
"JjEJSy": {
"translation": "Configura il tuo workspace",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Accedi"
},
"fcWrnU": {
"translation": "Esci",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Sviluppo software"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Sistema"
},
"KM6m8p": {
"translation": "Team",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "La bacheca è stata ripristinata."
},
"nKBUeF": {
"translation": "La scheda è stata duplicata.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "La scheda è stata duplicata."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "I permessi di questo membro sono stati ripristinati ai valori predefiniti del suo ruolo."
},
"HQVm6e": {
"translation": "Questo URL è già in uso",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Questo URL è riservato",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Titolo"
},
"wK4OTM": {
"translation": "Titolo (facoltativo)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Titolo (facoltativo)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Impossibile creare lo workspace"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Impossibile eliminare il commento"
},
"Oo4E6p": {
"translation": "Impossibile duplicare la scheda",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Impossibile duplicare la scheda"
},
"K7k9u3": {
"translation": "Impossibile spostare la scheda",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Impossibile spostare la scheda"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Impossibile inviare il feedback"
},
"Q60WUZ": {
"translation": "Impossibile avviare il checkout",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Membri illimitati"
},
"8AwlaR": {
"translation": "Membri illimitati e un nome utente workspace personalizzato per i team pronti a crescere.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Passa a Pro ($29/mese)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Descrizione workspace"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Nome workspace"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Stai per modificare la tua password."
},
"3WXdoZ": {
"translation": "Potrai sempre modificarli in seguito nelle impostazioni.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Il tuo account è stato eliminato."
},
"c4nMcR": {
"translation": "Il tuo avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Il tuo link di disiscrizione non contiene un token. Apri l'ultima email e riprova."
},
"GRAGsB": {
"translation": "Il tuo workspace",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "La descrizione del tuo workspace",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "Lo slug del tuo workspace è stato aggiornato."
},
"OTxjpR": {
"translation": "il-tuo-workspace",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Activiteitenlogboeken"
},
"UGCIzB": {
"translation": "Label toevoegen / bewerken",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Label toevoegen / bewerken"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Er is een onverwachte fout opgetreden. Probeer het later opnieuw."
},
"YkfDoz": {
"translation": "Jaarlijks",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Wacht op klant"
},
"iH8pgl": {
"translation": "Terug",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Het beste voor kleine en groeiende teams die samenwerking nodig hebben"
},
"zt/6cS": {
"translation": "Het beste voor kleine teams die willen samenwerken en sneller vooruit willen komen.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Kaart"
},
"sU2uWc": {
"translation": "Kaart gedupliceerd",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Kaart gedupliceerd"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklists"
},
"zMquA7": {
"translation": "Kies een abonnement",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Content creatie"
},
"xGVfLh": {
"translation": "Doorgaan",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Kopieer kaartlink"
},
"0utuU6": {
"translation": "Checklists kopiëren",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Checklists kopiëren"
},
"fDQ7hA": {
"translation": "Labels kopiëren",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Labels kopiëren"
},
"1bJKhj": {
"translation": "Link naar kaart kopiëren",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Link naar kaart kopiëren"
},
"uvH2xS": {
"translation": "Leden kopiëren",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Leden kopiëren"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Maak werkruimte"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Aangepaste gebruikersnaam"
},
"ZDPJBc": {
"translation": "Aangepaste gebruikersnamen vereisen een upgrade naar een Pro-abonnement",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Verloopt morgen"
},
"euc6Ns": {
"translation": "Dupliceren",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Dupliceren"
},
"BTDPLo": {
"translation": "Kaart dupliceren",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Kaart dupliceren"
},
"06EQqT": {
"translation": "Dupliceren…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Dupliceren…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "E-mailzichtbaarheid"
},
"bFREhu": {
"translation": "Einde van lijst",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Einde van lijst"
},
"SUXBxp": {
"translation": "Engineering",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Ga naar sjablonen"
},
"SUvm1Y": {
"translation": "Geschikt voor individuen die net beginnen en alleen de basisbehoeften hebben.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Sjabloon maken"
},
"hB02vO": {
"translation": "Leden beheren",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Leden beheren"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "heeft checklistitem <0>{0}</0> als onvolledig gemarkeerd"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "maandelijkse facturering"
},
"51UCsN": {
"translation": "Verplaats naar andere lijst",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Verplaats naar andere lijst"
},
"J4+OTA": {
"translation": "Verplaats naar lijst",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Verplaats naar lijst"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Commandomenu openen"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Persoonlijk project"
},
"Oi+J+N": {
"translation": "Kies een abonnement om te beginnen. Alle betaalde abonnementen hebben een gratis proefperiode van 14 dagen.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Probeer het opnieuw."
},
"nYNMZZ": {
"translation": "Positie in lijst (0 = eerste, leeg laten voor het einde)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Positie in lijst (0 = eerste, leeg laten voor het einde)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Roadmap"
},
@@ -4949,13 +5032,13 @@
"translation": "Bekijk wat onze gebruikers over Kan zeggen"
},
"zYRVNp": {
"translation": "Selecteer een lijst",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Selecteer een lijst"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "heeft de vervaldatum ingesteld"
},
"JjEJSy": {
"translation": "Stel je werkruimte in",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Inloggen"
},
"fcWrnU": {
"translation": "Uitloggen",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Softwareontwikkeling"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Systeem"
},
"KM6m8p": {
"translation": "Team",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "Het board is gedearchiveerd."
},
"nKBUeF": {
"translation": "De kaart is gedupliceerd.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "De kaart is gedupliceerd."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "De rechten van dit lid zijn teruggezet naar de standaardinstellingen van hun rol."
},
"HQVm6e": {
"translation": "Deze URL is al in gebruik",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Deze URL is gereserveerd",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Titel"
},
"wK4OTM": {
"translation": "Titel (optioneel)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Titel (optioneel)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Kan workspace niet aanmaken"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Kan opmerking niet verwijderen"
},
"Oo4E6p": {
"translation": "Kan kaart niet dupliceren",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Kan kaart niet dupliceren"
},
"K7k9u3": {
"translation": "Kan kaart niet verplaatsen",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Kan kaart niet verplaatsen"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Kan feedback niet verzenden"
},
"Q60WUZ": {
"translation": "Kan afrekenen niet starten",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Onbeperkt leden"
},
"8AwlaR": {
"translation": "Onbeperkt aantal leden en een aangepaste werkruimte-URL voor teams die klaar zijn om te groeien.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Upgrade naar Pro ($29/maand)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Workspace-beschrijving"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Workspace-naam"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Je staat op het punt je wachtwoord te wijzigen."
},
"3WXdoZ": {
"translation": "Je kunt dit later altijd wijzigen in de instellingen.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Je account is verwijderd."
},
"c4nMcR": {
"translation": "Jouw avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Je afmeldlink mist een token. Open de nieuwste e-mail en probeer het opnieuw."
},
"GRAGsB": {
"translation": "Jouw werkruimte",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Jouw werkruimtebeschrijving",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "Je werkruimte-slug is bijgewerkt."
},
"OTxjpR": {
"translation": "jouw-werkruimte",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Dzienniki aktywności"
},
"UGCIzB": {
"translation": "Dodaj / edytuj etykietę",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Dodaj / edytuj etykietę"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Wystąpił nieoczekiwany błąd. Spróbuj ponownie później."
},
"YkfDoz": {
"translation": "Rocznie",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Oczekiwanie na klienta"
},
"iH8pgl": {
"translation": "Wstecz",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Najlepsze dla małych i rozwijających się zespołów wymagających współpracy"
},
"zt/6cS": {
"translation": "Najlepszy dla małych zespołów, które chcą współpracować i działać szybciej razem.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Karta"
},
"sU2uWc": {
"translation": "Karta zduplikowana",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Karta zduplikowana"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklisty"
},
"zMquA7": {
"translation": "Wybierz plan",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Tworzenie treści"
},
"xGVfLh": {
"translation": "Kontynuuj",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Kopiuj link do karty"
},
"0utuU6": {
"translation": "Kopiuj listy kontrolne",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Kopiuj listy kontrolne"
},
"fDQ7hA": {
"translation": "Kopiuj etykiety",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Kopiuj etykiety"
},
"1bJKhj": {
"translation": "Kopiuj link do karty",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Kopiuj link do karty"
},
"uvH2xS": {
"translation": "Kopiuj członków",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Kopiuj członków"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Utwórz workspace"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Niestandardowa nazwa użytkownika"
},
"ZDPJBc": {
"translation": "Niestandardowe nazwy użytkownika wymagają uaktualnienia do planu Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Termin jutro"
},
"euc6Ns": {
"translation": "Duplikuj",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplikuj"
},
"BTDPLo": {
"translation": "Duplikuj kartę",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Duplikuj kartę"
},
"06EQqT": {
"translation": "Duplikowanie…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplikowanie…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Widoczność e-maila"
},
"bFREhu": {
"translation": "Koniec listy",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Koniec listy"
},
"SUXBxp": {
"translation": "Inżynieria",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Przejdź do szablonów"
},
"SUvm1Y": {
"translation": "Dobry dla osób zaczynających, które potrzebują tylko podstaw.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Utwórz szablon"
},
"hB02vO": {
"translation": "Zarządzaj członkami",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Zarządzaj członkami"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "oznaczył(a) element listy kontrolnej <0>{0}</0> jako nieukończony"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "rozliczenie miesięczne"
},
"51UCsN": {
"translation": "Przenieś do innej listy",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Przenieś do innej listy"
},
"J4+OTA": {
"translation": "Przenieś do listy",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Przenieś do listy"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Otwórz menu poleceń"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Projekt osobisty"
},
"Oi+J+N": {
"translation": "Wybierz plan, aby rozpocząć. Wszystkie płatne plany zawierają 14-dniowy bezpłatny okres próbny.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Spróbuj ponownie."
},
"nYNMZZ": {
"translation": "Pozycja na liście (0 = pierwsza, puste pole = koniec)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Pozycja na liście (0 = pierwsza, puste pole = koniec)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Mapa drogowa"
},
@@ -4949,13 +5032,13 @@
"translation": "Zobacz, co nasi użytkownicy mówią o Kan"
},
"zYRVNp": {
"translation": "Wybierz listę",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Wybierz listę"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "ustaw termin"
},
"JjEJSy": {
"translation": "Skonfiguruj swoją przestrzeń roboczą",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Zaloguj się"
},
"fcWrnU": {
"translation": "Wyloguj się",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Software Development"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "System"
},
"KM6m8p": {
"translation": "Zespół",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "Tablica została przywrócona z archiwum."
},
"nKBUeF": {
"translation": "Karta została zduplikowana.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "Karta została zduplikowana."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "Uprawnienia tego członka zostały zresetowane do domyślnych dla jego roli."
},
"HQVm6e": {
"translation": "Ten adres URL jest już zajęty",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Ten adres URL jest zarezerwowany",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Tytuł"
},
"wK4OTM": {
"translation": "Tytuł (opcjonalnie)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Tytuł (opcjonalnie)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Nie można utworzyć workspace"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Nie można usunąć komentarza"
},
"Oo4E6p": {
"translation": "Nie można zduplikować karty",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Nie można zduplikować karty"
},
"K7k9u3": {
"translation": "Nie można przenieść karty",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Nie można przenieść karty"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Nie można wysłać opinii"
},
"Q60WUZ": {
"translation": "Nie można rozpocząć procesu płatności",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Nielimitowani członkowie"
},
"8AwlaR": {
"translation": "Nieograniczona liczba członków i niestandardowa nazwa użytkownika przestrzeni roboczej dla zespołów gotowych do rozwoju.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Ulepsz do Pro (29 $/miesiąc)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Opis przestrzeni roboczej"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Nazwa przestrzeni roboczej"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Zaraz zmienisz swoje hasło."
},
"3WXdoZ": {
"translation": "Zawsze możesz to później zmienić w ustawieniach.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Twoje konto zostało usunięte."
},
"c4nMcR": {
"translation": "Twój awatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Twój link do wypisania się nie zawiera tokena. Otwórz najnowszy e-mail i spróbuj ponownie."
},
"GRAGsB": {
"translation": "Twoja przestrzeń robocza",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Opis Twojej przestrzeni roboczej",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "Slug Twojego workspace został zaktualizowany."
},
"OTxjpR": {
"translation": "twoja-przestrzen",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Registros de atividades"
},
"UGCIzB": {
"translation": "Adicionar / editar etiqueta",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Adicionar / editar etiqueta"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Ocorreu um erro inesperado. Por favor, tente novamente mais tarde."
},
"YkfDoz": {
"translation": "Anual",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Aguardando cliente"
},
"iH8pgl": {
"translation": "Voltar",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Ideal para equipes pequenas e em crescimento que precisam de colaboração"
},
"zt/6cS": {
"translation": "Ideal para pequenas equipes que desejam colaborar e avançar mais rápido juntas.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Cartão"
},
"sU2uWc": {
"translation": "Cartão duplicado",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Cartão duplicado"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Checklists"
},
"zMquA7": {
"translation": "Escolha um plano",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Criação de conteúdo"
},
"xGVfLh": {
"translation": "Continuar",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Copiar link do cartão"
},
"0utuU6": {
"translation": "Copiar checklists",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Copiar checklists"
},
"fDQ7hA": {
"translation": "Copiar etiquetas",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Copiar etiquetas"
},
"1bJKhj": {
"translation": "Copiar link do cartão",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Copiar link do cartão"
},
"uvH2xS": {
"translation": "Copiar membros",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Copiar membros"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Criar workspace"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Nome de usuário personalizado"
},
"ZDPJBc": {
"translation": "Nomes de usuário personalizados exigem atualização para um plano Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2283,32 +2331,32 @@
"translation": "Vence amanhã"
},
"euc6Ns": {
"translation": "Duplicar",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplicar"
},
"BTDPLo": {
"translation": "Duplicar cartão",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Duplicar cartão"
},
"06EQqT": {
"translation": "Duplicando…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Duplicando…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Visibilidade do email"
},
"bFREhu": {
"translation": "Fim da lista",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Fim da lista"
},
"SUXBxp": {
"translation": "Engenharia",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Ir para modelos"
},
"SUvm1Y": {
"translation": "Bom para indivíduos começando que precisam apenas do essencial.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Criar modelo"
},
"hB02vO": {
"translation": "Gerenciar membros",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Gerenciar membros"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "marcou o item da checklist <0>{0}</0> como incompleto"
},
"vo2a+a": {
"translation": "Marketing",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "cobrança mensal"
},
"51UCsN": {
"translation": "Mover para outra lista",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Mover para outra lista"
},
"J4+OTA": {
"translation": "Mover para lista",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Mover para lista"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Abrir menu de comandos"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Projeto pessoal"
},
"Oi+J+N": {
"translation": "Escolha um plano para começar. Todos os planos pagos incluem 14 dias de teste grátis.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Por favor, tente novamente."
},
"nYNMZZ": {
"translation": "Posição na lista (0 = primeira, deixe vazio para o final)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Posição na lista (0 = primeira, deixe vazio para o final)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Roadmap"
},
@@ -4949,13 +5032,13 @@
"translation": "Veja o que nossos usuários estão dizendo sobre o Kan"
},
"zYRVNp": {
"translation": "Selecione uma lista",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Selecione uma lista"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "definiu a data de vencimento"
},
"JjEJSy": {
"translation": "Configure seu workspace",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Entrar"
},
"fcWrnU": {
"translation": "Sair",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Desenvolvimento de software"
},
"6sKjjx": {
"translation": "Solo",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Sistema"
},
"KM6m8p": {
"translation": "Equipe",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "O quadro foi desarquivado."
},
"nKBUeF": {
"translation": "O cartão foi duplicado.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "O cartão foi duplicado."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "As permissões deste membro foram redefinidas para os padrões de sua função."
},
"HQVm6e": {
"translation": "Esta URL já está em uso",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Esta URL é reservada",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Título"
},
"wK4OTM": {
"translation": "Título (opcional)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Título (opcional)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Não foi possível criar workspace"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Não foi possível excluir o comentário"
},
"Oo4E6p": {
"translation": "Não foi possível duplicar o cartão",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Não foi possível duplicar o cartão"
},
"K7k9u3": {
"translation": "Não foi possível mover o cartão",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Não foi possível mover o cartão"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Não foi possível enviar o feedback"
},
"Q60WUZ": {
"translation": "Não foi possível iniciar o checkout",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Membros ilimitados"
},
"8AwlaR": {
"translation": "Membros ilimitados e um nome de usuário personalizado para equipes prontas para crescer.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Fazer upgrade para Pro ($29/mês)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Descrição do workspace"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Nome do workspace"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Você está prestes a alterar sua senha."
},
"3WXdoZ": {
"translation": "Você pode alterar isso depois nas configurações.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Sua conta foi excluída."
},
"c4nMcR": {
"translation": "Seu avatar",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "Seu link de cancelamento de inscrição está sem um token. Por favor, abra o e-mail mais recente e tente novamente."
},
"GRAGsB": {
"translation": "Seu workspace",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Descrição do seu workspace",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "O slug do seu workspace foi atualizado."
},
"OTxjpR": {
"translation": "seu-workspace",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -239,11 +239,11 @@
"translation": "Журналы активности"
},
"UGCIzB": {
"translation": "Добавить / изменить метку",
"message": "Add / edit label",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 50]],
"translation": "Добавить / изменить метку"
},
"B3xxao": {
"message": "Add a card",
@@ -556,6 +556,13 @@
],
"translation": "Произошла непредвиденная ошибка. Пожалуйста, попробуйте позже."
},
"YkfDoz": {
"translation": "Ежегодно",
"message": "Annual",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 63]]
},
"3bqt9U": {
"message": "Anyone with this link can join your workspace",
"placeholders": {},
@@ -756,6 +763,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 59]],
"translation": "Ожидание клиента"
},
"iH8pgl": {
"translation": "Назад",
"message": "Back",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 275]]
},
"KNKCTb": {
"message": "Backlog",
"placeholders": {},
@@ -798,6 +812,13 @@
"origin": [["src/views/pricing/components/PricingTiers.tsx", 53]],
"translation": "Лучше всего подходит для небольших и развивающихся команд, которым нужна совместная работа"
},
"zt/6cS": {
"translation": "Идеально для небольших команд, которые хотят сотрудничать и работать быстрее вместе.",
"message": "Best for small teams who want to collaborate and move faster together.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 86]]
},
"qaS+1/": {
"message": "Best for teams that want to scale without limits",
"placeholders": {},
@@ -1249,6 +1270,7 @@
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
["src/views/onboarding/select-plan/index.tsx", 209],
["src/views/settings/components/Avatar.tsx", 287],
["src/views/settings/components/ChangePasswordConfirmation.tsx", 168],
[
@@ -1270,11 +1292,13 @@
"translation": "Карточка"
},
"sU2uWc": {
"translation": "Карточка продублирована",
"message": "Card duplicated",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 67]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 67]
],
"translation": "Карточка продублирована"
},
"fEY2vP": {
"message": "Card not found",
@@ -1376,6 +1400,13 @@
],
"translation": "Чек-листы"
},
"zMquA7": {
"translation": "Выберите тариф",
"message": "Choose a plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 122]]
},
"VHS0aJ": {
"message": "Clear all custom permissions?",
"placeholders": {},
@@ -1633,6 +1664,16 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 40]],
"translation": "Создание контента"
},
"xGVfLh": {
"translation": "Продолжить",
"message": "Continue",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 212],
["src/views/onboarding/workspace-details/index.tsx", 291]
]
},
"J2Wbjt": {
"message": "Continue with ",
"placeholders": {},
@@ -1678,38 +1719,38 @@
"translation": "Скопировать ссылку на карточку"
},
"0utuU6": {
"translation": "Копировать чек-листы",
"message": "Copy checklists",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 257]
]
],
"translation": "Копировать чек-листы"
},
"fDQ7hA": {
"translation": "Копировать метки",
"message": "Copy labels",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 221]
]
],
"translation": "Копировать метки"
},
"1bJKhj": {
"translation": "Копировать ссылку на карточку",
"message": "Copy link to card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 62]],
"translation": "Копировать ссылку на карточку"
},
"uvH2xS": {
"translation": "Копировать участников",
"message": "Copy members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 239]
]
],
"translation": "Копировать участников"
},
"9PaIxv": {
"message": "Core features",
@@ -1841,7 +1882,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 388],
["src/components/WorkspaceMenu.tsx", 153]
["src/components/WorkspaceMenu.tsx", 160]
],
"translation": "Создать рабочее пространство"
},
@@ -1941,6 +1982,13 @@
],
"translation": "Пользовательское имя"
},
"ZDPJBc": {
"translation": "Для пользовательских имен пользователей требуется обновление до тарифа Pro",
"message": "Custom usernames require upgrading to a Pro plan",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 220]]
},
"j9IZZ0": {
"message": "Custom workspace URL",
"placeholders": {},
@@ -2224,7 +2272,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 36],
["src/views/board/components/CardContextDueDateModal.tsx", 36],
["src/views/board/components/CardContextLabelsModal.tsx", 48],
["src/views/board/components/CardContextMembersModal.tsx", 68],
["src/views/boards/components/TemplateBoards.tsx", 17],
@@ -2283,32 +2331,32 @@
"translation": "Срок — завтра"
},
"euc6Ns": {
"translation": "Дублировать",
"message": "Duplicate",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Дублировать"
},
"BTDPLo": {
"translation": "Дублировать карточку",
"message": "Duplicate card",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 111],
["src/views/board/components/CardContextMenu.tsx", 68]
]
],
"translation": "Дублировать карточку"
},
"06EQqT": {
"translation": "Дублирование…",
"message": "Duplicating…",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 279]
]
],
"translation": "Дублирование…"
},
"ePK91l": {
"message": "Edit",
@@ -2423,13 +2471,20 @@
"translation": "Видимость email"
},
"bFREhu": {
"translation": "Конец списка",
"message": "End of list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 200]
]
],
"translation": "Конец списка"
},
"SUXBxp": {
"translation": "Разработка",
"message": "Engineering",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"0+ewPp": {
"message": "Enhancement",
@@ -2887,6 +2942,8 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 77],
["src/views/onboarding/select-plan/index.tsx", 78],
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
["src/views/pricing/components/Pricing.tsx", 32],
["src/views/pricing/components/Pricing.tsx", 32],
@@ -3097,6 +3154,13 @@
"origin": [["src/components/SideNavigation.tsx", 119]],
"translation": "Перейти к шаблонам"
},
"SUvm1Y": {
"translation": "Подходит для начинающих пользователей, которым нужны только базовые функции.",
"message": "Good for individuals starting out who just need the essentials.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 79]]
},
"cdyS7J": {
"message": "Google SSO",
"placeholders": {},
@@ -3695,14 +3759,14 @@
"translation": "Создать шаблон"
},
"hB02vO": {
"translation": "Управление участниками",
"message": "Manage members",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextMembersModal.tsx", 51],
["src/views/board/components/CardContextMenu.tsx", 38]
]
],
"translation": "Управление участниками"
},
"IDvohQ": {
"message": "marked a checklist item as incomplete",
@@ -3720,6 +3784,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 258]],
"translation": "отметил элемент контрольного списка <0>{0}</0> как невыполненный"
},
"vo2a+a": {
"translation": "Маркетинг",
"message": "Marketing",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 161]]
},
"agPptk": {
"message": "Medium",
"placeholders": {},
@@ -3791,6 +3862,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 62],
["src/views/pricing/components/Pricing.tsx", 14],
["src/views/pricing/index.tsx", 20]
],
@@ -3804,18 +3876,18 @@
"translation": "ежемесячная оплата"
},
"51UCsN": {
"translation": "Переместить в другой список",
"message": "Move to another list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]]
"origin": [["src/views/board/components/CardContextMenu.tsx", 44]],
"translation": "Переместить в другой список"
},
"J4+OTA": {
"translation": "Переместить в список",
"message": "Move to list",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
"translation": "Переместить в список"
},
"BOqTi5": {
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
@@ -4142,7 +4214,7 @@
"message": "Open command menu",
"placeholders": {},
"comments": [],
"origin": [["src/components/WorkspaceMenu.tsx", 31]],
"origin": [["src/components/WorkspaceMenu.tsx", 34]],
"translation": "Открыть командное меню"
},
"cFQEU/": {
@@ -4358,6 +4430,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 86]],
"translation": "Личный проект"
},
"Oi+J+N": {
"translation": "Выберите тариф, чтобы начать. Все платные тарифы включают 14-дневный бесплатный пробный период.",
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 125]]
},
"Iqh0Uv": {
"message": "Planned",
"placeholders": {},
@@ -4482,6 +4561,8 @@
["src/views/members/components/InviteMemberForm.tsx", 104],
["src/views/members/components/InviteMemberForm.tsx", 241],
["src/views/members/index.tsx", 66],
["src/views/onboarding/workspace-details/index.tsx", 101],
["src/views/onboarding/workspace-details/index.tsx", 150],
["src/views/settings/components/Avatar.tsx", 200],
["src/views/settings/components/DeleteAccountConfirmation.tsx", 40],
["src/views/settings/components/DeleteWorkspaceConfirmation.tsx", 46],
@@ -4519,13 +4600,13 @@
"translation": "Пожалуйста, попробуйте ещё раз."
},
"nYNMZZ": {
"translation": "Позиция в списке (0 = первая, оставьте пустым для конца)",
"message": "Position in list (0 = first, leave empty for end)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 193]
]
],
"translation": "Позиция в списке (0 = первая, оставьте пустым для конца)"
},
"aHCEmh": {
"message": "Pricing",
@@ -4572,6 +4653,7 @@
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 91],
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
["src/views/pricing/components/PricingTiers.tsx", 70]
],
@@ -4829,7 +4911,8 @@
"origin": [
["src/views/home/components/Footer.tsx", 36],
["src/views/home/components/Header.tsx", 13],
["src/views/home/components/Header.tsx", 28]
["src/views/home/components/Header.tsx", 28],
["src/views/onboarding/workspace-details/index.tsx", 161]
],
"translation": "Дорожная карта"
},
@@ -4949,13 +5032,13 @@
"translation": "Посмотрите, что наши пользователи говорят о Kan"
},
"zYRVNp": {
"translation": "Выберите список",
"message": "Select a list",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 131]
]
],
"translation": "Выберите список"
},
"wgNoIs": {
"message": "Select all",
@@ -5041,6 +5124,13 @@
"origin": [["src/views/card/components/ActivityList.tsx", 142]],
"translation": "установить срок"
},
"JjEJSy": {
"translation": "Настройте ваше рабочее пространство",
"message": "Set up your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 179]]
},
"Tz0i8g": {
"message": "Settings",
"placeholders": {},
@@ -5121,6 +5211,16 @@
"origin": [["src/views/invite/index.tsx", 154]],
"translation": "Войти"
},
"fcWrnU": {
"translation": "Выйти",
"message": "Sign out",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/select-plan/index.tsx", 284],
["src/views/onboarding/workspace-details/index.tsx", 362]
]
},
"mErq7F": {
"message": "Sign Up",
"placeholders": {},
@@ -5206,6 +5306,13 @@
"origin": [["src/views/boards/components/TemplateBoards.tsx", 22]],
"translation": "Разработка ПО"
},
"6sKjjx": {
"translation": "Индивидуальный",
"message": "Solo",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 76]]
},
"vnS6Rf": {
"message": "SSO",
"placeholders": {},
@@ -5305,6 +5412,13 @@
"origin": [["src/components/UserMenu.tsx", 144]],
"translation": "Система"
},
"KM6m8p": {
"translation": "Команда",
"message": "Team",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 83]]
},
"bff61F": {
"message": "Team Plan",
"placeholders": {},
@@ -5427,11 +5541,13 @@
"translation": "Доска была восстановлена из архива."
},
"nKBUeF": {
"translation": "Карточка была продублирована.",
"message": "The card has been duplicated.",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 69]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 69]
],
"translation": "Карточка была продублирована."
},
"jlB2RY": {
"message": "The current password you entered is incorrect.",
@@ -5555,6 +5671,20 @@
],
"translation": "Права этого участника были сброшены до значений по умолчанию для его роли."
},
"HQVm6e": {
"translation": "Этот URL уже занят",
"message": "This URL has already been taken",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 73]]
},
"gKmoow": {
"translation": "Этот URL зарезервирован",
"message": "This URL is reserved",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 75]]
},
"OAYToL": {
"message": "This will remove all custom member permissions in this workspace. Members will inherit permissions only from their roles.",
"placeholders": {},
@@ -5616,13 +5746,13 @@
"translation": "Заголовок"
},
"wK4OTM": {
"translation": "Название (необязательно)",
"message": "Title (optional)",
"placeholders": {},
"comments": [],
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 180]
]
],
"translation": "Название (необязательно)"
},
"Se/UIp": {
"message": "To Do",
@@ -5768,7 +5898,10 @@
"message": "Unable to create workspace",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 158]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 158],
["src/views/onboarding/workspace-details/index.tsx", 100]
],
"translation": "Не удалось создать рабочую область"
},
"WHHLh9": {
@@ -5809,18 +5942,20 @@
"translation": "Не удалось удалить комментарий"
},
"Oo4E6p": {
"translation": "Невозможно дублировать карточку",
"message": "Unable to duplicate card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextDuplicateModal.tsx", 75]]
"origin": [
["src/views/board/components/CardContextDuplicateModal.tsx", 75]
],
"translation": "Невозможно дублировать карточку"
},
"K7k9u3": {
"translation": "Невозможно переместить карточку",
"message": "Unable to move card",
"placeholders": {},
"comments": [],
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]]
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 41]],
"translation": "Невозможно переместить карточку"
},
"8yFGGF": {
"message": "Unable to remove member",
@@ -5854,6 +5989,13 @@
"origin": [["src/components/FeedbackModal.tsx", 40]],
"translation": "Не удалось отправить отзыв"
},
"Q60WUZ": {
"translation": "Не удалось начать оформление заказа",
"message": "Unable to start checkout",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 149]]
},
"T7Mywq": {
"message": "Unable to update board",
"placeholders": {},
@@ -6061,6 +6203,13 @@
],
"translation": "Неограниченное количество участников"
},
"8AwlaR": {
"translation": "Неограниченное количество участников и персональное имя рабочего пространства для команд, готовых к масштабированию.",
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 94]]
},
"Ws+3X+": {
"message": "Unlimited seats and advanced features for growing teams.",
"placeholders": {},
@@ -6150,7 +6299,10 @@
"message": "Upgrade to Pro ($29/month)",
"placeholders": {},
"comments": [],
"origin": [["src/components/NewWorkspaceForm.tsx", 373]],
"origin": [
["src/components/NewWorkspaceForm.tsx", 373],
["src/views/onboarding/workspace-details/index.tsx", 243]
],
"translation": "Перейти на Pro (29 $/месяц)"
},
"b3Thhd": {
@@ -6462,7 +6614,10 @@
"message": "Workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/settings/WorkspaceSettings.tsx", 82]],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 253],
["src/views/settings/WorkspaceSettings.tsx", 82]
],
"translation": "Описание рабочего пространства"
},
"Ax/hYa": {
@@ -6509,6 +6664,7 @@
"comments": [],
"origin": [
["src/components/NewWorkspaceForm.tsx", 263],
["src/views/onboarding/workspace-details/index.tsx", 188],
["src/views/settings/WorkspaceSettings.tsx", 63]
],
"translation": "Название рабочего пространства"
@@ -6616,6 +6772,13 @@
"origin": [["src/views/settings/AccountSettings.tsx", 91]],
"translation": "Вы собираетесь изменить свой пароль."
},
"3WXdoZ": {
"translation": "Вы всегда можете изменить это позже в настройках.",
"message": "You can always change these later in settings.",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 182]]
},
"aelko+": {
"message": "You can get a custom workspace URL, like <0>kan.bn/kan</0>, by going into your <1>workspace settings</1> and purchasing a pro workspace subscription. All subscriptions help fund the development of the project!",
"placeholders": {},
@@ -6711,6 +6874,13 @@
],
"translation": "Ваш аккаунт был удалён."
},
"c4nMcR": {
"translation": "Ваш аватар",
"message": "Your avatar",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/select-plan/index.tsx", 229]]
},
"evg7+A": {
"message": "Your boards have been imported.",
"placeholders": {},
@@ -6797,6 +6967,20 @@
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
"translation": "В вашей ссылке для отписки отсутствует токен. Пожалуйста, откройте последнее письмо и попробуйте снова."
},
"GRAGsB": {
"translation": "Ваше рабочее пространство",
"message": "Your workspace",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 322]]
},
"j0o6ml": {
"translation": "Описание вашего рабочего пространства",
"message": "Your workspace description",
"placeholders": {},
"comments": [],
"origin": [["src/views/onboarding/workspace-details/index.tsx", 325]]
},
"GnSSGm": {
"message": "Your workspace description has been updated.",
"placeholders": {},
@@ -6833,6 +7017,16 @@
],
"translation": "Слаг вашего рабочего пространства был обновлён."
},
"OTxjpR": {
"translation": "your-workspace",
"message": "your-workspace",
"placeholders": {},
"comments": [],
"origin": [
["src/views/onboarding/workspace-details/index.tsx", 197],
["src/views/onboarding/workspace-details/index.tsx", 198]
]
},
"4DOCMI": {
"message": "YouTube URL",
"placeholders": {},

File diff suppressed because one or more lines are too long

View File

@@ -1,12 +1,13 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import { env } from "~/env";
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "GET") {
return res.status(405).json({ message: "Method not allowed" });
}
@@ -32,7 +33,9 @@ export default withRateLimit(
try {
allowedHost = new URL(s3Endpoint).hostname.toLowerCase();
} catch {
return res.status(500).json({ message: "Storage endpoint misconfigured" });
return res
.status(500)
.json({ message: "Storage endpoint misconfigured" });
}
if (hostname !== allowedHost && !hostname.endsWith(`.${allowedHost}`)) {
@@ -66,10 +69,7 @@ export default withRateLimit(
const buffer = await upstream.arrayBuffer();
return res.send(Buffer.from(buffer));
} catch (error) {
console.error("Error downloading attachment:", error);
return res
.status(500)
.json({ message: "Failed to download attachment" });
return res.status(500).json({ message: "Failed to download attachment" });
}
},
}),
);

View File

@@ -1,25 +1,25 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "GET") {
return res.status(405).json({ message: "Method not allowed" });
}
try {
const response = await fetch("https://formbricks.com/api/oss-friends");
if (!response.ok) {
throw new Error("Failed to fetch from Formbricks");
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "GET") {
return res.status(405).json({ message: "Method not allowed" });
}
const data = await response.json();
return res.status(200).json(data);
} catch (error) {
console.error("Error fetching OSS friends:", error);
return res.status(500).json({ message: "Failed to fetch OSS friends" });
}
},
try {
const response = await fetch("https://formbricks.com/api/oss-friends");
if (!response.ok) {
throw new Error("Failed to fetch from Formbricks");
}
const data = await response.json();
return res.status(200).json(data);
} catch (error) {
return res.status(500).json({ message: "Failed to fetch OSS friends" });
}
}),
);

View File

@@ -2,34 +2,34 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { env } from "next-runtime-env";
import { createNextApiContext } from "@kan/api/trpc";
import { createStripeClient } from "@kan/stripe";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import { createStripeClient } from "@kan/stripe";
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
const stripe = createStripeClient();
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
const stripe = createStripeClient();
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
try {
const { user } = await createNextApiContext(req);
if (!user?.stripeCustomerId) {
return res.status(404).json({ error: "No billing account found" });
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
const session = await stripe.billingPortal.sessions.create({
customer: user.stripeCustomerId,
return_url: `${env("NEXT_PUBLIC_BASE_URL")}/settings`,
});
try {
const { user } = await createNextApiContext(req);
return res.status(200).json({ url: session.url });
} catch (error) {
console.error("Error:", error);
return res.status(500).json({ error: "Error creating portal session" });
}
},
if (!user?.stripeCustomerId) {
return res.status(404).json({ error: "No billing account found" });
}
const session = await stripe.billingPortal.sessions.create({
customer: user.stripeCustomerId,
return_url: `${env("NEXT_PUBLIC_BASE_URL")}/settings`,
});
return res.status(200).json({ url: session.url });
} catch (error) {
return res.status(500).json({ error: "Error creating portal session" });
}
}),
);

View File

@@ -3,10 +3,13 @@ import { env } from "next-runtime-env";
import { z } from "zod";
import { createNextApiContext } from "@kan/api/trpc";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { assertPermission } from "@kan/api/utils/permissions";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import * as subscriptionRepo from "@kan/db/repository/subscription.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { generateUID } from "@kan/shared/utils";
import { createStripeClient } from "@kan/stripe";
import { withRateLimit } from "@kan/api/utils/rateLimit";
const workspaceSlugSchema = z
.string()
@@ -17,21 +20,24 @@ const workspaceSlugSchema = z
interface CheckoutSessionRequest {
successUrl: string;
cancelUrl: string;
slug: string;
workspacePublicId: string;
stripeCustomerId: string;
plan: "team" | "pro";
billing?: string;
workspacePublicId?: string;
slug?: string;
workspaceName?: string;
workspaceDescription?: string;
workspaceSlug?: string;
}
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
const stripe = createStripeClient();
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
const stripe = createStripeClient();
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
try {
const { user, db } = await createNextApiContext(req);
if (!user) {
@@ -39,81 +45,107 @@ export default withRateLimit(
}
const body = req.body as CheckoutSessionRequest;
const { successUrl, cancelUrl, slug, workspacePublicId } = body;
const {
successUrl,
cancelUrl,
plan,
billing,
workspacePublicId,
slug,
workspaceName,
workspaceDescription,
workspaceSlug,
} = body;
if (!successUrl || !cancelUrl || !workspacePublicId) {
if (!successUrl || !cancelUrl || !plan) {
return res.status(400).json({ error: "Missing required fields" });
}
if (slug) {
const slugResult = workspaceSlugSchema.safeParse(slug);
if (!workspacePublicId && !workspaceName) {
return res
.status(400)
.json({ error: "Must provide workspacePublicId or workspaceName" });
}
const resolvedSlug = slug ?? workspaceSlug;
if (resolvedSlug) {
const slugResult = workspaceSlugSchema.safeParse(resolvedSlug);
if (!slugResult.success) {
return new Response(
JSON.stringify({ error: "Invalid workspace slug" }),
{
status: 400,
headers: { "Content-Type": "application/json" },
},
);
return res.status(400).json({ error: "Invalid workspace slug" });
}
}
const workspace = await workspaceRepo.getAllByUserId(db, user.id);
let resolvedWorkspacePublicId = workspacePublicId;
let subscriptionId: number | undefined;
const isMemberOfWorkspace = workspace.some(
({ workspace }) => workspace.publicId === body.workspacePublicId,
);
if (workspacePublicId) {
// Existing workspace upgrade
const workspace = await workspaceRepo.getByPublicId(
db,
workspacePublicId,
);
if (!isMemberOfWorkspace) {
return new Response(JSON.stringify({ error: "Unauthorized" }), {
status: 403,
headers: { "Content-Type": "application/json" },
if (!workspace) {
return res.status(404).json({ error: "Workspace not found" });
}
try {
await assertPermission(db, user.id, workspace.id, "workspace:manage");
} catch {
return res.status(403).json({ error: "Unauthorized" });
}
const subscription = await subscriptionRepo.create(db, {
plan: plan,
referenceId: workspacePublicId,
userId: user.id,
stripeCustomerId: user.stripeCustomerId ?? "",
status: "incomplete",
});
subscriptionId = subscription?.id;
if (!subscriptionId) {
return res.status(500).json({ error: "Error creating subscription" });
}
} else {
resolvedWorkspacePublicId = generateUID();
}
const subscription = await subscriptionRepo.create(db, {
plan: "pro",
referenceId: workspacePublicId,
userId: user.id,
stripeCustomerId: user.stripeCustomerId ?? "",
status: "incomplete",
});
const subscriptionId = subscription?.id;
if (!subscriptionId) {
return res.status(500).json({ error: "Error creating subscription" });
}
const isTeam = body.plan === "team";
const annualPriceId = isTeam
? (process.env.STRIPE_TEAM_PLAN_YEARLY_PRICE_ID ??
process.env.STRIPE_TEAM_PLAN_MONTHLY_PRICE_ID)
: (process.env.STRIPE_PRO_PLAN_YEARLY_PRICE_ID ??
process.env.STRIPE_PRO_PLAN_MONTHLY_PRICE_ID);
const monthlyPriceId = isTeam
? process.env.STRIPE_TEAM_PLAN_MONTHLY_PRICE_ID
: process.env.STRIPE_PRO_PLAN_MONTHLY_PRICE_ID;
const priceId = billing === "annual" ? annualPriceId : monthlyPriceId;
const session = await stripe.checkout.sessions.create({
mode: "subscription",
payment_method_collection: "always",
line_items: [
{
price: process.env.STRIPE_PRO_PLAN_MONTHLY_PRICE_ID,
quantity: 1,
},
],
subscription_data: {
trial_period_days: 14,
},
success_url: `${env("NEXT_PUBLIC_BASE_URL")}${successUrl}`,
line_items: [{ price: priceId, quantity: 1 }],
subscription_data: { trial_period_days: 14 },
success_url: `${env("NEXT_PUBLIC_BASE_URL")}${successUrl}?workspacePublicId=${resolvedWorkspacePublicId}`,
cancel_url: `${env("NEXT_PUBLIC_BASE_URL")}${cancelUrl}`,
client_reference_id: workspacePublicId,
client_reference_id: resolvedWorkspacePublicId,
customer: user.stripeCustomerId ?? undefined,
metadata: {
...(slug && { workspaceSlug: slug }),
workspacePublicId,
workspacePublicId: resolvedWorkspacePublicId!,
userId: user.id,
subscriptionId,
userEmail: user.email ?? "",
...(resolvedSlug && { workspaceSlug: resolvedSlug }),
...(workspaceName && { workspaceName }),
...(workspaceDescription && { workspaceDescription }),
...(subscriptionId && { subscriptionId: String(subscriptionId) }),
plan: plan,
isNewWorkspace: workspaceName ? "true" : "false",
},
});
return res.status(200).json({ url: session.url });
} catch (error) {
console.error("Error:", error);
return res.status(500).json({ error: "Error creating checkout session" });
}
},
}),
);

View File

@@ -1,12 +1,14 @@
import { randomUUID } from "crypto";
import type { NextApiRequest, NextApiResponse } from "next";
import type { Readable } from "node:stream";
import { createNextApiContext } from "@kan/api/trpc";
import * as subscriptionRepo from "@kan/db/repository/subscription.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { createLogger } from "@kan/logger";
import { createStripeClient } from "@kan/stripe";
const log = createLogger("stripe-webhook");
const log = createLogger("api");
async function buffer(readable: Readable) {
const chunks = [];
@@ -21,6 +23,9 @@ export default async function handler(
res: NextApiResponse,
) {
const stripe = createStripeClient();
const start = Date.now();
const requestId = randomUUID();
const procedure = req.url?.split("?")[0] ?? "/api/stripe/webhook";
if (req.method !== "POST") {
return res.status(405).json({ message: "Method not allowed" });
@@ -44,29 +49,85 @@ export default async function handler(
const { db } = await createNextApiContext(req);
log.info({ eventType: event.type, eventId: event.id }, "Stripe webhook received");
switch (event.type) {
case "checkout.session.completed": {
const checkoutSession = event.data.object;
const meta = checkoutSession.metadata;
const metaData = checkoutSession.metadata;
if (!meta?.workspacePublicId) break;
if (metaData?.workspacePublicId) {
await workspaceRepo.update(db, metaData.workspacePublicId, {
...(metaData.workspaceSlug && { slug: metaData.workspaceSlug }),
plan: "pro",
const plan = meta.plan === "team" ? "team" : ("pro" as const);
if (
meta.isNewWorkspace === "true" &&
meta.workspaceName &&
meta.userId &&
meta.userEmail
) {
const existing = await workspaceRepo.getByPublicId(db, meta.workspacePublicId);
if (!existing) {
const slug = meta.workspaceSlug ?? meta.workspacePublicId;
await workspaceRepo.create(db, {
publicId: meta.workspacePublicId,
name: meta.workspaceName,
slug,
plan,
createdBy: meta.userId,
createdByEmail: meta.userEmail,
...(meta.workspaceDescription && {
description: meta.workspaceDescription,
}),
});
await subscriptionRepo.create(db, {
plan,
referenceId: meta.workspacePublicId,
userId: meta.userId,
stripeCustomerId: checkoutSession.customer as string,
status: "active",
});
}
} else {
// Existing workspace upgrade — update plan (and slug for pro)
await workspaceRepo.update(db, meta.workspacePublicId, {
plan,
...(plan === "pro" && meta.workspaceSlug && { slug: meta.workspaceSlug }),
});
}
break;
}
default:
log.warn({ eventType: event.type }, "Unhandled Stripe event type");
}
log.info(
{
requestId,
procedure,
transport: "rest",
duration: Date.now() - start,
status: 200,
input: { eventType: event.type, eventId: event.id },
},
"API OK",
);
return res.status(200).json({ received: true });
} catch (err) {
log.error({ err }, "Stripe webhook handler failed");
log.error(
{
requestId,
procedure,
transport: "rest",
duration: Date.now() - start,
status: 400,
err,
},
"API error",
);
return res.status(400).json({ message: "Webhook handler failed" });
}
}

View File

@@ -1,52 +1,58 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { addYears } from "date-fns";
import { createNextApiContext } from "@kan/api/trpc";
import { integrations } from "@kan/db/schema";
import { addYears } from "date-fns";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import { integrations } from "@kan/db/schema";
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "POST") {
return res.status(405).json({ message: "Method not allowed" });
}
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "POST") {
return res.status(405).json({ message: "Method not allowed" });
}
const { user } = await createNextApiContext(req);
const { user } = await createNextApiContext(req);
if (!user)
return res.status(401).json({ message: "User not authenticated" });
if (!user)
return res.status(401).json({ message: "User not authenticated" });
const apiKey = process.env.TRELLO_APP_API_KEY;
const apiKey = process.env.TRELLO_APP_API_KEY;
if (!apiKey)
return res.status(500).json({ message: "Trello API key not set in Environment Variables" });
if (!apiKey)
return res
.status(500)
.json({ message: "Trello API key not set in Environment Variables" });
const token = req.body.token;
const token = req.body.token;
if (!token)
return res.status(400).json({ message: "No token found" });
if (!token) return res.status(400).json({ message: "No token found" });
try {
const { db } = await createNextApiContext(req);
try {
const { db } = await createNextApiContext(req);
await db.insert(integrations).values({
provider: "trello",
userId: user.id,
accessToken: token,
expiresAt: addYears(new Date(), 1),
}).onConflictDoUpdate({
set: {
accessToken: token,
expiresAt: addYears(new Date(), 1),
},
target: [integrations.userId, integrations.provider],
});
await db
.insert(integrations)
.values({
provider: "trello",
userId: user.id,
accessToken: token,
expiresAt: addYears(new Date(), 1),
})
.onConflictDoUpdate({
set: {
accessToken: token,
expiresAt: addYears(new Date(), 1),
},
target: [integrations.userId, integrations.provider],
});
return res.status(200).json({ message: "Trello authentication successful" });
} catch (err) {
console.error("Trello authentication error:", err);
return res.status(400).json({ message: "Trello authentication failed" });
}
},
);
return res
.status(200)
.json({ message: "Trello authentication successful" });
} catch (err) {
return res.status(400).json({ message: "Trello authentication failed" });
}
}),
);

View File

@@ -3,9 +3,11 @@ import { Novu } from "@novu/api";
import { jwtVerify } from "jose";
import { z } from "zod";
import { env } from "~/env";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import { env } from "~/env";
const requestSchema = z.object({
token: z.string().min(1),
});
@@ -22,84 +24,85 @@ const textEncoder = new TextEncoder();
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse<ResponseData>) => {
if (process.env.NEXT_PUBLIC_KAN_ENV !== "cloud") {
return res.status(404).json({
success: false,
error: "Unsubscribe endpoint is not available.",
code: "UNAVAILABLE",
});
}
withApiLogging(
async (req: NextApiRequest, res: NextApiResponse<ResponseData>) => {
if (process.env.NEXT_PUBLIC_KAN_ENV !== "cloud") {
return res.status(404).json({
success: false,
error: "Unsubscribe endpoint is not available.",
code: "UNAVAILABLE",
});
}
if (req.method !== "POST") {
res.setHeader("Allow", "POST");
return res.status(405).json({
success: false,
error: "Method not allowed.",
code: "METHOD_NOT_ALLOWED",
});
}
if (req.method !== "POST") {
res.setHeader("Allow", "POST");
return res.status(405).json({
success: false,
error: "Method not allowed.",
code: "METHOD_NOT_ALLOWED",
});
}
const parsedBody = requestSchema.safeParse(req.body);
const parsedBody = requestSchema.safeParse(req.body);
if (!parsedBody.success) {
return res.status(400).json({
success: false,
error: "Invalid request payload.",
code: "BAD_REQUEST",
});
}
if (!parsedBody.success) {
return res.status(400).json({
success: false,
error: "Invalid request payload.",
code: "BAD_REQUEST",
});
}
if (!env.EMAIL_UNSUBSCRIBE_SECRET || !env.NOVU_API_KEY) {
return res.status(500).json({
success: false,
error: "Unsubscribe service is not configured.",
code: "NOT_CONFIGURED",
});
}
if (!env.EMAIL_UNSUBSCRIBE_SECRET || !env.NOVU_API_KEY) {
return res.status(500).json({
success: false,
error: "Unsubscribe service is not configured.",
code: "NOT_CONFIGURED",
});
}
let payload: z.infer<typeof tokenPayloadSchema>;
let payload: z.infer<typeof tokenPayloadSchema>;
try {
const verified = await jwtVerify(
parsedBody.data.token,
textEncoder.encode(env.EMAIL_UNSUBSCRIBE_SECRET),
{
// We intentionally do not use exp/iat claims
// tokens are long-lived and validated only by signature + payload.
clockTolerance: "0s",
},
);
payload = tokenPayloadSchema.parse(verified.payload);
} catch {
return res.status(401).json({
success: false,
error: "Your unsubscribe link is invalid or has expired.",
code: "INVALID_TOKEN",
});
}
try {
const verified = await jwtVerify(
parsedBody.data.token,
textEncoder.encode(env.EMAIL_UNSUBSCRIBE_SECRET),
{
// We intentionally do not use exp/iat claims
// tokens are long-lived and validated only by signature + payload.
clockTolerance: "0s",
},
);
payload = tokenPayloadSchema.parse(verified.payload);
} catch {
return res.status(401).json({
success: false,
error: "Your unsubscribe link is invalid or has expired.",
code: "INVALID_TOKEN",
});
}
const novu = new Novu({ secretKey: env.NOVU_API_KEY });
const novu = new Novu({ secretKey: env.NOVU_API_KEY });
try {
await novu.subscribers.preferences.update(
{
channels: {
email: false,
},
},
payload.subscriberId,
);
} catch (error) {
console.error("Failed to update Novu preferences", error);
return res.status(502).json({
success: false,
error:
"We could not update your email preferences right now. Please try again later.",
code: "NOVU_ERROR",
});
}
try {
await novu.subscribers.preferences.update(
{
channels: {
email: false,
},
},
payload.subscriberId,
);
} catch (error) {
return res.status(502).json({
success: false,
error:
"We could not update your email preferences right now. Please try again later.",
code: "NOVU_ERROR",
});
}
return res.status(200).json({ success: true });
},
return res.status(200).json({ success: true });
},
),
);

View File

@@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { Upload } from "@aws-sdk/lib-storage";
import { createNextApiContext } from "@kan/api/trpc";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { assertPermission } from "@kan/api/utils/permissions";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import * as cardRepo from "@kan/db/repository/card.repo";
@@ -22,7 +23,7 @@ export const config = {
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
@@ -36,7 +37,9 @@ export default withRateLimit(
const bucket = env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME;
if (!bucket) {
return res.status(500).json({ error: "Attachments bucket not configured" });
return res
.status(500)
.json({ error: "Attachments bucket not configured" });
}
const cardPublicId = req.query.cardPublicId;
@@ -55,7 +58,9 @@ export default withRateLimit(
}
if (!Number.isFinite(contentLength) || contentLength <= 0) {
return res.status(400).json({ error: "Missing or invalid content length" });
return res
.status(400)
.json({ error: "Missing or invalid content length" });
}
if (contentLength > MAX_SIZE_BYTES) {
@@ -129,8 +134,7 @@ export default withRateLimit(
return res.status(200).json({ attachment });
} catch (error) {
console.error("Attachment upload failed", error);
return res.status(500).json({ error: "Internal server error" });
}
},
}),
);

View File

@@ -2,13 +2,17 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { createNextApiContext } from "@kan/api/trpc";
import * as userRepo from "@kan/db/repository/user.repo";
import { env } from "~/env";
import { withApiLogging } from "@kan/api/utils/apiLogging";
import { withRateLimit } from "@kan/api/utils/rateLimit";
import * as userRepo from "@kan/db/repository/user.repo";
import { createS3Client } from "@kan/shared/utils";
const MAX_SIZE_BYTES = parseInt(process.env.S3_AVATAR_UPLOAD_LIMIT || '2097152', 10); // Default 2MB
import { env } from "~/env";
const MAX_SIZE_BYTES = parseInt(
process.env.S3_AVATAR_UPLOAD_LIMIT || "2097152",
10,
); // Default 2MB
const allowedContentTypes = ["image/jpeg", "image/png", "image/webp"];
export const config = {
@@ -19,7 +23,7 @@ export const config = {
export default withRateLimit(
{ points: 100, duration: 60 },
async (req: NextApiRequest, res: NextApiResponse) => {
withApiLogging(async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
@@ -51,7 +55,9 @@ export default withRateLimit(
}
if (!Number.isFinite(contentLength) || contentLength <= 0) {
return res.status(400).json({ error: "Missing or invalid content length" });
return res
.status(400)
.json({ error: "Missing or invalid content length" });
}
if (contentLength > MAX_SIZE_BYTES) {
@@ -93,9 +99,7 @@ export default withRateLimit(
user: updatedUser,
});
} catch (error) {
console.error("Avatar upload failed", error);
return res.status(500).json({ error: "Internal server error" });
}
},
}),
);

View File

@@ -0,0 +1,31 @@
import { useRouter } from "next/navigation";
import { useEffect } from "react";
import { env } from "next-runtime-env";
import { authClient } from "@kan/auth/client";
import { PageHead } from "~/components/PageHead";
import SelectPlanView from "~/views/onboarding/select-plan";
export default function SelectPlanPage() {
const router = useRouter();
const { data: session, isPending } = authClient.useSession();
useEffect(() => {
if (!isPending && !session?.user) {
router.push("/login");
}
if (!isPending && env("NEXT_PUBLIC_KAN_ENV") !== "cloud") {
router.push("/boards");
}
}, [session, isPending, router]);
if (isPending || !session?.user) return null;
return (
<>
<PageHead title="Select plan | kan.bn" />
<SelectPlanView />
</>
);
}

View File

@@ -0,0 +1,28 @@
import { useRouter } from "next/navigation";
import { env } from "next-runtime-env";
import { useEffect } from "react";
import { authClient } from "@kan/auth/client";
import { PageHead } from "~/components/PageHead";
import WorkspaceDetailsView from "~/views/onboarding/workspace-details";
export default function WorkspaceDetailsPage() {
const router = useRouter();
const { data: session, isPending } = authClient.useSession();
useEffect(() => {
if (!isPending && !session?.user) router.push("/login");
if (!isPending && env("NEXT_PUBLIC_KAN_ENV") !== "cloud")
router.push("/boards");
}, [session, isPending, router]);
if (isPending || !session?.user) return null;
return (
<>
<PageHead title="Create workspace | kan.bn" />
<WorkspaceDetailsView />
</>
);
}

View File

@@ -17,7 +17,7 @@ interface Workspace {
description: string | null | undefined;
publicId: string;
slug: string | undefined;
plan: "free" | "pro" | "enterprise" | undefined;
plan: "free" | "team" | "pro" | "enterprise" | undefined;
role: "admin" | "member" | "guest";
weekStartDay: 0 | 1 | 6;
}
@@ -27,7 +27,7 @@ const initialWorkspace: Workspace = {
description: null,
publicId: "",
slug: "",
plan: "free",
plan: "free" as const,
role: "member",
weekStartDay: 1,
};
@@ -50,7 +50,15 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
const workspacePublicId = useSearchParams().get("workspacePublicId");
const { data, isLoading } = api.workspace.all.useQuery();
const [pendingWorkspaceId, setPendingWorkspaceId] = useState<string | null>(
workspacePublicId,
);
const pollAttemptsRef = React.useRef(0);
const MAX_POLL_ATTEMPTS = 5;
const { data, isLoading } = api.workspace.all.useQuery(undefined, {
refetchInterval: pendingWorkspaceId ? 2000 : false,
});
const utils = api.useUtils();
const switchWorkspace = (_workspace: Workspace) => {
@@ -94,7 +102,16 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
({ workspace }) => workspace.publicId === storedWorkspaceId,
);
if (!selectedWorkspace?.workspace) return;
if (!selectedWorkspace?.workspace) {
pollAttemptsRef.current += 1;
if (pollAttemptsRef.current >= MAX_POLL_ATTEMPTS) {
setPendingWorkspaceId(null);
}
return;
}
pollAttemptsRef.current = 0;
setPendingWorkspaceId(null);
setWorkspace({
publicId: selectedWorkspace.workspace.publicId,

View File

@@ -515,7 +515,7 @@ export function NewCardForm({
</div>
</div>
<div className="mt-5 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<div className="mt-5 flex items-center justify-end space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Create another`}
isChecked={isCreateAnotherEnabled}

View File

@@ -136,7 +136,7 @@ export function NewListForm({
}}
/>
</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Create another`}
isChecked={isCreateAnotherEnabled}

View File

@@ -2,6 +2,7 @@ import type { DropResult } from "react-beautiful-dnd";
import Link from "next/link";
import { useParams } from "next/navigation";
import { useRouter } from "next/router";
import { env } from "next-runtime-env";
import { t } from "@lingui/core/macro";
import { keepPreviousData } from "@tanstack/react-query";
import { useEffect, useState } from "react";
@@ -725,7 +726,9 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
if (
card.publicId.startsWith(
"PLACEHOLDER",
)
) ||
env("NEXT_PUBLIC_KAN_ENV") ===
"cloud"
)
return;
e.preventDefault();

View File

@@ -184,7 +184,7 @@ const SelectSource = ({
/>
</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<div>
<Button
type="submit"
@@ -310,7 +310,7 @@ const ImportGithub: React.FC = () => {
<form onSubmit={handleSubmitProjects(onSubmitProjects)}>
<div className="h-[105px] overflow-auto px-5">{renderContent()}</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Select all`}
isChecked={!!isSelectAllEnabled}
@@ -459,7 +459,7 @@ const ImportTrello: React.FC = () => {
<form onSubmit={handleSubmitBoards(onSubmitBoards)}>
<div className="h-[105px] overflow-auto px-5">{renderContent()}</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Select all`}
isChecked={!!isSelectAllEnabled}

View File

@@ -148,7 +148,7 @@ export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
showTemplates={showTemplates}
customTemplates={formattedTemplates ?? []}
/>
<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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
{!isTemplate && (
<Toggle
label={t`Use template`}

View File

@@ -341,7 +341,7 @@ export function InviteMemberForm({
)}
</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 space-x-4 border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={
isShareInviteLinkEnabled

View File

@@ -0,0 +1,289 @@
import { useRouter, useSearchParams } from "next/navigation";
import { t } from "@lingui/core/macro";
import { Radio, RadioGroup } from "@headlessui/react";
import { AnimatePresence, motion } from "framer-motion";
import { useState } from "react";
import { HiUser } from "react-icons/hi2";
import { twMerge } from "tailwind-merge";
import { authClient } from "@kan/auth/client";
import Button from "~/components/Button";
import { api } from "~/utils/api";
type PlanId = "solo" | "team" | "pro";
type Billing = "monthly" | "annual";
// Each user orbits via a zero-size pivot div at center (144,144) that rotates.
// The icon is offset from the pivot by `radius` pixels along the x-axis.
// A counter-rotation on the icon keeps it upright.
const ORBIT_USERS: Record<
PlanId,
{ id: string; angle: number; radius: number; duration: number }[]
> = {
solo: [],
team: [
{ id: "t1", angle: 45, radius: 104, duration: 50 },
{ id: "t2", angle: 170, radius: 104, duration: 50 },
{ id: "t3", angle: 290, radius: 104, duration: 50 },
],
pro: [
{ id: "t1", angle: 45, radius: 104, duration: 50 },
{ id: "t2", angle: 170, radius: 104, duration: 50 },
{ id: "t3", angle: 290, radius: 104, duration: 50 },
{ id: "p1", angle: 10, radius: 144, duration: 70 },
{ id: "p2", angle: 120, radius: 144, duration: 70 },
{ id: "p4", angle: 240, radius: 144, duration: 70 },
{ id: "p3", angle: 230, radius: 64, duration: 30 },
],
};
export default function SelectPlanView() {
const router = useRouter();
const searchParams = useSearchParams();
const [selected, setSelected] = useState<PlanId>(
(searchParams.get("plan") as PlanId | null) ?? "solo",
);
const [billing, setBilling] = useState<Billing>(
(searchParams.get("billing") as Billing | null) ?? "annual",
);
const returnUrl = searchParams.get("returnUrl") ?? "/boards";
const { data: workspaces } = api.workspace.all.useQuery();
const { data: session } = authClient.useSession();
const { data: user } = api.user.getUser.useQuery(undefined, {
enabled: !!session?.user,
});
const userImage = user?.image ?? session?.user.image ?? null;
const hasExistingWorkspace = !!workspaces?.length;
const FREQUENCIES: { value: Billing; label: string }[] = [
{ value: "monthly", label: t`Monthly` },
{ value: "annual", label: t`Annual` },
];
const PLANS: {
id: PlanId;
name: string;
monthly: string;
annual: string;
description: string;
trial?: boolean;
}[] = [
{
id: "solo",
name: t`Solo`,
monthly: t`Free`,
annual: t`Free`,
description: t`Good for individuals starting out who just need the essentials.`,
},
{
id: "team",
name: t`Team`,
monthly: "$10/user/mo",
annual: "$8/user/mo",
description: t`Best for small teams who want to collaborate and move faster together.`,
trial: true,
},
{
id: "pro",
name: t`Pro`,
monthly: "$29/mo",
annual: "$23/mo",
description: t`Unlimited members and a custom workspace username for teams ready to scale.`,
trial: true,
},
];
const handleSelectPlan = (plan: PlanId) => {
setSelected(plan);
router.replace(`/onboarding/select-plan?plan=${plan}&billing=${billing}&returnUrl=${encodeURIComponent(returnUrl)}`);
};
const handleSetBilling = (b: Billing) => {
setBilling(b);
router.replace(`/onboarding/select-plan?plan=${selected}&billing=${b}&returnUrl=${encodeURIComponent(returnUrl)}`);
};
const handleContinue = () =>
router.push(`/onboarding/workspace?plan=${selected}&billing=${billing}&returnUrl=${encodeURIComponent(returnUrl)}`);
const handleCancel = () => router.push(returnUrl);
return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4 bg-light-100 px-4 py-8 dark:bg-dark-50 md:px-6">
<div className="w-full max-w-3xl overflow-hidden rounded-xl border border-light-400 bg-light-200 shadow-xl dark:border-dark-400 dark:bg-dark-100">
<div className="flex flex-col md:h-[520px] md:flex-row">
{/* Left panel */}
<div className="flex flex-col p-6 md:w-[55%] md:p-8">
<div className="flex-1">
<h2 className="text-xl font-bold text-light-1000 dark:text-dark-1000">
{t`Choose a plan`}
</h2>
<p className="mt-1 text-sm text-light-800 dark:text-dark-800">
{t`Pick a plan to get started. All paid plans include a 14-day free trial.`}
</p>
{/* Billing toggle */}
<div className="mt-4 flex justify-end">
<RadioGroup
value={billing}
onChange={handleSetBilling}
className="grid grid-cols-2 gap-x-1 rounded-full p-1 text-center text-xs font-semibold ring-1 ring-inset ring-light-600 dark:ring-dark-600"
>
{FREQUENCIES.map((f) => (
<Radio
key={f.value}
value={f.value}
className={twMerge(
"cursor-pointer rounded-full px-2.5 py-0.5 text-xs transition-colors",
billing === f.value
? "bg-dark-50 text-white dark:bg-light-50 dark:text-dark-50"
: "text-light-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-200",
)}
>
{f.label}
</Radio>
))}
</RadioGroup>
</div>
<div className="mt-4 space-y-3">
{PLANS.map((plan) => {
const badge =
billing === "annual" ? plan.annual : plan.monthly;
return (
<button
key={plan.id}
type="button"
onClick={() => handleSelectPlan(plan.id)}
className={`relative w-full rounded-lg border px-4 py-3 text-left transition-colors ${
selected === plan.id
? "border-light-700 bg-light-300 dark:border-dark-600 dark:bg-dark-200"
: "border-light-500 bg-light-200 hover:border-light-600 dark:border-dark-500 dark:bg-dark-100 dark:hover:border-dark-600"
}`}
>
<div className="flex items-start justify-between">
<div className="flex-1 pr-8">
<div className="flex items-center gap-2">
<span className="text-sm font-semibold text-light-1000 dark:text-dark-1000">
{plan.name}
</span>
<span className="rounded-full bg-neutral-700 px-2 py-px text-[11px] font-medium text-neutral-200">
{badge}
</span>
{plan.trial && billing === "annual" && (
<span className="rounded-full bg-emerald-500/10 px-2 py-px text-[11px] font-medium text-emerald-600 ring-1 ring-inset ring-emerald-500/20 dark:text-emerald-400">
-20%
</span>
)}
</div>
<p className="mt-1 text-xs text-light-800 dark:text-dark-800">
{plan.description}
</p>
</div>
<div className="mt-0.5 flex-shrink-0">
<div
className={`flex h-4 w-4 items-center justify-center rounded-full border-2 ${
selected === plan.id
? "border-light-900 bg-light-900 dark:border-dark-900 dark:bg-dark-900"
: "border-light-700 dark:border-dark-700"
}`}
>
{selected === plan.id && (
<div className="h-1.5 w-1.5 rounded-full bg-light-100 dark:bg-dark-100" />
)}
</div>
</div>
</div>
</button>
);
})}
</div>
</div>
<div className="mt-6 flex justify-end gap-2 md:mt-8">
{hasExistingWorkspace && (
<Button variant="ghost" onClick={handleCancel}>
{t`Cancel`}
</Button>
)}
<Button onClick={handleContinue}>{t`Continue`}</Button>
</div>
</div>
{/* Right panel */}
<div className="hidden items-center justify-center bg-light-200 dark:bg-dark-200 md:flex md:w-[45%]">
<div className="relative h-72 w-72">
{/* Orbit rings */}
<div className="absolute inset-0 m-auto h-72 w-72 rounded-full border border-light-400 dark:border-dark-400" />
<div className="absolute inset-0 m-auto h-52 w-52 rounded-full border border-light-400 dark:border-dark-400" />
<div className="absolute inset-0 m-auto h-32 w-32 rounded-full border border-light-400 dark:border-dark-400" />
{/* Centre person */}
<div className="absolute inset-0 m-auto flex h-16 w-16 items-center justify-center overflow-hidden rounded-full bg-light-300 dark:bg-dark-300">
{userImage ? (
<img
src={userImage}
alt={t`Your avatar`}
className="h-full w-full object-cover"
/>
) : (
<HiUser className="h-7 w-7 text-light-700 dark:text-dark-700" />
)}
</div>
{/* Orbiting users — zero-size pivot at center rotates; icon offset by radius stays on the ring */}
<AnimatePresence>
{ORBIT_USERS[selected].map((u) => (
<motion.div
key={u.id}
style={{ position: "absolute", left: 144, top: 144 }}
initial={{ opacity: 0, rotate: u.angle }}
animate={{ opacity: 1, rotate: u.angle + 360 }}
exit={{ opacity: 0 }}
transition={{
opacity: { duration: 0.3 },
rotate: {
duration: u.duration,
repeat: Infinity,
ease: "linear",
repeatType: "loop",
},
}}
>
{/* Counter-rotate icon so it stays upright */}
<motion.div
style={{
position: "absolute",
left: u.radius - 12,
top: -12,
}}
initial={{ rotate: -u.angle }}
animate={{ rotate: -(u.angle + 360) }}
transition={{
duration: u.duration,
repeat: Infinity,
ease: "linear",
repeatType: "loop",
}}
className="flex h-6 w-6 items-center justify-center rounded-full bg-light-400 dark:bg-dark-400"
>
<HiUser className="h-3.5 w-3.5 text-light-800 dark:text-dark-800" />
</motion.div>
</motion.div>
))}
</AnimatePresence>
</div>
</div>
</div>
</div>
{!hasExistingWorkspace && (
<Button variant="ghost" onClick={() => authClient.signOut()}>
{t`Sign out`}
</Button>
)}
</div>
);
}

View File

@@ -0,0 +1,367 @@
import { useRouter, useSearchParams } from "next/navigation";
import { t } from "@lingui/core/macro";
import { motion } from "framer-motion";
import { useEffect, useState } from "react";
import {
HiArrowLeft,
HiArrowPath,
HiArrowRight,
HiCheck,
HiEllipsisVertical,
HiInformationCircle,
HiLockClosed,
} from "react-icons/hi2";
import { authClient } from "@kan/auth/client";
import Button from "~/components/Button";
import Input from "~/components/Input";
import LoadingSpinner from "~/components/LoadingSpinner";
import Toggle from "~/components/Toggle";
import { Tooltip } from "~/components/Tooltip";
import { useDebounce } from "~/hooks/useDebounce";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
function slugify(value: string) {
return value
.toLowerCase()
.trim()
.replace(/[^a-z0-9\s-]/g, "")
.replace(/\s+/g, "-")
.replace(/-+/g, "-")
.slice(0, 60);
}
export default function WorkspaceNameView() {
const router = useRouter();
const searchParams = useSearchParams();
const plan = searchParams.get("plan") ?? "solo";
const billing = searchParams.get("billing") ?? "annual";
const returnUrl = searchParams.get("returnUrl") ?? "/boards";
const { showPopup } = usePopup();
const [isProToggle, setIsProToggle] = useState(plan === "pro");
const [name, setName] = useState("");
const [slug, setSlug] = useState("");
const [slugManuallyEdited, setSlugManuallyEdited] = useState(false);
const [description, setDescription] = useState("");
const handleNameChange = (value: string) => {
setName(value);
if (isProToggle && !slugManuallyEdited) {
setSlug(slugify(value));
}
};
const [debouncedSlug] = useDebounce(slug, 500);
const isTyping = slug !== debouncedSlug;
const slugAvailability = api.workspace.checkSlugAvailability.useQuery(
{ workspaceSlug: debouncedSlug },
{ enabled: isProToggle && debouncedSlug.length >= 3 && !isTyping },
);
const isSlugAvailable =
slugAvailability.data?.isAvailable && !slugAvailability.data?.isReserved;
const isSlugTaken =
slugAvailability.data?.isAvailable === false &&
!slugAvailability.data?.isReserved;
const isSlugReserved = slugAvailability.data?.isReserved === true;
const slugError = isSlugTaken
? t`This URL has already been taken`
: isSlugReserved
? t`This URL is reserved`
: undefined;
const { data: session } = authClient.useSession();
const { data: user } = api.user.getUser.useQuery(undefined, {
enabled: !!session?.user,
});
const { data: workspaces } = api.workspace.all.useQuery();
const hasExistingWorkspace = !!workspaces?.length;
const utils = api.useUtils();
const previewSlug = isProToggle
? slugify(slug) || slugify(name) || "your-workspace"
: "your-workspace";
const createWorkspace = api.workspace.create.useMutation({
onSuccess: async (workspace) => {
if (!workspace.publicId) return;
localStorage.setItem("workspacePublicId", workspace.publicId);
void utils.workspace.all.invalidate();
router.push("/boards");
},
onError: () => {
showPopup({
header: t`Unable to create workspace`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
},
});
const [isRedirectingToCheckout, setIsRedirectingToCheckout] = useState(false);
const handleContinue = async () => {
if (!name.trim()) return;
if (plan === "solo") {
createWorkspace.mutate({
name: name.trim(),
...(description.trim() && { description: description.trim() }),
});
return;
}
// team/pro: redirect to Stripe — workspace created on checkout_success
setIsRedirectingToCheckout(true);
try {
const response = await fetch("/api/stripe/create_checkout_session", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
workspaceName: name.trim(),
...(description.trim() && {
workspaceDescription: description.trim(),
}),
...(plan === "pro" && slug ? { workspaceSlug: slug } : {}),
cancelUrl: window.location.pathname + window.location.search,
successUrl: "/boards",
billing,
plan,
}),
});
const data = await response.json();
const url = (data as { url: string }).url;
if (url) {
window.location.href = url;
return;
}
} catch {
// fall through
}
setIsRedirectingToCheckout(false);
showPopup({
header: t`Unable to start checkout`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
};
useEffect(() => {
document.getElementById("workspace-name-input")?.focus();
}, []);
const displayName = user?.name ?? session?.user.name ?? "";
const BOARDS = [t`Roadmap`, t`Engineering`, t`Marketing`];
const [visibleCount, setVisibleCount] = useState(1);
useEffect(() => {
const timers = BOARDS.slice(1).map((_, i) =>
setTimeout(() => setVisibleCount(i + 2), (i + 1) * 2000),
);
return () => timers.forEach(clearTimeout);
}, []);
return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4 bg-light-100 px-4 py-8 dark:bg-dark-50 md:px-6">
<div className="w-full max-w-3xl overflow-hidden rounded-xl border border-light-400 bg-light-200 shadow-xl dark:border-dark-400 dark:bg-dark-100">
<div className="flex flex-col md:h-[520px] md:flex-row">
{/* Left panel */}
<div className="flex flex-col p-6 md:w-[55%] md:p-8">
<div className="flex-1">
<h2 className="text-xl font-bold text-light-1000 dark:text-dark-1000">
{t`Set up your workspace`}
</h2>
<p className="mt-1 text-sm text-light-800 dark:text-dark-800">
{t`You can always change these later in settings.`}
</p>
<div className="mt-6 space-y-3">
<Input
id="workspace-name-input"
placeholder={t`Workspace name`}
value={name}
onChange={(e) => handleNameChange(e.target.value)}
onKeyDown={(e) => e.key === "Enter" && handleContinue()}
maxLength={64}
/>
<div className="space-y-2">
<Input
placeholder={t`your-workspace`}
value={isProToggle ? slug : t`your-workspace`}
onChange={(e) => {
setSlugManuallyEdited(true);
setSlug(
e.target.value
.toLowerCase()
.replace(/[^a-z0-9\s-]/g, "")
.replace(/\s+/g, "-")
.replace(/-+/g, "-")
.slice(0, 60),
);
}}
disabled={!isProToggle}
prefix="kan.bn/"
className={
!isProToggle ? "cursor-not-allowed opacity-50" : ""
}
errorMessage={slugError}
iconRight={
!isProToggle ? (
<Tooltip
content={
<span className="text-xs">{t`Custom usernames require upgrading to a Pro plan`}</span>
}
placement="top"
delay={0}
>
<HiInformationCircle className="h-4 w-4 leading-[0] text-dark-700 dark:text-dark-700" />
</Tooltip>
) : isProToggle && slug.length >= 3 ? (
isTyping || slugAvailability.isPending ? (
<LoadingSpinner />
) : isSlugAvailable ? (
<HiCheck className="h-4 w-4 text-white" />
) : null
) : null
}
/>
</div>
{plan !== "pro" && (
<div className="pb-2">
<Toggle
isChecked={isProToggle}
onChange={() => setIsProToggle((v) => !v)}
label={t`Upgrade to Pro ($29/month)`}
labelPosition="after"
/>
</div>
)}
<div>
<textarea
value={description}
onChange={(e) => setDescription(e.target.value)}
placeholder={t`Workspace description`}
maxLength={280}
rows={3}
className="block w-full resize-none rounded-md border-0 bg-dark-300 bg-white/5 py-1.5 text-sm shadow-sm ring-1 ring-inset ring-light-600 placeholder:text-dark-800 focus:ring-2 focus:ring-inset focus:ring-light-700 dark:text-dark-1000 dark:ring-dark-700 dark:focus:ring-dark-700 sm:leading-6"
/>
<p className="mt-1 text-right text-[10px] text-light-700 dark:text-dark-700">
{description.length}/280
</p>
</div>
</div>
</div>
<div className="mt-6 flex flex-wrap items-center justify-between gap-3">
<div className="ml-auto flex gap-2">
<Button
variant="ghost"
onClick={() =>
router.replace(
`/onboarding/select-plan?plan=${plan}&billing=${billing}&returnUrl=${encodeURIComponent(returnUrl)}`,
)
}
>
{t`Back`}
</Button>
<Button
onClick={() => void handleContinue()}
disabled={
!name.trim() ||
createWorkspace.isPending ||
isRedirectingToCheckout ||
(isProToggle &&
slug.length >= 3 &&
(isTyping || slugAvailability.isPending || !!slugError))
}
isLoading={
createWorkspace.isPending || isRedirectingToCheckout
}
>
{t`Continue`}
</Button>
</div>
</div>
</div>
{/* Right panel — browser mockup */}
<div className="hidden flex-col bg-light-300 dark:bg-dark-200 md:flex md:w-[45%]">
{/* Browser chrome */}
<div className="flex items-center gap-2 border-b border-light-400 px-3 py-2.5 dark:border-dark-400">
<div className="flex items-center gap-1.5 text-light-700 dark:text-dark-700">
<HiArrowLeft className="h-3.5 w-3.5" />
<HiArrowRight className="h-3.5 w-3.5" />
<HiArrowPath className="h-3.5 w-3.5" />
</div>
<div className="flex flex-1 items-center gap-1.5 rounded-md bg-light-200 px-2.5 py-1 dark:bg-dark-300">
<HiLockClosed className="h-3 w-3 flex-shrink-0 text-light-700 dark:text-dark-700" />
<span className="truncate text-xs text-light-900 dark:text-dark-900">
kan.bn/
<span className="text-light-1000 dark:text-dark-1000">
{previewSlug}
</span>
</span>
</div>
<HiEllipsisVertical className="h-4 w-4 flex-shrink-0 text-light-700 dark:text-dark-700" />
</div>
{/* Browser content */}
<div className="flex flex-1 flex-col items-center overflow-hidden px-14 py-8">
{/* Workspace name + description */}
<p className="text-center text-xs font-bold text-light-1000 dark:text-dark-1000">
{name || t`Your workspace`}
</p>
<p className="mt-0.5 line-clamp-2 break-all text-center text-[10px] text-light-800 dark:text-dark-800">
{description || t`Your workspace description`}
</p>
{/* Boards area */}
<div className="mt-3 flex w-full flex-1 flex-col rounded-lg bg-light-200 p-2 dark:bg-dark-300">
<div className="flex flex-1 flex-col gap-1.5">
{BOARDS.map((board, i) => (
<motion.div
key={board}
initial={{ opacity: 0, y: -12 }}
animate={
i < visibleCount
? { opacity: 1, y: 0 }
: { opacity: 0, y: -12 }
}
transition={{
opacity: { duration: 0.2 },
y: { duration: 0.25, ease: "easeOut" },
}}
className="flex w-full flex-1 items-center justify-center rounded border border-dashed border-light-400 bg-light-50 px-3 text-[10px] font-medium text-light-900 dark:border-dark-400 dark:bg-dark-100 dark:text-dark-900"
>
{board}
</motion.div>
))}
</div>
</div>
{/* Footer */}
<p className="mt-2 text-[10px] font-semibold text-light-900 dark:text-dark-900">
kan.bn
</p>
</div>
</div>
</div>
</div>
{!hasExistingWorkspace && (
<Button variant="ghost" onClick={() => authClient.signOut()}>
{t`Sign out`}
</Button>
)}
</div>
);
}

View File

@@ -24,6 +24,8 @@ export function UpgradeToProConfirmation({
body: JSON.stringify({
...(entityId && { slug: entityId }),
workspacePublicId: workspacePublicId,
plan: "pro",
billing: "monthly",
cancelUrl: "/settings",
successUrl: "/settings",
}),

View File

@@ -28,6 +28,10 @@
"types": "./dist/utils/rateLimit.d.ts",
"default": "./src/utils/rateLimit.ts"
},
"./utils/apiLogging": {
"types": "./dist/utils/apiLogging.d.ts",
"default": "./src/utils/apiLogging.ts"
},
"./utils/permissions": {
"types": "./dist/utils/permissions.d.ts",
"default": "./src/utils/permissions.ts"

View File

@@ -202,6 +202,7 @@ export const workspaceRouter = createTRPCRouter({
.input(
z.object({
name: z.string().min(1).max(64),
description: z.string().max(280).optional(),
slug: z
.string()
.min(3)
@@ -260,6 +261,7 @@ export const workspaceRouter = createTRPCRouter({
slug: workspaceSlug,
createdBy: userId,
createdByEmail: userEmail,
...(input.description && { description: input.description }),
});
if (!result.publicId)

View File

@@ -0,0 +1,80 @@
import { randomUUID } from "crypto";
import type { NextApiRequest, NextApiResponse } from "next";
import { createLogger } from "@kan/logger";
import { createNextApiContext } from "../trpc";
const log = createLogger("api");
const isCloud = process.env.NEXT_PUBLIC_KAN_ENV === "cloud";
export function withApiLogging(
handler: (
req: NextApiRequest,
res: NextApiResponse,
) => Promise<unknown> | unknown,
) {
return async (req: NextApiRequest, res: NextApiResponse) => {
const start = Date.now();
const requestId = randomUUID();
const route = req.url?.split("?")[0] ?? "unknown";
const input = {
...(req.query &&
Object.keys(req.query).length > 0 && { query: req.query }),
...(req.body &&
typeof req.body === "object" &&
Object.keys(req.body).length > 0 && { body: req.body }),
};
let statusCode = 200;
const originalStatus = res.status.bind(res);
res.status = (code: number) => {
statusCode = code;
return originalStatus(code);
};
let userId: string | undefined;
let email: string | undefined;
try {
const ctx = await createNextApiContext(req);
userId = ctx.user?.id;
email = ctx.user?.email ?? undefined;
} catch {
// unauthenticated or auth unavailable
}
let handlerError: unknown;
try {
await handler(req, res);
} catch (err) {
handlerError = err;
statusCode = 500;
if (!res.headersSent) {
res.status(500).json({ error: "Internal server error" });
}
}
const duration = Date.now() - start;
const meta = {
requestId,
procedure: route,
transport: "rest",
duration,
userId,
...(isCloud && email && { email }),
...(Object.keys(input).length > 0 && { input }),
status: statusCode,
...(handlerError instanceof Error && {
error: handlerError.message,
stack: handlerError.stack,
}),
};
if (statusCode < 400) {
log.info(meta, "API OK");
} else {
log.error(meta, "API error");
}
};
}

View File

@@ -0,0 +1 @@
ALTER TYPE "public"."workspace_plan" ADD VALUE 'team' BEFORE 'pro';

File diff suppressed because it is too large Load Diff

View File

@@ -218,6 +218,13 @@
"when": 1773212242728,
"tag": "20260311065722_AddWeekStartDay",
"breakpoints": true
},
{
"idx": 31,
"version": "7",
"when": 1775170588247,
"tag": "20260402225628_AddTeamWorkspacePlan",
"breakpoints": true
}
]
}

View File

@@ -64,6 +64,8 @@ export const create = async (
slug: string;
createdBy: string;
createdByEmail: string;
description?: string;
plan?: "free" | "team" | "pro" | "enterprise";
},
) => {
const [workspace] = await db
@@ -73,6 +75,8 @@ export const create = async (
name: workspaceInput.name,
slug: workspaceInput.slug,
createdBy: workspaceInput.createdBy,
...(workspaceInput.description && { description: workspaceInput.description }),
...(workspaceInput.plan && { plan: workspaceInput.plan }),
})
.returning({
id: workspaces.id,
@@ -124,7 +128,7 @@ export const update = async (
workspaceInput: {
name?: string;
slug?: string;
plan?: "free" | "pro" | "enterprise";
plan?: "free" | "team" | "pro" | "enterprise";
description?: string;
showEmailsToMembers?: boolean;
weekStartDay?: number;

View File

@@ -34,7 +34,7 @@ export const slugTypes = ["reserved", "premium"] as const;
export type SlugType = (typeof slugTypes)[number];
export const slugTypeEnum = pgEnum("slug_type", slugTypes);
export const workspacePlans = ["free", "pro", "enterprise"] as const;
export const workspacePlans = ["free", "team", "pro", "enterprise"] as const;
export type WorkspacePlan = (typeof workspacePlans)[number];
export const workspacePlanEnum = pgEnum("workspace_plan", workspacePlans);