From 9e912c6407221931ba8266f311e007e3f3e42251 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 17 Nov 2025 18:07:07 +0100 Subject: [PATCH 01/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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": "日本語" }, From 27c2a28988d3ddefe26a3d7f97d16ad5bb863433 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:22:03 +0100 Subject: [PATCH 11/26] Update ProxyHosts.md Wrong translation of the product name. --- frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md index f4463736ee..215d444494 100644 --- a/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md +++ b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md @@ -4,4 +4,4 @@ Un hôte proxy est le point de terminaison entrant d'un service web que vous sou 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. +Les hôtes proxy constituent l'utilisation la plus courante du Nginx Proxy Manager. From 7b54b5d404e482346af6692fcf688fa8f48e5b47 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:29:34 +0100 Subject: [PATCH 12/26] Update fr.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some errors… --- frontend/src/locale/src/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/fr.json b/frontend/src/locale/src/fr.json index e3ef6d1d0f..c715c028a6 100644 --- a/frontend/src/locale/src/fr.json +++ b/frontend/src/locale/src/fr.json @@ -66,7 +66,7 @@ "defaultMessage": "Voir les Détails" }, "auditlogs": { - "defaultMessage": "Auditer les Logs" + "defaultMessage": "Journaux d'audit" }, "cancel": { "defaultMessage": "Annuler" @@ -129,7 +129,7 @@ "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." + "defaultMessage": "Cette 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." From f3f8cbd231264791bff6f27771ee521dd574aabe Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:33:46 +0100 Subject: [PATCH 13/26] Update IntlProvider.tsx Alphabetical order. --- frontend/src/locale/IntlProvider.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 324002726e..641ede2d34 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -1,10 +1,12 @@ import { createIntl, createIntlCache } from "react-intl"; +import langBg from "./lang/bg.json"; 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 langIt from "./lang/it.json"; import langJa from "./lang/ja.json"; +import langKo from "./lang/ko.json"; import langList from "./lang/lang-list.json"; import langNl from "./lang/nl.json"; import langPl from "./lang/pl.json"; @@ -12,27 +14,27 @@ import langRu from "./lang/ru.json"; import langSk from "./lang/sk.json"; import langVi from "./lang/vi.json"; import langZh from "./lang/zh.json"; -import langKo from "./lang/ko.json"; -import langBg from "./lang/bg.json"; + + // first item of each array should be the language code, // not the country code // Remember when adding to this list, also update check-locales.js script const localeOptions = [ + ["bg", "bg-BG", langBg], ["de", "de-DE", langDe], ["en", "en-US", langEn], ["es", "es-ES", langEs], ["fr", "fr-FR", langFr], ["it", "it-IT", langIt], ["ja", "ja-JP", langJa], + ["ko", "ko-KR", langKo], ["nl", "nl-NL", langNl], ["pl", "pl-PL", langPl], ["ru", "ru-RU", langRu], ["sk", "sk-SK", langSk], ["vi", "vi-VN", langVi], ["zh", "zh-CN", langZh], - ["ko", "ko-KR", langKo], - ["bg", "bg-BG", langBg], ]; const loadMessages = (locale?: string): typeof langList & typeof langEn => { From c98b1121207b93446dac9b9623ff1d78d6ad28f0 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:35:04 +0100 Subject: [PATCH 14/26] Update check-locales.cjs Alphabetical order. --- frontend/check-locales.cjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs index 579b0ad7f2..bf95bbf8db 100755 --- a/frontend/check-locales.cjs +++ b/frontend/check-locales.cjs @@ -7,20 +7,20 @@ // - Also checks the error messages returned by the backend const allLocales = [ + ["bg", "bg-BG"], ["de", "de-DE"], ["en", "en-US"], ["es", "es-ES"], ["fr", "fr-FR"], ["it", "it-IT"], ["ja", "ja-JP"], + ["ko", "ko-KR"], ["nl", "nl-NL"], ["pl", "pl-PL"], ["ru", "ru-RU"], ["sk", "sk-SK"], ["vi", "vi-VN"], ["zh", "zh-CN"], - ["ko", "ko-KR"], - ["bg", "bg-BG"], ]; const ignoreUnused = [ From 113163a19d3ca6b07e6d33c7179fa3a3f5763360 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:39:31 +0100 Subject: [PATCH 15/26] Update lang-list.json Alphabetical order. Deutsch replacing German. --- frontend/src/locale/src/lang-list.json | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 62ed1f1f17..ad8f653743 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -1,6 +1,9 @@ { + "locale-bg-BG": { + "defaultMessage": "Български" + } "locale-de-DE": { - "defaultMessage": "German" + "defaultMessage": "Deutsch" }, "locale-en-US": { "defaultMessage": "English" @@ -11,34 +14,31 @@ "locale-fr-FR": { "defaultMessage": "Français" }, + "locale-it-IT": { + "defaultMessage": "Italiano" + }, "locale-ja-JP": { "defaultMessage": "日本語" }, + "locale-ko-KR": { + "defaultMessage": "한국어" + }, + "locale-nl-NL": { + "defaultMessage": "Nederlands" + ), + "locale-pl-PL": { + "defaultMessage": "Polski" + }, "locale-ru-RU": { "defaultMessage": "Русский" }, "locale-sk-SK": { "defaultMessage": "Slovenčina" }, - "locale-zh-CN": { - "defaultMessage": "中文" - }, - "locale-pl-PL": { - "defaultMessage": "Polski" - }, - "locale-it-IT": { - "defaultMessage": "Italiano" - }, "locale-vi-VN": { "defaultMessage": "Tiếng Việt" }, - "locale-nl-NL": { - "defaultMessage": "Nederlands" - }, - "locale-ko-KR": { - "defaultMessage": "한국어" - }, - "locale-bg-BG": { - "defaultMessage": "Български" + "locale-zh-CN": { + "defaultMessage": "中文" } } From 655a37354688c971acd914c6ef406bd784102b5c Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:40:36 +0100 Subject: [PATCH 16/26] Update index.ts Alphabetical order. --- frontend/src/locale/src/HelpDoc/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index 44a23d19e9..7d6101aa36 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -1,17 +1,17 @@ +import * as bg from "./bg/index"; 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 it from "./it/index"; import * as ja from "./ja/index"; +import * as ko from "./ko/index"; import * as nl from "./nl/index"; import * as pl from "./pl/index"; import * as ru from "./ru/index"; import * as sk from "./sk/index"; import * as vi from "./vi/index"; import * as zh from "./zh/index"; -import * as ko from "./ko/index"; -import * as bg from "./bg/index"; const items: any = { bg, de, en, es, fr, it, ja, ko, nl, pl, ru, sk, vi, zh }; From 1dfea7f84acb79946f6db49566352a8715f8df97 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Sun, 7 Dec 2025 20:43:31 +0100 Subject: [PATCH 17/26] Update lang-list.json Alphabetical order. Deutsch replacing German. --- frontend/src/locale/src/lang-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index ad8f653743..7c892902ba 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -25,7 +25,7 @@ }, "locale-nl-NL": { "defaultMessage": "Nederlands" - ), + }, "locale-pl-PL": { "defaultMessage": "Polski" }, From de6a662dc7c3d0820cc7ae17538d0709c2ee86a6 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:44:09 +0100 Subject: [PATCH 18/26] Update AccessLists.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/AccessLists.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/AccessLists.md b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md index 4f44194b16..2a22b399c0 100644 --- a/frontend/src/locale/src/HelpDoc/fr/AccessLists.md +++ b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md @@ -1,7 +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. +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 hôtes 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. +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 hôtes 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. From 0975be321e518d6be0eb3d9935824553be4e02d9 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:51:12 +0100 Subject: [PATCH 19/26] Update Certificates.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/Certificates.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/Certificates.md b/frontend/src/locale/src/HelpDoc/fr/Certificates.md index 606edcea20..f5fa32594d 100644 --- a/frontend/src/locale/src/HelpDoc/fr/Certificates.md +++ b/frontend/src/locale/src/HelpDoc/fr/Certificates.md @@ -2,19 +2,19 @@ ### 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. +Un certificat HTTP validé signifie que les serveurs de Let's Encrypt testeront 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é. +Pour cette méthode, vous devrez créer un Hôte Proxy pour votre ou vos domaines. Cet Hôte Proxy devra être accessible via HTTP et pointer vers cette installation Nginx. Une fois le certificat émis, vous pourrez modifier l'Hôte Proxy pour qu'il utilise également ce certificat pour les connexions HTTPS. Cependant, l'Hôte 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. +Un certificat DNS validé nécessite l'utilisation du plugin Fournisseur DNS. 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, votre certificat sera émis. -Il n'est pas nécessaire de créer un serveur proxy avant de demander ce type de certificat. +Il n'est pas nécessaire de créer un Hôte 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. +Il n'est pas non plus nécessaire de configurer votre Hôte Proxy pour l'accès HTTP. Ce processus prend en charge les domaines génériques. From ede14f8613bffed37863947063c3890719499004 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:52:01 +0100 Subject: [PATCH 20/26] Update AccessLists.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/AccessLists.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/AccessLists.md b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md index 2a22b399c0..ca76bf625d 100644 --- a/frontend/src/locale/src/HelpDoc/fr/AccessLists.md +++ b/frontend/src/locale/src/HelpDoc/fr/AccessLists.md @@ -1,7 +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 hôtes proxy via l'authentification HTTP de base. +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 Hôtes 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 hôtes proxy. +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 Hôtes 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. From e9456535d71c49cef39c84bb4116b9b919d7254a Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:54:45 +0100 Subject: [PATCH 21/26] Update DeadHosts.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/DeadHosts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md index aaef1e218e..d81ceabd81 100644 --- a/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md +++ b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md @@ -1,7 +1,7 @@ ## Qu'est-ce qu'un serveur 404 ? -Un serveur 404 est simplement un serveur configuré pour afficher une page 404. +Un Hôte 404 est simplement un hôte 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. +Un autre avantage de cet hôte est la possibilité de suivre les journaux et de consulter les sites référents. From eb9ef94c168be733e1c46d5b8ac9ff875ae41fdb Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:55:38 +0100 Subject: [PATCH 22/26] Update ProxyHosts.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md index 215d444494..10c75b99dc 100644 --- a/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md +++ b/frontend/src/locale/src/HelpDoc/fr/ProxyHosts.md @@ -1,7 +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. +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 Nginx Proxy Manager. +Les Hôtes Proxy constituent l'utilisation la plus courante du Nginx Proxy Manager. From afbfd4a330ce3039f46b3f4bd766efd7aa2d6888 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:57:11 +0100 Subject: [PATCH 23/26] Update RedirectionHosts.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md index 2a5a8e2384..f12319d4a7 100644 --- a/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md +++ b/frontend/src/locale/src/HelpDoc/fr/RedirectionHosts.md @@ -1,5 +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. +Un Hôte 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. +On utilise généralement ce type d'hôte lorsque votre site web change de domaine, mais que des liens provenant des moteurs de recherche ou des sites référenceurs pointent toujours vers l'ancien domaine. From b7f322b7e3bef8177313c839ad36439109d4cbcd Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:57:29 +0100 Subject: [PATCH 24/26] Update DeadHosts.md A better translation. --- frontend/src/locale/src/HelpDoc/fr/DeadHosts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md index d81ceabd81..8d22c290ce 100644 --- a/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md +++ b/frontend/src/locale/src/HelpDoc/fr/DeadHosts.md @@ -4,4 +4,4 @@ Un Hôte 404 est simplement un hôte 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 cet hôte est la possibilité de suivre les journaux et de consulter les sites référents. +Un autre avantage de cet hôte est la possibilité de suivre les journaux et de consulter les sites référenceurs. From b14fe73a668c8ea51c222541024c42e00ffe7e88 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 02:57:47 +0100 Subject: [PATCH 25/26] Update DeadHosts.md A better translation. From 0e5633693a41319ffcca3acd9340410d954343e0 Mon Sep 17 00:00:00 2001 From: GedasMirak Date: Mon, 8 Dec 2025 03:05:11 +0100 Subject: [PATCH 26/26] Update lang-list.json Alphabetical order, but commas count! --- frontend/src/locale/src/lang-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 7c892902ba..42b4f4285c 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -1,7 +1,7 @@ { "locale-bg-BG": { "defaultMessage": "Български" - } + }, "locale-de-DE": { "defaultMessage": "Deutsch" },