pgkiln 0.59.0 → 0.61.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.
@@ -1714,4 +1714,101 @@ export const en = {
1714
1714
  'dev.not_found': 'Not found.',
1715
1715
  'dev.role_changed': 'Role changed.',
1716
1716
  'dev.removed': 'Developer removed.',
1717
+ // ------------------------------------------------------------ Security: two-factor sign-in (sprint 126)
1718
+ 'mfa.menu': 'Two-factor sign-in',
1719
+ 'mfa.title': 'Security',
1720
+ 'mfa.intro': 'After your password, confirm it’s you with a passkey (fingerprint, face, security key) or a code from an authenticator app. Recovery codes get you in when you lose them.',
1721
+ 'mfa.required_you': 'Your administrator requires two-factor sign-in: add a passkey or an authenticator app.',
1722
+ 'mfa.banner': 'Two-factor sign-in is required. Set it up before {date}: {link}',
1723
+ 'mfa.set_up_now': 'set up now',
1724
+ 'mfa.factors': 'Passkeys and authenticator apps',
1725
+ 'mfa.app_name': 'Name',
1726
+ 'mfa.app_default': 'Phone',
1727
+ 'mfa.added': 'Added',
1728
+ 'mfa.last_used': 'Last used',
1729
+ 'mfa.no_apps': 'No second factor yet: you sign in with your password only.',
1730
+ 'mfa.add_app': 'Add an authenticator app',
1731
+ 'mfa.no_key': 'Two-factor sign-in needs the instance key (PGKILN_SECRET_KEY) to store the app’s secret.',
1732
+ 'mfa.scan': 'Scan the QR code with an authenticator app.',
1733
+ 'mfa.or_enter': 'Or enter this key by hand:',
1734
+ 'mfa.enter_code': 'Enter the 6-digit code the app shows.',
1735
+ 'mfa.qr_label': 'QR code for the authenticator app',
1736
+ 'mfa.confirm_app': 'Confirm and turn on',
1737
+ 'mfa.cancel_setup': 'Cancel',
1738
+ 'mfa.setup_expired': 'The setup took too long: start again.',
1739
+ 'mfa.wrong_setup': 'That code doesn’t match: check the time on your phone and try the next code.',
1740
+ 'mfa.app_added': 'Authenticator app added: from now on you sign in with a code too.',
1741
+ 'mfa.remove': 'Remove',
1742
+ 'mfa.remove_app': 'Remove this app',
1743
+ 'mfa.your_password': 'Your password',
1744
+ 'mfa.wrong_password': 'Wrong password.',
1745
+ 'mfa.cannot_remove_required': 'Two-factor sign-in is required for you: add another passkey or app before you remove this one.',
1746
+ 'mfa.cannot_remove_admin': 'At least two administrators (or every administrator, when there are fewer) must keep two-factor sign-in while the policy is on.',
1747
+ 'mfa.keep_admins': 'Not now: the two-factor policy needs at least two administrators with two-factor sign-in (or every administrator, when there are fewer).',
1748
+ 'mfa.removed': 'Removed.',
1749
+ 'mfa.codes_title': 'Recovery codes',
1750
+ 'mfa.codes_once': 'Save these codes somewhere safe, away from your phone. Each one signs you in once instead of an app code. They are shown only now.',
1751
+ 'mfa.codes_saved': 'I saved these codes',
1752
+ 'mfa.codes_done': 'Done',
1753
+ 'mfa.codes_kept': 'Recovery codes saved.',
1754
+ 'mfa.codes_left': 'Unused recovery codes: {n}.',
1755
+ 'mfa.codes_after': 'You get recovery codes when you add a passkey or an authenticator app.',
1756
+ 'mfa.codes_low': 'Few recovery codes left: make new ones.',
1757
+ 'mfa.codes_new': 'New recovery codes',
1758
+ 'mfa.codes_new_confirm': 'Make new recovery codes? The old ones stop working.',
1759
+ 'mfa.expired': 'The sign-in took too long: sign in again.',
1760
+ 'mfa.step_title': 'Two-factor sign-in',
1761
+ 'mfa.step_intro': 'Confirm it’s you, {user}: use a passkey or enter a code from your authenticator app.',
1762
+ 'mfa.code': 'Code',
1763
+ 'mfa.code_help': '6 digits from the app, or one of your recovery codes.',
1764
+ 'mfa.verify': 'Verify',
1765
+ 'mfa.cancel': 'Back to sign-in',
1766
+ 'mfa.locked_out': 'Lost your phone, key and codes? Ask an administrator to reset your two-factor sign-in.',
1767
+ 'mfa.wrong': 'That code is not right, or was already used.',
1768
+ 'mfa.column': 'Two-factor',
1769
+ 'mfa.on': 'on',
1770
+ 'mfa.off': 'off',
1771
+ 'mfa.reset': 'Reset',
1772
+ 'mfa.reason': 'Reason',
1773
+ 'mfa.reset_help': 'Removes the apps and recovery codes of {user} and signs them out. Logged; the administrators are told by mail.',
1774
+ 'mfa.reset_btn': 'Reset two-factor sign-in',
1775
+ 'mfa.reason_needed': 'Give a reason for the reset.',
1776
+ 'mfa.reset_done': 'Two-factor sign-in of {user} reset.',
1777
+ 'mfa.policy_title': 'Two-factor sign-in',
1778
+ 'mfa.policy_label': 'Require two-factor sign-in for',
1779
+ 'mfa.policy_off': 'Nobody (optional)',
1780
+ 'mfa.policy_admins': 'Administrators',
1781
+ 'mfa.policy_all': 'All developers',
1782
+ 'mfa.grace': 'Grace period (days)',
1783
+ 'mfa.grace_help': 'Developers without an app see a reminder until then; after it, only their Security page.',
1784
+ 'mfa.policy_help': 'Administrators with two-factor sign-in: {enrolled} of {admins}. Requiring it needs at least two of them (or every one, when there are fewer).',
1785
+ 'mfa.policy_save': 'Save',
1786
+ 'mfa.policy_saved': 'Two-factor policy saved.',
1787
+ 'mfa.policy_needs_admins': 'First, at least two administrators (or every administrator, when there are fewer) set up two-factor sign-in, so nobody is locked out alone.',
1788
+ 'mfa.without': 'Without two-factor sign-in: {list}.',
1789
+ 'mfa.cli_note': 'Locked out? On the server: pgkiln admin reset-2fa <developer> or pgkiln admin set-2fa-policy off.',
1790
+ // ------------------------------------------------------------ Security: passkeys and trusted browsers (sprint 127)
1791
+ 'mfa.kind': 'Kind',
1792
+ 'mfa.kind_passkey': 'Passkeys',
1793
+ 'mfa.kind_app': 'Authenticator apps',
1794
+ 'mfa.other_domain': 'for {domain}',
1795
+ 'mfa.other_domain_help': 'Made for {domain}: it doesn’t work at this address. Add a new passkey here.',
1796
+ 'mfa.passkey_intro': 'Sign in with your fingerprint, face or screen lock, or a security key. A passkey only works on this site.',
1797
+ 'mfa.passkey_default': 'Passkey',
1798
+ 'mfa.add_passkey': 'Add a passkey',
1799
+ 'mfa.passkey_needs_js': 'Adding a passkey needs JavaScript; an authenticator app works without it.',
1800
+ 'mfa.passkey_failed': 'The passkey didn’t work. Try again, or use a code.',
1801
+ 'mfa.passkey_known': 'This passkey is already added.',
1802
+ 'mfa.passkey_added': 'Passkey added: from now on you can sign in with it.',
1803
+ 'mfa.remove_passkey': 'Remove this passkey',
1804
+ 'mfa.use_passkey': 'Use a passkey',
1805
+ 'mfa.trust_browser': 'Trust this browser for {days} days',
1806
+ 'mfa.trusted_title': 'Trusted browsers',
1807
+ 'mfa.trusted_count': 'Browsers that skip the second step: {n} (for up to {days} days).',
1808
+ 'mfa.trusted_off': 'Trusting browsers is turned off.',
1809
+ 'mfa.forget_browsers': 'Forget trusted browsers',
1810
+ 'mfa.browsers_forgotten': 'Every browser asks for the second step again.',
1811
+ 'mfa.trust_days': 'Trust a browser (days)',
1812
+ 'mfa.trust_days_help': 'After the second step a developer may skip it in that browser for this many days. 0: never.',
1813
+ 'mfa.passkey_needs_host': 'Passkeys need a host name, not an IP address ({host}): open the builder at localhost or its domain name.',
1717
1814
  } as const;
