From 9e912c6407221931ba8266f311e007e3f3e42251 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 18:07:07 +0100 Subject: [PATCH 01/10] Add french to lang-list.json --- frontend/src/locale/src/lang-list.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 5e3a5c4c70..39a0858210 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -5,6 +5,9 @@ "locale-es-ES": { "defaultMessage": "Español" }, + "locale-fr-FR": { + "defaultMessage": "Français" + }, "locale-de-DE": { "defaultMessage": "German" }, From 8629780cd10705574bdccd7462ed90e0e537d2a8 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 19:22:13 +0100 Subject: [PATCH 02/10] Add a french translation via fr.json --- frontend/src/locale/src/en.json | 647 -------------------------------- frontend/src/locale/src/fr.json | 647 ++++++++++++++++++++++++++++++++ 2 files changed, 647 insertions(+), 647 deletions(-) delete mode 100644 frontend/src/locale/src/en.json create mode 100644 frontend/src/locale/src/fr.json diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json deleted file mode 100644 index 02e9f8fab9..0000000000 --- a/frontend/src/locale/src/en.json +++ /dev/null @@ -1,647 +0,0 @@ -{ - "access-list": { - "defaultMessage": "Access List" - }, - "access-list.access-count": { - "defaultMessage": "{count} {count, plural, one {Rule} other {Rules}}" - }, - "access-list.auth-count": { - "defaultMessage": "{count} {count, plural, one {User} other {Users}}" - }, - "access-list.help-rules-last": { - "defaultMessage": "When at least 1 rule exists, this deny all rule will be added last" - }, - "access-list.help.rules-order": { - "defaultMessage": "Note that the allow and deny directives will be applied in the order they are defined." - }, - "access-list.pass-auth": { - "defaultMessage": "Pass Auth to Upstream" - }, - "access-list.public": { - "defaultMessage": "Publicly Accessible" - }, - "access-list.public.subtitle": { - "defaultMessage": "No basic auth required" - }, - "access-list.satisfy-any": { - "defaultMessage": "Satisfy Any" - }, - "access-list.subtitle": { - "defaultMessage": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}" - }, - "access-lists": { - "defaultMessage": "Access Lists" - }, - "action.add": { - "defaultMessage": "Add" - }, - "action.add-location": { - "defaultMessage": "Add Location" - }, - "action.close": { - "defaultMessage": "Close" - }, - "action.delete": { - "defaultMessage": "Delete" - }, - "action.disable": { - "defaultMessage": "Disable" - }, - "action.download": { - "defaultMessage": "Download" - }, - "action.edit": { - "defaultMessage": "Edit" - }, - "action.enable": { - "defaultMessage": "Enable" - }, - "action.permissions": { - "defaultMessage": "Permissions" - }, - "action.renew": { - "defaultMessage": "Renew" - }, - "action.view-details": { - "defaultMessage": "View Details" - }, - "auditlogs": { - "defaultMessage": "Audit Logs" - }, - "cancel": { - "defaultMessage": "Cancel" - }, - "certificate": { - "defaultMessage": "Certificate" - }, - "certificate.custom-certificate": { - "defaultMessage": "Certificate" - }, - "certificate.custom-certificate-key": { - "defaultMessage": "Certificate Key" - }, - "certificate.custom-intermediate": { - "defaultMessage": "Intermediate Certificate" - }, - "certificate.in-use": { - "defaultMessage": "In Use" - }, - "certificate.none.subtitle": { - "defaultMessage": "No certificate assigned" - }, - "certificate.none.subtitle.for-http": { - "defaultMessage": "This host will not use HTTPS" - }, - "certificate.none.title": { - "defaultMessage": "None" - }, - "certificate.not-in-use": { - "defaultMessage": "Not Used" - }, - "certificate.renew": { - "defaultMessage": "Renew Certificate" - }, - "certificates": { - "defaultMessage": "Certificates" - }, - "certificates.custom": { - "defaultMessage": "Custom Certificate" - }, - "certificates.custom.warning": { - "defaultMessage": "Key files protected with a passphrase are not supported." - }, - "certificates.dns.credentials": { - "defaultMessage": "Credentials File Content" - }, - "certificates.dns.credentials-note": { - "defaultMessage": "This plugin requires a configuration file containing an API token or other credentials for your provider" - }, - "certificates.dns.credentials-warning": { - "defaultMessage": "This data will be stored as plaintext in the database and in a file!" - }, - "certificates.dns.propagation-seconds": { - "defaultMessage": "Propagation Seconds" - }, - "certificates.dns.propagation-seconds-note": { - "defaultMessage": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation." - }, - "certificates.dns.provider": { - "defaultMessage": "DNS Provider" - }, - "certificates.dns.warning": { - "defaultMessage": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation." - }, - "certificates.http.reachability-404": { - "defaultMessage": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running." - }, - "certificates.http.reachability-failed-to-check": { - "defaultMessage": "Failed to check the reachability due to a communication error with site24x7.com." - }, - "certificates.http.reachability-not-resolved": { - "defaultMessage": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router." - }, - "certificates.http.reachability-ok": { - "defaultMessage": "Your server is reachable and creating certificates should be possible." - }, - "certificates.http.reachability-other": { - "defaultMessage": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." - }, - "certificates.http.reachability-wrong-data": { - "defaultMessage": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." - }, - "certificates.http.test-results": { - "defaultMessage": "Test Results" - }, - "certificates.http.warning": { - "defaultMessage": "These domains must be already configured to point to this installation." - }, - "certificates.request.subtitle": { - "defaultMessage": "with Let's Encrypt" - }, - "certificates.request.title": { - "defaultMessage": "Request a new Certificate" - }, - "column.access": { - "defaultMessage": "Access" - }, - "column.authorization": { - "defaultMessage": "Authorization" - }, - "column.authorizations": { - "defaultMessage": "Authorizations" - }, - "column.custom-locations": { - "defaultMessage": "Custom Locations" - }, - "column.destination": { - "defaultMessage": "Destination" - }, - "column.details": { - "defaultMessage": "Details" - }, - "column.email": { - "defaultMessage": "Email" - }, - "column.event": { - "defaultMessage": "Event" - }, - "column.expires": { - "defaultMessage": "Expires" - }, - "column.http-code": { - "defaultMessage": "HTTP Code" - }, - "column.incoming-port": { - "defaultMessage": "Incoming Port" - }, - "column.name": { - "defaultMessage": "Name" - }, - "column.protocol": { - "defaultMessage": "Protocol" - }, - "column.provider": { - "defaultMessage": "Provider" - }, - "column.roles": { - "defaultMessage": "Roles" - }, - "column.rules": { - "defaultMessage": "Rules" - }, - "column.satisfy": { - "defaultMessage": "Satisfy" - }, - "column.satisfy-all": { - "defaultMessage": "All" - }, - "column.satisfy-any": { - "defaultMessage": "Any" - }, - "column.scheme": { - "defaultMessage": "Scheme" - }, - "column.source": { - "defaultMessage": "Source" - }, - "column.ssl": { - "defaultMessage": "SSL" - }, - "column.status": { - "defaultMessage": "Status" - }, - "created-on": { - "defaultMessage": "Created: {date}" - }, - "dashboard": { - "defaultMessage": "Dashboard" - }, - "dead-host": { - "defaultMessage": "404 Host" - }, - "dead-hosts": { - "defaultMessage": "404 Hosts" - }, - "dead-hosts.count": { - "defaultMessage": "{count} {count, plural, one {404 Host} other {404 Hosts}}" - }, - "disabled": { - "defaultMessage": "Disabled" - }, - "domain-names": { - "defaultMessage": "Domain Names" - }, - "domain-names.max": { - "defaultMessage": "{count} domain names maximum" - }, - "domain-names.placeholder": { - "defaultMessage": "Start typing to add domain..." - }, - "domain-names.wildcards-not-permitted": { - "defaultMessage": "Wildcards not permitted for this type" - }, - "domain-names.wildcards-not-supported": { - "defaultMessage": "Wildcards not supported for this CA" - }, - "domains.force-ssl": { - "defaultMessage": "Force SSL" - }, - "domains.hsts-enabled": { - "defaultMessage": "HSTS Enabled" - }, - "domains.hsts-subdomains": { - "defaultMessage": "HSTS Sub-domains" - }, - "domains.http2-support": { - "defaultMessage": "HTTP/2 Support" - }, - "domains.use-dns": { - "defaultMessage": "Use DNS Challenge" - }, - "email-address": { - "defaultMessage": "Email address" - }, - "empty-search": { - "defaultMessage": "No results found" - }, - "empty-subtitle": { - "defaultMessage": "Why don't you create one?" - }, - "enabled": { - "defaultMessage": "Enabled" - }, - "error.access.at-least-one": { - "defaultMessage": "Either one Authorization or one Access Rule is required" - }, - "error.access.duplicate-usernames": { - "defaultMessage": "Authorization Usernames must be unique" - }, - "error.invalid-auth": { - "defaultMessage": "Invalid email or password" - }, - "error.invalid-domain": { - "defaultMessage": "Invalid domain: {domain}" - }, - "error.invalid-email": { - "defaultMessage": "Invalid email address" - }, - "error.max-character-length": { - "defaultMessage": "Maximum length is {max} character{max, plural, one {} other {s}}" - }, - "error.max-domains": { - "defaultMessage": "Too many domains, max is {max}" - }, - "error.maximum": { - "defaultMessage": "Maximum is {max}" - }, - "error.min-character-length": { - "defaultMessage": "Minimum length is {min} character{min, plural, one {} other {s}}" - }, - "error.minimum": { - "defaultMessage": "Minimum is {min}" - }, - "error.passwords-must-match": { - "defaultMessage": "Passwords must match" - }, - "error.required": { - "defaultMessage": "This is required" - }, - "expires.on": { - "defaultMessage": "Expires: {date}" - }, - "footer.github-fork": { - "defaultMessage": "Fork me on Github" - }, - "host.flags.block-exploits": { - "defaultMessage": "Block Common Exploits" - }, - "host.flags.cache-assets": { - "defaultMessage": "Cache Assets" - }, - "host.flags.preserve-path": { - "defaultMessage": "Preserve Path" - }, - "host.flags.protocols": { - "defaultMessage": "Protocols" - }, - "host.flags.websockets-upgrade": { - "defaultMessage": "Websockets Support" - }, - "host.forward-port": { - "defaultMessage": "Forward Port" - }, - "host.forward-scheme": { - "defaultMessage": "Scheme" - }, - "hosts": { - "defaultMessage": "Hosts" - }, - "http-only": { - "defaultMessage": "HTTP Only" - }, - "lets-encrypt": { - "defaultMessage": "Let's Encrypt" - }, - "lets-encrypt-via-dns": { - "defaultMessage": "Let's Encrypt via DNS" - }, - "lets-encrypt-via-http": { - "defaultMessage": "Let's Encrypt via HTTP" - }, - "loading": { - "defaultMessage": "Loading…" - }, - "login.title": { - "defaultMessage": "Login to your account" - }, - "nginx-config.label": { - "defaultMessage": "Custom Nginx Configuration" - }, - "nginx-config.placeholder": { - "defaultMessage": "# Enter your custom Nginx configuration here at your own risk!" - }, - "no-permission-error": { - "defaultMessage": "You do not have access to view this." - }, - "notfound.action": { - "defaultMessage": "Take me home" - }, - "notfound.content": { - "defaultMessage": "We are sorry but the page you are looking for was not found" - }, - "notfound.title": { - "defaultMessage": "Oops… You just found an error page" - }, - "notification.error": { - "defaultMessage": "Error" - }, - "notification.object-deleted": { - "defaultMessage": "{object} has been deleted" - }, - "notification.object-disabled": { - "defaultMessage": "{object} has been disabled" - }, - "notification.object-enabled": { - "defaultMessage": "{object} has been enabled" - }, - "notification.object-renewed": { - "defaultMessage": "{object} has been renewed" - }, - "notification.object-saved": { - "defaultMessage": "{object} has been saved" - }, - "notification.success": { - "defaultMessage": "Success" - }, - "object.actions-title": { - "defaultMessage": "{object} #{id}" - }, - "object.add": { - "defaultMessage": "Add {object}" - }, - "object.delete": { - "defaultMessage": "Delete {object}" - }, - "object.delete.content": { - "defaultMessage": "Are you sure you want to delete this {object}?" - }, - "object.edit": { - "defaultMessage": "Edit {object}" - }, - "object.empty": { - "defaultMessage": "There are no {objects}" - }, - "object.event.created": { - "defaultMessage": "Created {object}" - }, - "object.event.deleted": { - "defaultMessage": "Deleted {object}" - }, - "object.event.disabled": { - "defaultMessage": "Disabled {object}" - }, - "object.event.enabled": { - "defaultMessage": "Enabled {object}" - }, - "object.event.renewed": { - "defaultMessage": "Renewed {object}" - }, - "object.event.updated": { - "defaultMessage": "Updated {object}" - }, - "offline": { - "defaultMessage": "Offline" - }, - "online": { - "defaultMessage": "Online" - }, - "options": { - "defaultMessage": "Options" - }, - "password": { - "defaultMessage": "Password" - }, - "password.generate": { - "defaultMessage": "Generate random password" - }, - "password.hide": { - "defaultMessage": "Hide Password" - }, - "password.show": { - "defaultMessage": "Show Password" - }, - "permissions.hidden": { - "defaultMessage": "Hidden" - }, - "permissions.manage": { - "defaultMessage": "Manage" - }, - "permissions.view": { - "defaultMessage": "View Only" - }, - "permissions.visibility.all": { - "defaultMessage": "All Items" - }, - "permissions.visibility.title": { - "defaultMessage": "Item Visibility" - }, - "permissions.visibility.user": { - "defaultMessage": "Created Items Only" - }, - "proxy-host": { - "defaultMessage": "Proxy Host" - }, - "proxy-host.forward-host": { - "defaultMessage": "Forward Hostname / IP" - }, - "proxy-hosts": { - "defaultMessage": "Proxy Hosts" - }, - "proxy-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}" - }, - "public": { - "defaultMessage": "Public" - }, - "redirection-host": { - "defaultMessage": "Redirection Host" - }, - "redirection-host.forward-domain": { - "defaultMessage": "Forward Domain" - }, - "redirection-host.forward-http-code": { - "defaultMessage": "HTTP Code" - }, - "redirection-hosts": { - "defaultMessage": "Redirection Hosts" - }, - "redirection-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}" - }, - "role.admin": { - "defaultMessage": "Administrator" - }, - "role.standard-user": { - "defaultMessage": "Standard User" - }, - "save": { - "defaultMessage": "Save" - }, - "setting": { - "defaultMessage": "Setting" - }, - "settings": { - "defaultMessage": "Settings" - }, - "settings.default-site": { - "defaultMessage": "Default Site" - }, - "settings.default-site.404": { - "defaultMessage": "404 Page" - }, - "settings.default-site.444": { - "defaultMessage": "No Response (444)" - }, - "settings.default-site.congratulations": { - "defaultMessage": "Congratulations Page" - }, - "settings.default-site.description": { - "defaultMessage": "What to show when Nginx is hit with an unknown Host" - }, - "settings.default-site.html": { - "defaultMessage": "Custom HTML" - }, - "settings.default-site.html.placeholder": { - "defaultMessage": "" - }, - "settings.default-site.redirect": { - "defaultMessage": "Redirect" - }, - "setup.preamble": { - "defaultMessage": "Get started by creating your admin account." - }, - "setup.title": { - "defaultMessage": "Welcome!" - }, - "sign-in": { - "defaultMessage": "Sign in" - }, - "ssl-certificate": { - "defaultMessage": "SSL Certificate" - }, - "stream": { - "defaultMessage": "Stream" - }, - "stream.forward-host": { - "defaultMessage": "Forward Host" - }, - "stream.incoming-port": { - "defaultMessage": "Incoming Port" - }, - "streams": { - "defaultMessage": "Streams" - }, - "streams.count": { - "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}" - }, - "streams.tcp": { - "defaultMessage": "TCP" - }, - "streams.udp": { - "defaultMessage": "UDP" - }, - "test": { - "defaultMessage": "Test" - }, - "update-available": { - "defaultMessage": "Update Available: {latestVersion}" - }, - "user": { - "defaultMessage": "User" - }, - "user.change-password": { - "defaultMessage": "Change Password" - }, - "user.confirm-password": { - "defaultMessage": "Confirm Password" - }, - "user.current-password": { - "defaultMessage": "Current Password" - }, - "user.edit-profile": { - "defaultMessage": "Edit Profile" - }, - "user.full-name": { - "defaultMessage": "Full Name" - }, - "user.login-as": { - "defaultMessage": "Sign in as {name}" - }, - "user.logout": { - "defaultMessage": "Logout" - }, - "user.new-password": { - "defaultMessage": "New Password" - }, - "user.nickname": { - "defaultMessage": "Nickname" - }, - "user.set-password": { - "defaultMessage": "Set Password" - }, - "user.set-permissions": { - "defaultMessage": "Set Permissions for {name}" - }, - "user.switch-dark": { - "defaultMessage": "Switch to Dark mode" - }, - "user.switch-light": { - "defaultMessage": "Switch to Light mode" - }, - "username": { - "defaultMessage": "Username" - }, - "users": { - "defaultMessage": "Users" - } -} diff --git a/frontend/src/locale/src/fr.json b/frontend/src/locale/src/fr.json new file mode 100644 index 0000000000..e3ef6d1d0f --- /dev/null +++ b/frontend/src/locale/src/fr.json @@ -0,0 +1,647 @@ +{ + "access-list": { + "defaultMessage": "Liste d'accès" + }, + "access-list.access-count": { + "defaultMessage": "{count} {count, plural, one {Règle} other {Règles}}" + }, + "access-list.auth-count": { + "defaultMessage": "{count} {count, plural, one {Utilisateur} other {Utilisateurs}}" + }, + "access-list.help-rules-last": { + "defaultMessage": "S'il existe au moins une règle, cette règle de refuser tout sera ajoutée en dernier." + }, + "access-list.help.rules-order": { + "defaultMessage": "Notez que les directives autoriser et refuser seront appliquées dans l'ordre où elles sont définies." + }, + "access-list.pass-auth": { + "defaultMessage": "Transmettre l'authentification au serveur en amont" + }, + "access-list.public": { + "defaultMessage": "Accessible au public" + }, + "access-list.public.subtitle": { + "defaultMessage": "Aucune authentification de base requise" + }, + "access-list.satisfy-any": { + "defaultMessage": "Valide n'importe quelle règle" + }, + "access-list.subtitle": { + "defaultMessage": "{utilisateurs} {utilisateurs, plural, one {Utilisateur} other {Utilisateurs}}, {règles} {règles, plural, one {Règle} other {Règles}} - Crée : {date}" + }, + "access-lists": { + "defaultMessage": "Listes d'accès" + }, + "action.add": { + "defaultMessage": "Ajouter" + }, + "action.add-location": { + "defaultMessage": "Ajouter localisation" + }, + "action.close": { + "defaultMessage": "Fermer" + }, + "action.delete": { + "defaultMessage": "Supprimer" + }, + "action.disable": { + "defaultMessage": "Désactiver" + }, + "action.download": { + "defaultMessage": "Télécharger" + }, + "action.edit": { + "defaultMessage": "Modifier" + }, + "action.enable": { + "defaultMessage": "Activer" + }, + "action.permissions": { + "defaultMessage": "Permissions" + }, + "action.renew": { + "defaultMessage": "Renouveler" + }, + "action.view-details": { + "defaultMessage": "Voir les Détails" + }, + "auditlogs": { + "defaultMessage": "Auditer les Logs" + }, + "cancel": { + "defaultMessage": "Annuler" + }, + "certificate": { + "defaultMessage": "Certificat" + }, + "certificate.custom-certificate": { + "defaultMessage": "Certificat" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "Clé du Certificat" + }, + "certificate.custom-intermediate": { + "defaultMessage": "Certificat intermédiaire" + }, + "certificate.in-use": { + "defaultMessage": "Utilisé" + }, + "certificate.none.subtitle": { + "defaultMessage": "Aucun certificat assigné" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "Cet hôte n'utilisera pas le HTTPS" + }, + "certificate.none.title": { + "defaultMessage": "Aucun" + }, + "certificate.not-in-use": { + "defaultMessage": "Non utilisé" + }, + "certificate.renew": { + "defaultMessage": "Renouveler Certificat" + }, + "certificates": { + "defaultMessage": "Certificats" + }, + "certificates.custom": { + "defaultMessage": "Certificat personnalisé" + }, + "certificates.custom.warning": { + "defaultMessage": "Les fichiers de clé protégés par une passphrase ne sont pas acceptés." + }, + "certificates.dns.credentials": { + "defaultMessage": "Contenu du fichier d'identifiants" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "Ce plugin nécessite un fichier de configuration contenant un jeton d'API ou d'autres informations d'identification pour votre fournisseur." + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "Ces données seront stockées en clair dans la base de données et dans un fichier !" + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "Propagation Seconds" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "Laisser vide pour utiliser la valeur par défaut du plugin. Nombre de secondes à attendre pour la propagation DNS." + }, + "certificates.dns.provider": { + "defaultMessage": "Fournisseur DNS" + }, + "certificates.dns.warning": { + "defaultMessage": "TCette section requiert une certaine connaissance de Certbot et de ses plugins DNS. Veuillez consulter la documentation des plugins correspondants." + }, + "certificates.http.reachability-404": { + "defaultMessage": "Un serveur a été trouvé sur ce domaine, mais il ne semble pas s'agir de Nginx Proxy Manager. Veuillez vérifier que votre domaine pointe bien vers l'adresse IP où votre instance NPM est exécutée." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "Impossible de vérifier l'accessibilité en raison d'une erreur de communication avec site24x7.com." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "Aucun serveur n'est disponible pour ce domaine. Veuillez vérifier que votre domaine existe et pointe vers l'adresse IP où votre instance NPM est exécutée. Si nécessaire, le port 80 est ouvert dans votre routeur." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "Votre serveur est accessible et la création de certificats devrait être possible." + }, + "certificates.http.reachability-other": { + "defaultMessage": "Un serveur a été trouvé sur ce domaine, mais il a renvoyé un code d'état inattendu {code}. S'agit-il du serveur NPM ? Veuillez vérifier que votre domaine pointe bien vers l'adresse IP où votre instance NPM est exécutée." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "Un serveur a été trouvé sur ce domaine, mais il a renvoyé des données inattendues. S'agit-il du serveur NPM ? Veuillez vérifier que votre domaine pointe bien vers l'adresse IP où votre instance NPM est exécutée." + }, + "certificates.http.test-results": { + "defaultMessage": "Résultats du test" + }, + "certificates.http.warning": { + "defaultMessage": "Ces domaines doivent déjà être configurés pour pointer vers cette installation." + }, + "certificates.request.subtitle": { + "defaultMessage": "avec Let's Encrypt" + }, + "certificates.request.title": { + "defaultMessage": "Demander un nouveau certificat" + }, + "column.access": { + "defaultMessage": "Accès" + }, + "column.authorization": { + "defaultMessage": "Autorisation" + }, + "column.authorizations": { + "defaultMessage": "Autorisations" + }, + "column.custom-locations": { + "defaultMessage": "Emplacement personnalisé" + }, + "column.destination": { + "defaultMessage": "Destination" + }, + "column.details": { + "defaultMessage": "Détails" + }, + "column.email": { + "defaultMessage": "eMail" + }, + "column.event": { + "defaultMessage": "Évènement" + }, + "column.expires": { + "defaultMessage": "Expire" + }, + "column.http-code": { + "defaultMessage": "Code HTTP" + }, + "column.incoming-port": { + "defaultMessage": "Port entrant" + }, + "column.name": { + "defaultMessage": "Nom" + }, + "column.protocol": { + "defaultMessage": "Protocole" + }, + "column.provider": { + "defaultMessage": "Fournisseur" + }, + "column.roles": { + "defaultMessage": "Rôles" + }, + "column.rules": { + "defaultMessage": "Règles" + }, + "column.satisfy": { + "defaultMessage": "Valide" + }, + "column.satisfy-all": { + "defaultMessage": "All" + }, + "column.satisfy-any": { + "defaultMessage": "Any" + }, + "column.scheme": { + "defaultMessage": "Schéma" + }, + "column.source": { + "defaultMessage": "Source" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "Statut" + }, + "created-on": { + "defaultMessage": "Créé : {date}" + }, + "dashboard": { + "defaultMessage": "Tableau de bord" + }, + "dead-host": { + "defaultMessage": "Hôte 404" + }, + "dead-hosts": { + "defaultMessage": "Hôtes 404" + }, + "dead-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Hôte 404} other {Hôtes 404}}" + }, + "disabled": { + "defaultMessage": "Désactivé" + }, + "domain-names": { + "defaultMessage": "Noms de domaine" + }, + "domain-names.max": { + "defaultMessage": "{count} noms de domaine au maximum" + }, + "domain-names.placeholder": { + "defaultMessage": "Commencez à écrire pour ajouter un domaine…" + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "Les Wildcards ne sont pas permises dans ce cas" + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "Les Wildcards ne sont pas prises en charge par cette autorité de certification." + }, + "domains.force-ssl": { + "defaultMessage": "Forcer SSL" + }, + "domains.hsts-enabled": { + "defaultMessage": "HSTS activé" + }, + "domains.hsts-subdomains": { + "defaultMessage": "Sous-domaines HSTS" + }, + "domains.http2-support": { + "defaultMessage": "Prise en charge de HTTP/2" + }, + "domains.use-dns": { + "defaultMessage": "Utiliser le challenge DNS" + }, + "email-address": { + "defaultMessage": "Adresse eMail" + }, + "empty-search": { + "defaultMessage": "Aucun résultat trouvé" + }, + "empty-subtitle": { + "defaultMessage": "Pourquoi n'en créez-vous pas un ?" + }, + "enabled": { + "defaultMessage": "Activé" + }, + "error.access.at-least-one": { + "defaultMessage": "Une autorisation ou une règle d'accès est requise." + }, + "error.access.duplicate-usernames": { + "defaultMessage": "Les noms d'utilisateurs autorisés doivent être uniques" + }, + "error.invalid-auth": { + "defaultMessage": "Adresse eMail ou mot de passe invalide" + }, + "error.invalid-domain": { + "defaultMessage": "Domaine invalide : {domain}" + }, + "error.invalid-email": { + "defaultMessage": "Adresse eMail invalide" + }, + "error.max-character-length": { + "defaultMessage": "La longueur maximale est {max} caractère{max, plural, one {} other {s}}" + }, + "error.max-domains": { + "defaultMessage": "Trop de domaines, le maximum est {max}" + }, + "error.maximum": { + "defaultMessage": "Le maximum est {max}" + }, + "error.min-character-length": { + "defaultMessage": "La longueur minimale est {min} caractère{min, plural, one {} other {s}}" + }, + "error.minimum": { + "defaultMessage": "Le minimum est {min}" + }, + "error.passwords-must-match": { + "defaultMessage": "Les mots de passe doivent correspondre" + }, + "error.required": { + "defaultMessage": "Ceci est obligatoire" + }, + "expires.on": { + "defaultMessage": "Expire : {date}" + }, + "footer.github-fork": { + "defaultMessage": "Forkez-moi sur Github" + }, + "host.flags.block-exploits": { + "defaultMessage": "Bloquer les exploits courants" + }, + "host.flags.cache-assets": { + "defaultMessage": "Ressources du cache" + }, + "host.flags.preserve-path": { + "defaultMessage": "Préserver le chemin" + }, + "host.flags.protocols": { + "defaultMessage": "Protocoles" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "Prise en charge de Websockets" + }, + "host.forward-port": { + "defaultMessage": "Port de redirection" + }, + "host.forward-scheme": { + "defaultMessage": "Schéma" + }, + "hosts": { + "defaultMessage": "Hôtes" + }, + "http-only": { + "defaultMessage": "HTTP uniquement" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt via DNS" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt via HTTP" + }, + "loading": { + "defaultMessage": "Chargement…" + }, + "login.title": { + "defaultMessage": "Connectez-vous à votre compte" + }, + "nginx-config.label": { + "defaultMessage": "Configuration Nginx personnalisée" + }, + "nginx-config.placeholder": { + "defaultMessage": "# Mettez ici votre configuration Nginx personnalisé à vos risques et périls !" + }, + "no-permission-error": { + "defaultMessage": "Vous n'avez pas la permission de voir ce contenu." + }, + "notfound.action": { + "defaultMessage": "Ramenez-moi à l'accueil" + }, + "notfound.content": { + "defaultMessage": "Nous sommes désolés, mais la page que vous cherchez est introuvable" + }, + "notfound.title": { + "defaultMessage": "Oops… Vous avez découvert une page d'erreur" + }, + "notification.error": { + "defaultMessage": "Erreur" + }, + "notification.object-deleted": { + "defaultMessage": "{object} a été supprimé" + }, + "notification.object-disabled": { + "defaultMessage": "{object} a été désactivé" + }, + "notification.object-enabled": { + "defaultMessage": "{object} a été activé" + }, + "notification.object-renewed": { + "defaultMessage": "{object} a été renouvelé" + }, + "notification.object-saved": { + "defaultMessage": "{object} a été enregistré" + }, + "notification.success": { + "defaultMessage": "Réussi" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "Ajouter {object}" + }, + "object.delete": { + "defaultMessage": "Supprimer {object}" + }, + "object.delete.content": { + "defaultMessage": "Êtes-vous sûr de vouloir supprimer {object} ?" + }, + "object.edit": { + "defaultMessage": "Modifier {object}" + }, + "object.empty": { + "defaultMessage": "Il n'y a aucun {objects}" + }, + "object.event.created": { + "defaultMessage": "{object} créé" + }, + "object.event.deleted": { + "defaultMessage": "{object} supprimé" + }, + "object.event.disabled": { + "defaultMessage": "{object} désactivé" + }, + "object.event.enabled": { + "defaultMessage": "{object} activé" + }, + "object.event.renewed": { + "defaultMessage": "{object} renouvelé" + }, + "object.event.updated": { + "defaultMessage": "{object} mis à jour" + }, + "offline": { + "defaultMessage": "Hors ligne" + }, + "online": { + "defaultMessage": "En ligne" + }, + "options": { + "defaultMessage": "Options" + }, + "password": { + "defaultMessage": "Mot de passe" + }, + "password.generate": { + "defaultMessage": "Générer un mot de passe aléatoire" + }, + "password.hide": { + "defaultMessage": "Masquer le mot de passe" + }, + "password.show": { + "defaultMessage": "Afficher le mot de passe" + }, + "permissions.hidden": { + "defaultMessage": "Masquer" + }, + "permissions.manage": { + "defaultMessage": "Gérer" + }, + "permissions.view": { + "defaultMessage": "Voir uniquement" + }, + "permissions.visibility.all": { + "defaultMessage": "Tous les éléments" + }, + "permissions.visibility.title": { + "defaultMessage": "Éléments visibles" + }, + "permissions.visibility.user": { + "defaultMessage": "Éléments créés uniquement" + }, + "proxy-host": { + "defaultMessage": "Hôte proxy" + }, + "proxy-host.forward-host": { + "defaultMessage": "Nom d'hôte de redirection / IP" + }, + "proxy-hosts": { + "defaultMessage": "Hôtes proxy" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Hôte proxy} other {Hôtes proxy}}" + }, + "public": { + "defaultMessage": "Publique" + }, + "redirection-host": { + "defaultMessage": "Hôte de redirection" + }, + "redirection-host.forward-domain": { + "defaultMessage": "Domaine de redirection" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "Code HTTP" + }, + "redirection-hosts": { + "defaultMessage": "Hôtes de redirection" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Hôte de redirection} other {Hôtes de redirection}}" + }, + "role.admin": { + "defaultMessage": "Administrateur" + }, + "role.standard-user": { + "defaultMessage": "Utilisateur standard" + }, + "save": { + "defaultMessage": "Enregistrer" + }, + "setting": { + "defaultMessage": "Paramètre" + }, + "settings": { + "defaultMessage": "Paramètres" + }, + "settings.default-site": { + "defaultMessage": "Site par défaut" + }, + "settings.default-site.404": { + "defaultMessage": "Page 404" + }, + "settings.default-site.444": { + "defaultMessage": "Aucune réponse (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "Page de félicitations" + }, + "settings.default-site.description": { + "defaultMessage": "ce qu'il faut afficher lorsqu'un hôte inconnu est détecté par Nginx" + }, + "settings.default-site.html": { + "defaultMessage": "HTML personnalisé" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "Redirection" + }, + "setup.preamble": { + "defaultMessage": "Commencez par créer votre compte administrateur." + }, + "setup.title": { + "defaultMessage": "Bienvenue !" + }, + "sign-in": { + "defaultMessage": "Se connecter" + }, + "ssl-certificate": { + "defaultMessage": "Certificat SSL" + }, + "stream": { + "defaultMessage": "Stream" + }, + "stream.forward-host": { + "defaultMessage": "Hôte destinataire" + }, + "stream.incoming-port": { + "defaultMessage": "Port d'entrée" + }, + "streams": { + "defaultMessage": "Streams" + }, + "streams.count": { + "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "Test" + }, + "update-available": { + "defaultMessage": "Mise à jour disponible : {latestVersion}" + }, + "user": { + "defaultMessage": "Utilisateur" + }, + "user.change-password": { + "defaultMessage": "Modifier le mot de passe" + }, + "user.confirm-password": { + "defaultMessage": "Confirmer le mot de passe" + }, + "user.current-password": { + "defaultMessage": "Mot de passe actuel" + }, + "user.edit-profile": { + "defaultMessage": "Modifier le profil" + }, + "user.full-name": { + "defaultMessage": "Nom complet" + }, + "user.login-as": { + "defaultMessage": "Se connecter en tant que {name}" + }, + "user.logout": { + "defaultMessage": "Déconnexion" + }, + "user.new-password": { + "defaultMessage": "Nouveau mot de passe" + }, + "user.nickname": { + "defaultMessage": "Pseudonyme" + }, + "user.set-password": { + "defaultMessage": "Définir le mot de passe" + }, + "user.set-permissions": { + "defaultMessage": "Définir les autorisations pour {name}" + }, + "user.switch-dark": { + "defaultMessage": "Passer au mode Sombre" + }, + "user.switch-light": { + "defaultMessage": "Passer au mode Lumineux" + }, + "username": { + "defaultMessage": "Nom d'utilisateur" + }, + "users": { + "defaultMessage": "Utilisateurs" + } +} From d40c9a234b803eb3f4e9da4f15957a0021ff04e7 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 19:32:13 +0100 Subject: [PATCH 03/10] Add french HelpDocs --- .../src/locale/src/HelpDoc/fr/AccessLists.md | 7 ++++++ .../src/locale/src/HelpDoc/fr/Certificates.md | 23 +++++++++++++++++++ .../src/locale/src/HelpDoc/fr/DeadHosts.md | 7 ++++++ .../src/locale/src/HelpDoc/fr/ProxyHosts.md | 7 ++++++ .../locale/src/HelpDoc/fr/RedirectionHosts.md | 5 ++++ frontend/src/locale/src/HelpDoc/fr/Streams.md | 5 ++++ frontend/src/locale/src/HelpDoc/fr/index.ts | 6 +++++ 7 files changed, 60 insertions(+) create mode 100644 frontend/src/locale/src/HelpDoc/fr/AccessLists.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/Certificates.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/DeadHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/Streams.md create mode 100644 frontend/src/locale/src/HelpDoc/fr/index.ts diff --git a/frontend/src/locale/src/HelpDoc/fr/AccessLists.md b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md new file mode 100644 index 0000000000..4f44194b16 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md @@ -0,0 +1,7 @@ +## Qu'est-ce qu'une liste d'accès ? + +Les listes d'accès permettent de définir une liste noire ou une liste blanche d'adresses IP clientes spécifiques, ainsi que l'authentification des serveurs proxy via l'authentification HTTP de base. + +Vous pouvez configurer plusieurs règles client, noms d'utilisateur et mots de passe pour une même liste d'accès, puis l'appliquer à un ou plusieurs serveurs proxy. + +Ceci est particulièrement utile pour les services web redirigés qui ne disposent pas de mécanismes d'authentification intégrés ou lorsque vous souhaitez vous protéger contre les clients inconnus. diff --git a/frontend/src/locale/src/HelpDoc/fr/Certificates.md b/frontend/src/locale/src/HelpDoc/fr/Certificates.md new file mode 100644 index 0000000000..606edcea20 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/Certificates.md @@ -0,0 +1,23 @@ +## Aide concernant les certificats + +### Certificat HTTP + +Un certificat HTTP validé signifie que les serveurs de Let's Encrypt tenteront d'accéder à vos domaines via HTTP (et non HTTPS !). En cas de succès, ils émettront votre certificat. + +Pour cette méthode, vous devrez créer un serveur proxy pour votre ou vos domaines. Ce serveur proxy devra être accessible via HTTP et pointer vers cette installation Nginx. Une fois le certificat émis, vous pourrez modifier le serveur proxy pour qu'il utilise également ce certificat pour les connexions HTTPS. Cependant, le serveur proxy devra toujours être configuré pour l'accès HTTP afin que le certificat puisse être renouvelé. + +Ce processus ne prend pas en charge les domaines génériques. + +### Certificat DNS + +Un certificat DNS validé nécessite l'utilisation d'un plugin de fournisseur DNS. Ce fournisseur DNS créera des enregistrements temporaires sur votre domaine. Let's Encrypt interrogera ensuite ces enregistrements pour vérifier que vous en êtes bien le propriétaire. En cas de succès, ils émettront votre certificat. + +Il n'est pas nécessaire de créer un serveur proxy avant de demander ce type de certificat. + +Il n'est pas non plus nécessaire de configurer votre serveur proxy pour l'accès HTTP. + +Ce processus prend en charge les domaines génériques. + +## Certificat personnalisé + +Utilisez cette option pour importer votre propre certificat SSL, fourni par votre autorité de certification. diff --git a/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md new file mode 100644 index 0000000000..aaef1e218e --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md @@ -0,0 +1,7 @@ +## Qu'est-ce qu'un serveur 404 ? + +Un serveur 404 est simplement un serveur configuré pour afficher une page 404. + +Cela peut s'avérer utile lorsque votre domaine est indexé par les moteurs de recherche et que vous souhaitez fournir une page d'erreur plus conviviale ou, plus précisément, indiquer aux moteurs de recherche que les pages du domaine n'existent plus. + +Un autre avantage de ce serveur est la possibilité de suivre les journaux d'activité et de consulter les sites référents. diff --git a/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md new file mode 100644 index 0000000000..f4463736ee --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md @@ -0,0 +1,7 @@ +## Qu'est-ce qu'un hôte proxy ? + +Un hôte proxy est le point de terminaison entrant d'un service web que vous souhaitez rediriger. + +Il assure la terminaison SSL optionnelle pour votre service qui ne prend pas en charge SSL nativement. + +Les hôtes proxy constituent l'utilisation la plus courante du gestionnaire de proxy Nginx. diff --git a/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md new file mode 100644 index 0000000000..2a5a8e2384 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md @@ -0,0 +1,5 @@ +## Qu'est-ce qu'un serveur de redirection ? + +Un serveur de redirection redirige les requêtes provenant du domaine entrant vers un autre domaine. + +On utilise généralement ce type de serveur lorsque votre site web change de domaine, mais que des liens provenant des moteurs de recherche ou des sites référents pointent toujours vers l'ancien domaine. diff --git a/frontend/src/locale/src/HelpDoc/fr/Streams.md b/frontend/src/locale/src/HelpDoc/fr/Streams.md new file mode 100644 index 0000000000..74668b9928 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/Streams.md @@ -0,0 +1,5 @@ +## Qu'est-ce qu'un Stream ? + +Fonctionnalité relativement récente de Nginx, un Stream permet de rediriger le trafic TCP/UDP directement vers un autre ordinateur du réseau. + +Si vous gérez des serveurs de jeux, FTP ou SSH, cela peut s'avérer très utile. diff --git a/frontend/src/locale/src/HelpDoc/fr/index.ts b/frontend/src/locale/src/HelpDoc/fr/index.ts new file mode 100644 index 0000000000..a9bb46ba7c --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/fr/index.ts @@ -0,0 +1,6 @@ +export * as AccessLists from "./AccessLists.md"; +export * as Certificates from "./Certificates.md"; +export * as DeadHosts from "./DeadHosts.md"; +export * as ProxyHosts from "./ProxyHosts.md"; +export * as RedirectionHosts from "./RedirectionHosts.md"; +export * as Streams from "./Streams.md"; From 855e0daee72d35a36b0b028ccefa9a43bd28bd8e Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 19:53:05 +0100 Subject: [PATCH 04/10] ReUpload en.json Error while adding the fr.json file. --- frontend/src/locale/src/en.json | 647 ++++++++++++++++++++++++++++++++ 1 file changed, 647 insertions(+) create mode 100644 frontend/src/locale/src/en.json diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json new file mode 100644 index 0000000000..02e9f8fab9 --- /dev/null +++ b/frontend/src/locale/src/en.json @@ -0,0 +1,647 @@ +{ + "access-list": { + "defaultMessage": "Access List" + }, + "access-list.access-count": { + "defaultMessage": "{count} {count, plural, one {Rule} other {Rules}}" + }, + "access-list.auth-count": { + "defaultMessage": "{count} {count, plural, one {User} other {Users}}" + }, + "access-list.help-rules-last": { + "defaultMessage": "When at least 1 rule exists, this deny all rule will be added last" + }, + "access-list.help.rules-order": { + "defaultMessage": "Note that the allow and deny directives will be applied in the order they are defined." + }, + "access-list.pass-auth": { + "defaultMessage": "Pass Auth to Upstream" + }, + "access-list.public": { + "defaultMessage": "Publicly Accessible" + }, + "access-list.public.subtitle": { + "defaultMessage": "No basic auth required" + }, + "access-list.satisfy-any": { + "defaultMessage": "Satisfy Any" + }, + "access-list.subtitle": { + "defaultMessage": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}" + }, + "access-lists": { + "defaultMessage": "Access Lists" + }, + "action.add": { + "defaultMessage": "Add" + }, + "action.add-location": { + "defaultMessage": "Add Location" + }, + "action.close": { + "defaultMessage": "Close" + }, + "action.delete": { + "defaultMessage": "Delete" + }, + "action.disable": { + "defaultMessage": "Disable" + }, + "action.download": { + "defaultMessage": "Download" + }, + "action.edit": { + "defaultMessage": "Edit" + }, + "action.enable": { + "defaultMessage": "Enable" + }, + "action.permissions": { + "defaultMessage": "Permissions" + }, + "action.renew": { + "defaultMessage": "Renew" + }, + "action.view-details": { + "defaultMessage": "View Details" + }, + "auditlogs": { + "defaultMessage": "Audit Logs" + }, + "cancel": { + "defaultMessage": "Cancel" + }, + "certificate": { + "defaultMessage": "Certificate" + }, + "certificate.custom-certificate": { + "defaultMessage": "Certificate" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "Certificate Key" + }, + "certificate.custom-intermediate": { + "defaultMessage": "Intermediate Certificate" + }, + "certificate.in-use": { + "defaultMessage": "In Use" + }, + "certificate.none.subtitle": { + "defaultMessage": "No certificate assigned" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "This host will not use HTTPS" + }, + "certificate.none.title": { + "defaultMessage": "None" + }, + "certificate.not-in-use": { + "defaultMessage": "Not Used" + }, + "certificate.renew": { + "defaultMessage": "Renew Certificate" + }, + "certificates": { + "defaultMessage": "Certificates" + }, + "certificates.custom": { + "defaultMessage": "Custom Certificate" + }, + "certificates.custom.warning": { + "defaultMessage": "Key files protected with a passphrase are not supported." + }, + "certificates.dns.credentials": { + "defaultMessage": "Credentials File Content" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "This plugin requires a configuration file containing an API token or other credentials for your provider" + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "This data will be stored as plaintext in the database and in a file!" + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "Propagation Seconds" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation." + }, + "certificates.dns.provider": { + "defaultMessage": "DNS Provider" + }, + "certificates.dns.warning": { + "defaultMessage": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation." + }, + "certificates.http.reachability-404": { + "defaultMessage": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "Failed to check the reachability due to a communication error with site24x7.com." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "Your server is reachable and creating certificates should be possible." + }, + "certificates.http.reachability-other": { + "defaultMessage": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.test-results": { + "defaultMessage": "Test Results" + }, + "certificates.http.warning": { + "defaultMessage": "These domains must be already configured to point to this installation." + }, + "certificates.request.subtitle": { + "defaultMessage": "with Let's Encrypt" + }, + "certificates.request.title": { + "defaultMessage": "Request a new Certificate" + }, + "column.access": { + "defaultMessage": "Access" + }, + "column.authorization": { + "defaultMessage": "Authorization" + }, + "column.authorizations": { + "defaultMessage": "Authorizations" + }, + "column.custom-locations": { + "defaultMessage": "Custom Locations" + }, + "column.destination": { + "defaultMessage": "Destination" + }, + "column.details": { + "defaultMessage": "Details" + }, + "column.email": { + "defaultMessage": "Email" + }, + "column.event": { + "defaultMessage": "Event" + }, + "column.expires": { + "defaultMessage": "Expires" + }, + "column.http-code": { + "defaultMessage": "HTTP Code" + }, + "column.incoming-port": { + "defaultMessage": "Incoming Port" + }, + "column.name": { + "defaultMessage": "Name" + }, + "column.protocol": { + "defaultMessage": "Protocol" + }, + "column.provider": { + "defaultMessage": "Provider" + }, + "column.roles": { + "defaultMessage": "Roles" + }, + "column.rules": { + "defaultMessage": "Rules" + }, + "column.satisfy": { + "defaultMessage": "Satisfy" + }, + "column.satisfy-all": { + "defaultMessage": "All" + }, + "column.satisfy-any": { + "defaultMessage": "Any" + }, + "column.scheme": { + "defaultMessage": "Scheme" + }, + "column.source": { + "defaultMessage": "Source" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "Status" + }, + "created-on": { + "defaultMessage": "Created: {date}" + }, + "dashboard": { + "defaultMessage": "Dashboard" + }, + "dead-host": { + "defaultMessage": "404 Host" + }, + "dead-hosts": { + "defaultMessage": "404 Hosts" + }, + "dead-hosts.count": { + "defaultMessage": "{count} {count, plural, one {404 Host} other {404 Hosts}}" + }, + "disabled": { + "defaultMessage": "Disabled" + }, + "domain-names": { + "defaultMessage": "Domain Names" + }, + "domain-names.max": { + "defaultMessage": "{count} domain names maximum" + }, + "domain-names.placeholder": { + "defaultMessage": "Start typing to add domain..." + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "Wildcards not permitted for this type" + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "Wildcards not supported for this CA" + }, + "domains.force-ssl": { + "defaultMessage": "Force SSL" + }, + "domains.hsts-enabled": { + "defaultMessage": "HSTS Enabled" + }, + "domains.hsts-subdomains": { + "defaultMessage": "HSTS Sub-domains" + }, + "domains.http2-support": { + "defaultMessage": "HTTP/2 Support" + }, + "domains.use-dns": { + "defaultMessage": "Use DNS Challenge" + }, + "email-address": { + "defaultMessage": "Email address" + }, + "empty-search": { + "defaultMessage": "No results found" + }, + "empty-subtitle": { + "defaultMessage": "Why don't you create one?" + }, + "enabled": { + "defaultMessage": "Enabled" + }, + "error.access.at-least-one": { + "defaultMessage": "Either one Authorization or one Access Rule is required" + }, + "error.access.duplicate-usernames": { + "defaultMessage": "Authorization Usernames must be unique" + }, + "error.invalid-auth": { + "defaultMessage": "Invalid email or password" + }, + "error.invalid-domain": { + "defaultMessage": "Invalid domain: {domain}" + }, + "error.invalid-email": { + "defaultMessage": "Invalid email address" + }, + "error.max-character-length": { + "defaultMessage": "Maximum length is {max} character{max, plural, one {} other {s}}" + }, + "error.max-domains": { + "defaultMessage": "Too many domains, max is {max}" + }, + "error.maximum": { + "defaultMessage": "Maximum is {max}" + }, + "error.min-character-length": { + "defaultMessage": "Minimum length is {min} character{min, plural, one {} other {s}}" + }, + "error.minimum": { + "defaultMessage": "Minimum is {min}" + }, + "error.passwords-must-match": { + "defaultMessage": "Passwords must match" + }, + "error.required": { + "defaultMessage": "This is required" + }, + "expires.on": { + "defaultMessage": "Expires: {date}" + }, + "footer.github-fork": { + "defaultMessage": "Fork me on Github" + }, + "host.flags.block-exploits": { + "defaultMessage": "Block Common Exploits" + }, + "host.flags.cache-assets": { + "defaultMessage": "Cache Assets" + }, + "host.flags.preserve-path": { + "defaultMessage": "Preserve Path" + }, + "host.flags.protocols": { + "defaultMessage": "Protocols" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "Websockets Support" + }, + "host.forward-port": { + "defaultMessage": "Forward Port" + }, + "host.forward-scheme": { + "defaultMessage": "Scheme" + }, + "hosts": { + "defaultMessage": "Hosts" + }, + "http-only": { + "defaultMessage": "HTTP Only" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt via DNS" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt via HTTP" + }, + "loading": { + "defaultMessage": "Loading…" + }, + "login.title": { + "defaultMessage": "Login to your account" + }, + "nginx-config.label": { + "defaultMessage": "Custom Nginx Configuration" + }, + "nginx-config.placeholder": { + "defaultMessage": "# Enter your custom Nginx configuration here at your own risk!" + }, + "no-permission-error": { + "defaultMessage": "You do not have access to view this." + }, + "notfound.action": { + "defaultMessage": "Take me home" + }, + "notfound.content": { + "defaultMessage": "We are sorry but the page you are looking for was not found" + }, + "notfound.title": { + "defaultMessage": "Oops… You just found an error page" + }, + "notification.error": { + "defaultMessage": "Error" + }, + "notification.object-deleted": { + "defaultMessage": "{object} has been deleted" + }, + "notification.object-disabled": { + "defaultMessage": "{object} has been disabled" + }, + "notification.object-enabled": { + "defaultMessage": "{object} has been enabled" + }, + "notification.object-renewed": { + "defaultMessage": "{object} has been renewed" + }, + "notification.object-saved": { + "defaultMessage": "{object} has been saved" + }, + "notification.success": { + "defaultMessage": "Success" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "Add {object}" + }, + "object.delete": { + "defaultMessage": "Delete {object}" + }, + "object.delete.content": { + "defaultMessage": "Are you sure you want to delete this {object}?" + }, + "object.edit": { + "defaultMessage": "Edit {object}" + }, + "object.empty": { + "defaultMessage": "There are no {objects}" + }, + "object.event.created": { + "defaultMessage": "Created {object}" + }, + "object.event.deleted": { + "defaultMessage": "Deleted {object}" + }, + "object.event.disabled": { + "defaultMessage": "Disabled {object}" + }, + "object.event.enabled": { + "defaultMessage": "Enabled {object}" + }, + "object.event.renewed": { + "defaultMessage": "Renewed {object}" + }, + "object.event.updated": { + "defaultMessage": "Updated {object}" + }, + "offline": { + "defaultMessage": "Offline" + }, + "online": { + "defaultMessage": "Online" + }, + "options": { + "defaultMessage": "Options" + }, + "password": { + "defaultMessage": "Password" + }, + "password.generate": { + "defaultMessage": "Generate random password" + }, + "password.hide": { + "defaultMessage": "Hide Password" + }, + "password.show": { + "defaultMessage": "Show Password" + }, + "permissions.hidden": { + "defaultMessage": "Hidden" + }, + "permissions.manage": { + "defaultMessage": "Manage" + }, + "permissions.view": { + "defaultMessage": "View Only" + }, + "permissions.visibility.all": { + "defaultMessage": "All Items" + }, + "permissions.visibility.title": { + "defaultMessage": "Item Visibility" + }, + "permissions.visibility.user": { + "defaultMessage": "Created Items Only" + }, + "proxy-host": { + "defaultMessage": "Proxy Host" + }, + "proxy-host.forward-host": { + "defaultMessage": "Forward Hostname / IP" + }, + "proxy-hosts": { + "defaultMessage": "Proxy Hosts" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}" + }, + "public": { + "defaultMessage": "Public" + }, + "redirection-host": { + "defaultMessage": "Redirection Host" + }, + "redirection-host.forward-domain": { + "defaultMessage": "Forward Domain" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "HTTP Code" + }, + "redirection-hosts": { + "defaultMessage": "Redirection Hosts" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}" + }, + "role.admin": { + "defaultMessage": "Administrator" + }, + "role.standard-user": { + "defaultMessage": "Standard User" + }, + "save": { + "defaultMessage": "Save" + }, + "setting": { + "defaultMessage": "Setting" + }, + "settings": { + "defaultMessage": "Settings" + }, + "settings.default-site": { + "defaultMessage": "Default Site" + }, + "settings.default-site.404": { + "defaultMessage": "404 Page" + }, + "settings.default-site.444": { + "defaultMessage": "No Response (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "Congratulations Page" + }, + "settings.default-site.description": { + "defaultMessage": "What to show when Nginx is hit with an unknown Host" + }, + "settings.default-site.html": { + "defaultMessage": "Custom HTML" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "Redirect" + }, + "setup.preamble": { + "defaultMessage": "Get started by creating your admin account." + }, + "setup.title": { + "defaultMessage": "Welcome!" + }, + "sign-in": { + "defaultMessage": "Sign in" + }, + "ssl-certificate": { + "defaultMessage": "SSL Certificate" + }, + "stream": { + "defaultMessage": "Stream" + }, + "stream.forward-host": { + "defaultMessage": "Forward Host" + }, + "stream.incoming-port": { + "defaultMessage": "Incoming Port" + }, + "streams": { + "defaultMessage": "Streams" + }, + "streams.count": { + "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "Test" + }, + "update-available": { + "defaultMessage": "Update Available: {latestVersion}" + }, + "user": { + "defaultMessage": "User" + }, + "user.change-password": { + "defaultMessage": "Change Password" + }, + "user.confirm-password": { + "defaultMessage": "Confirm Password" + }, + "user.current-password": { + "defaultMessage": "Current Password" + }, + "user.edit-profile": { + "defaultMessage": "Edit Profile" + }, + "user.full-name": { + "defaultMessage": "Full Name" + }, + "user.login-as": { + "defaultMessage": "Sign in as {name}" + }, + "user.logout": { + "defaultMessage": "Logout" + }, + "user.new-password": { + "defaultMessage": "New Password" + }, + "user.nickname": { + "defaultMessage": "Nickname" + }, + "user.set-password": { + "defaultMessage": "Set Password" + }, + "user.set-permissions": { + "defaultMessage": "Set Permissions for {name}" + }, + "user.switch-dark": { + "defaultMessage": "Switch to Dark mode" + }, + "user.switch-light": { + "defaultMessage": "Switch to Light mode" + }, + "username": { + "defaultMessage": "Username" + }, + "users": { + "defaultMessage": "Users" + } +} From 17cb545dac0d9f6ad9589fe66ddc6b39bc9fbf28 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 20:02:19 +0100 Subject: [PATCH 05/10] Update IntlProvider.tsx to add french --- frontend/src/locale/IntlProvider.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index f0f347aeb8..90fd7813e4 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -2,6 +2,7 @@ import { createIntl, createIntlCache } from "react-intl"; import langDe from "./lang/de.json"; import langEn from "./lang/en.json"; import langEs from "./lang/es.json"; +import langFr from "./lang/fr.json"; import langJa from "./lang/ja.json"; import langList from "./lang/lang-list.json"; import langRu from "./lang/ru.json"; @@ -16,6 +17,7 @@ const localeOptions = [ ["en", "en-US"], ["de", "de-DE"], ["es", "es-ES"], + ["es", "fr-FR"], ["ja", "ja-JP"], ["ru", "ru-RU"], ["sk", "sk-SK"], @@ -28,6 +30,8 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => { switch (thisLocale.slice(0, 2)) { case "de": return Object.assign({}, langList, langEn, langDe); + case "fr": + return Object.assign({}, langList, langEn, langFr); case "es": return Object.assign({}, langList, langEn, langEs); case "ja": @@ -47,6 +51,9 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => { const getFlagCodeForLocale = (locale?: string) => { switch (locale) { + case "fr-FR": + case "fr": + return "FR"; case "es-ES": case "es": return "ES"; From 8f66b0ae8d1a7f753eab16ed354313134ca2bb21 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 20:03:38 +0100 Subject: [PATCH 06/10] Update index.ts to add french --- frontend/src/locale/src/HelpDoc/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index af33919e7c..3837dd1562 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -1,12 +1,13 @@ import * as de from "./de/index"; import * as en from "./en/index"; +import * as fr from "./fr/index"; import * as ja from "./ja/index"; import * as pl from "./pl/index"; import * as ru from "./ru/index"; import * as sk from "./sk/index"; import * as zh from "./zh/index"; -const items: any = { en, de, ja, sk, zh, pl, ru }; +const items: any = { en, es, de, fr, ja, sk, zh, pl, ru }; const fallbackLang = "en"; From b2f4e570536a4c302de1501d8b36ead13587b760 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 20:07:20 +0100 Subject: [PATCH 07/10] Update index.ts to add ES --- frontend/src/locale/src/HelpDoc/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index 3837dd1562..841dac6f40 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -1,5 +1,6 @@ import * as de from "./de/index"; import * as en from "./en/index"; +import * as es from "./es/index"; import * as fr from "./fr/index"; import * as ja from "./ja/index"; import * as pl from "./pl/index"; From 708a107f01e3995648c670b868d8e0742c693a49 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Tue, 18 Nov 2025 14:31:56 +0100 Subject: [PATCH 08/10] Update check-locales.cjs to add french Add alphabetical order to the listing. --- frontend/check-locales.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs index bd871169fb..cd03ad68d8 100755 --- a/frontend/check-locales.cjs +++ b/frontend/check-locales.cjs @@ -7,9 +7,10 @@ // - Also checks the error messages returned by the backend const allLocales = [ - ["en", "en-US"], ["de", "de-DE"], + ["en", "en-US"], ["es", "es-ES"], + ["fr", "fr-FR"], ["it", "it-IT"], ["ja", "ja-JP"], ["nl", "nl-NL"], From 494e6d6bd58f980fc8132c6bc5bf590ed43cd5fc Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Tue, 18 Nov 2025 14:34:36 +0100 Subject: [PATCH 09/10] Update IntlProvider.tsx to add french Add alphabetical order to sort languages. --- frontend/src/locale/IntlProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 562d4fb0e8..2639f53ed4 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -17,8 +17,8 @@ import langZh from "./lang/zh.json"; // not the country code // Remember when adding to this list, also update check-locales.js script const localeOptions = [ - ["en", "en-US", langEn], ["de", "de-DE", langDe], + ["en", "en-US", langEn], ["es", "es-ES", langEs], ["fr", "fr-FR", langFr], ["it", "it-IT", langIt], From 4d728945be5653a6a2c1f36ae2ba6a30579477df Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Tue, 18 Nov 2025 14:36:09 +0100 Subject: [PATCH 10/10] Update lang-list.json to add french Add alphabetical order to sort languages. --- frontend/src/locale/src/lang-list.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index ee1b12a778..adbb07c63a 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -1,4 +1,7 @@ { + "locale-de-DE": { + "defaultMessage": "German" + }, "locale-en-US": { "defaultMessage": "English" }, @@ -8,9 +11,6 @@ "locale-fr-FR": { "defaultMessage": "Français" }, - "locale-de-DE": { - "defaultMessage": "German" - }, "locale-ja-JP": { "defaultMessage": "日本語" },