strapi-plugin-magic-link-v5 4.6.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/admin/src/pages/Tokens/IPBans.jsx +32 -29
- package/admin/src/pages/Tokens/JWTSessions.jsx +35 -32
- package/admin/src/translations/de.json +72 -1
- package/admin/src/translations/en.json +72 -1
- package/admin/src/translations/es.json +72 -1
- package/admin/src/translations/fr.json +72 -1
- package/admin/src/translations/pt.json +72 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,18 @@ Secure passwordless authentication for Strapi using email-based magic links. No
|
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](https://www.npmjs.com/package/strapi-plugin-magic-link-v5)
|
|
7
7
|
|
|
8
|
+
## 🌍 Supported Languages
|
|
9
|
+
|
|
10
|
+
The admin interface is available in **5 languages** for international accessibility:
|
|
11
|
+
|
|
12
|
+
- 🇬🇧 **English** - Global standard
|
|
13
|
+
- 🇩🇪 **Deutsch** - German (DACH region)
|
|
14
|
+
- 🇫🇷 **Français** - French (Strapi's home & community)
|
|
15
|
+
- 🇪🇸 **Español** - Spanish (Spain & Latin America)
|
|
16
|
+
- 🇵🇹 **Português** - Portuguese (Brazil & Portugal)
|
|
17
|
+
|
|
18
|
+
Users can switch languages in **Settings → Magic Link → Interface Language**.
|
|
19
|
+
|
|
8
20
|
---
|
|
9
21
|
|
|
10
22
|
## 📜 License
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
|
2
2
|
import styled, { keyframes } from 'styled-components';
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
3
4
|
import {
|
|
4
5
|
Typography,
|
|
5
6
|
Box,
|
|
@@ -33,6 +34,7 @@ import {
|
|
|
33
34
|
Plus,
|
|
34
35
|
WarningCircle,
|
|
35
36
|
} from '@strapi/icons';
|
|
37
|
+
import getTrad from '../../utils/getTrad';
|
|
36
38
|
|
|
37
39
|
// ================ DESIGN TOKENS ================
|
|
38
40
|
const theme = {
|
|
@@ -253,6 +255,7 @@ const LoadingOverlay = styled(Flex)`
|
|
|
253
255
|
|
|
254
256
|
// ================ HAUPTKOMPONENTE ================
|
|
255
257
|
const IPBans = () => {
|
|
258
|
+
const { formatMessage } = useIntl();
|
|
256
259
|
const { get, post } = useFetchClient();
|
|
257
260
|
const { toggleNotification } = useNotification();
|
|
258
261
|
|
|
@@ -295,7 +298,7 @@ const IPBans = () => {
|
|
|
295
298
|
// Stat Cards Konfiguration
|
|
296
299
|
const statCards = [
|
|
297
300
|
{
|
|
298
|
-
title: '
|
|
301
|
+
title: formatMessage({ id: getTrad('ipban.stats.total') }),
|
|
299
302
|
value: stats.total,
|
|
300
303
|
icon: Lock,
|
|
301
304
|
color: theme.colors.danger[600],
|
|
@@ -331,8 +334,8 @@ const IPBans = () => {
|
|
|
331
334
|
fetchBannedIPs();
|
|
332
335
|
toggleNotification({
|
|
333
336
|
type: 'success',
|
|
334
|
-
message:
|
|
335
|
-
title: '
|
|
337
|
+
message: formatMessage({ id: getTrad('ipban.notifications.refreshSuccess') }),
|
|
338
|
+
title: formatMessage({ id: getTrad('tokens.notifications.success') })
|
|
336
339
|
});
|
|
337
340
|
};
|
|
338
341
|
|
|
@@ -355,14 +358,14 @@ const IPBans = () => {
|
|
|
355
358
|
setNewIP('');
|
|
356
359
|
toggleNotification({
|
|
357
360
|
type: 'success',
|
|
358
|
-
message:
|
|
359
|
-
title: '
|
|
361
|
+
message: formatMessage({ id: getTrad('ipban.notifications.banSuccess') }, { ip: newIP }),
|
|
362
|
+
title: formatMessage({ id: getTrad('tokens.notifications.success') })
|
|
360
363
|
});
|
|
361
364
|
} catch (error) {
|
|
362
365
|
toggleNotification({
|
|
363
366
|
type: 'warning',
|
|
364
|
-
message:
|
|
365
|
-
title: '
|
|
367
|
+
message: formatMessage({ id: getTrad('ipban.notifications.banError') }),
|
|
368
|
+
title: formatMessage({ id: getTrad('tokens.notifications.error') })
|
|
366
369
|
});
|
|
367
370
|
}
|
|
368
371
|
};
|
|
@@ -375,14 +378,14 @@ const IPBans = () => {
|
|
|
375
378
|
await fetchBannedIPs();
|
|
376
379
|
toggleNotification({
|
|
377
380
|
type: 'success',
|
|
378
|
-
message:
|
|
379
|
-
title: '
|
|
381
|
+
message: formatMessage({ id: getTrad('ipban.notifications.unbanSuccess') }, { ip }),
|
|
382
|
+
title: formatMessage({ id: getTrad('tokens.notifications.success') })
|
|
380
383
|
});
|
|
381
384
|
} catch (error) {
|
|
382
385
|
toggleNotification({
|
|
383
386
|
type: 'warning',
|
|
384
|
-
message:
|
|
385
|
-
title: '
|
|
387
|
+
message: formatMessage({ id: getTrad('ipban.notifications.unbanError') }),
|
|
388
|
+
title: formatMessage({ id: getTrad('tokens.notifications.error') })
|
|
386
389
|
});
|
|
387
390
|
}
|
|
388
391
|
};
|
|
@@ -399,7 +402,7 @@ const IPBans = () => {
|
|
|
399
402
|
<Container>
|
|
400
403
|
<LoadingOverlay>
|
|
401
404
|
<Box className="loader-icon">
|
|
402
|
-
<Loader>
|
|
405
|
+
<Loader>{formatMessage({ id: getTrad('common.loadingBannedIPs') })}</Loader>
|
|
403
406
|
</Box>
|
|
404
407
|
</LoadingOverlay>
|
|
405
408
|
</Container>
|
|
@@ -454,7 +457,7 @@ const IPBans = () => {
|
|
|
454
457
|
variant="default"
|
|
455
458
|
size="S"
|
|
456
459
|
>
|
|
457
|
-
|
|
460
|
+
{formatMessage({ id: getTrad('ipban.actions.ban') })}
|
|
458
461
|
</Button>
|
|
459
462
|
<Button
|
|
460
463
|
onClick={handleRefresh}
|
|
@@ -462,7 +465,7 @@ const IPBans = () => {
|
|
|
462
465
|
variant="secondary"
|
|
463
466
|
size="S"
|
|
464
467
|
>
|
|
465
|
-
|
|
468
|
+
{formatMessage({ id: getTrad('ipban.actions.refresh') })}
|
|
466
469
|
</Button>
|
|
467
470
|
</FilterBar>
|
|
468
471
|
|
|
@@ -495,7 +498,7 @@ const IPBans = () => {
|
|
|
495
498
|
marginBottom: '8px',
|
|
496
499
|
}}
|
|
497
500
|
>
|
|
498
|
-
|
|
501
|
+
{formatMessage({ id: getTrad('ipban.empty.title') })}
|
|
499
502
|
</Typography>
|
|
500
503
|
|
|
501
504
|
<Typography
|
|
@@ -507,7 +510,7 @@ const IPBans = () => {
|
|
|
507
510
|
lineHeight: '1.6',
|
|
508
511
|
}}
|
|
509
512
|
>
|
|
510
|
-
|
|
513
|
+
{formatMessage({ id: getTrad('ipban.empty.description') })}
|
|
511
514
|
</Typography>
|
|
512
515
|
|
|
513
516
|
<Flex gap={3} justifyContent="center" style={{ marginTop: '16px' }}>
|
|
@@ -522,7 +525,7 @@ const IPBans = () => {
|
|
|
522
525
|
fontWeight: '600',
|
|
523
526
|
}}
|
|
524
527
|
>
|
|
525
|
-
|
|
528
|
+
{formatMessage({ id: getTrad('ipban.empty.action') })}
|
|
526
529
|
</Button>
|
|
527
530
|
</Flex>
|
|
528
531
|
</Flex>
|
|
@@ -568,12 +571,12 @@ const IPBans = () => {
|
|
|
568
571
|
</Flex>
|
|
569
572
|
</Td>
|
|
570
573
|
<Td>
|
|
571
|
-
<AnimatedBadge variant="danger">
|
|
574
|
+
<AnimatedBadge variant="danger">{formatMessage({ id: getTrad('ipban.status.banned') })}</AnimatedBadge>
|
|
572
575
|
</Td>
|
|
573
576
|
<Td>
|
|
574
577
|
<Flex gap={1} justifyContent="flex-end">
|
|
575
578
|
<IconButton
|
|
576
|
-
label=
|
|
579
|
+
label={formatMessage({ id: getTrad('ipban.actions.unban') })}
|
|
577
580
|
variant="success-ghost"
|
|
578
581
|
onClick={() => handleUnbanIP(ip)}
|
|
579
582
|
withTooltip={false}
|
|
@@ -593,7 +596,7 @@ const IPBans = () => {
|
|
|
593
596
|
<Flex justifyContent="center">
|
|
594
597
|
<Pagination activePage={currentPage} pageCount={totalPages}>
|
|
595
598
|
<PreviousLink onClick={() => setCurrentPage(Math.max(1, currentPage - 1))}>
|
|
596
|
-
|
|
599
|
+
{formatMessage({ id: getTrad('common.previous') })}
|
|
597
600
|
</PreviousLink>
|
|
598
601
|
{[...Array(totalPages)].map((_, i) => (
|
|
599
602
|
<PageLink
|
|
@@ -605,7 +608,7 @@ const IPBans = () => {
|
|
|
605
608
|
</PageLink>
|
|
606
609
|
))}
|
|
607
610
|
<NextLink onClick={() => setCurrentPage(Math.min(totalPages, currentPage + 1))}>
|
|
608
|
-
|
|
611
|
+
{formatMessage({ id: getTrad('common.next') })}
|
|
609
612
|
</NextLink>
|
|
610
613
|
</Pagination>
|
|
611
614
|
</Flex>
|
|
@@ -659,15 +662,15 @@ const IPBans = () => {
|
|
|
659
662
|
>
|
|
660
663
|
<Flex direction="column" gap={1} alignItems="flex-start">
|
|
661
664
|
<Typography variant="beta" style={{ fontSize: '16px', fontWeight: '600' }}>
|
|
662
|
-
|
|
665
|
+
{formatMessage({ id: getTrad('ipban.modal.title') })}
|
|
663
666
|
</Typography>
|
|
664
667
|
<Typography variant="pi" textColor="neutral600" style={{ fontSize: '13px' }}>
|
|
665
|
-
|
|
668
|
+
{formatMessage({ id: getTrad('ipban.modal.subtitle') })}
|
|
666
669
|
</Typography>
|
|
667
670
|
</Flex>
|
|
668
671
|
<IconButton
|
|
669
672
|
onClick={() => setShowAddModal(false)}
|
|
670
|
-
label=
|
|
673
|
+
label={formatMessage({ id: getTrad('common.close') })}
|
|
671
674
|
withTooltip={false}
|
|
672
675
|
>
|
|
673
676
|
<Cross />
|
|
@@ -695,8 +698,8 @@ const IPBans = () => {
|
|
|
695
698
|
|
|
696
699
|
<Box>
|
|
697
700
|
<TextInput
|
|
698
|
-
label=
|
|
699
|
-
placeholder=
|
|
701
|
+
label={formatMessage({ id: getTrad('ipban.modal.label') })}
|
|
702
|
+
placeholder={formatMessage({ id: getTrad('ipban.modal.placeholder') })}
|
|
700
703
|
value={newIP}
|
|
701
704
|
onChange={(e) => setNewIP(e.target.value)}
|
|
702
705
|
style={{ fontSize: '14px', fontFamily: 'monospace' }}
|
|
@@ -706,7 +709,7 @@ const IPBans = () => {
|
|
|
706
709
|
textColor="neutral600"
|
|
707
710
|
style={{ marginTop: '6px', fontSize: '12px' }}
|
|
708
711
|
>
|
|
709
|
-
|
|
712
|
+
{formatMessage({ id: getTrad('ipban.modal.hint') })}
|
|
710
713
|
</Typography>
|
|
711
714
|
</Box>
|
|
712
715
|
</Flex>
|
|
@@ -734,7 +737,7 @@ const IPBans = () => {
|
|
|
734
737
|
size="M"
|
|
735
738
|
variant="tertiary"
|
|
736
739
|
>
|
|
737
|
-
|
|
740
|
+
{formatMessage({ id: getTrad('ipban.modal.cancel') })}
|
|
738
741
|
</Button>
|
|
739
742
|
<Button
|
|
740
743
|
onClick={handleBanIP}
|
|
@@ -743,7 +746,7 @@ const IPBans = () => {
|
|
|
743
746
|
startIcon={<Lock />}
|
|
744
747
|
disabled={!newIP}
|
|
745
748
|
>
|
|
746
|
-
|
|
749
|
+
{formatMessage({ id: getTrad('ipban.modal.submit') })}
|
|
747
750
|
</Button>
|
|
748
751
|
</Flex>
|
|
749
752
|
</Box>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
|
2
2
|
import styled, { keyframes } from 'styled-components';
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
3
4
|
import {
|
|
4
5
|
Typography,
|
|
5
6
|
Box,
|
|
@@ -38,6 +39,7 @@ import {
|
|
|
38
39
|
CaretDown,
|
|
39
40
|
Monitor,
|
|
40
41
|
} from '@strapi/icons';
|
|
42
|
+
import getTrad from '../../utils/getTrad';
|
|
41
43
|
|
|
42
44
|
// ================ DESIGN TOKENS ================
|
|
43
45
|
const theme = {
|
|
@@ -280,6 +282,7 @@ const formatDate = (dateString) => {
|
|
|
280
282
|
|
|
281
283
|
// ================ HAUPTKOMPONENTE ================
|
|
282
284
|
const JWTSessions = () => {
|
|
285
|
+
const { formatMessage } = useIntl();
|
|
283
286
|
const { get, post } = useFetchClient();
|
|
284
287
|
const { toggleNotification } = useNotification();
|
|
285
288
|
|
|
@@ -358,7 +361,7 @@ const JWTSessions = () => {
|
|
|
358
361
|
// Stat Cards Konfiguration
|
|
359
362
|
const statCards = [
|
|
360
363
|
{
|
|
361
|
-
title: '
|
|
364
|
+
title: formatMessage({ id: getTrad('jwt.stats.total') }),
|
|
362
365
|
value: stats.total,
|
|
363
366
|
icon: Shield,
|
|
364
367
|
color: theme.colors.primary[600],
|
|
@@ -366,7 +369,7 @@ const JWTSessions = () => {
|
|
|
366
369
|
delay: '0s'
|
|
367
370
|
},
|
|
368
371
|
{
|
|
369
|
-
title: '
|
|
372
|
+
title: formatMessage({ id: getTrad('jwt.stats.active') }),
|
|
370
373
|
value: stats.active,
|
|
371
374
|
icon: Check,
|
|
372
375
|
color: theme.colors.success[600],
|
|
@@ -374,7 +377,7 @@ const JWTSessions = () => {
|
|
|
374
377
|
delay: '0.1s'
|
|
375
378
|
},
|
|
376
379
|
{
|
|
377
|
-
title: '
|
|
380
|
+
title: formatMessage({ id: getTrad('jwt.stats.expired') }),
|
|
378
381
|
value: stats.expired,
|
|
379
382
|
icon: Clock,
|
|
380
383
|
color: theme.colors.warning[600],
|
|
@@ -382,7 +385,7 @@ const JWTSessions = () => {
|
|
|
382
385
|
delay: '0.2s'
|
|
383
386
|
},
|
|
384
387
|
{
|
|
385
|
-
title: '
|
|
388
|
+
title: formatMessage({ id: getTrad('jwt.stats.revoked') }),
|
|
386
389
|
value: stats.revoked,
|
|
387
390
|
icon: Lock,
|
|
388
391
|
color: theme.colors.danger[600],
|
|
@@ -435,8 +438,8 @@ const JWTSessions = () => {
|
|
|
435
438
|
} catch (error) {
|
|
436
439
|
toggleNotification({
|
|
437
440
|
type: 'warning',
|
|
438
|
-
message:
|
|
439
|
-
title: '
|
|
441
|
+
message: formatMessage({ id: getTrad('jwt.notifications.revokeError') }),
|
|
442
|
+
title: formatMessage({ id: getTrad('tokens.notifications.error') })
|
|
440
443
|
});
|
|
441
444
|
}
|
|
442
445
|
};
|
|
@@ -447,14 +450,14 @@ const JWTSessions = () => {
|
|
|
447
450
|
await fetchSessions();
|
|
448
451
|
toggleNotification({
|
|
449
452
|
type: 'success',
|
|
450
|
-
message:
|
|
451
|
-
title: '
|
|
453
|
+
message: formatMessage({ id: getTrad('jwt.notifications.unrevokeSuccess') }),
|
|
454
|
+
title: formatMessage({ id: getTrad('tokens.notifications.success') })
|
|
452
455
|
});
|
|
453
456
|
} catch (error) {
|
|
454
457
|
toggleNotification({
|
|
455
458
|
type: 'warning',
|
|
456
|
-
message:
|
|
457
|
-
title: '
|
|
459
|
+
message: formatMessage({ id: getTrad('jwt.notifications.unrevokeError') }),
|
|
460
|
+
title: formatMessage({ id: getTrad('tokens.notifications.error') })
|
|
458
461
|
});
|
|
459
462
|
}
|
|
460
463
|
};
|
|
@@ -465,14 +468,14 @@ const JWTSessions = () => {
|
|
|
465
468
|
await fetchSessions();
|
|
466
469
|
toggleNotification({
|
|
467
470
|
type: 'success',
|
|
468
|
-
message: response?.data?.message ||
|
|
469
|
-
title: '
|
|
471
|
+
message: response?.data?.message || formatMessage({ id: getTrad('jwt.notifications.cleanupSuccess') }),
|
|
472
|
+
title: formatMessage({ id: getTrad('tokens.notifications.success') })
|
|
470
473
|
});
|
|
471
474
|
} catch (error) {
|
|
472
475
|
toggleNotification({
|
|
473
476
|
type: 'warning',
|
|
474
|
-
message:
|
|
475
|
-
title: '
|
|
477
|
+
message: formatMessage({ id: getTrad('jwt.notifications.cleanupError') }),
|
|
478
|
+
title: formatMessage({ id: getTrad('tokens.notifications.error') })
|
|
476
479
|
});
|
|
477
480
|
}
|
|
478
481
|
};
|
|
@@ -504,12 +507,12 @@ const JWTSessions = () => {
|
|
|
504
507
|
|
|
505
508
|
const getStatusBadge = (session) => {
|
|
506
509
|
if (session.revoked) {
|
|
507
|
-
return <AnimatedBadge variant="danger">
|
|
510
|
+
return <AnimatedBadge variant="danger">{formatMessage({ id: getTrad('jwt.status.revoked') })}</AnimatedBadge>;
|
|
508
511
|
}
|
|
509
512
|
if (session.isExpired) {
|
|
510
|
-
return <AnimatedBadge variant="warning">
|
|
513
|
+
return <AnimatedBadge variant="warning">{formatMessage({ id: getTrad('jwt.status.expired') })}</AnimatedBadge>;
|
|
511
514
|
}
|
|
512
|
-
return <AnimatedBadge variant="success">
|
|
515
|
+
return <AnimatedBadge variant="success">{formatMessage({ id: getTrad('jwt.status.active') })}</AnimatedBadge>;
|
|
513
516
|
};
|
|
514
517
|
|
|
515
518
|
// Loading State
|
|
@@ -518,7 +521,7 @@ const JWTSessions = () => {
|
|
|
518
521
|
<Container>
|
|
519
522
|
<LoadingOverlay>
|
|
520
523
|
<Box className="loader-icon">
|
|
521
|
-
<Loader>
|
|
524
|
+
<Loader>{formatMessage({ id: getTrad('common.loadingSessions') })}</Loader>
|
|
522
525
|
</Box>
|
|
523
526
|
</LoadingOverlay>
|
|
524
527
|
</Container>
|
|
@@ -570,12 +573,12 @@ const JWTSessions = () => {
|
|
|
570
573
|
<SingleSelect
|
|
571
574
|
value={filterStatus}
|
|
572
575
|
onChange={setFilterStatus}
|
|
573
|
-
placeholder=
|
|
576
|
+
placeholder={formatMessage({ id: getTrad('tokens.filter.status') })}
|
|
574
577
|
>
|
|
575
|
-
<SingleSelectOption value="all">
|
|
576
|
-
<SingleSelectOption value="active">
|
|
577
|
-
<SingleSelectOption value="expired">
|
|
578
|
-
<SingleSelectOption value="revoked">
|
|
578
|
+
<SingleSelectOption value="all">{formatMessage({ id: getTrad('jwt.filter.all') })}</SingleSelectOption>
|
|
579
|
+
<SingleSelectOption value="active">{formatMessage({ id: getTrad('jwt.filter.active') })}</SingleSelectOption>
|
|
580
|
+
<SingleSelectOption value="expired">{formatMessage({ id: getTrad('jwt.filter.expired') })}</SingleSelectOption>
|
|
581
|
+
<SingleSelectOption value="revoked">{formatMessage({ id: getTrad('jwt.filter.revoked') })}</SingleSelectOption>
|
|
579
582
|
</SingleSelect>
|
|
580
583
|
<SingleSelect
|
|
581
584
|
value={pageSize.toString()}
|
|
@@ -593,7 +596,7 @@ const JWTSessions = () => {
|
|
|
593
596
|
variant="secondary"
|
|
594
597
|
size="S"
|
|
595
598
|
>
|
|
596
|
-
|
|
599
|
+
{formatMessage({ id: getTrad('jwt.actions.cleanup') })}
|
|
597
600
|
</Button>
|
|
598
601
|
<Button
|
|
599
602
|
onClick={handleRefresh}
|
|
@@ -601,7 +604,7 @@ const JWTSessions = () => {
|
|
|
601
604
|
variant="secondary"
|
|
602
605
|
size="S"
|
|
603
606
|
>
|
|
604
|
-
|
|
607
|
+
{formatMessage({ id: getTrad('jwt.actions.refresh') })}
|
|
605
608
|
</Button>
|
|
606
609
|
</FilterBar>
|
|
607
610
|
|
|
@@ -650,7 +653,7 @@ const JWTSessions = () => {
|
|
|
650
653
|
marginBottom: '8px',
|
|
651
654
|
}}
|
|
652
655
|
>
|
|
653
|
-
|
|
656
|
+
{formatMessage({ id: getTrad('jwt.empty.title') })}
|
|
654
657
|
</Typography>
|
|
655
658
|
|
|
656
659
|
<Typography
|
|
@@ -662,7 +665,7 @@ const JWTSessions = () => {
|
|
|
662
665
|
lineHeight: '1.6',
|
|
663
666
|
}}
|
|
664
667
|
>
|
|
665
|
-
|
|
668
|
+
{formatMessage({ id: getTrad('jwt.empty.description') })}
|
|
666
669
|
</Typography>
|
|
667
670
|
|
|
668
671
|
<Flex gap={3} justifyContent="center" style={{ marginTop: '16px' }}>
|
|
@@ -674,7 +677,7 @@ const JWTSessions = () => {
|
|
|
674
677
|
variant="secondary"
|
|
675
678
|
size="L"
|
|
676
679
|
>
|
|
677
|
-
|
|
680
|
+
{formatMessage({ id: getTrad('jwt.empty.resetFilters') })}
|
|
678
681
|
</Button>
|
|
679
682
|
</Flex>
|
|
680
683
|
</Flex>
|
|
@@ -789,7 +792,7 @@ const JWTSessions = () => {
|
|
|
789
792
|
<Flex gap={1} justifyContent="flex-end">
|
|
790
793
|
{session.revoked ? (
|
|
791
794
|
<IconButton
|
|
792
|
-
label=
|
|
795
|
+
label={formatMessage({ id: getTrad('jwt.actions.unrevoke') })}
|
|
793
796
|
variant="success-ghost"
|
|
794
797
|
onClick={() => handleUnrevoke(session.id, session.userId)}
|
|
795
798
|
withTooltip={false}
|
|
@@ -799,7 +802,7 @@ const JWTSessions = () => {
|
|
|
799
802
|
</IconButton>
|
|
800
803
|
) : (
|
|
801
804
|
<IconButton
|
|
802
|
-
label=
|
|
805
|
+
label={formatMessage({ id: getTrad('jwt.actions.revoke') })}
|
|
803
806
|
variant="danger-ghost"
|
|
804
807
|
onClick={() => handleRevoke(session.id)}
|
|
805
808
|
withTooltip={false}
|
|
@@ -820,7 +823,7 @@ const JWTSessions = () => {
|
|
|
820
823
|
<Flex justifyContent="center">
|
|
821
824
|
<Pagination activePage={currentPage} pageCount={totalPages}>
|
|
822
825
|
<PreviousLink onClick={() => setCurrentPage(Math.max(1, currentPage - 1))}>
|
|
823
|
-
|
|
826
|
+
{formatMessage({ id: getTrad('common.previous') })}
|
|
824
827
|
</PreviousLink>
|
|
825
828
|
{[...Array(totalPages)].map((_, i) => (
|
|
826
829
|
<PageLink
|
|
@@ -832,7 +835,7 @@ const JWTSessions = () => {
|
|
|
832
835
|
</PageLink>
|
|
833
836
|
))}
|
|
834
837
|
<NextLink onClick={() => setCurrentPage(Math.min(totalPages, currentPage + 1))}>
|
|
835
|
-
|
|
838
|
+
{formatMessage({ id: getTrad('common.next') })}
|
|
836
839
|
</NextLink>
|
|
837
840
|
</Pagination>
|
|
838
841
|
</Flex>
|
|
@@ -296,5 +296,76 @@
|
|
|
296
296
|
"magic-link.tokens.extend.custom": "Eigene",
|
|
297
297
|
"magic-link.tokens.extend.newExpiry": "Neues Ablaufdatum",
|
|
298
298
|
"magic-link.tokens.extend.submit": "Token verlängern",
|
|
299
|
-
"magic-link.tokens.extend.cancel": "Abbrechen"
|
|
299
|
+
"magic-link.tokens.extend.cancel": "Abbrechen",
|
|
300
|
+
|
|
301
|
+
"magic-link.jwt.stats.total": "Gesamt",
|
|
302
|
+
"magic-link.jwt.stats.active": "Aktiv",
|
|
303
|
+
"magic-link.jwt.stats.expired": "Abgelaufen",
|
|
304
|
+
"magic-link.jwt.stats.revoked": "Gesperrt",
|
|
305
|
+
"magic-link.jwt.filter.all": "Alle anzeigen",
|
|
306
|
+
"magic-link.jwt.filter.active": "Nur Aktive",
|
|
307
|
+
"magic-link.jwt.filter.expired": "Nur Abgelaufene",
|
|
308
|
+
"magic-link.jwt.filter.revoked": "Nur Gesperrte",
|
|
309
|
+
"magic-link.jwt.status.active": "Aktiv",
|
|
310
|
+
"magic-link.jwt.status.expired": "Abgelaufen",
|
|
311
|
+
"magic-link.jwt.status.revoked": "Gesperrt",
|
|
312
|
+
"magic-link.jwt.actions.cleanup": "Aufräumen",
|
|
313
|
+
"magic-link.jwt.actions.refresh": "Aktualisieren",
|
|
314
|
+
"magic-link.jwt.actions.revoke": "Sperren",
|
|
315
|
+
"magic-link.jwt.actions.unrevoke": "Entsperren",
|
|
316
|
+
"magic-link.jwt.empty.title": "Keine JWT Sessions gefunden",
|
|
317
|
+
"magic-link.jwt.empty.description": "Es sind momentan keine JWT Sessions aktiv oder ändere deine Filterkriterien",
|
|
318
|
+
"magic-link.jwt.empty.resetFilters": "Filter zurücksetzen",
|
|
319
|
+
"magic-link.jwt.notifications.revokeSuccess": "Session wurde gesperrt",
|
|
320
|
+
"magic-link.jwt.notifications.revokeError": "Fehler beim Sperren der Session",
|
|
321
|
+
"magic-link.jwt.notifications.unrevokeSuccess": "Session wurde entsperrt",
|
|
322
|
+
"magic-link.jwt.notifications.unrevokeError": "Fehler beim Entsperren der Session",
|
|
323
|
+
"magic-link.jwt.notifications.cleanupSuccess": "Sessions wurden aufgeräumt",
|
|
324
|
+
"magic-link.jwt.notifications.cleanupError": "Fehler beim Aufräumen der Sessions",
|
|
325
|
+
"magic-link.jwt.notifications.refreshSuccess": "Daten wurden aktualisiert",
|
|
326
|
+
|
|
327
|
+
"magic-link.ipban.stats.total": "Gesperrte IPs",
|
|
328
|
+
"magic-link.ipban.title": "Gesperrte IP-Adressen",
|
|
329
|
+
"magic-link.ipban.actions.ban": "IP sperren",
|
|
330
|
+
"magic-link.ipban.actions.unban": "Entsperren",
|
|
331
|
+
"magic-link.ipban.actions.refresh": "Aktualisieren",
|
|
332
|
+
"magic-link.ipban.modal.title": "IP-Adresse sperren",
|
|
333
|
+
"magic-link.ipban.modal.subtitle": "Fügen Sie eine IP-Adresse zur Sperrliste hinzu",
|
|
334
|
+
"magic-link.ipban.modal.warning": "Warnung: Diese IP-Adresse wird sofort gesperrt und alle zugehörigen Tokens werden deaktiviert.",
|
|
335
|
+
"magic-link.ipban.modal.label": "IP-Adresse",
|
|
336
|
+
"magic-link.ipban.modal.placeholder": "z.B. 192.168.1.1",
|
|
337
|
+
"magic-link.ipban.modal.hint": "Geben Sie eine IPv4 oder IPv6 Adresse ein",
|
|
338
|
+
"magic-link.ipban.modal.cancel": "Abbrechen",
|
|
339
|
+
"magic-link.ipban.modal.submit": "IP sperren",
|
|
340
|
+
"magic-link.ipban.status.banned": "Gesperrt",
|
|
341
|
+
"magic-link.ipban.empty.title": "Keine gesperrten IPs",
|
|
342
|
+
"magic-link.ipban.empty.description": "Es sind momentan keine IP-Adressen gesperrt. Fügen Sie eine IP hinzu, um sie zu blockieren.",
|
|
343
|
+
"magic-link.ipban.empty.action": "Erste IP sperren",
|
|
344
|
+
"magic-link.ipban.notifications.banSuccess": "IP {ip} wurde gesperrt",
|
|
345
|
+
"magic-link.ipban.notifications.unbanSuccess": "IP {ip} wurde entsperrt",
|
|
346
|
+
"magic-link.ipban.notifications.banError": "Fehler beim Sperren der IP",
|
|
347
|
+
"magic-link.ipban.notifications.unbanError": "Fehler beim Entsperren der IP",
|
|
348
|
+
"magic-link.ipban.notifications.refreshSuccess": "IP-Liste aktualisiert",
|
|
349
|
+
|
|
350
|
+
"magic-link.common.loading": "Lädt...",
|
|
351
|
+
"magic-link.common.loadingSessions": "Lade JWT Sessions...",
|
|
352
|
+
"magic-link.common.loadingBannedIPs": "Lade gesperrte IP-Adressen...",
|
|
353
|
+
"magic-link.common.search": "Suchen",
|
|
354
|
+
"magic-link.common.clear": "Löschen",
|
|
355
|
+
"magic-link.common.previous": "Zurück",
|
|
356
|
+
"magic-link.common.next": "Weiter",
|
|
357
|
+
"magic-link.common.user": "Benutzer",
|
|
358
|
+
"magic-link.common.ipAddress": "IP-Adresse",
|
|
359
|
+
"magic-link.common.userAgent": "User Agent",
|
|
360
|
+
"magic-link.common.status": "Status",
|
|
361
|
+
"magic-link.common.created": "Erstellt",
|
|
362
|
+
"magic-link.common.expiresAt": "Gültig bis",
|
|
363
|
+
"magic-link.common.actions": "Aktionen",
|
|
364
|
+
"magic-link.common.tokens": "Tokens",
|
|
365
|
+
"magic-link.common.close": "Schließen",
|
|
366
|
+
"magic-link.common.cancel": "Abbrechen",
|
|
367
|
+
"magic-link.common.submit": "Absenden",
|
|
368
|
+
"magic-link.common.entriesPerPage": "Einträge pro Seite",
|
|
369
|
+
"magic-link.common.entries": "{count} Einträge",
|
|
370
|
+
"magic-link.common.selectedCount": "{count} ausgewählt"
|
|
300
371
|
}
|
|
@@ -296,5 +296,76 @@
|
|
|
296
296
|
"magic-link.tokens.extend.custom": "Custom",
|
|
297
297
|
"magic-link.tokens.extend.newExpiry": "New expiry date",
|
|
298
298
|
"magic-link.tokens.extend.submit": "Extend Token",
|
|
299
|
-
"magic-link.tokens.extend.cancel": "Cancel"
|
|
299
|
+
"magic-link.tokens.extend.cancel": "Cancel",
|
|
300
|
+
|
|
301
|
+
"magic-link.jwt.stats.total": "Total",
|
|
302
|
+
"magic-link.jwt.stats.active": "Active",
|
|
303
|
+
"magic-link.jwt.stats.expired": "Expired",
|
|
304
|
+
"magic-link.jwt.stats.revoked": "Revoked",
|
|
305
|
+
"magic-link.jwt.filter.all": "Show All",
|
|
306
|
+
"magic-link.jwt.filter.active": "Active Only",
|
|
307
|
+
"magic-link.jwt.filter.expired": "Expired Only",
|
|
308
|
+
"magic-link.jwt.filter.revoked": "Revoked Only",
|
|
309
|
+
"magic-link.jwt.status.active": "Active",
|
|
310
|
+
"magic-link.jwt.status.expired": "Expired",
|
|
311
|
+
"magic-link.jwt.status.revoked": "Revoked",
|
|
312
|
+
"magic-link.jwt.actions.cleanup": "Cleanup",
|
|
313
|
+
"magic-link.jwt.actions.refresh": "Refresh",
|
|
314
|
+
"magic-link.jwt.actions.revoke": "Revoke",
|
|
315
|
+
"magic-link.jwt.actions.unrevoke": "Unrevoke",
|
|
316
|
+
"magic-link.jwt.empty.title": "No JWT Sessions Found",
|
|
317
|
+
"magic-link.jwt.empty.description": "No JWT sessions are currently active or change your filter criteria",
|
|
318
|
+
"magic-link.jwt.empty.resetFilters": "Reset Filters",
|
|
319
|
+
"magic-link.jwt.notifications.revokeSuccess": "Session revoked successfully",
|
|
320
|
+
"magic-link.jwt.notifications.revokeError": "Error revoking session",
|
|
321
|
+
"magic-link.jwt.notifications.unrevokeSuccess": "Session unrevoked successfully",
|
|
322
|
+
"magic-link.jwt.notifications.unrevokeError": "Error unrevoking session",
|
|
323
|
+
"magic-link.jwt.notifications.cleanupSuccess": "Sessions cleaned up successfully",
|
|
324
|
+
"magic-link.jwt.notifications.cleanupError": "Error cleaning up sessions",
|
|
325
|
+
"magic-link.jwt.notifications.refreshSuccess": "Data has been refreshed",
|
|
326
|
+
|
|
327
|
+
"magic-link.ipban.stats.total": "Banned IPs",
|
|
328
|
+
"magic-link.ipban.title": "Banned IP Addresses",
|
|
329
|
+
"magic-link.ipban.actions.ban": "Ban IP",
|
|
330
|
+
"magic-link.ipban.actions.unban": "Unban",
|
|
331
|
+
"magic-link.ipban.actions.refresh": "Refresh",
|
|
332
|
+
"magic-link.ipban.modal.title": "Ban IP Address",
|
|
333
|
+
"magic-link.ipban.modal.subtitle": "Add an IP address to the block list",
|
|
334
|
+
"magic-link.ipban.modal.warning": "Warning: This IP address will be immediately blocked and all associated tokens will be deactivated.",
|
|
335
|
+
"magic-link.ipban.modal.label": "IP Address",
|
|
336
|
+
"magic-link.ipban.modal.placeholder": "e.g. 192.168.1.1",
|
|
337
|
+
"magic-link.ipban.modal.hint": "Enter an IPv4 or IPv6 address",
|
|
338
|
+
"magic-link.ipban.modal.cancel": "Cancel",
|
|
339
|
+
"magic-link.ipban.modal.submit": "Ban IP",
|
|
340
|
+
"magic-link.ipban.status.banned": "Banned",
|
|
341
|
+
"magic-link.ipban.empty.title": "No Banned IPs",
|
|
342
|
+
"magic-link.ipban.empty.description": "No IP addresses are currently banned. Add an IP to block it.",
|
|
343
|
+
"magic-link.ipban.empty.action": "Ban First IP",
|
|
344
|
+
"magic-link.ipban.notifications.banSuccess": "IP {ip} has been banned",
|
|
345
|
+
"magic-link.ipban.notifications.unbanSuccess": "IP {ip} has been unbanned",
|
|
346
|
+
"magic-link.ipban.notifications.banError": "Error banning IP",
|
|
347
|
+
"magic-link.ipban.notifications.unbanError": "Error unbanning IP",
|
|
348
|
+
"magic-link.ipban.notifications.refreshSuccess": "IP list updated",
|
|
349
|
+
|
|
350
|
+
"magic-link.common.loading": "Loading...",
|
|
351
|
+
"magic-link.common.loadingSessions": "Loading JWT sessions...",
|
|
352
|
+
"magic-link.common.loadingBannedIPs": "Loading banned IP addresses...",
|
|
353
|
+
"magic-link.common.search": "Search",
|
|
354
|
+
"magic-link.common.clear": "Clear",
|
|
355
|
+
"magic-link.common.previous": "Previous",
|
|
356
|
+
"magic-link.common.next": "Next",
|
|
357
|
+
"magic-link.common.user": "User",
|
|
358
|
+
"magic-link.common.ipAddress": "IP Address",
|
|
359
|
+
"magic-link.common.userAgent": "User Agent",
|
|
360
|
+
"magic-link.common.status": "Status",
|
|
361
|
+
"magic-link.common.created": "Created",
|
|
362
|
+
"magic-link.common.expiresAt": "Expires At",
|
|
363
|
+
"magic-link.common.actions": "Actions",
|
|
364
|
+
"magic-link.common.tokens": "Tokens",
|
|
365
|
+
"magic-link.common.close": "Close",
|
|
366
|
+
"magic-link.common.cancel": "Cancel",
|
|
367
|
+
"magic-link.common.submit": "Submit",
|
|
368
|
+
"magic-link.common.entriesPerPage": "Entries per page",
|
|
369
|
+
"magic-link.common.entries": "{count} entries",
|
|
370
|
+
"magic-link.common.selectedCount": "{count} selected"
|
|
300
371
|
}
|
|
@@ -296,6 +296,77 @@
|
|
|
296
296
|
"magic-link.tokens.extend.custom": "Personalizado",
|
|
297
297
|
"magic-link.tokens.extend.newExpiry": "Nueva fecha de expiración",
|
|
298
298
|
"magic-link.tokens.extend.submit": "Extender token",
|
|
299
|
-
"magic-link.tokens.extend.cancel": "Cancelar"
|
|
299
|
+
"magic-link.tokens.extend.cancel": "Cancelar",
|
|
300
|
+
|
|
301
|
+
"magic-link.jwt.stats.total": "Total",
|
|
302
|
+
"magic-link.jwt.stats.active": "Activo",
|
|
303
|
+
"magic-link.jwt.stats.expired": "Expirado",
|
|
304
|
+
"magic-link.jwt.stats.revoked": "Revocado",
|
|
305
|
+
"magic-link.jwt.filter.all": "Mostrar todo",
|
|
306
|
+
"magic-link.jwt.filter.active": "Solo activos",
|
|
307
|
+
"magic-link.jwt.filter.expired": "Solo expirados",
|
|
308
|
+
"magic-link.jwt.filter.revoked": "Solo revocados",
|
|
309
|
+
"magic-link.jwt.status.active": "Activo",
|
|
310
|
+
"magic-link.jwt.status.expired": "Expirado",
|
|
311
|
+
"magic-link.jwt.status.revoked": "Revocado",
|
|
312
|
+
"magic-link.jwt.actions.cleanup": "Limpiar",
|
|
313
|
+
"magic-link.jwt.actions.refresh": "Actualizar",
|
|
314
|
+
"magic-link.jwt.actions.revoke": "Revocar",
|
|
315
|
+
"magic-link.jwt.actions.unrevoke": "Desrevocar",
|
|
316
|
+
"magic-link.jwt.empty.title": "No se encontraron sesiones JWT",
|
|
317
|
+
"magic-link.jwt.empty.description": "No hay sesiones JWT activas actualmente o cambie sus criterios de filtro",
|
|
318
|
+
"magic-link.jwt.empty.resetFilters": "Restablecer filtros",
|
|
319
|
+
"magic-link.jwt.notifications.revokeSuccess": "Sesión revocada correctamente",
|
|
320
|
+
"magic-link.jwt.notifications.revokeError": "Error al revocar la sesión",
|
|
321
|
+
"magic-link.jwt.notifications.unrevokeSuccess": "Sesión desrevocada correctamente",
|
|
322
|
+
"magic-link.jwt.notifications.unrevokeError": "Error al desrevocar la sesión",
|
|
323
|
+
"magic-link.jwt.notifications.cleanupSuccess": "Sesiones limpiadas correctamente",
|
|
324
|
+
"magic-link.jwt.notifications.cleanupError": "Error al limpiar las sesiones",
|
|
325
|
+
"magic-link.jwt.notifications.refreshSuccess": "Los datos se han actualizado",
|
|
326
|
+
|
|
327
|
+
"magic-link.ipban.stats.total": "IPs bloqueadas",
|
|
328
|
+
"magic-link.ipban.title": "Direcciones IP bloqueadas",
|
|
329
|
+
"magic-link.ipban.actions.ban": "Bloquear IP",
|
|
330
|
+
"magic-link.ipban.actions.unban": "Desbloquear",
|
|
331
|
+
"magic-link.ipban.actions.refresh": "Actualizar",
|
|
332
|
+
"magic-link.ipban.modal.title": "Bloquear dirección IP",
|
|
333
|
+
"magic-link.ipban.modal.subtitle": "Agregar una dirección IP a la lista de bloqueo",
|
|
334
|
+
"magic-link.ipban.modal.warning": "Advertencia: Esta dirección IP será bloqueada inmediatamente y todos los tokens asociados serán desactivados.",
|
|
335
|
+
"magic-link.ipban.modal.label": "Dirección IP",
|
|
336
|
+
"magic-link.ipban.modal.placeholder": "ej. 192.168.1.1",
|
|
337
|
+
"magic-link.ipban.modal.hint": "Ingrese una dirección IPv4 o IPv6",
|
|
338
|
+
"magic-link.ipban.modal.cancel": "Cancelar",
|
|
339
|
+
"magic-link.ipban.modal.submit": "Bloquear IP",
|
|
340
|
+
"magic-link.ipban.status.banned": "Bloqueado",
|
|
341
|
+
"magic-link.ipban.empty.title": "No hay IPs bloqueadas",
|
|
342
|
+
"magic-link.ipban.empty.description": "No hay direcciones IP bloqueadas actualmente. Agregue una IP para bloquearla.",
|
|
343
|
+
"magic-link.ipban.empty.action": "Bloquear primera IP",
|
|
344
|
+
"magic-link.ipban.notifications.banSuccess": "IP {ip} ha sido bloqueada",
|
|
345
|
+
"magic-link.ipban.notifications.unbanSuccess": "IP {ip} ha sido desbloqueada",
|
|
346
|
+
"magic-link.ipban.notifications.banError": "Error al bloquear IP",
|
|
347
|
+
"magic-link.ipban.notifications.unbanError": "Error al desbloquear IP",
|
|
348
|
+
"magic-link.ipban.notifications.refreshSuccess": "Lista de IP actualizada",
|
|
349
|
+
|
|
350
|
+
"magic-link.common.loading": "Cargando...",
|
|
351
|
+
"magic-link.common.loadingSessions": "Cargando sesiones JWT...",
|
|
352
|
+
"magic-link.common.loadingBannedIPs": "Cargando direcciones IP bloqueadas...",
|
|
353
|
+
"magic-link.common.search": "Buscar",
|
|
354
|
+
"magic-link.common.clear": "Borrar",
|
|
355
|
+
"magic-link.common.previous": "Anterior",
|
|
356
|
+
"magic-link.common.next": "Siguiente",
|
|
357
|
+
"magic-link.common.user": "Usuario",
|
|
358
|
+
"magic-link.common.ipAddress": "Dirección IP",
|
|
359
|
+
"magic-link.common.userAgent": "User Agent",
|
|
360
|
+
"magic-link.common.status": "Estado",
|
|
361
|
+
"magic-link.common.created": "Creado",
|
|
362
|
+
"magic-link.common.expiresAt": "Expira",
|
|
363
|
+
"magic-link.common.actions": "Acciones",
|
|
364
|
+
"magic-link.common.tokens": "Tokens",
|
|
365
|
+
"magic-link.common.close": "Cerrar",
|
|
366
|
+
"magic-link.common.cancel": "Cancelar",
|
|
367
|
+
"magic-link.common.submit": "Enviar",
|
|
368
|
+
"magic-link.common.entriesPerPage": "Entradas por página",
|
|
369
|
+
"magic-link.common.entries": "{count} entradas",
|
|
370
|
+
"magic-link.common.selectedCount": "{count} seleccionado(s)"
|
|
300
371
|
}
|
|
301
372
|
|
|
@@ -296,6 +296,77 @@
|
|
|
296
296
|
"magic-link.tokens.extend.custom": "Personnalisé",
|
|
297
297
|
"magic-link.tokens.extend.newExpiry": "Nouvelle date d'expiration",
|
|
298
298
|
"magic-link.tokens.extend.submit": "Prolonger le jeton",
|
|
299
|
-
"magic-link.tokens.extend.cancel": "Annuler"
|
|
299
|
+
"magic-link.tokens.extend.cancel": "Annuler",
|
|
300
|
+
|
|
301
|
+
"magic-link.jwt.stats.total": "Total",
|
|
302
|
+
"magic-link.jwt.stats.active": "Actif",
|
|
303
|
+
"magic-link.jwt.stats.expired": "Expiré",
|
|
304
|
+
"magic-link.jwt.stats.revoked": "Révoqué",
|
|
305
|
+
"magic-link.jwt.filter.all": "Afficher tout",
|
|
306
|
+
"magic-link.jwt.filter.active": "Actifs uniquement",
|
|
307
|
+
"magic-link.jwt.filter.expired": "Expirés uniquement",
|
|
308
|
+
"magic-link.jwt.filter.revoked": "Révoqués uniquement",
|
|
309
|
+
"magic-link.jwt.status.active": "Actif",
|
|
310
|
+
"magic-link.jwt.status.expired": "Expiré",
|
|
311
|
+
"magic-link.jwt.status.revoked": "Révoqué",
|
|
312
|
+
"magic-link.jwt.actions.cleanup": "Nettoyer",
|
|
313
|
+
"magic-link.jwt.actions.refresh": "Actualiser",
|
|
314
|
+
"magic-link.jwt.actions.revoke": "Révoquer",
|
|
315
|
+
"magic-link.jwt.actions.unrevoke": "Annuler la révocation",
|
|
316
|
+
"magic-link.jwt.empty.title": "Aucune session JWT trouvée",
|
|
317
|
+
"magic-link.jwt.empty.description": "Aucune session JWT n'est actuellement active ou modifiez vos critères de filtre",
|
|
318
|
+
"magic-link.jwt.empty.resetFilters": "Réinitialiser les filtres",
|
|
319
|
+
"magic-link.jwt.notifications.revokeSuccess": "Session révoquée avec succès",
|
|
320
|
+
"magic-link.jwt.notifications.revokeError": "Erreur lors de la révocation de la session",
|
|
321
|
+
"magic-link.jwt.notifications.unrevokeSuccess": "Révocation de session annulée avec succès",
|
|
322
|
+
"magic-link.jwt.notifications.unrevokeError": "Erreur lors de l'annulation de la révocation de la session",
|
|
323
|
+
"magic-link.jwt.notifications.cleanupSuccess": "Sessions nettoyées avec succès",
|
|
324
|
+
"magic-link.jwt.notifications.cleanupError": "Erreur lors du nettoyage des sessions",
|
|
325
|
+
"magic-link.jwt.notifications.refreshSuccess": "Les données ont été actualisées",
|
|
326
|
+
|
|
327
|
+
"magic-link.ipban.stats.total": "IPs bannies",
|
|
328
|
+
"magic-link.ipban.title": "Adresses IP bannies",
|
|
329
|
+
"magic-link.ipban.actions.ban": "Bannir IP",
|
|
330
|
+
"magic-link.ipban.actions.unban": "Débannir",
|
|
331
|
+
"magic-link.ipban.actions.refresh": "Actualiser",
|
|
332
|
+
"magic-link.ipban.modal.title": "Bannir une adresse IP",
|
|
333
|
+
"magic-link.ipban.modal.subtitle": "Ajouter une adresse IP à la liste de blocage",
|
|
334
|
+
"magic-link.ipban.modal.warning": "Attention : Cette adresse IP sera immédiatement bloquée et tous les jetons associés seront désactivés.",
|
|
335
|
+
"magic-link.ipban.modal.label": "Adresse IP",
|
|
336
|
+
"magic-link.ipban.modal.placeholder": "ex. 192.168.1.1",
|
|
337
|
+
"magic-link.ipban.modal.hint": "Entrez une adresse IPv4 ou IPv6",
|
|
338
|
+
"magic-link.ipban.modal.cancel": "Annuler",
|
|
339
|
+
"magic-link.ipban.modal.submit": "Bannir IP",
|
|
340
|
+
"magic-link.ipban.status.banned": "Banni",
|
|
341
|
+
"magic-link.ipban.empty.title": "Aucune IP bannie",
|
|
342
|
+
"magic-link.ipban.empty.description": "Aucune adresse IP n'est actuellement bannie. Ajoutez une IP pour la bloquer.",
|
|
343
|
+
"magic-link.ipban.empty.action": "Bannir la première IP",
|
|
344
|
+
"magic-link.ipban.notifications.banSuccess": "IP {ip} a été bannie",
|
|
345
|
+
"magic-link.ipban.notifications.unbanSuccess": "IP {ip} a été débannie",
|
|
346
|
+
"magic-link.ipban.notifications.banError": "Erreur lors du bannissement de l'IP",
|
|
347
|
+
"magic-link.ipban.notifications.unbanError": "Erreur lors du débannissement de l'IP",
|
|
348
|
+
"magic-link.ipban.notifications.refreshSuccess": "Liste IP mise à jour",
|
|
349
|
+
|
|
350
|
+
"magic-link.common.loading": "Chargement...",
|
|
351
|
+
"magic-link.common.loadingSessions": "Chargement des sessions JWT...",
|
|
352
|
+
"magic-link.common.loadingBannedIPs": "Chargement des adresses IP bannies...",
|
|
353
|
+
"magic-link.common.search": "Rechercher",
|
|
354
|
+
"magic-link.common.clear": "Effacer",
|
|
355
|
+
"magic-link.common.previous": "Précédent",
|
|
356
|
+
"magic-link.common.next": "Suivant",
|
|
357
|
+
"magic-link.common.user": "Utilisateur",
|
|
358
|
+
"magic-link.common.ipAddress": "Adresse IP",
|
|
359
|
+
"magic-link.common.userAgent": "User Agent",
|
|
360
|
+
"magic-link.common.status": "Statut",
|
|
361
|
+
"magic-link.common.created": "Créé",
|
|
362
|
+
"magic-link.common.expiresAt": "Expire le",
|
|
363
|
+
"magic-link.common.actions": "Actions",
|
|
364
|
+
"magic-link.common.tokens": "Jetons",
|
|
365
|
+
"magic-link.common.close": "Fermer",
|
|
366
|
+
"magic-link.common.cancel": "Annuler",
|
|
367
|
+
"magic-link.common.submit": "Soumettre",
|
|
368
|
+
"magic-link.common.entriesPerPage": "Entrées par page",
|
|
369
|
+
"magic-link.common.entries": "{count} entrées",
|
|
370
|
+
"magic-link.common.selectedCount": "{count} sélectionné(s)"
|
|
300
371
|
}
|
|
301
372
|
|
|
@@ -296,6 +296,77 @@
|
|
|
296
296
|
"magic-link.tokens.extend.custom": "Personalizado",
|
|
297
297
|
"magic-link.tokens.extend.newExpiry": "Nova data de expiração",
|
|
298
298
|
"magic-link.tokens.extend.submit": "Estender token",
|
|
299
|
-
"magic-link.tokens.extend.cancel": "Cancelar"
|
|
299
|
+
"magic-link.tokens.extend.cancel": "Cancelar",
|
|
300
|
+
|
|
301
|
+
"magic-link.jwt.stats.total": "Total",
|
|
302
|
+
"magic-link.jwt.stats.active": "Ativo",
|
|
303
|
+
"magic-link.jwt.stats.expired": "Expirado",
|
|
304
|
+
"magic-link.jwt.stats.revoked": "Revogado",
|
|
305
|
+
"magic-link.jwt.filter.all": "Mostrar tudo",
|
|
306
|
+
"magic-link.jwt.filter.active": "Apenas ativos",
|
|
307
|
+
"magic-link.jwt.filter.expired": "Apenas expirados",
|
|
308
|
+
"magic-link.jwt.filter.revoked": "Apenas revogados",
|
|
309
|
+
"magic-link.jwt.status.active": "Ativo",
|
|
310
|
+
"magic-link.jwt.status.expired": "Expirado",
|
|
311
|
+
"magic-link.jwt.status.revoked": "Revogado",
|
|
312
|
+
"magic-link.jwt.actions.cleanup": "Limpar",
|
|
313
|
+
"magic-link.jwt.actions.refresh": "Atualizar",
|
|
314
|
+
"magic-link.jwt.actions.revoke": "Revogar",
|
|
315
|
+
"magic-link.jwt.actions.unrevoke": "Cancelar revogação",
|
|
316
|
+
"magic-link.jwt.empty.title": "Nenhuma sessão JWT encontrada",
|
|
317
|
+
"magic-link.jwt.empty.description": "Não há sessões JWT ativas no momento ou altere seus critérios de filtro",
|
|
318
|
+
"magic-link.jwt.empty.resetFilters": "Redefinir filtros",
|
|
319
|
+
"magic-link.jwt.notifications.revokeSuccess": "Sessão revogada com sucesso",
|
|
320
|
+
"magic-link.jwt.notifications.revokeError": "Erro ao revogar a sessão",
|
|
321
|
+
"magic-link.jwt.notifications.unrevokeSuccess": "Revogação de sessão cancelada com sucesso",
|
|
322
|
+
"magic-link.jwt.notifications.unrevokeError": "Erro ao cancelar a revogação da sessão",
|
|
323
|
+
"magic-link.jwt.notifications.cleanupSuccess": "Sessões limpas com sucesso",
|
|
324
|
+
"magic-link.jwt.notifications.cleanupError": "Erro ao limpar as sessões",
|
|
325
|
+
"magic-link.jwt.notifications.refreshSuccess": "Os dados foram atualizados",
|
|
326
|
+
|
|
327
|
+
"magic-link.ipban.stats.total": "IPs banidos",
|
|
328
|
+
"magic-link.ipban.title": "Endereços IP banidos",
|
|
329
|
+
"magic-link.ipban.actions.ban": "Banir IP",
|
|
330
|
+
"magic-link.ipban.actions.unban": "Desbanir",
|
|
331
|
+
"magic-link.ipban.actions.refresh": "Atualizar",
|
|
332
|
+
"magic-link.ipban.modal.title": "Banir endereço IP",
|
|
333
|
+
"magic-link.ipban.modal.subtitle": "Adicionar um endereço IP à lista de bloqueio",
|
|
334
|
+
"magic-link.ipban.modal.warning": "Aviso: Este endereço IP será bloqueado imediatamente e todos os tokens associados serão desativados.",
|
|
335
|
+
"magic-link.ipban.modal.label": "Endereço IP",
|
|
336
|
+
"magic-link.ipban.modal.placeholder": "ex. 192.168.1.1",
|
|
337
|
+
"magic-link.ipban.modal.hint": "Digite um endereço IPv4 ou IPv6",
|
|
338
|
+
"magic-link.ipban.modal.cancel": "Cancelar",
|
|
339
|
+
"magic-link.ipban.modal.submit": "Banir IP",
|
|
340
|
+
"magic-link.ipban.status.banned": "Banido",
|
|
341
|
+
"magic-link.ipban.empty.title": "Nenhum IP banido",
|
|
342
|
+
"magic-link.ipban.empty.description": "Nenhum endereço IP está banido no momento. Adicione um IP para bloqueá-lo.",
|
|
343
|
+
"magic-link.ipban.empty.action": "Banir primeiro IP",
|
|
344
|
+
"magic-link.ipban.notifications.banSuccess": "IP {ip} foi banido",
|
|
345
|
+
"magic-link.ipban.notifications.unbanSuccess": "IP {ip} foi desbanido",
|
|
346
|
+
"magic-link.ipban.notifications.banError": "Erro ao banir IP",
|
|
347
|
+
"magic-link.ipban.notifications.unbanError": "Erro ao desbanir IP",
|
|
348
|
+
"magic-link.ipban.notifications.refreshSuccess": "Lista de IP atualizada",
|
|
349
|
+
|
|
350
|
+
"magic-link.common.loading": "Carregando...",
|
|
351
|
+
"magic-link.common.loadingSessions": "Carregando sessões JWT...",
|
|
352
|
+
"magic-link.common.loadingBannedIPs": "Carregando endereços IP banidos...",
|
|
353
|
+
"magic-link.common.search": "Pesquisar",
|
|
354
|
+
"magic-link.common.clear": "Limpar",
|
|
355
|
+
"magic-link.common.previous": "Anterior",
|
|
356
|
+
"magic-link.common.next": "Próximo",
|
|
357
|
+
"magic-link.common.user": "Usuário",
|
|
358
|
+
"magic-link.common.ipAddress": "Endereço IP",
|
|
359
|
+
"magic-link.common.userAgent": "User Agent",
|
|
360
|
+
"magic-link.common.status": "Status",
|
|
361
|
+
"magic-link.common.created": "Criado",
|
|
362
|
+
"magic-link.common.expiresAt": "Expira em",
|
|
363
|
+
"magic-link.common.actions": "Ações",
|
|
364
|
+
"magic-link.common.tokens": "Tokens",
|
|
365
|
+
"magic-link.common.close": "Fechar",
|
|
366
|
+
"magic-link.common.cancel": "Cancelar",
|
|
367
|
+
"magic-link.common.submit": "Enviar",
|
|
368
|
+
"magic-link.common.entriesPerPage": "Entradas por página",
|
|
369
|
+
"magic-link.common.entries": "{count} entradas",
|
|
370
|
+
"magic-link.common.selectedCount": "{count} selecionado(s)"
|
|
300
371
|
}
|
|
301
372
|
|
package/package.json
CHANGED