@@ -1711,4 +1711,101 @@ export const es: BuilderMessages = {
1711
1711
  'dev.not_found': 'No encontrado.',
1712
1712
  'dev.role_changed': 'Rol cambiado.',
1713
1713
  'dev.removed': 'Desarrollador quitado.',
1714
+ // ------------------------------------------------------------ Security: two-factor sign-in (sprint 126)
1715
+ 'mfa.menu': 'Inicio de sesión en dos pasos',
1716
+ 'mfa.title': 'Seguridad',
1717
+ 'mfa.intro': 'Después de su contraseña, confirme que es usted con una llave de acceso (huella, rostro, llave de seguridad) o un código de una aplicación de autenticación. Los códigos de recuperación le permiten entrar si los pierde.',
1718
+ 'mfa.required_you': 'Su administrador exige el inicio de sesión en dos pasos: añada una llave de acceso o una aplicación de autenticación.',
1719
+ 'mfa.banner': 'El inicio de sesión en dos pasos es obligatorio. Configúrelo antes del {date}: {link}',
1720
+ 'mfa.set_up_now': 'configurar ahora',
1721
+ 'mfa.factors': 'Llaves de acceso y aplicaciones de autenticación',
1722
+ 'mfa.app_name': 'Nombre',
1723
+ 'mfa.app_default': 'Teléfono',
1724
+ 'mfa.added': 'Añadida',
1725
+ 'mfa.last_used': 'Último uso',
1726
+ 'mfa.no_apps': 'Aún no hay segundo factor: inicia sesión solo con su contraseña.',
1727
+ 'mfa.add_app': 'Añadir una aplicación de autenticación',
1728
+ 'mfa.no_key': 'El inicio de sesión en dos pasos necesita la clave de la instancia (PGKILN_SECRET_KEY) para guardar el secreto de la aplicación.',
1729
+ 'mfa.scan': 'Escanee el código QR con una aplicación de autenticación.',
1730
+ 'mfa.or_enter': 'O introduzca esta clave a mano:',
1731
+ 'mfa.enter_code': 'Introduzca el código de 6 dígitos que muestra la aplicación.',
1732
+ 'mfa.qr_label': 'Código QR para la aplicación de autenticación',
1733
+ 'mfa.confirm_app': 'Confirmar y activar',
1734
+ 'mfa.cancel_setup': 'Cancelar',
1735
+ 'mfa.setup_expired': 'La configuración tardó demasiado: empiece de nuevo.',
1736
+ 'mfa.wrong_setup': 'Ese código no coincide: compruebe la hora del teléfono y pruebe el siguiente código.',
1737
+ 'mfa.app_added': 'Aplicación de autenticación añadida: a partir de ahora también inicia sesión con un código.',
1738
+ 'mfa.remove': 'Quitar',
1739
+ 'mfa.remove_app': 'Quitar esta aplicación',
1740
+ 'mfa.your_password': 'Su contraseña',
1741
+ 'mfa.wrong_password': 'Contraseña incorrecta.',
1742
+ 'mfa.cannot_remove_required': 'El inicio de sesión en dos pasos es obligatorio para usted: añada otra llave o aplicación antes de quitar esta.',
1743
+ 'mfa.cannot_remove_admin': 'Al menos dos administradores (o todos, si hay menos) deben mantener el inicio de sesión en dos pasos mientras la política esté activa.',
1744
+ 'mfa.keep_admins': 'Ahora no: la política de dos pasos necesita al menos dos administradores con inicio de sesión en dos pasos (o todos, si hay menos).',
1745
+ 'mfa.removed': 'Quitado.',
1746
+ 'mfa.codes_title': 'Códigos de recuperación',
1747
+ 'mfa.codes_once': 'Guarde estos códigos en un lugar seguro, lejos del teléfono. Cada uno sustituye una vez a un código de la aplicación. Solo se muestran ahora.',
1748
+ 'mfa.codes_saved': 'He guardado estos códigos',
1749
+ 'mfa.codes_done': 'Hecho',
1750
+ 'mfa.codes_kept': 'Códigos de recuperación guardados.',
1751
+ 'mfa.codes_left': 'Códigos de recuperación sin usar: {n}.',
1752
+ 'mfa.codes_after': 'Recibe códigos de recuperación al añadir una llave de acceso o una aplicación de autenticación.',
1753
+ 'mfa.codes_low': 'Quedan pocos códigos de recuperación: genere nuevos.',
1754
+ 'mfa.codes_new': 'Nuevos códigos de recuperación',
1755
+ 'mfa.codes_new_confirm': '¿Generar nuevos códigos de recuperación? Los antiguos dejan de funcionar.',
1756
+ 'mfa.expired': 'El inicio de sesión tardó demasiado: inicie sesión de nuevo.',
1757
+ 'mfa.step_title': 'Inicio de sesión en dos pasos',
1758
+ 'mfa.step_intro': 'Confirme que es usted, {user}: use una llave de acceso o introduzca un código de su aplicación de autenticación.',
1759
+ 'mfa.code': 'Código',
1760
+ 'mfa.code_help': '6 dígitos de la aplicación o uno de sus códigos de recuperación.',
1761
+ 'mfa.verify': 'Verificar',
1762
+ 'mfa.cancel': 'Volver al inicio de sesión',
1763
+ 'mfa.locked_out': '¿Perdió el teléfono, la llave y los códigos? Pida a un administrador que restablezca su inicio de sesión en dos pasos.',
1764
+ 'mfa.wrong': 'Ese código no es correcto o ya se usó.',
1765
+ 'mfa.column': 'Dos pasos',
1766
+ 'mfa.on': 'activado',
1767
+ 'mfa.off': 'desactivado',
1768
+ 'mfa.reset': 'Restablecer',
1769
+ 'mfa.reason': 'Motivo',
1770
+ 'mfa.reset_help': 'Quita las aplicaciones y los códigos de recuperación de {user} y cierra su sesión. Se registra; los administradores reciben un correo.',
1771
+ 'mfa.reset_btn': 'Restablecer el inicio de sesión en dos pasos',
1772
+ 'mfa.reason_needed': 'Indique un motivo para el restablecimiento.',
1773
+ 'mfa.reset_done': 'Inicio de sesión en dos pasos de {user} restablecido.',
1774
+ 'mfa.policy_title': 'Inicio de sesión en dos pasos',
1775
+ 'mfa.policy_label': 'Exigir el inicio de sesión en dos pasos a',
1776
+ 'mfa.policy_off': 'Nadie (opcional)',
1777
+ 'mfa.policy_admins': 'Administradores',
1778
+ 'mfa.policy_all': 'Todos los desarrolladores',
1779
+ 'mfa.grace': 'Período de gracia (días)',
1780
+ 'mfa.grace_help': 'Los desarrolladores sin aplicación ven un aviso hasta entonces; después, solo su página de Seguridad.',
1781
+ 'mfa.policy_help': 'Administradores con inicio de sesión en dos pasos: {enrolled} de {admins}. Para exigirlo hacen falta al menos dos (o todos, si hay menos).',
1782
+ 'mfa.policy_save': 'Guardar',
1783
+ 'mfa.policy_saved': 'Política de dos pasos guardada.',
1784
+ 'mfa.policy_needs_admins': 'Primero, al menos dos administradores (o todos, si hay menos) deben configurar el inicio de sesión en dos pasos, para que nadie quede bloqueado solo.',
1785
+ 'mfa.without': 'Sin inicio de sesión en dos pasos: {list}.',
1786
+ 'mfa.cli_note': '¿Bloqueado? En el servidor: pgkiln admin reset-2fa <developer> o pgkiln admin set-2fa-policy off.',
1787
+ // ------------------------------------------------------------ Security: passkeys and trusted browsers (sprint 127)
1788
+ 'mfa.kind': 'Tipo',
1789
+ 'mfa.kind_passkey': 'Llaves de acceso',
1790
+ 'mfa.kind_app': 'Aplicaciones de autenticación',
1791
+ 'mfa.other_domain': 'para {domain}',
1792
+ 'mfa.other_domain_help': 'Creada para {domain}: no funciona en esta dirección. Añada aquí una nueva llave.',
1793
+ 'mfa.passkey_intro': 'Inicie sesión con su huella, su rostro, el bloqueo de pantalla o una llave de seguridad. Una llave de acceso solo funciona en este sitio.',
1794
+ 'mfa.passkey_default': 'Llave de acceso',
1795
+ 'mfa.add_passkey': 'Añadir una llave de acceso',
1796
+ 'mfa.passkey_needs_js': 'Añadir una llave de acceso requiere JavaScript; una aplicación de autenticación funciona sin él.',
1797
+ 'mfa.passkey_failed': 'La llave de acceso no funcionó. Inténtelo de nuevo o use un código.',
1798
+ 'mfa.passkey_known': 'Esta llave de acceso ya está añadida.',
1799
+ 'mfa.passkey_added': 'Llave de acceso añadida: a partir de ahora puede iniciar sesión con ella.',
1800
+ 'mfa.remove_passkey': 'Quitar esta llave de acceso',
1801
+ 'mfa.use_passkey': 'Usar una llave de acceso',
1802
+ 'mfa.trust_browser': 'Confiar en este navegador durante {days} días',
1803
+ 'mfa.trusted_title': 'Navegadores de confianza',
1804
+ 'mfa.trusted_count': 'Navegadores que omiten el segundo paso: {n} (hasta {days} días).',
1805
+ 'mfa.trusted_off': 'La confianza en navegadores está desactivada.',
1806
+ 'mfa.forget_browsers': 'Olvidar los navegadores de confianza',
1807
+ 'mfa.browsers_forgotten': 'Todos los navegadores vuelven a pedir el segundo paso.',
1808
+ 'mfa.trust_days': 'Confiar en un navegador (días)',
1809
+ 'mfa.trust_days_help': 'Tras el segundo paso, un desarrollador puede omitirlo en ese navegador durante estos días. 0: nunca.',
1810
+ 'mfa.passkey_needs_host': 'Las llaves de acceso necesitan un nombre de host, no una dirección IP ({host}): abra el constructor en localhost o en su nombre de dominio.',
1714
1811
  };
