mirror of
https://github.com/fosrl/pangolin.git
synced 2026-01-28 22:00:51 +00:00
Merge branch 'main' into dev
This commit is contained in:
16
README.md
16
README.md
@@ -1,6 +1,6 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<h2>
|
<h2>
|
||||||
<a href="https://digpangolin.com">
|
<a href="https://pangolin.net/">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
|
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
|
||||||
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="350">
|
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="350">
|
||||||
@@ -11,11 +11,11 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<h5>
|
<h5>
|
||||||
<a href="https://digpangolin.com">
|
<a href="https://pangolin.net/">
|
||||||
Website
|
Website
|
||||||
</a>
|
</a>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
<a href="https://docs.digpangolin.com/">
|
<a href="https://docs.pangolin.net/">
|
||||||
Documentation
|
Documentation
|
||||||
</a>
|
</a>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[](https://discord.gg/HCJR8Xhme4)
|
[](https://discord.gg/HCJR8Xhme4)
|
||||||
[](https://digpangolin.com/slack)
|
[](https://pangolin.net/slack)
|
||||||
[](https://hub.docker.com/r/fosrl/pangolin)
|
[](https://hub.docker.com/r/fosrl/pangolin)
|
||||||

|

|
||||||
[](https://www.youtube.com/@fossorial-app)
|
[](https://www.youtube.com/@fossorial-app)
|
||||||
@@ -45,7 +45,7 @@ Pangolin is a self-hosted tunneled reverse proxy server with identity and contex
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Check out the [quick install guide](https://docs.digpangolin.com/self-host/quick-install) for how to install and set up Pangolin.
|
Check out the [quick install guide](https://docs.pangolin.net/self-host/quick-install) for how to install and set up Pangolin.
|
||||||
|
|
||||||
## Deployment Options
|
## Deployment Options
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ Check out the [quick install guide](https://docs.digpangolin.com/self-host/quick
|
|||||||
|-----------------|--------------|
|
|-----------------|--------------|
|
||||||
| **Self-Host: Community Edition** | Free, open source, and licensed under AGPL-3. |
|
| **Self-Host: Community Edition** | Free, open source, and licensed under AGPL-3. |
|
||||||
| **Self-Host: Enterprise Edition** | Licensed under Fossorial Commercial License. Free for personal and hobbyist use, and for businesses earning under \$100K USD annually. |
|
| **Self-Host: Enterprise Edition** | Licensed under Fossorial Commercial License. Free for personal and hobbyist use, and for businesses earning under \$100K USD annually. |
|
||||||
| **Pangolin Cloud** | Fully managed service with instant setup and pay-as-you-go pricing — no infrastructure required. Or, self-host your own [remote node](https://docs.digpangolin.com/manage/remote-node/nodes) and connect to our control plane. |
|
| **Pangolin Cloud** | Fully managed service with instant setup and pay-as-you-go pricing — no infrastructure required. Or, self-host your own [remote node](https://docs.pangolin.net/manage/remote-node/nodes) and connect to our control plane. |
|
||||||
|
|
||||||
## Key Features
|
## Key Features
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ Pangolin packages everything you need for seamless application access and exposu
|
|||||||
### Check out the docs
|
### Check out the docs
|
||||||
|
|
||||||
We encourage everyone to read the full documentation first, which is
|
We encourage everyone to read the full documentation first, which is
|
||||||
available at [docs.digpangolin.com](https://docs.digpangolin.com). This README provides only a very brief subset of
|
available at [docs.pangolin.net](https://docs.pangolin.net). This README provides only a very brief subset of
|
||||||
the docs to illustrate some basic ideas.
|
the docs to illustrate some basic ideas.
|
||||||
|
|
||||||
### Sign up and try now
|
### Sign up and try now
|
||||||
@@ -81,7 +81,7 @@ For Pangolin's managed service, you will first need to create an account at
|
|||||||
|
|
||||||
## Licensing
|
## Licensing
|
||||||
|
|
||||||
Pangolin is dual licensed under the AGPL-3 and the [Fossorial Commercial License](https://digpangolin.com/fcl.html). For inquiries about commercial licensing, please contact us at [contact@fossorial.io](mailto:contact@fossorial.io).
|
Pangolin is dual licensed under the AGPL-3 and the [Fossorial Commercial License](https://pangolin.net/fcl.html). For inquiries about commercial licensing, please contact us at [contact@fossorial.io](mailto:contact@fossorial.io).
|
||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
|
|||||||
@@ -6,45 +6,45 @@
|
|||||||
"setupOrgName": "Nom de l'organisation",
|
"setupOrgName": "Nom de l'organisation",
|
||||||
"orgDisplayName": "Ceci est le nom d'affichage de votre organisation.",
|
"orgDisplayName": "Ceci est le nom d'affichage de votre organisation.",
|
||||||
"orgId": "ID de l'organisation",
|
"orgId": "ID de l'organisation",
|
||||||
"setupIdentifierMessage": "Ceci est l'identifiant unique pour votre organisation. Il est séparé du nom affiché.",
|
"setupIdentifierMessage": "Ceci est l'identifiant de votre organisation. Il est différent du nom affiché.",
|
||||||
"setupErrorIdentifier": "L'ID de l'organisation est déjà pris. Veuillez en choisir un autre.",
|
"setupErrorIdentifier": "Cet identifiant est déjà pris. Veuillez en choisir un autre.",
|
||||||
"componentsErrorNoMemberCreate": "Vous n'êtes actuellement membre d'aucune organisation. Créez une organisation pour commencer.",
|
"componentsErrorNoMemberCreate": "Vous n'êtes actuellement membre d'aucune organisation. Créez une organisation pour commencer.",
|
||||||
"componentsErrorNoMember": "Vous n'êtes actuellement membre d'aucune organisation.",
|
"componentsErrorNoMember": "Vous n'êtes actuellement membre d'aucune organisation.",
|
||||||
"welcome": "Bienvenue à Pangolin",
|
"welcome": "Bienvenue sur Pangolin",
|
||||||
"welcomeTo": "Bienvenue chez",
|
"welcomeTo": "Bienvenue chez",
|
||||||
"componentsCreateOrg": "Créer une organisation",
|
"componentsCreateOrg": "Créer une organisation",
|
||||||
"componentsMember": "Vous êtes membre de {count, plural, =0 {aucune organisation} one {une organisation} other {# organisations}}.",
|
"componentsMember": "Vous {count, plural, =0 {n'} other {}}êtes membre {count, plural, =0 {d'aucune organisation} one {d'une organisation} other {de # organisations}}.",
|
||||||
"componentsInvalidKey": "Clés de licence invalides ou expirées détectées. Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
|
"componentsInvalidKey": "Clés de licence invalides ou expirées détectées. Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
|
||||||
"dismiss": "Refuser",
|
"dismiss": "Refuser",
|
||||||
"componentsLicenseViolation": "Violation de licence : Ce serveur utilise des sites {usedSites} qui dépassent la limite autorisée des sites {maxSites} . Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
|
"componentsLicenseViolation": "Violation de licence : Ce serveur utilise des sites {usedSites} qui dépassent la limite autorisée des sites {maxSites} . Suivez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.",
|
||||||
"componentsSupporterMessage": "Merci de soutenir Pangolin en tant que {tier}!",
|
"componentsSupporterMessage": "Merci de soutenir Pangolin en tant que {tier}!",
|
||||||
"inviteErrorNotValid": "Nous sommes désolés, mais il semble que l'invitation que vous essayez d'accéder n'ait pas été acceptée ou n'est plus valide.",
|
"inviteErrorNotValid": "Nous sommes désolés, mais il semble que l'invitation via laquelle vous essayez d'accéder n'ait pas été acceptée ou n'est plus valide.",
|
||||||
"inviteErrorUser": "Nous sommes désolés, mais il semble que l'invitation que vous essayez d'accéder ne soit pas pour cet utilisateur.",
|
"inviteErrorUser": "Nous sommes désolés, mais il semble que l'invitation via laquelle vous essayez d'accéder ne soit pas pour cet utilisateur.",
|
||||||
"inviteLoginUser": "Assurez-vous que vous êtes bien connecté en tant qu'utilisateur correct.",
|
"inviteLoginUser": "Assurez-vous d'etre bien connecté au bon compte.",
|
||||||
"inviteErrorNoUser": "Nous sommes désolés, mais il semble que l'invitation que vous essayez d'accéder ne soit pas pour un utilisateur qui existe.",
|
"inviteErrorNoUser": "Nous sommes désolés, mais il semble que l'invitation via laquelle vous essayez d'accéder ne soit pas pour un utilisateur qui existe.",
|
||||||
"inviteCreateUser": "Veuillez d'abord créer un compte.",
|
"inviteCreateUser": "Vous n'avez aucun compte, veuillez en créer un.",
|
||||||
"goHome": "Retour à la maison",
|
"goHome": "Retour à l'accueil",
|
||||||
"inviteLogInOtherUser": "Se connecter en tant qu'utilisateur différent",
|
"inviteLogInOtherUser": "Se connecter en tant qu'utilisateur différent",
|
||||||
"createAnAccount": "Créer un compte",
|
"createAnAccount": "Créer un compte",
|
||||||
"inviteNotAccepted": "Invitation non acceptée",
|
"inviteNotAccepted": "Invitation non acceptée",
|
||||||
"authCreateAccount": "Créez un compte pour commencer",
|
"authCreateAccount": "Créez un compte pour commencer",
|
||||||
"authNoAccount": "Vous n'avez pas de compte ?",
|
"authNoAccount": "Vous n'avez pas de compte ?",
|
||||||
"email": "Courriel",
|
"email": "Adresse email",
|
||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"confirmPassword": "Confirmer le mot de passe",
|
"confirmPassword": "Confirmer le mot de passe",
|
||||||
"createAccount": "Créer un compte",
|
"createAccount": "Créer un compte",
|
||||||
"viewSettings": "Afficher les paramètres",
|
"viewSettings": "Afficher les paramètres",
|
||||||
"delete": "Supprimez",
|
"delete": "Supprimer",
|
||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
"online": "En ligne",
|
"online": "En ligne",
|
||||||
"offline": "Hors ligne",
|
"offline": "Hors ligne",
|
||||||
"site": "Site",
|
"site": "Site",
|
||||||
"dataIn": "Données dans",
|
"dataIn": "Données reçues",
|
||||||
"dataOut": "Données épuisées",
|
"dataOut": "Données émises",
|
||||||
"connectionType": "Type de connexion",
|
"connectionType": "Type de connexion",
|
||||||
"tunnelType": "Type de tunnel",
|
"tunnelType": "Type de tunnel",
|
||||||
"local": "Locale",
|
"local": "Locale",
|
||||||
"edit": "Editer",
|
"edit": "Modifier",
|
||||||
"siteConfirmDelete": "Confirmer la suppression du site",
|
"siteConfirmDelete": "Confirmer la suppression du site",
|
||||||
"siteDelete": "Supprimer le site",
|
"siteDelete": "Supprimer le site",
|
||||||
"siteMessageRemove": "Une fois supprimé, le site ne sera plus accessible. Toutes les ressources et cibles associées au site seront également supprimées.",
|
"siteMessageRemove": "Une fois supprimé, le site ne sera plus accessible. Toutes les ressources et cibles associées au site seront également supprimées.",
|
||||||
@@ -64,11 +64,11 @@
|
|||||||
"siteLearnNewt": "Apprenez à installer Newt sur votre système",
|
"siteLearnNewt": "Apprenez à installer Newt sur votre système",
|
||||||
"siteSeeConfigOnce": "Vous ne pourrez voir la configuration qu'une seule fois.",
|
"siteSeeConfigOnce": "Vous ne pourrez voir la configuration qu'une seule fois.",
|
||||||
"siteLoadWGConfig": "Chargement de la configuration WireGuard...",
|
"siteLoadWGConfig": "Chargement de la configuration WireGuard...",
|
||||||
"siteDocker": "Développer les détails du déploiement Docker",
|
"siteDocker": "Afficher les détails du déploiement Docker",
|
||||||
"toggle": "Activer/désactiver",
|
"toggle": "Activer/désactiver",
|
||||||
"dockerCompose": "Composition Docker",
|
"dockerCompose": "Docker Compose",
|
||||||
"dockerRun": "Exécution Docker",
|
"dockerRun": "Docker Run",
|
||||||
"siteLearnLocal": "Les sites locaux ne tunnel, en savoir plus",
|
"siteLearnLocal": "Les sites locaux ne permettent pas d'utiliser les tunnel, en savoir plus",
|
||||||
"siteConfirmCopy": "J'ai copié la configuration",
|
"siteConfirmCopy": "J'ai copié la configuration",
|
||||||
"searchSitesProgress": "Rechercher des sites...",
|
"searchSitesProgress": "Rechercher des sites...",
|
||||||
"siteAdd": "Ajouter un site",
|
"siteAdd": "Ajouter un site",
|
||||||
@@ -79,9 +79,9 @@
|
|||||||
"operatingSystem": "Système d'exploitation",
|
"operatingSystem": "Système d'exploitation",
|
||||||
"commands": "Commandes",
|
"commands": "Commandes",
|
||||||
"recommended": "Recommandé",
|
"recommended": "Recommandé",
|
||||||
"siteNewtDescription": "Pour une meilleure expérience d'utilisateur, utilisez Newt. Il utilise WireGuard sous le capot et vous permet d'adresser vos ressources privées par leur adresse LAN sur votre réseau privé à partir du tableau de bord Pangolin.",
|
"siteNewtDescription": "Pour une meilleure expérience d'utilisateur, utilisez Newt. Newt se base sur WireGuard et vous permet d'adresser vos ressources privées par leur adresse LAN sur votre réseau privé à partir du tableau de bord Pangolin.",
|
||||||
"siteRunsInDocker": "Exécute dans Docker",
|
"siteRunsInDocker": "S'exécute dans Docker",
|
||||||
"siteRunsInShell": "Exécute en shell sur macOS, Linux et Windows",
|
"siteRunsInShell": "S'exécute en shell sur macOS, Linux et Windows",
|
||||||
"siteErrorDelete": "Erreur lors de la suppression du site",
|
"siteErrorDelete": "Erreur lors de la suppression du site",
|
||||||
"siteErrorUpdate": "Impossible de mettre à jour le site",
|
"siteErrorUpdate": "Impossible de mettre à jour le site",
|
||||||
"siteErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour du site.",
|
"siteErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour du site.",
|
||||||
@@ -89,18 +89,18 @@
|
|||||||
"siteUpdatedDescription": "Le site a été mis à jour.",
|
"siteUpdatedDescription": "Le site a été mis à jour.",
|
||||||
"siteGeneralDescription": "Configurer les paramètres généraux de ce site",
|
"siteGeneralDescription": "Configurer les paramètres généraux de ce site",
|
||||||
"siteSettingDescription": "Configurer les paramètres de votre site",
|
"siteSettingDescription": "Configurer les paramètres de votre site",
|
||||||
"siteSetting": "Réglages {siteName}",
|
"siteSetting": "Réglages de {siteName}",
|
||||||
"siteNewtTunnel": "Tunnel Newt (Recommandé)",
|
"siteNewtTunnel": "Tunnel Newt (Recommandé)",
|
||||||
"siteNewtTunnelDescription": "La façon la plus simple de créer un point d'entrée dans votre réseau. Pas de configuration supplémentaire.",
|
"siteNewtTunnelDescription": "La façon la plus simple de créer un point d'entrée dans votre réseau. Pas de configuration supplémentaire.",
|
||||||
"siteWg": "WireGuard basique",
|
"siteWg": "WireGuard basique",
|
||||||
"siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.",
|
"siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.",
|
||||||
"siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES",
|
"siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES",
|
||||||
"siteLocalDescription": "Ressources locales seulement. Pas de tunneling.",
|
"siteLocalDescription": "Ressources locales seulement. Pas de tunneling.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Ressources locales seulement. Pas de tunneling. Seulement disponible sur les noeuds distants",
|
||||||
"siteSeeAll": "Voir tous les sites",
|
"siteSeeAll": "Voir tous les sites",
|
||||||
"siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site",
|
"siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site",
|
||||||
"siteNewtCredentials": "Identifiants Newt",
|
"siteNewtCredentials": "Identifiants Newt",
|
||||||
"siteNewtCredentialsDescription": "C'est ainsi que Newt s'authentifiera avec le serveur",
|
"siteNewtCredentialsDescription": "C'est comme cela que Newt s'authentifiera avec le serveur",
|
||||||
"siteCredentialsSave": "Enregistrez vos identifiants",
|
"siteCredentialsSave": "Enregistrez vos identifiants",
|
||||||
"siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de le copier dans un endroit sécurisé.",
|
"siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de le copier dans un endroit sécurisé.",
|
||||||
"siteInfo": "Informations sur le site",
|
"siteInfo": "Informations sur le site",
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
"shareErrorDelete": "Impossible de supprimer le lien",
|
"shareErrorDelete": "Impossible de supprimer le lien",
|
||||||
"shareErrorDeleteMessage": "Une erreur s'est produite lors de la suppression du lien",
|
"shareErrorDeleteMessage": "Une erreur s'est produite lors de la suppression du lien",
|
||||||
"shareDeleted": "Lien supprimé",
|
"shareDeleted": "Lien supprimé",
|
||||||
"shareDeletedDescription": "Le lien a été supprimé",
|
"shareDeletedDescription": "Le lien de partage a été supprimé",
|
||||||
"shareTokenDescription": "Votre jeton d'accès peut être passé de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Elles doivent être transmises par le client à chaque demande d'accès authentifié.",
|
"shareTokenDescription": "Votre jeton d'accès peut être passé de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Elles doivent être transmises par le client à chaque demande d'accès authentifié.",
|
||||||
"accessToken": "Jeton d'accès",
|
"accessToken": "Jeton d'accès",
|
||||||
"usageExamples": "Exemples d'utilisation",
|
"usageExamples": "Exemples d'utilisation",
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
"shareExpireDescription": "Le temps d'expiration est combien de temps le lien sera utilisable et fournira un accès à la ressource. Après cette période, le lien ne fonctionnera plus et les utilisateurs qui ont utilisé ce lien perdront l'accès à la ressource.",
|
"shareExpireDescription": "Le temps d'expiration est combien de temps le lien sera utilisable et fournira un accès à la ressource. Après cette période, le lien ne fonctionnera plus et les utilisateurs qui ont utilisé ce lien perdront l'accès à la ressource.",
|
||||||
"shareSeeOnce": "Vous ne pourrez voir ce lien. Assurez-vous de le copier.",
|
"shareSeeOnce": "Vous ne pourrez voir ce lien. Assurez-vous de le copier.",
|
||||||
"shareAccessHint": "N'importe qui avec ce lien peut accéder à la ressource. Partagez-le avec soin.",
|
"shareAccessHint": "N'importe qui avec ce lien peut accéder à la ressource. Partagez-le avec soin.",
|
||||||
"shareTokenUsage": "Voir Utilisation du jeton d'accès",
|
"shareTokenUsage": "Voir l'utilisation du jeton d'accès",
|
||||||
"createLink": "Créer un lien",
|
"createLink": "Créer un lien",
|
||||||
"resourcesNotFound": "Aucune ressource trouvée",
|
"resourcesNotFound": "Aucune ressource trouvée",
|
||||||
"resourceSearch": "Rechercher des ressources",
|
"resourceSearch": "Rechercher des ressources",
|
||||||
@@ -1234,7 +1234,7 @@
|
|||||||
"billing": "Facturation",
|
"billing": "Facturation",
|
||||||
"orgBillingDescription": "Gérez vos informations de facturation et vos abonnements",
|
"orgBillingDescription": "Gérez vos informations de facturation et vos abonnements",
|
||||||
"github": "GitHub",
|
"github": "GitHub",
|
||||||
"pangolinHosted": "Pangolin Hébergement",
|
"pangolinHosted": "Hebergé par Pangolin",
|
||||||
"fossorial": "Fossorial",
|
"fossorial": "Fossorial",
|
||||||
"completeAccountSetup": "Complétez la configuration du compte",
|
"completeAccountSetup": "Complétez la configuration du compte",
|
||||||
"completeAccountSetupDescription": "Définissez votre mot de passe pour commencer",
|
"completeAccountSetupDescription": "Définissez votre mot de passe pour commencer",
|
||||||
@@ -1316,7 +1316,7 @@
|
|||||||
"billingRemoteExitNodesInfo": "Vous êtes facturé pour chaque nœud géré dans votre organisation. La facturation est calculée quotidiennement en fonction du nombre de nœuds gérés actifs dans votre organisation.",
|
"billingRemoteExitNodesInfo": "Vous êtes facturé pour chaque nœud géré dans votre organisation. La facturation est calculée quotidiennement en fonction du nombre de nœuds gérés actifs dans votre organisation.",
|
||||||
"domainNotFound": "Domaine introuvable",
|
"domainNotFound": "Domaine introuvable",
|
||||||
"domainNotFoundDescription": "Cette ressource est désactivée car le domaine n'existe plus dans notre système. Veuillez définir un nouveau domaine pour cette ressource.",
|
"domainNotFoundDescription": "Cette ressource est désactivée car le domaine n'existe plus dans notre système. Veuillez définir un nouveau domaine pour cette ressource.",
|
||||||
"failed": "Échec",
|
"failed": "Erreur",
|
||||||
"createNewOrgDescription": "Créer une nouvelle organisation",
|
"createNewOrgDescription": "Créer une nouvelle organisation",
|
||||||
"organization": "Organisation",
|
"organization": "Organisation",
|
||||||
"port": "Port",
|
"port": "Port",
|
||||||
@@ -1370,7 +1370,7 @@
|
|||||||
"createDomainARecords": "Enregistrements A",
|
"createDomainARecords": "Enregistrements A",
|
||||||
"createDomainRecordNumber": "Enregistrement {number}",
|
"createDomainRecordNumber": "Enregistrement {number}",
|
||||||
"createDomainTxtRecords": "Enregistrements TXT",
|
"createDomainTxtRecords": "Enregistrements TXT",
|
||||||
"createDomainSaveTheseRecords": "Enregistrez ces enregistrements",
|
"createDomainSaveTheseRecords": "Sauvegardez ces enregistrements",
|
||||||
"createDomainSaveTheseRecordsDescription": "Assurez-vous de sauvegarder ces enregistrements DNS car vous ne les reverrez pas.",
|
"createDomainSaveTheseRecordsDescription": "Assurez-vous de sauvegarder ces enregistrements DNS car vous ne les reverrez pas.",
|
||||||
"createDomainDnsPropagation": "Propagation DNS",
|
"createDomainDnsPropagation": "Propagation DNS",
|
||||||
"createDomainDnsPropagationDescription": "Les modifications DNS peuvent mettre du temps à se propager sur internet. Cela peut prendre de quelques minutes à 48 heures selon votre fournisseur DNS et les réglages TTL.",
|
"createDomainDnsPropagationDescription": "Les modifications DNS peuvent mettre du temps à se propager sur internet. Cela peut prendre de quelques minutes à 48 heures selon votre fournisseur DNS et les réglages TTL.",
|
||||||
@@ -1445,7 +1445,7 @@
|
|||||||
"IntervalSeconds": "Intervalle sain",
|
"IntervalSeconds": "Intervalle sain",
|
||||||
"timeoutSeconds": "Délai",
|
"timeoutSeconds": "Délai",
|
||||||
"timeIsInSeconds": "Le temps est exprimé en secondes",
|
"timeIsInSeconds": "Le temps est exprimé en secondes",
|
||||||
"retryAttempts": "Tentatives de réessai",
|
"retryAttempts": "Tentatives",
|
||||||
"expectedResponseCodes": "Codes de réponse attendus",
|
"expectedResponseCodes": "Codes de réponse attendus",
|
||||||
"expectedResponseCodesDescription": "Code de statut HTTP indiquant un état de santé satisfaisant. Si non renseigné, 200-300 est considéré comme satisfaisant.",
|
"expectedResponseCodesDescription": "Code de statut HTTP indiquant un état de santé satisfaisant. Si non renseigné, 200-300 est considéré comme satisfaisant.",
|
||||||
"customHeaders": "En-têtes personnalisés",
|
"customHeaders": "En-têtes personnalisés",
|
||||||
@@ -1760,9 +1760,9 @@
|
|||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Enterprise Edition",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Unlicensed",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Gérer les clients",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Valide jusqu'au",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licenses",
|
||||||
@@ -1771,8 +1771,8 @@
|
|||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Please enter a valid email address",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Please select a use case type",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Le prénom est requis",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Le nom est requis",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Please describe your primary use",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Job title is required for business use",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Industry is required for business use",
|
||||||
@@ -1786,7 +1786,7 @@
|
|||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Utilisation personelle",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
@@ -1824,27 +1824,27 @@
|
|||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
||||||
"firstName": "First Name",
|
"firstName": "Prénom",
|
||||||
"lastName": "Last Name",
|
"lastName": "Nom",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "profession",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "What is your industry?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
||||||
"companyName": "Company name",
|
"companyName": "Entreprise",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Pays de résidence",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "État / Province / Région",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Code postal",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Site de l'entreprise",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Numéro de téléphone professionnel",
|
||||||
"country": "Country",
|
"country": "Pays",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Numéro de téléphone (optionnel)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Fermer",
|
||||||
"previous": "Previous",
|
"previous": "Précédent",
|
||||||
"next": "Next",
|
"next": "Suivant",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Generate License Key"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
@@ -1860,16 +1860,16 @@
|
|||||||
},
|
},
|
||||||
"priority": "Priorité",
|
"priority": "Priorité",
|
||||||
"priorityDescription": "Les routes de haute priorité sont évaluées en premier. La priorité = 100 signifie l'ordre automatique (décision du système). Utilisez un autre nombre pour imposer la priorité manuelle.",
|
"priorityDescription": "Les routes de haute priorité sont évaluées en premier. La priorité = 100 signifie l'ordre automatique (décision du système). Utilisez un autre nombre pour imposer la priorité manuelle.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nom de l'instance",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configure Path Matching",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Match Type",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Préfix",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exact",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Path Value",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Sauvegarder",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/path",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
||||||
@@ -1889,7 +1889,7 @@
|
|||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Préfix",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exact",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Strip",
|
||||||
|
|||||||
919
package-lock.json
generated
919
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -56,7 +56,7 @@
|
|||||||
"@radix-ui/react-tabs": "1.1.13",
|
"@radix-ui/react-tabs": "1.1.13",
|
||||||
"@radix-ui/react-toast": "1.2.15",
|
"@radix-ui/react-toast": "1.2.15",
|
||||||
"@radix-ui/react-tooltip": "^1.2.8",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@react-email/components": "0.5.6",
|
"@react-email/components": "0.5.7",
|
||||||
"@react-email/render": "^1.3.2",
|
"@react-email/render": "^1.3.2",
|
||||||
"@react-email/tailwind": "1.2.2",
|
"@react-email/tailwind": "1.2.2",
|
||||||
"@simplewebauthn/browser": "^13.2.2",
|
"@simplewebauthn/browser": "^13.2.2",
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"drizzle-orm": "0.44.6",
|
"drizzle-orm": "0.44.6",
|
||||||
"eslint": "9.37.0",
|
"eslint": "9.37.0",
|
||||||
"eslint-config-next": "15.5.4",
|
"eslint-config-next": "15.5.6",
|
||||||
"express": "5.1.0",
|
"express": "5.1.0",
|
||||||
"express-rate-limit": "8.1.0",
|
"express-rate-limit": "8.1.0",
|
||||||
"glob": "11.0.3",
|
"glob": "11.0.3",
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
"lucide-react": "^0.545.0",
|
"lucide-react": "^0.545.0",
|
||||||
"maxmind": "5.0.0",
|
"maxmind": "5.0.0",
|
||||||
"moment": "2.30.1",
|
"moment": "2.30.1",
|
||||||
"next": "15.5.4",
|
"next": "15.5.6",
|
||||||
"next-intl": "^4.3.12",
|
"next-intl": "^4.3.12",
|
||||||
"next-themes": "0.4.6",
|
"next-themes": "0.4.6",
|
||||||
"node-cache": "5.1.2",
|
"node-cache": "5.1.2",
|
||||||
@@ -143,13 +143,13 @@
|
|||||||
"@types/nodemailer": "7.0.2",
|
"@types/nodemailer": "7.0.2",
|
||||||
"@types/pg": "8.15.5",
|
"@types/pg": "8.15.5",
|
||||||
"@types/react": "19.2.2",
|
"@types/react": "19.2.2",
|
||||||
"@types/react-dom": "19.2.1",
|
"@types/react-dom": "19.2.2",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
"@types/swagger-ui-express": "^4.1.8",
|
"@types/swagger-ui-express": "^4.1.8",
|
||||||
"@types/ws": "8.18.1",
|
"@types/ws": "8.18.1",
|
||||||
"@types/yargs": "17.0.33",
|
"@types/yargs": "17.0.33",
|
||||||
"drizzle-kit": "0.31.5",
|
"drizzle-kit": "0.31.5",
|
||||||
"esbuild": "0.25.10",
|
"esbuild": "0.25.11",
|
||||||
"esbuild-node-externals": "1.18.0",
|
"esbuild-node-externals": "1.18.0",
|
||||||
"postcss": "^8",
|
"postcss": "^8",
|
||||||
"react-email": "4.3.0",
|
"react-email": "4.3.0",
|
||||||
|
|||||||
@@ -920,7 +920,7 @@ export class UsageService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Don't await to prevent blocking
|
// Don't await to prevent blocking
|
||||||
sendToClient(newt.newtId, payload).catch(
|
await sendToClient(newt.newtId, payload).catch(
|
||||||
(error: any) => {
|
(error: any) => {
|
||||||
logger.error(
|
logger.error(
|
||||||
`Failed to send termination message to newt ${newt.newtId}:`,
|
`Failed to send termination message to newt ${newt.newtId}:`,
|
||||||
|
|||||||
Reference in New Issue
Block a user