strapi-plugin-magic-link-v5 4.5.0 → 4.7.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 CHANGED
@@ -5,6 +5,18 @@ Secure passwordless authentication for Strapi using email-based magic links. No
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
6
  [![npm version](https://badge.fury.io/js/strapi-plugin-magic-link-v5.svg)](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
@@ -4,6 +4,7 @@ import enTranslations from '../translations/en.json';
4
4
  import deTranslations from '../translations/de.json';
5
5
  import frTranslations from '../translations/fr.json';
6
6
  import esTranslations from '../translations/es.json';
7
+ import ptTranslations from '../translations/pt.json';
7
8
 
8
9
  const LanguageContext = createContext();
9
10
 
@@ -20,6 +21,7 @@ const translations = {
20
21
  de: deTranslations,
21
22
  fr: frTranslations,
22
23
  es: esTranslations,
24
+ pt: ptTranslations,
23
25
  };
24
26
 
25
27
  export const LanguageProvider = ({ children }) => {
@@ -316,6 +316,7 @@ const SettingsModern = () => {
316
316
  <SingleSelectOption value="de">{formatMessage({ id: getTrad('settings.language.de') })}</SingleSelectOption>
317
317
  <SingleSelectOption value="fr">{formatMessage({ id: getTrad('settings.language.fr') })}</SingleSelectOption>
318
318
  <SingleSelectOption value="es">{formatMessage({ id: getTrad('settings.language.es') })}</SingleSelectOption>
319
+ <SingleSelectOption value="pt">{formatMessage({ id: getTrad('settings.language.pt') })}</SingleSelectOption>
319
320
  </SingleSelect>
320
321
  </Box>
321
322
  <Typography variant="pi" textColor="neutral600" style={{ fontSize: '11px', flex: 1 }}>
@@ -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: 'Gesamt',
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: 'Aktiv',
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: 'Abgelaufen',
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: 'Gesperrt',
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: 'Fehler beim Sperren der Session',
439
- title: 'Fehler'
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: 'Session wurde entsperrt',
451
- title: 'Erfolg'
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: 'Fehler beim Entsperren der Session',
457
- title: 'Fehler'
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 || 'Sessions wurden aufgeräumt',
469
- title: 'Erfolg'
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: 'Fehler beim Aufräumen der Sessions',
475
- title: 'Fehler'
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">Gesperrt</AnimatedBadge>;
510
+ return <AnimatedBadge variant="danger">{formatMessage({ id: getTrad('jwt.status.revoked') })}</AnimatedBadge>;
508
511
  }
509
512
  if (session.isExpired) {
510
- return <AnimatedBadge variant="warning">Abgelaufen</AnimatedBadge>;
513
+ return <AnimatedBadge variant="warning">{formatMessage({ id: getTrad('jwt.status.expired') })}</AnimatedBadge>;
511
514
  }
512
- return <AnimatedBadge variant="success">Aktiv</AnimatedBadge>;
515
+ return <AnimatedBadge variant="success">{formatMessage({ id: getTrad('jwt.status.active') })}</AnimatedBadge>;
513
516
  };
514
517
 
515
518
  // Loading State
@@ -570,12 +573,12 @@ const JWTSessions = () => {
570
573
  <SingleSelect
571
574
  value={filterStatus}
572
575
  onChange={setFilterStatus}
573
- placeholder="Status filtern"
576
+ placeholder={formatMessage({ id: getTrad('tokens.filter.status') })}
574
577
  >
575
- <SingleSelectOption value="all">Alle anzeigen</SingleSelectOption>
576
- <SingleSelectOption value="active">Nur Aktive</SingleSelectOption>
577
- <SingleSelectOption value="expired">Nur Abgelaufene</SingleSelectOption>
578
- <SingleSelectOption value="revoked">Nur Gesperrte</SingleSelectOption>
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
- Aufräumen
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
- Aktualisieren
607
+ {formatMessage({ id: getTrad('jwt.actions.refresh') })}
605
608
  </Button>
606
609
  </FilterBar>
607
610
 
@@ -21,6 +21,7 @@
21
21
  "magic-link.settings.language.de": "Deutsch",
22
22
  "magic-link.settings.language.fr": "Français",
23
23
  "magic-link.settings.language.es": "Español",
24
+ "magic-link.settings.language.pt": "Português",
24
25
 
25
26
  "magic-link.settings.info.header": "Wichtige Hinweise zur Konfiguration",
26
27
  "magic-link.settings.info.line1": "Alle Änderungen werden sofort nach dem Speichern aktiv",
@@ -295,5 +296,51 @@
295
296
  "magic-link.tokens.extend.custom": "Eigene",
296
297
  "magic-link.tokens.extend.newExpiry": "Neues Ablaufdatum",
297
298
  "magic-link.tokens.extend.submit": "Token verlängern",
298
- "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.banError": "Fehler beim Sperren der IP",
345
+ "magic-link.ipban.notifications.unbanError": "Fehler beim Entsperren der IP"
299
346
  }
@@ -21,6 +21,7 @@
21
21
  "magic-link.settings.language.de": "Deutsch",
22
22
  "magic-link.settings.language.fr": "Français",
23
23
  "magic-link.settings.language.es": "Español",
24
+ "magic-link.settings.language.pt": "Português",
24
25
 
25
26
  "magic-link.settings.info.header": "Important Configuration Notes",
26
27
  "magic-link.settings.info.line1": "All changes take effect immediately after saving",
@@ -295,5 +296,51 @@
295
296
  "magic-link.tokens.extend.custom": "Custom",
296
297
  "magic-link.tokens.extend.newExpiry": "New expiry date",
297
298
  "magic-link.tokens.extend.submit": "Extend Token",
298
- "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.banError": "Error banning IP",
345
+ "magic-link.ipban.notifications.unbanError": "Error unbanning IP"
299
346
  }
@@ -21,6 +21,7 @@
21
21
  "magic-link.settings.language.de": "Deutsch",
22
22
  "magic-link.settings.language.fr": "Français",
23
23
  "magic-link.settings.language.es": "Español",
24
+ "magic-link.settings.language.pt": "Português",
24
25
 
25
26
  "magic-link.settings.info.header": "Notas importantes de configuración",
26
27
  "magic-link.settings.info.line1": "Todos los cambios surten efecto inmediatamente después de guardar",
@@ -295,6 +296,52 @@
295
296
  "magic-link.tokens.extend.custom": "Personalizado",
296
297
  "magic-link.tokens.extend.newExpiry": "Nueva fecha de expiración",
297
298
  "magic-link.tokens.extend.submit": "Extender token",
298
- "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.banError": "Error al bloquear IP",
345
+ "magic-link.ipban.notifications.unbanError": "Error al desbloquear IP"
299
346
  }