@@ -1711,4 +1711,101 @@ export const fr: BuilderMessages = {
1711
1711
  'dev.not_found': 'Introuvable.',
1712
1712
  'dev.role_changed': 'Rôle modifié.',
1713
1713
  'dev.removed': 'Développeur retiré.',
1714
+ // ------------------------------------------------------------ Security: two-factor sign-in (sprint 126)
1715
+ 'mfa.menu': 'Connexion à deux facteurs',
1716
+ 'mfa.title': 'Sécurité',
1717
+ 'mfa.intro': 'Après votre mot de passe, confirmez que c’est vous avec une clé d’accès (empreinte, visage, clé de sécurité) ou un code d’une application d’authentification. Les codes de récupération vous laissent entrer si vous les perdez.',
1718
+ 'mfa.required_you': 'Votre administrateur exige la connexion à deux facteurs : ajoutez une clé d’accès ou une application d’authentification.',
1719
+ 'mfa.banner': 'La connexion à deux facteurs est obligatoire. Configurez-la avant le {date} : {link}',
1720
+ 'mfa.set_up_now': 'configurer maintenant',
1721
+ 'mfa.factors': 'Clés d’accès et applications d’authentification',
1722
+ 'mfa.app_name': 'Nom',
1723
+ 'mfa.app_default': 'Téléphone',
1724
+ 'mfa.added': 'Ajoutée',
1725
+ 'mfa.last_used': 'Dernière utilisation',
1726
+ 'mfa.no_apps': 'Pas encore de second facteur : vous vous connectez avec votre mot de passe seul.',
1727
+ 'mfa.add_app': 'Ajouter une application d’authentification',
1728
+ 'mfa.no_key': 'La connexion à deux facteurs a besoin de la clé de l’instance (PGKILN_SECRET_KEY) pour stocker le secret de l’application.',
1729
+ 'mfa.scan': 'Scannez le code QR avec une application d’authentification.',
1730
+ 'mfa.or_enter': 'Ou saisissez cette clé à la main :',
1731
+ 'mfa.enter_code': 'Saisissez le code à 6 chiffres affiché par l’application.',
1732
+ 'mfa.qr_label': 'Code QR pour l’application d’authentification',
1733
+ 'mfa.confirm_app': 'Confirmer et activer',
1734
+ 'mfa.cancel_setup': 'Annuler',
1735
+ 'mfa.setup_expired': 'La configuration a pris trop de temps : recommencez.',
1736
+ 'mfa.wrong_setup': 'Ce code ne correspond pas : vérifiez l’heure de votre téléphone et essayez le code suivant.',
1737
+ 'mfa.app_added': 'Application d’authentification ajoutée : désormais, vous vous connectez aussi avec un code.',
1738
+ 'mfa.remove': 'Supprimer',
1739
+ 'mfa.remove_app': 'Supprimer cette application',
1740
+ 'mfa.your_password': 'Votre mot de passe',
1741
+ 'mfa.wrong_password': 'Mot de passe incorrect.',
1742
+ 'mfa.cannot_remove_required': 'La connexion à deux facteurs est obligatoire pour vous : ajoutez une autre clé ou application avant de supprimer celle-ci.',
1743
+ 'mfa.cannot_remove_admin': 'Au moins deux administrateurs (ou tous, s’ils sont moins nombreux) doivent garder la connexion à deux facteurs tant que la règle est active.',
1744
+ 'mfa.keep_admins': 'Pas maintenant : la règle à deux facteurs exige au moins deux administrateurs avec la connexion à deux facteurs (ou tous, s’ils sont moins nombreux).',
1745
+ 'mfa.removed': 'Supprimé.',
1746
+ 'mfa.codes_title': 'Codes de récupération',
1747
+ 'mfa.codes_once': 'Conservez ces codes en lieu sûr, loin de votre téléphone. Chacun remplace une fois un code de l’application. Ils ne sont affichés que maintenant.',
1748
+ 'mfa.codes_saved': 'J’ai conservé ces codes',
1749
+ 'mfa.codes_done': 'Terminé',
1750
+ 'mfa.codes_kept': 'Codes de récupération conservés.',
1751
+ 'mfa.codes_left': 'Codes de récupération inutilisés : {n}.',
1752
+ 'mfa.codes_after': 'Vous recevez des codes de récupération en ajoutant une clé d’accès ou une application d’authentification.',
1753
+ 'mfa.codes_low': 'Il reste peu de codes de récupération : créez-en de nouveaux.',
1754
+ 'mfa.codes_new': 'Nouveaux codes de récupération',
1755
+ 'mfa.codes_new_confirm': 'Créer de nouveaux codes de récupération ? Les anciens ne fonctionneront plus.',
1756
+ 'mfa.expired': 'La connexion a pris trop de temps : reconnectez-vous.',
1757
+ 'mfa.step_title': 'Connexion à deux facteurs',
1758
+ 'mfa.step_intro': 'Confirmez que c’est vous, {user} : utilisez une clé d’accès ou saisissez un code de votre application d’authentification.',
1759
+ 'mfa.code': 'Code',
1760
+ 'mfa.code_help': '6 chiffres de l’application, ou l’un de vos codes de récupération.',
1761
+ 'mfa.verify': 'Vérifier',
1762
+ 'mfa.cancel': 'Retour à la connexion',
1763
+ 'mfa.locked_out': 'Téléphone, clé et codes perdus ? Demandez à un administrateur de réinitialiser votre connexion à deux facteurs.',
1764
+ 'mfa.wrong': 'Ce code est incorrect ou a déjà été utilisé.',
1765
+ 'mfa.column': 'Deux facteurs',
1766
+ 'mfa.on': 'activée',
1767
+ 'mfa.off': 'désactivée',
1768
+ 'mfa.reset': 'Réinitialiser',
1769
+ 'mfa.reason': 'Motif',
1770
+ 'mfa.reset_help': 'Supprime les applications et codes de récupération de {user} et le déconnecte. Journalisé ; les administrateurs sont prévenus par e-mail.',
1771
+ 'mfa.reset_btn': 'Réinitialiser la connexion à deux facteurs',
1772
+ 'mfa.reason_needed': 'Indiquez un motif pour la réinitialisation.',
1773
+ 'mfa.reset_done': 'Connexion à deux facteurs de {user} réinitialisée.',
1774
+ 'mfa.policy_title': 'Connexion à deux facteurs',
1775
+ 'mfa.policy_label': 'Exiger la connexion à deux facteurs pour',
1776
+ 'mfa.policy_off': 'Personne (facultatif)',
1777
+ 'mfa.policy_admins': 'Administrateurs',
1778
+ 'mfa.policy_all': 'Tous les développeurs',
1779
+ 'mfa.grace': 'Délai de grâce (jours)',
1780
+ 'mfa.grace_help': 'Les développeurs sans application voient un rappel jusque-là ; ensuite, seulement leur page Sécurité.',
1781
+ 'mfa.policy_help': 'Administrateurs avec la connexion à deux facteurs : {enrolled} sur {admins}. L’exiger demande au moins deux d’entre eux (ou tous, s’ils sont moins nombreux).',
1782
+ 'mfa.policy_save': 'Enregistrer',
1783
+ 'mfa.policy_saved': 'Règle à deux facteurs enregistrée.',
1784
+ 'mfa.policy_needs_admins': 'D’abord, au moins deux administrateurs (ou tous, s’ils sont moins nombreux) configurent la connexion à deux facteurs, pour que personne ne reste bloqué seul.',
1785
+ 'mfa.without': 'Sans connexion à deux facteurs : {list}.',
1786
+ 'mfa.cli_note': 'Bloqué ? Sur le serveur : pgkiln admin reset-2fa <developer> ou pgkiln admin set-2fa-policy off.',
1787
+ // ------------------------------------------------------------ Security: passkeys and trusted browsers (sprint 127)
1788
+ 'mfa.kind': 'Type',
1789
+ 'mfa.kind_passkey': 'Clés d’accès',
1790
+ 'mfa.kind_app': 'Applications d’authentification',
1791
+ 'mfa.other_domain': 'pour {domain}',
1792
+ 'mfa.other_domain_help': 'Créée pour {domain} : elle ne fonctionne pas à cette adresse. Ajoutez ici une nouvelle clé.',
1793
+ 'mfa.passkey_intro': 'Connectez-vous avec votre empreinte, votre visage, le verrouillage d’écran ou une clé de sécurité. Une clé d’accès ne fonctionne que sur ce site.',
1794
+ 'mfa.passkey_default': 'Clé d’accès',
1795
+ 'mfa.add_passkey': 'Ajouter une clé d’accès',
1796
+ 'mfa.passkey_needs_js': 'Ajouter une clé d’accès nécessite JavaScript ; une application d’authentification fonctionne sans.',
1797
+ 'mfa.passkey_failed': 'La clé d’accès n’a pas fonctionné. Réessayez ou utilisez un code.',
1798
+ 'mfa.passkey_known': 'Cette clé d’accès est déjà ajoutée.',
1799
+ 'mfa.passkey_added': 'Clé d’accès ajoutée : vous pouvez désormais vous connecter avec elle.',
1800
+ 'mfa.remove_passkey': 'Supprimer cette clé d’accès',
1801
+ 'mfa.use_passkey': 'Utiliser une clé d’accès',
1802
+ 'mfa.trust_browser': 'Faire confiance à ce navigateur pendant {days} jours',
1803
+ 'mfa.trusted_title': 'Navigateurs de confiance',
1804
+ 'mfa.trusted_count': 'Navigateurs qui passent la seconde étape : {n} (jusqu’à {days} jours).',
1805
+ 'mfa.trusted_off': 'La confiance envers les navigateurs est désactivée.',
1806
+ 'mfa.forget_browsers': 'Oublier les navigateurs de confiance',
1807
+ 'mfa.browsers_forgotten': 'Chaque navigateur redemande la seconde étape.',
1808
+ 'mfa.trust_days': 'Faire confiance à un navigateur (jours)',
1809
+ 'mfa.trust_days_help': 'Après la seconde étape, un développeur peut la passer dans ce navigateur pendant ce nombre de jours. 0 : jamais.',
1810
+ 'mfa.passkey_needs_host': 'Les clés d’accès ont besoin d’un nom d’hôte, pas d’une adresse IP ({host}) : ouvrez le builder sur localhost ou son nom de domaine.',
1714
1811
  };
@@ -1711,4 +1711,101 @@ export const nl: BuilderMessages = {
1711
1711
  'dev.not_found': 'Niet gevonden.',
1712
1712
  'dev.role_changed': 'Rol gewijzigd.',
1713
1713
  'dev.removed': 'Ontwikkelaar verwijderd.',
1714
+ // ------------------------------------------------------------ Security: two-factor sign-in (sprint 126)
1715
+ 'mfa.menu': 'Aanmelden in twee stappen',
1716
+ 'mfa.title': 'Beveiliging',
1717
+ 'mfa.intro': 'Bevestig na uw wachtwoord dat u het bent met een passkey (vingerafdruk, gezicht, beveiligingssleutel) of een code uit een authenticator-app. Met herstelcodes komt u binnen als u die kwijtraakt.',
1718
+ 'mfa.required_you': 'Uw beheerder vereist aanmelden in twee stappen: voeg een passkey of een authenticator-app toe.',
1719
+ 'mfa.banner': 'Aanmelden in twee stappen is verplicht. Stel het in vóór {date}: {link}',
1720
+ 'mfa.set_up_now': 'nu instellen',
1721
+ 'mfa.factors': 'Passkeys en authenticator-apps',
1722
+ 'mfa.app_name': 'Naam',
1723
+ 'mfa.app_default': 'Telefoon',
1724
+ 'mfa.added': 'Toegevoegd',
1725
+ 'mfa.last_used': 'Laatst gebruikt',
1726
+ 'mfa.no_apps': 'Nog geen tweede factor: u meldt zich alleen met uw wachtwoord aan.',
1727
+ 'mfa.add_app': 'Authenticator-app toevoegen',
1728
+ 'mfa.no_key': 'Aanmelden in twee stappen heeft de instantiesleutel (PGKILN_SECRET_KEY) nodig om het geheim van de app op te slaan.',
1729
+ 'mfa.scan': 'Scan de QR-code met een authenticator-app.',
1730
+ 'mfa.or_enter': 'Of voer deze sleutel met de hand in:',
1731
+ 'mfa.enter_code': 'Voer de 6-cijferige code uit de app in.',
1732
+ 'mfa.qr_label': 'QR-code voor de authenticator-app',
1733
+ 'mfa.confirm_app': 'Bevestigen en inschakelen',
1734
+ 'mfa.cancel_setup': 'Annuleren',
1735
+ 'mfa.setup_expired': 'Het instellen duurde te lang: begin opnieuw.',
1736
+ 'mfa.wrong_setup': 'Die code klopt niet: controleer de tijd op uw telefoon en probeer de volgende code.',
1737
+ 'mfa.app_added': 'Authenticator-app toegevoegd: voortaan meldt u zich ook met een code aan.',
1738
+ 'mfa.remove': 'Verwijderen',
1739
+ 'mfa.remove_app': 'Deze app verwijderen',
1740
+ 'mfa.your_password': 'Uw wachtwoord',
1741
+ 'mfa.wrong_password': 'Onjuist wachtwoord.',
1742
+ 'mfa.cannot_remove_required': 'Aanmelden in twee stappen is voor u verplicht: voeg eerst een andere passkey of app toe.',
1743
+ 'mfa.cannot_remove_admin': 'Minstens twee beheerders (of alle, als het er minder zijn) moeten aanmelden in twee stappen houden zolang het beleid aan staat.',
1744
+ 'mfa.keep_admins': 'Nu niet: het beleid vereist minstens twee beheerders met aanmelden in twee stappen (of alle, als het er minder zijn).',
1745
+ 'mfa.removed': 'Verwijderd.',
1746
+ 'mfa.codes_title': 'Herstelcodes',
1747
+ 'mfa.codes_once': 'Bewaar deze codes op een veilige plek, niet bij uw telefoon. Elke code vervangt één keer een app-code. Ze worden alleen nu getoond.',
1748
+ 'mfa.codes_saved': 'Ik heb deze codes bewaard',
1749
+ 'mfa.codes_done': 'Klaar',
1750
+ 'mfa.codes_kept': 'Herstelcodes bewaard.',
1751
+ 'mfa.codes_left': 'Ongebruikte herstelcodes: {n}.',
1752
+ 'mfa.codes_after': 'U krijgt herstelcodes zodra u een passkey of authenticator-app toevoegt.',
1753
+ 'mfa.codes_low': 'Nog maar weinig herstelcodes: maak nieuwe.',
1754
+ 'mfa.codes_new': 'Nieuwe herstelcodes',
1755
+ 'mfa.codes_new_confirm': 'Nieuwe herstelcodes maken? De oude werken dan niet meer.',
1756
+ 'mfa.expired': 'Het aanmelden duurde te lang: meld u opnieuw aan.',
1757
+ 'mfa.step_title': 'Aanmelden in twee stappen',
1758
+ 'mfa.step_intro': 'Bevestig dat u het bent, {user}: gebruik een passkey of voer een code uit uw authenticator-app in.',
1759
+ 'mfa.code': 'Code',
1760
+ 'mfa.code_help': '6 cijfers uit de app, of een van uw herstelcodes.',
1761
+ 'mfa.verify': 'Controleren',
1762
+ 'mfa.cancel': 'Terug naar aanmelden',
1763
+ 'mfa.locked_out': 'Telefoon, sleutel en codes kwijt? Vraag een beheerder uw aanmelden in twee stappen te resetten.',
1764
+ 'mfa.wrong': 'Die code klopt niet of is al gebruikt.',
1765
+ 'mfa.column': 'Twee stappen',
1766
+ 'mfa.on': 'aan',
1767
+ 'mfa.off': 'uit',
1768
+ 'mfa.reset': 'Resetten',
1769
+ 'mfa.reason': 'Reden',
1770
+ 'mfa.reset_help': 'Verwijdert de apps en herstelcodes van {user} en meldt deze af. Wordt gelogd; de beheerders krijgen een e-mail.',
1771
+ 'mfa.reset_btn': 'Aanmelden in twee stappen resetten',
1772
+ 'mfa.reason_needed': 'Geef een reden voor de reset.',
1773
+ 'mfa.reset_done': 'Aanmelden in twee stappen van {user} gereset.',
1774
+ 'mfa.policy_title': 'Aanmelden in twee stappen',
1775
+ 'mfa.policy_label': 'Aanmelden in twee stappen verplicht voor',
1776
+ 'mfa.policy_off': 'Niemand (optioneel)',
1777
+ 'mfa.policy_admins': 'Beheerders',
1778
+ 'mfa.policy_all': 'Alle ontwikkelaars',
1779
+ 'mfa.grace': 'Overgangsperiode (dagen)',
1780
+ 'mfa.grace_help': 'Ontwikkelaars zonder app zien tot dan een herinnering; daarna alleen hun Beveiligingspagina.',
1781
+ 'mfa.policy_help': 'Beheerders met aanmelden in twee stappen: {enrolled} van {admins}. Verplichten kan pas met minstens twee (of alle, als het er minder zijn).',
1782
+ 'mfa.policy_save': 'Opslaan',
1783
+ 'mfa.policy_saved': 'Beleid voor twee stappen opgeslagen.',
1784
+ 'mfa.policy_needs_admins': 'Eerst moeten minstens twee beheerders (of alle, als het er minder zijn) aanmelden in twee stappen instellen, zodat niemand alleen buitengesloten raakt.',
1785
+ 'mfa.without': 'Zonder aanmelden in twee stappen: {list}.',
1786
+ 'mfa.cli_note': 'Buitengesloten? Op de server: pgkiln admin reset-2fa <developer> of pgkiln admin set-2fa-policy off.',
1787
+ // ------------------------------------------------------------ Security: passkeys and trusted browsers (sprint 127)
1788
+ 'mfa.kind': 'Soort',
1789
+ 'mfa.kind_passkey': 'Passkeys',
1790
+ 'mfa.kind_app': 'Authenticator-apps',
1791
+ 'mfa.other_domain': 'voor {domain}',
1792
+ 'mfa.other_domain_help': 'Gemaakt voor {domain}: werkt niet op dit adres. Voeg hier een nieuwe passkey toe.',
1793
+ 'mfa.passkey_intro': 'Meld u aan met uw vingerafdruk, gezicht, schermvergrendeling of een beveiligingssleutel. Een passkey werkt alleen op deze site.',
1794
+ 'mfa.passkey_default': 'Passkey',
1795
+ 'mfa.add_passkey': 'Passkey toevoegen',
1796
+ 'mfa.passkey_needs_js': 'Een passkey toevoegen vraagt JavaScript; een authenticator-app werkt zonder.',
1797
+ 'mfa.passkey_failed': 'De passkey werkte niet. Probeer het opnieuw of gebruik een code.',
1798
+ 'mfa.passkey_known': 'Deze passkey is al toegevoegd.',
1799
+ 'mfa.passkey_added': 'Passkey toegevoegd: voortaan kunt u zich ermee aanmelden.',
1800
+ 'mfa.remove_passkey': 'Deze passkey verwijderen',
1801
+ 'mfa.use_passkey': 'Passkey gebruiken',
1802
+ 'mfa.trust_browser': 'Deze browser {days} dagen vertrouwen',
1803
+ 'mfa.trusted_title': 'Vertrouwde browsers',
1804
+ 'mfa.trusted_count': 'Browsers die de tweede stap overslaan: {n} (hoogstens {days} dagen).',
1805
+ 'mfa.trusted_off': 'Browsers vertrouwen staat uit.',
1806
+ 'mfa.forget_browsers': 'Vertrouwde browsers vergeten',
1807
+ 'mfa.browsers_forgotten': 'Elke browser vraagt weer om de tweede stap.',
1808
+ 'mfa.trust_days': 'Browser vertrouwen (dagen)',
1809
+ 'mfa.trust_days_help': 'Na de tweede stap mag een ontwikkelaar die in die browser zoveel dagen overslaan. 0: nooit.',
1810
+ 'mfa.passkey_needs_host': 'Passkeys hebben een hostnaam nodig, geen IP-adres ({host}): open de builder via localhost of de domeinnaam.',
1714
1811
  };