300
347
 
@@ -21,6 +21,7 @@
21
21
  "magic-link.settings.language.de": "Deutsch",
22
22
  "magic-link.settings.language.fr": "Français",
23
23
  "magic-link.settings.language.es": "Español",
24
+ "magic-link.settings.language.pt": "Português",
24
25
 
25
26
  "magic-link.settings.info.header": "Notes de configuration importantes",
26
27
  "magic-link.settings.info.line1": "Tous les changements prennent effet immédiatement après l'enregistrement",
@@ -295,6 +296,52 @@
295
296
  "magic-link.tokens.extend.custom": "Personnalisé",
296
297
  "magic-link.tokens.extend.newExpiry": "Nouvelle date d'expiration",
297
298
  "magic-link.tokens.extend.submit": "Prolonger le jeton",
298
- "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.banError": "Erreur lors du bannissement de l'IP",
345
+ "magic-link.ipban.notifications.unbanError": "Erreur lors du débannissement de l'IP"
299
346
  }
300
347
 
@@ -0,0 +1,347 @@
1
+ {
2
+ "magic-link.plugin.name": "Magic Link",
3
+ "magic-link.Header.Settings": "Magic Link",
4
+ "magic-link.Form.title.Settings": "Configurações",
5
+
6
+ "magic-link.status.active": "ATIVO",
7
+ "magic-link.status.inactive": "INATIVO",
8
+
9
+ "magic-link.settings.page.title": "⚙️ Configurações do Magic Link",
10
+ "magic-link.settings.page.subtitle": "Configure a autenticação sem senha para seus usuários",
11
+ "magic-link.settings.save.button": "Salvar alterações",
12
+ "magic-link.settings.save.saving": "Salvando...",
13
+ "magic-link.settings.save.success": "Configurações salvas com sucesso",
14
+ "magic-link.settings.save.error": "Erro ao salvar as configurações",
15
+ "magic-link.settings.load.loading": "Carregando configurações...",
16
+ "magic-link.settings.load.error": "Erro ao carregar as configurações",
17
+
18
+ "magic-link.settings.language.label": "🌐 Idioma da interface",
19
+ "magic-link.settings.language.hint": "Selecione o idioma para a interface de administração",
20
+ "magic-link.settings.language.en": "English",
21
+ "magic-link.settings.language.de": "Deutsch",
22
+ "magic-link.settings.language.fr": "Français",
23
+ "magic-link.settings.language.es": "Español",
24
+ "magic-link.settings.language.pt": "Português",
25
+
26
+ "magic-link.settings.info.header": "Notas importantes de configuração",
27
+ "magic-link.settings.info.line1": "Todas as alterações entram em vigor imediatamente após salvar",
28
+ "magic-link.settings.info.line2": "Certifique-se de que todas as URLs estejam configuradas corretamente",
29
+ "magic-link.settings.info.line3": "Teste a configuração após salvar com um token de teste",
30
+ "magic-link.settings.info.line4": "Cartões verdes mostram recursos ATIVOS, cartões cinzas estão INATIVOS",
31
+
32
+ "magic-link.settings.section.general": "Configurações gerais",
33
+ "magic-link.settings.section.general.description": "Configuração básica para Magic Link",
34
+ "magic-link.settings.section.auth": "Autenticação",
35
+ "magic-link.settings.section.auth.description": "Configure a autenticação e criação de usuários",
36
+ "magic-link.settings.section.email": "Configurações de e-mail",
37
+ "magic-link.settings.section.email.description": "Configure modelos de e-mail e informações do remetente",
38
+ "magic-link.settings.section.advanced": "Configurações avançadas",
39
+ "magic-link.settings.section.advanced.description": "Opções de configuração adicionais",
40
+
41
+ "magic-link.settings.features.title": "RECURSOS PRINCIPAIS",
42
+ "magic-link.settings.features.subtitle": "Ativar ou desativar os recursos principais do plugin Magic Link",
43
+
44
+ "magic-link.settings.feature.enabled.title": "Ativar Magic Link",
45
+ "magic-link.settings.feature.enabled.description": "Ativa ou desativa todo o sistema Magic Link. Quando desativado, nenhum Magic Link pode ser criado ou usado.",
46
+
47
+ "magic-link.settings.feature.createUser.title": "Criar usuários automaticamente",
48
+ "magic-link.settings.feature.createUser.description": "Cria automaticamente uma nova conta de usuário se o endereço de e-mail ainda não existir no seu sistema.",
49
+
50
+ "magic-link.settings.feature.staysValid.title": "Uso múltiplo do token",
51
+ "magic-link.settings.feature.staysValid.description": "O token pode ser usado várias vezes. Menos seguro, mas mais conveniente se os usuários precisarem abrir o link várias vezes.",
52
+
53
+ "magic-link.settings.time.title": "CONFIGURAÇÕES DE TEMPO",
54
+ "magic-link.settings.expire.label": "⏱️ Tempo de expiração do Magic Link",
55
+ "magic-link.settings.expire.hint": "Quanto tempo o Magic Link permanece válido antes de expirar?",
56
+ "magic-link.settings.expire.placeholder": "3600",
57
+ "magic-link.settings.expire.recommendation": "💡 Recomendação: 3600 segundos (1 hora) é ideal para segurança e facilidade de uso",
58
+
59
+ "magic-link.settings.tokenLength.label": "🔐 Comprimento do token (Segurança)",
60
+ "magic-link.settings.tokenLength.hint": "Quanto mais longo o token, mais seguro contra ataques de força bruta",
61
+ "magic-link.settings.tokenLength.placeholder": "20",
62
+ "magic-link.settings.tokenLength.recommendation": "✓ Seguro: 20-40 caracteres. Atual: {length} caracteres",
63
+
64
+ "magic-link.settings.security.title": "CONFIGURAÇÕES DE SEGURANÇA",
65
+ "magic-link.settings.maxAttempts.label": "🚫 Tentativas máximas de login",
66
+ "magic-link.settings.maxAttempts.hint": "Quantas tentativas falhadas são permitidas antes de um usuário ser bloqueado?",
67
+ "magic-link.settings.maxAttempts.placeholder": "5",
68
+ "magic-link.settings.maxAttempts.warning": "⚠️ Nota: Em 0, este recurso está desativado (tentativas ilimitadas)",
69
+
70
+ "magic-link.settings.api.title": "CONFIGURAÇÃO DE API",
71
+ "magic-link.settings.loginPath.label": "🔗 Caminho da API de login",
72
+ "magic-link.settings.loginPath.hint": "O endpoint da API pelo qual os usuários fazem login com o Magic Link",
73
+ "magic-link.settings.loginPath.placeholder": "/magic-link/login",
74
+ "magic-link.settings.loginPath.fullPath": "Caminho completo: http://localhost:1337/api{path}?loginToken=XXX",
75
+
76
+ "magic-link.settings.confirmationUrl.label": "🌐 URL de confirmação (Importante!)",
77
+ "magic-link.settings.confirmationUrl.hint": "A URL base usada no e-mail. Os usuários clicam nela para fazer login.",
78
+ "magic-link.settings.confirmationUrl.placeholder": "https://seu-app.com/auth/magic-link",
79
+ "magic-link.settings.confirmationUrl.example": "📧 Exemplo de link de e-mail: {url}?loginToken=abc123...",
80
+
81
+ "magic-link.settings.callbackUrl.label": "↪️ URL de callback (Após login)",
82
+ "magic-link.settings.callbackUrl.hint": "Para onde os usuários devem ser redirecionados após um login bem-sucedido? (Opcional)",
83
+ "magic-link.settings.callbackUrl.placeholder": "https://seu-app.com/dashboard",
84
+ "magic-link.settings.callbackUrl.note": "Se vazio: Os usuários permanecem na página de login",
85
+
86
+ "magic-link.settings.auth.options.title": "OPÇÕES DE AUTENTICAÇÃO",
87
+ "magic-link.settings.auth.options.subtitle": "Configure como os usuários são autenticados e gerenciados",
88
+
89
+ "magic-link.settings.auth.verifyEmail.title": "Verificação de e-mail",
90
+ "magic-link.settings.auth.verifyEmail.description": "Requer que os usuários confirmem seu endereço de e-mail antes de poder fazer login. Aumenta a segurança.",
91
+
92
+ "magic-link.settings.auth.welcomeEmail.title": "E-mail de boas-vindas",
93
+ "magic-link.settings.auth.welcomeEmail.description": "Envia automaticamente um e-mail de boas-vindas aos usuários recém-registrados.",
94
+
95
+ "magic-link.settings.auth.useJwt.title": "Usar JWT Token",
96
+ "magic-link.settings.auth.useJwt.description": "Usa JWT (JSON Web Tokens) para autenticação em vez de cookies de sessão. Recomendado para aplicações modernas.",
97
+
98
+ "magic-link.settings.auth.storeLoginInfo.title": "Armazenar dados de login",
99
+ "magic-link.settings.auth.storeLoginInfo.description": "Armazena endereço IP e informações do navegador para cada login para monitoramento de segurança.",
100
+
101
+ "magic-link.settings.auth.management.title": "GERENCIAMENTO DE USUÁRIOS",
102
+ "magic-link.settings.auth.strategy.label": "👤 Estratégia de criação de usuário",
103
+ "magic-link.settings.auth.strategy.email": "Apenas e-mail - A conta é criada apenas com o endereço de e-mail",
104
+ "magic-link.settings.auth.strategy.emailUsername": "E-mail + Nome de usuário - O nome de usuário é gerado automaticamente a partir do e-mail",
105
+ "magic-link.settings.auth.strategy.manual": "Manual - Sem criação automática, os usuários devem existir previamente",
106
+ "magic-link.settings.auth.strategy.current": "Atualmente selecionado: {strategy}",
107
+
108
+ "magic-link.settings.auth.jwtExpiration.label": "🕒 Período de validade do JWT Token",
109
+ "magic-link.settings.auth.jwtExpiration.hint": "Quanto tempo um JWT token permanece válido após o login?",
110
+ "magic-link.settings.auth.jwtExpiration.placeholder": "30d",
111
+ "magic-link.settings.auth.jwtExpiration.examples": "✓ Exemplos: 1h (1 hora) • 7d (7 dias) • 30d (30 dias) • 90d (3 meses)",
112
+
113
+ "magic-link.settings.email.sender.title": "📨 INFORMAÇÕES DO REMETENTE",
114
+ "magic-link.settings.email.sender.subtitle": "Estas informações aparecem nos e-mails enviados aos usuários",
115
+
116
+ "magic-link.settings.email.fromName.label": "👤 Nome do remetente",
117
+ "magic-link.settings.email.fromName.hint": "O nome exibido aos usuários em seu e-mail",
118
+ "magic-link.settings.email.fromName.placeholder": "Meu App",
119
+ "magic-link.settings.email.fromName.example": "Exemplo: \"Meu App\" aparece como \"Meu App <noreply@...>\"",
120
+
121
+ "magic-link.settings.email.fromEmail.label": "📧 E-mail do remetente",
122
+ "magic-link.settings.email.fromEmail.hint": "O endereço de e-mail a partir do qual todos os Magic Links são enviados",
123
+ "magic-link.settings.email.fromEmail.placeholder": "noreply@seu-app.com",
124
+ "magic-link.settings.email.fromEmail.note": "Deve ser um endereço de e-mail válido e configurado",
125
+
126
+ "magic-link.settings.email.responseEmail.label": "💬 E-mail de resposta",
127
+ "magic-link.settings.email.responseEmail.hint": "Endereço de e-mail para respostas de usuários (opcional)",
128
+ "magic-link.settings.email.responseEmail.placeholder": "suporte@seu-app.com",
129
+ "magic-link.settings.email.responseEmail.note": "Se os usuários responderem ao e-mail, vai para aqui",
130
+
131
+ "magic-link.settings.email.subject.label": "✉️ Linha de assunto do e-mail",
132
+ "magic-link.settings.email.subject.hint": "A linha de assunto que os usuários veem em seu e-mail",
133
+ "magic-link.settings.email.subject.placeholder": "Seu Magic Link para fazer login",
134
+ "magic-link.settings.email.subject.note": "Formule claramente para que os usuários não marquem o e-mail como spam",
135
+
136
+ "magic-link.settings.email.templates.title": "📝 MODELOS DE E-MAIL",
137
+ "magic-link.settings.email.templates.subtitle": "Projete os e-mails enviados aos usuários. Use marcadores para conteúdo dinâmico.",
138
+
139
+ "magic-link.settings.email.placeholders.title": "📌 Marcadores disponíveis (clique para copiar):",
140
+ "magic-link.settings.email.placeholders.url": "<%= URL %>",
141
+ "magic-link.settings.email.placeholders.url.description": "→ Sua URL de confirmação",
142
+ "magic-link.settings.email.placeholders.url.example": "Exemplo: https://seu-app.com/auth/magic-link",
143
+ "magic-link.settings.email.placeholders.code": "<%= CODE %>",
144
+ "magic-link.settings.email.placeholders.code.description": "→ O token Magic Link gerado",
145
+ "magic-link.settings.email.placeholders.code.example": "Único para cada usuário e login",
146
+ "magic-link.settings.email.placeholders.copied": "{placeholder} copiado para a área de transferência!",
147
+
148
+ "magic-link.settings.email.html.title": "🎨 Modelo de e-mail HTML",
149
+ "magic-link.settings.email.html.badge": "Modelo principal",
150
+ "magic-link.settings.email.html.description": "Modelo HTML para seus e-mails Magic Link. Use os marcadores <%= URL %> e <%= CODE %>",
151
+ "magic-link.settings.email.html.loadDefault": "📋 Carregar modelo padrão",
152
+ "magic-link.settings.email.html.filename": "editor.html",
153
+ "magic-link.settings.email.html.placeholder": "<p>Olá, <a href='<%= URL %>?loginToken=<%= CODE %>'>Clique aqui para fazer login</a></p>",
154
+ "magic-link.settings.email.html.copy": "📋 Copiar modelo",
155
+ "magic-link.settings.email.html.info": "ℹ️ Informações do modelo",
156
+ "magic-link.settings.email.html.stats": "O modelo tem {lines} linhas e {chars} caracteres",
157
+ "magic-link.settings.email.html.defaultLoaded": "Modelo padrão simples carregado!",
158
+
159
+ "magic-link.settings.email.text.title": "📄 Modelo de e-mail de texto",
160
+ "magic-link.settings.email.text.badge": "Fallback",
161
+ "magic-link.settings.email.text.description": "Versão de texto (sem HTML) como fallback para clientes de e-mail mais antigos",
162
+ "magic-link.settings.email.text.loadDefault": "📋 Carregar modelo padrão",
163
+ "magic-link.settings.email.text.filename": "editor.txt",
164
+ "magic-link.settings.email.text.placeholder": "Olá, clique aqui para fazer login: <%= URL %>?loginToken=<%= CODE %>",
165
+ "magic-link.settings.email.text.copy": "📋 Copiar modelo",
166
+ "magic-link.settings.email.text.defaultLoaded": "Modelo padrão simples carregado!",
167
+
168
+ "magic-link.settings.advanced.title": "🔧 OPÇÕES ADICIONAIS",
169
+ "magic-link.settings.advanced.subtitle": "Recursos avançados para casos de uso especiais",
170
+ "magic-link.settings.advanced.publicRegistration.title": "🌍 Magic Links no registro público",
171
+ "magic-link.settings.advanced.publicRegistration.description": "Permite que os usuários façam login com Magic Links através de formulários de registro público sem ter criado uma conta anteriormente.",
172
+
173
+ "magic-link.settings.footer.quickhelp": "💡 Ajuda rápida",
174
+ "magic-link.settings.footer.reminder": "Não esqueça: Após salvar, crie um token de teste e teste o Magic Link!",
175
+
176
+ "magic-link.tokens.title": "Tokens Magic Link",
177
+ "magic-link.tokens.page.title": "Gerenciamento de tokens",
178
+ "magic-link.tokens.page.subtitle": "Gerencie seus tokens Magic Link e sessões JWT com estilo",
179
+
180
+ "magic-link.tokens.stats.total": "Total",
181
+ "magic-link.tokens.stats.active": "Ativo",
182
+ "magic-link.tokens.stats.expired": "Expirado",
183
+ "magic-link.tokens.stats.used": "Usado",
184
+
185
+ "magic-link.tokens.tabs.magicLinks": "Tokens Magic Link",
186
+ "magic-link.tokens.tabs.jwtSessions": "Sessões JWT",
187
+ "magic-link.tokens.tabs.ipBans": "Bloqueios de IP",
188
+
189
+ "magic-link.tokens.actions.newToken": "Novo token",
190
+ "magic-link.tokens.actions.refresh": "Atualizar",
191
+ "magic-link.tokens.actions.settings": "Configurações",
192
+ "magic-link.tokens.actions.bulkDelete": "Excluir selecionados",
193
+ "magic-link.tokens.actions.clearSelection": "Limpar seleção",
194
+
195
+ "magic-link.tokens.search.placeholder": "Buscar por e-mail ou token...",
196
+ "magic-link.tokens.search.clear": "Limpar",
197
+
198
+ "magic-link.tokens.filter.all": "Mostrar tudo",
199
+ "magic-link.tokens.filter.active": "Apenas ativos",
200
+ "magic-link.tokens.filter.expired": "Apenas expirados",
201
+ "magic-link.tokens.filter.used": "Apenas usados",
202
+ "magic-link.tokens.filter.status": "Filtrar por status",
203
+
204
+ "magic-link.tokens.pageSize.10": "10 entradas",
205
+ "magic-link.tokens.pageSize.25": "25 entradas",
206
+ "magic-link.tokens.pageSize.50": "50 entradas",
207
+ "magic-link.tokens.pageSize.100": "100 entradas",
208
+ "magic-link.tokens.pageSize.label": "Entradas por página",
209
+
210
+ "magic-link.tokens.table.email": "E-mail",
211
+ "magic-link.tokens.table.token": "Token",
212
+ "magic-link.tokens.table.status": "Status",
213
+ "magic-link.tokens.table.created": "Criado",
214
+ "magic-link.tokens.table.expiresAt": "Válido até",
215
+ "magic-link.tokens.table.actions": "Ações",
216
+ "magic-link.tokens.table.sortBy": "Ordenar por",
217
+
218
+ "magic-link.tokens.status.active": "Ativo",
219
+ "magic-link.tokens.status.expired": "Expirado",
220
+ "magic-link.tokens.status.used": "Usado",
221
+
222
+ "magic-link.tokens.details.title": "Detalhes do token",
223
+ "magic-link.tokens.details.token": "Token",
224
+ "magic-link.tokens.details.magicLink": "URL do Magic Link",
225
+ "magic-link.tokens.details.curlCommand": "Comando cURL (Postman/Terminal)",
226
+ "magic-link.tokens.details.status": "Status",
227
+ "magic-link.tokens.details.created": "Criado",
228
+ "magic-link.tokens.details.expiresAt": "Válido até",
229
+ "magic-link.tokens.details.usedAt": "Usado",
230
+ "magic-link.tokens.details.unlimited": "Ilimitado",
231
+ "magic-link.tokens.details.never": "Nunca",
232
+ "magic-link.tokens.details.expiredSuffix": " (Expirado)",
233
+ "magic-link.tokens.details.close": "Fechar",
234
+ "magic-link.tokens.details.clickToCopy": "🔗 Clique para copiar",
235
+ "magic-link.tokens.details.clickToCopyCurl": "💻 Clique para copiar",
236
+
237
+ "magic-link.tokens.user.new": "Novo usuário",
238
+ "magic-link.tokens.user.id": "ID do usuário: {id}",
239
+
240
+ "magic-link.tokens.selected": "{count} token(s) selecionado(s)",
241
+
242
+ "magic-link.tokens.empty.title": "Nenhum token encontrado",
243
+ "magic-link.tokens.empty.description": "Crie seu primeiro token Magic Link ou altere seus critérios de filtro",
244
+ "magic-link.tokens.empty.createFirst": "Criar primeiro token",
245
+ "magic-link.tokens.empty.resetFilters": "Redefinir filtros",
246
+
247
+ "magic-link.tokens.loading": "Carregando dados de tokens...",
248
+
249
+ "magic-link.tokens.notifications.refreshed": "Os dados foram atualizados",
250
+ "magic-link.tokens.notifications.deleted": "Token excluído com sucesso",
251
+ "magic-link.tokens.notifications.bulkDeleted": "{count} tokens excluídos",
252
+ "magic-link.tokens.notifications.bulkDeleteSuccess": "Exclusão em massa bem-sucedida",
253
+ "magic-link.tokens.notifications.created": "Magic Link enviado para {email}",
254
+ "magic-link.tokens.notifications.createSuccess": "Token criado",
255
+ "magic-link.tokens.notifications.extended": "Token estendido por {days} dias",
256
+ "magic-link.tokens.notifications.extendSuccess": "Token estendido",
257
+ "magic-link.tokens.notifications.tokenCopied": "Token copiado para a área de transferência",
258
+ "magic-link.tokens.notifications.linkCopied": "Magic Link copiado!",
259
+ "magic-link.tokens.notifications.curlCopied": "Comando cURL copiado!",
260
+ "magic-link.tokens.notifications.error": "Erro",
261
+ "magic-link.tokens.notifications.success": "Sucesso",
262
+ "magic-link.tokens.notifications.loadError": "Erro ao carregar tokens",
263
+ "magic-link.tokens.notifications.deleteError": "Erro ao excluir token",
264
+ "magic-link.tokens.notifications.createError": "Erro ao criar token",
265
+ "magic-link.tokens.notifications.extendError": "Erro ao estender token",
266
+ "magic-link.tokens.notifications.validationError": "Por favor, insira um endereço de e-mail",
267
+ "magic-link.tokens.notifications.validation": "Validação",
268
+
269
+ "magic-link.tokens.pagination.previous": "Anterior",
270
+ "magic-link.tokens.pagination.next": "Próximo",
271
+
272
+ "magic-link.tokens.create.title": "✨ Criar token Magic Link",
273
+ "magic-link.tokens.create.email.label": "Endereço de e-mail *",
274
+ "magic-link.tokens.create.email.placeholder": "usuario@exemplo.com",
275
+ "magic-link.tokens.create.email.hint": "O Magic Link será enviado para este endereço de e-mail",
276
+ "magic-link.tokens.create.ttl.label": "Período de validade (Horas)",
277
+ "magic-link.tokens.create.ttl.hint": "Quanto tempo o token deve ser válido (1-168 horas)",
278
+ "magic-link.tokens.create.sendEmail.label": "Enviar e-mail automaticamente",
279
+ "magic-link.tokens.create.sendEmail.hint": "O usuário recebe imediatamente um e-mail com o Magic Link",
280
+ "magic-link.tokens.create.context.label": "Contexto JSON (Opcional)",
281
+ "magic-link.tokens.create.context.placeholder": "{ \"chave\": \"valor\" }",
282
+ "magic-link.tokens.create.context.hint": "Dados adicionais para passar com o token (deve ser JSON válido)",
283
+ "magic-link.tokens.create.context.error": "Formato JSON inválido",
284
+ "magic-link.tokens.create.submit": "Criar token",
285
+ "magic-link.tokens.create.cancel": "Cancelar",
286
+
287
+ "magic-link.tokens.extend.title": "🕒 Estender token",
288
+ "magic-link.tokens.extend.currentExpiry": "Atualmente válido até",
289
+ "magic-link.tokens.extend.selectExtension": "Selecionar extensão",
290
+ "magic-link.tokens.extend.customDays": "Número personalizado de dias",
291
+ "magic-link.tokens.extend.customPlaceholder": "ex. 14",
292
+ "magic-link.tokens.extend.preset1": "+1 Dia",
293
+ "magic-link.tokens.extend.preset7": "+7 Dias",
294
+ "magic-link.tokens.extend.preset30": "+30 Dias",
295
+ "magic-link.tokens.extend.preset90": "+90 Dias",
296
+ "magic-link.tokens.extend.custom": "Personalizado",
297
+ "magic-link.tokens.extend.newExpiry": "Nova data de expiração",
298
+ "magic-link.tokens.extend.submit": "Estender token",
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.banError": "Erro ao banir IP",
345
+ "magic-link.ipban.notifications.unbanError": "Erro ao desbanir IP"
346
+ }
347
+
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.5.0",
2
+ "version": "4.7.0",
3
3
  "keywords": [],
4
4
  "type": "commonjs",
5
5
  "exports": {