@@ -1711,4 +1711,101 @@ export const pt: BuilderMessages = {
1711
1711
  'dev.not_found': 'Não encontrado.',
1712
1712
  'dev.role_changed': 'Papel alterado.',
1713
1713
  'dev.removed': 'Desenvolvedor removido.',
1714
+ // ------------------------------------------------------------ Security: two-factor sign-in (sprint 126)
1715
+ 'mfa.menu': 'Login em duas etapas',
1716
+ 'mfa.title': 'Segurança',
1717
+ 'mfa.intro': 'Depois da senha, confirme que é você com uma chave de acesso (digital, rosto, chave de segurança) ou um código de um aplicativo autenticador. Os códigos de recuperação permitem entrar se você os perder.',
1718
+ 'mfa.required_you': 'Seu administrador exige login em duas etapas: adicione uma chave de acesso ou um aplicativo autenticador.',
1719
+ 'mfa.banner': 'O login em duas etapas é obrigatório. Configure-o antes de {date}: {link}',
1720
+ 'mfa.set_up_now': 'configurar agora',
1721
+ 'mfa.factors': 'Chaves de acesso e aplicativos autenticadores',
1722
+ 'mfa.app_name': 'Nome',
1723
+ 'mfa.app_default': 'Telefone',
1724
+ 'mfa.added': 'Adicionado',
1725
+ 'mfa.last_used': 'Último uso',
1726
+ 'mfa.no_apps': 'Nenhum segundo fator ainda: você entra apenas com sua senha.',
1727
+ 'mfa.add_app': 'Adicionar um aplicativo autenticador',
1728
+ 'mfa.no_key': 'O login em duas etapas precisa da chave da instância (PGKILN_SECRET_KEY) para guardar o segredo do aplicativo.',
1729
+ 'mfa.scan': 'Leia o código QR com um aplicativo autenticador.',
1730
+ 'mfa.or_enter': 'Ou digite esta chave à mão:',
1731
+ 'mfa.enter_code': 'Digite o código de 6 dígitos que o aplicativo mostra.',
1732
+ 'mfa.qr_label': 'Código QR para o aplicativo autenticador',
1733
+ 'mfa.confirm_app': 'Confirmar e ativar',
1734
+ 'mfa.cancel_setup': 'Cancelar',
1735
+ 'mfa.setup_expired': 'A configuração demorou demais: comece de novo.',
1736
+ 'mfa.wrong_setup': 'Esse código não confere: verifique a hora do telefone e tente o próximo código.',
1737
+ 'mfa.app_added': 'Aplicativo autenticador adicionado: a partir de agora você entra também com um código.',
1738
+ 'mfa.remove': 'Remover',
1739
+ 'mfa.remove_app': 'Remover este aplicativo',
1740
+ 'mfa.your_password': 'Sua senha',
1741
+ 'mfa.wrong_password': 'Senha incorreta.',
1742
+ 'mfa.cannot_remove_required': 'O login em duas etapas é obrigatório para você: adicione outra chave ou aplicativo antes de remover este.',
1743
+ 'mfa.cannot_remove_admin': 'Pelo menos dois administradores (ou todos, se forem menos) devem manter o login em duas etapas enquanto a política estiver ativa.',
1744
+ 'mfa.keep_admins': 'Agora não: a política exige pelo menos dois administradores com login em duas etapas (ou todos, se forem menos).',
1745
+ 'mfa.removed': 'Removido.',
1746
+ 'mfa.codes_title': 'Códigos de recuperação',
1747
+ 'mfa.codes_once': 'Guarde estes códigos em local seguro, longe do telefone. Cada um substitui uma vez um código do aplicativo. Eles são mostrados só agora.',
1748
+ 'mfa.codes_saved': 'Guardei estes códigos',
1749
+ 'mfa.codes_done': 'Concluído',
1750
+ 'mfa.codes_kept': 'Códigos de recuperação guardados.',
1751
+ 'mfa.codes_left': 'Códigos de recuperação não usados: {n}.',
1752
+ 'mfa.codes_after': 'Você recebe códigos de recuperação ao adicionar uma chave de acesso ou um aplicativo autenticador.',
1753
+ 'mfa.codes_low': 'Restam poucos códigos de recuperação: gere novos.',
1754
+ 'mfa.codes_new': 'Novos códigos de recuperação',
1755
+ 'mfa.codes_new_confirm': 'Gerar novos códigos de recuperação? Os antigos deixam de funcionar.',
1756
+ 'mfa.expired': 'O login demorou demais: entre novamente.',
1757
+ 'mfa.step_title': 'Login em duas etapas',
1758
+ 'mfa.step_intro': 'Confirme que é você, {user}: use uma chave de acesso ou digite um código do seu aplicativo autenticador.',
1759
+ 'mfa.code': 'Código',
1760
+ 'mfa.code_help': '6 dígitos do aplicativo ou um dos seus códigos de recuperação.',
1761
+ 'mfa.verify': 'Verificar',
1762
+ 'mfa.cancel': 'Voltar ao login',
1763
+ 'mfa.locked_out': 'Perdeu o telefone, a chave e os códigos? Peça a um administrador para redefinir seu login em duas etapas.',
1764
+ 'mfa.wrong': 'Esse código não está certo ou já foi usado.',
1765
+ 'mfa.column': 'Duas etapas',
1766
+ 'mfa.on': 'ativado',
1767
+ 'mfa.off': 'desativado',
1768
+ 'mfa.reset': 'Redefinir',
1769
+ 'mfa.reason': 'Motivo',
1770
+ 'mfa.reset_help': 'Remove os aplicativos e códigos de recuperação de {user} e encerra a sessão. Fica registrado; os administradores recebem um e-mail.',
1771
+ 'mfa.reset_btn': 'Redefinir o login em duas etapas',
1772
+ 'mfa.reason_needed': 'Informe um motivo para a redefinição.',
1773
+ 'mfa.reset_done': 'Login em duas etapas de {user} redefinido.',
1774
+ 'mfa.policy_title': 'Login em duas etapas',
1775
+ 'mfa.policy_label': 'Exigir login em duas etapas de',
1776
+ 'mfa.policy_off': 'Ninguém (opcional)',
1777
+ 'mfa.policy_admins': 'Administradores',
1778
+ 'mfa.policy_all': 'Todos os desenvolvedores',
1779
+ 'mfa.grace': 'Período de carência (dias)',
1780
+ 'mfa.grace_help': 'Desenvolvedores sem aplicativo veem um lembrete até lá; depois, só a página de Segurança.',
1781
+ 'mfa.policy_help': 'Administradores com login em duas etapas: {enrolled} de {admins}. Para exigir é preciso pelo menos dois (ou todos, se forem menos).',
1782
+ 'mfa.policy_save': 'Salvar',
1783
+ 'mfa.policy_saved': 'Política de duas etapas salva.',
1784
+ 'mfa.policy_needs_admins': 'Primeiro, pelo menos dois administradores (ou todos, se forem menos) configuram o login em duas etapas, para ninguém ficar bloqueado sozinho.',
1785
+ 'mfa.without': 'Sem login em duas etapas: {list}.',
1786
+ 'mfa.cli_note': 'Bloqueado? No servidor: pgkiln admin reset-2fa <developer> ou pgkiln admin set-2fa-policy off.',
1787
+ // ------------------------------------------------------------ Security: passkeys and trusted browsers (sprint 127)
1788
+ 'mfa.kind': 'Tipo',
1789
+ 'mfa.kind_passkey': 'Chaves de acesso',
1790
+ 'mfa.kind_app': 'Aplicativos autenticadores',
1791
+ 'mfa.other_domain': 'para {domain}',
1792
+ 'mfa.other_domain_help': 'Criada para {domain}: não funciona neste endereço. Adicione aqui uma nova chave.',
1793
+ 'mfa.passkey_intro': 'Entre com sua digital, rosto, bloqueio de tela ou uma chave de segurança. Uma chave de acesso só funciona neste site.',
1794
+ 'mfa.passkey_default': 'Chave de acesso',
1795
+ 'mfa.add_passkey': 'Adicionar uma chave de acesso',
1796
+ 'mfa.passkey_needs_js': 'Adicionar uma chave de acesso exige JavaScript; um aplicativo autenticador funciona sem ele.',
1797
+ 'mfa.passkey_failed': 'A chave de acesso não funcionou. Tente de novo ou use um código.',
1798
+ 'mfa.passkey_known': 'Esta chave de acesso já foi adicionada.',
1799
+ 'mfa.passkey_added': 'Chave de acesso adicionada: a partir de agora você pode entrar com ela.',
1800
+ 'mfa.remove_passkey': 'Remover esta chave de acesso',
1801
+ 'mfa.use_passkey': 'Usar uma chave de acesso',
1802
+ 'mfa.trust_browser': 'Confiar neste navegador por {days} dias',
1803
+ 'mfa.trusted_title': 'Navegadores confiáveis',
1804
+ 'mfa.trusted_count': 'Navegadores que pulam a segunda etapa: {n} (até {days} dias).',
1805
+ 'mfa.trusted_off': 'A confiança em navegadores está desativada.',
1806
+ 'mfa.forget_browsers': 'Esquecer os navegadores confiáveis',
1807
+ 'mfa.browsers_forgotten': 'Todos os navegadores voltam a pedir a segunda etapa.',
1808
+ 'mfa.trust_days': 'Confiar em um navegador (dias)',
1809
+ 'mfa.trust_days_help': 'Depois da segunda etapa, um desenvolvedor pode pulá-la naquele navegador por estes dias. 0: nunca.',
1810
+ 'mfa.passkey_needs_host': 'Chaves de acesso precisam de um nome de host, não de um endereço IP ({host}): abra o construtor em localhost ou no nome de domínio.',
1714
1811
  };
@@ -3,6 +3,7 @@ import { html } from '../html.ts';
3
3
  import { configurationValue, CONFIGURATION, INSTANCE_SETTINGS, instanceSetting, origin, refreshInstanceSettings, saveInstanceSettings } from '../instance.ts';
4
4
  import { clientIp, logActivity, type Session } from '../session.ts';
5
5
  import { isAdmin } from './locks.ts';
6
+ import { policyRegion } from './security.ts';
6
7
  import { releaseCheckRegion } from './workspace-home.ts';
7
8
  import { back, BASE, csrf, developer, flash, region, send, shell, type Req } from './ui.ts';
8
9
 
@@ -39,6 +40,7 @@ export async function instanceRoutes(app: FastifyInstance) {
39
40
  })}</div>
40
41
  <div class="buttons"><button class="btn btn-hot">Save</button></div></form>`)}
41
42
  ${await releaseCheckRegion(s)}
43
+ ${await policyRegion(s)}
42
44
  ${region('Configuration', html`<p class="muted u-mt0">Environment variables of this server (chapter 1 of the guide). Secrets show only whether they are set.</p>
43
45
  <div class="table-wrap"><table class="report report-reflow"><thead><tr><th>Variable</th><th>Value</th><th>Purpose</th></tr></thead>
44
46
  <tbody>${CONFIGURATION.map((c) => {