diff --git a/frontend/src/App.vue b/frontend/src/App.vue index b0dd782..516ecb7 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -122,6 +122,7 @@ const currentYear = ref(new Date().getFullYear()) Русский Tiếng Việt 中文 + Français diff --git a/frontend/src/lang/index.js b/frontend/src/lang/index.js index 308d359..62a2c37 100644 --- a/frontend/src/lang/index.js +++ b/frontend/src/lang/index.js @@ -4,6 +4,7 @@ import ru from './translations/ru.json'; import en from './translations/en.json'; import vi from './translations/vi.json'; import zh from './translations/zh.json'; +import fr from './translations/fr.json'; import {createI18n} from "vue-i18n"; // Create i18n instance with options @@ -22,7 +23,8 @@ const i18n = createI18n({ "ru": ru, "en": en, "vi": vi, - "zh": zh + "zh": zh, + "fr": fr } }); diff --git a/frontend/src/lang/translations/fr.json b/frontend/src/lang/translations/fr.json new file mode 100644 index 0000000..f5b165c --- /dev/null +++ b/frontend/src/lang/translations/fr.json @@ -0,0 +1,515 @@ +{ + "languages": { + "fr": "Français" + }, + "general": { + "pagination": { + "size": "Nombre d'éléments", + "all": "Tous (lent)" + }, + "search": { + "placeholder": "Rechercher...", + "button": "Rechercher" + }, + "select-all": "Tout sélectionner", + "yes": "Oui", + "no": "Non", + "cancel": "Annuler", + "close": "Fermer", + "save": "Enregistrer", + "delete": "Supprimer" + }, + "login": { + "headline": "Veuillez vous connecter", + "username": { + "label": "Nom d'utilisateur", + "placeholder": "Veuillez entrer votre nom d'utilisateur" + }, + "password": { + "label": "Mot de passe", + "placeholder": "Veuillez entrer votre mot de passe" + }, + "button": "Se connecter" + }, + "menu": { + "home": "Accueil", + "interfaces": "Interfaces", + "users": "Utilisateurs", + "lang": "Changer de langue", + "profile": "Mon profil", + "settings": "Paramètres", + "login": "Se connecter", + "logout": "Se déconnecter" + }, + "home": { + "headline": "Portail VPN WireGuard®", + "info-headline": "Plus d'informations", + "abstract": "WireGuard® est un VPN extrêmement simple mais rapide et moderne qui utilise une cryptographie de pointe. Il vise à être plus rapide, plus simple, plus léger et plus utile qu'IPsec, tout en évitant le casse-tête massif. Il se veut considérablement plus performant qu'OpenVPN.", + "installation": { + "box-header": "Installation de WireGuard", + "headline": "Installation", + "content": "Les instructions d'installation du logiciel client sont disponibles sur le site Web officiel de WireGuard.", + "button": "Ouvrir les instructions" + }, + "about-wg": { + "box-header": "À propos de WireGuard", + "headline": "À propos", + "content": "WireGuard® est un VPN extrêmement simple mais rapide et moderne qui utilise une cryptographie de pointe.", + "button": "Plus d'informations" + }, + "about-portal": { + "box-header": "À propos du Portail WireGuard", + "headline": "Portail WireGuard", + "content": "Le Portail WireGuard est un portail de configuration simple basé sur le Web pour WireGuard.", + "button": "Plus d'informations" + }, + "profiles": { + "headline": "Profils VPN", + "abstract": "Vous pouvez accéder et télécharger vos configurations VPN personnelles via votre profil utilisateur.", + "content": "Pour trouver tous vos profils configurés, cliquez sur le bouton ci-dessous.", + "button": "Ouvrir mon profil" + }, + "admin": { + "headline": "Zone d'administration", + "abstract": "Dans la zone d'administration, vous pouvez gérer les pairs WireGuard et l'interface du serveur, ainsi que les utilisateurs autorisés à se connecter au Portail WireGuard.", + "content": "", + "button-admin": "Ouvrir l'administration du serveur", + "button-user": "Ouvrir l'administration des utilisateurs" + } + }, + "interfaces": { + "headline": "Administration des interfaces", + "headline-peers": "Pairs VPN actuels", + "headline-endpoints": "Points de terminaison actuels", + "no-interface": { + "default-selection": "Aucune interface disponible", + "headline": "Aucune interface trouvée...", + "abstract": "Cliquez sur le bouton plus ci-dessus pour créer une nouvelle interface WireGuard." + }, + "no-peer": { + "headline": "Aucun pair disponible", + "abstract": "Actuellement, aucun pair n'est disponible pour l'interface WireGuard sélectionnée." + }, + "table-heading": { + "name": "Nom", + "user": "Utilisateur", + "ip": "IP", + "endpoint": "Point de terminaison", + "status": "Statut" + }, + "interface": { + "headline": "État de l'interface pour", + "mode": "mode", + "key": "Clé publique", + "endpoint": "Point de terminaison public", + "port": "Port d'écoute", + "peers": "Pairs activés", + "total-peers": "Total des pairs", + "endpoints": "Points de terminaison activés", + "total-endpoints": "Total des points de terminaison", + "ip": "Adresse IP", + "default-allowed-ip": "IP autorisées par défaut", + "dns": "Serveurs DNS", + "mtu": "MTU", + "default-keep-alive": "Intervalle Keepalive par défaut", + "button-show-config": "Afficher la configuration", + "button-download-config": "Télécharger la configuration", + "button-store-config": "Enregistrer la configuration pour wg-quick", + "button-edit": "Modifier l'interface" + }, + "button-add-interface": "Ajouter une interface", + "button-add-peer": "Ajouter un pair", + "button-add-peers": "Ajouter plusieurs pairs", + "button-show-peer": "Afficher le pair", + "button-edit-peer": "Modifier le pair", + "peer-disabled": "Le pair est désactivé, raison :", + "peer-expiring": "Le pair expire le", + "peer-connected": "Connecté", + "peer-not-connected": "Non connecté", + "peer-handshake": "Dernière négociation :", + "button-show-peer": "Afficher le pair", + "button-edit-peer": "Modifier le pair" + }, + "users": { + "headline": "Administration des utilisateurs", + "table-heading": { + "id": "ID", + "email": "E-mail", + "firstname": "Prénom", + "lastname": "Nom", + "source": "Source", + "peers": "Pairs", + "admin": "Admin" + }, + "no-user": { + "headline": "Aucun utilisateur disponible", + "abstract": "Actuellement, aucun utilisateur n'est enregistré auprès du Portail WireGuard." + }, + "button-add-user": "Ajouter un utilisateur", + "button-show-user": "Afficher l'utilisateur", + "button-edit-user": "Modifier l'utilisateur", + "user-disabled": "L'utilisateur est désactivé, raison :", + "user-locked": "Le compte est verrouillé, raison :", + "admin": "L'utilisateur a des privilèges d'administrateur", + "no-admin": "L'utilisateur n'a pas de privilèges d'administrateur" + }, + "profile": { + "headline": "Mes pairs VPN", + "table-heading": { + "name": "Nom", + "ip": "IP", + "stats": "Statut", + "interface": "Interface serveur" + }, + "no-peer": { + "headline": "Aucun pair disponible", + "abstract": "Actuellement, aucun pair n'est associé à votre profil utilisateur." + }, + "peer-connected": "Connecté", + "button-add-peer": "Ajouter un pair", + "button-show-peer": "Afficher le pair", + "button-edit-peer": "Modifier le pair" + }, + "settings": { + "headline": "Paramètres", + "abstract": "Ici, vous pouvez modifier vos paramètres personnels.", + "api": { + "headline": "Paramètres de l'API", + "abstract": "Ici, vous pouvez configurer les paramètres de l'API RESTful.", + "active-description": "L'API est actuellement active pour votre compte utilisateur. Toutes les requêtes API sont authentifiées avec l'authentification de base. Utilisez les informations d'identification suivantes pour l'authentification.", + "inactive-description": "L'API est actuellement inactive. Appuyez sur le bouton ci-dessous pour l'activer.", + "user-label": "Nom d'utilisateur de l'API :", + "user-placeholder": "L'utilisateur de l'API", + "token-label": "Mot de passe de l'API :", + "token-placeholder": "Le jeton de l'API", + "token-created-label": "Accès API accordé le :", + "button-disable-title": "Désactiver l'API, cela invalidera le jeton actuel.", + "button-disable-text": "Désactiver l'API", + "button-enable-title": "Activer l'API, cela générera un nouveau jeton.", + "button-enable-text": "Activer l'API", + "api-link": "Documentation de l'API" + } + }, + "modals": { + "user-view": { + "headline": "Compte utilisateur :", + "tab-user": "Informations", + "tab-peers": "Pairs", + "headline-info": "Informations sur l'utilisateur :", + "headline-notes": "Notes :", + "email": "E-mail", + "firstname": "Prénom", + "lastname": "Nom", + "phone": "Numéro de téléphone", + "department": "Département", + "api-enabled": "Accès API", + "disabled": "Compte désactivé", + "locked": "Compte verrouillé", + "no-peers": "L'utilisateur n'a pas de pairs associés.", + "peers": { + "name": "Nom", + "interface": "Interface", + "ip": "IP" + } + }, + "user-edit": { + "headline-edit": "Modifier l'utilisateur :", + "headline-new": "Nouvel utilisateur", + "header-general": "Général", + "header-personal": "Informations sur l'utilisateur", + "header-notes": "Notes", + "header-state": "État", + "identifier": { + "label": "Identifiant", + "placeholder": "L'identifiant unique de l'utilisateur" + }, + "source": { + "label": "Source", + "placeholder": "La source de l'utilisateur" + }, + "password": { + "label": "Mot de passe", + "placeholder": "Un mot de passe super secret", + "description": "Laissez ce champ vide pour conserver le mot de passe actuel." + }, + "email": { + "label": "E-mail", + "placeholder": "L'adresse e-mail" + }, + "phone": { + "label": "Téléphone", + "placeholder": "Le numéro de téléphone" + }, + "department": { + "label": "Département", + "placeholder": "Le département" + }, + "firstname": { + "label": "Prénom", + "placeholder": "Prénom" + }, + "lastname": { + "label": "Nom", + "placeholder": "Nom" + }, + "notes": { + "label": "Notes", + "placeholder": "" + }, + "disabled": { + "label": "Désactivé (aucune connexion WireGuard et aucune connexion possible)" + }, + "locked": { + "label": "Verrouillé (aucune connexion possible, les connexions WireGuard fonctionnent toujours)" + }, + "admin": { + "label": "Est Admin" + } + }, + "interface-view": { + "headline": "Configuration pour l'interface :" + }, + "interface-edit": { + "headline-edit": "Modifier l'interface :", + "headline-new": "Nouvelle interface", + "tab-interface": "Interface", + "tab-peerdef": "Valeurs par défaut des pairs", + "header-general": "Général", + "header-network": "Réseau", + "header-crypto": "Cryptographie", + "header-hooks": "Hooks d'interface", + "header-peer-hooks": "Hooks", + "header-state": "État", + "identifier": { + "label": "Identifiant", + "placeholder": "L'identifiant unique de l'interface" + }, + "mode": { + "label": "Mode de l'interface", + "server": "Mode serveur", + "client": "Mode client", + "any": "Mode inconnu" + }, + "display-name": { + "label": "Nom d'affichage", + "placeholder": "Le nom descriptif de l'interface" + }, + "private-key": { + "label": "Clé privée", + "placeholder": "La clé privée" + }, + "public-key": { + "label": "Clé publique", + "placeholder": "La clé publique" + }, + "ip": { + "label": "Adresses IP", + "placeholder": "Adresses IP (format CIDR)" + }, + "listen-port": { + "label": "Port d'écoute", + "placeholder": "Le port d'écoute" + }, + "dns": { + "label": "Serveur DNS", + "placeholder": "Les serveurs DNS qui doivent être utilisés" + }, + "dns-search": { + "label": "Domaines de recherche DNS", + "placeholder": "Préfixes de recherche DNS" + }, + "mtu": { + "label": "MTU", + "placeholder": "Le MTU de l'interface (0 = conserver la valeur par défaut)" + }, + "firewall-mark": { + "label": "Marque de pare-feu", + "placeholder": "Marque de pare-feu appliquée au trafic sortant. (0 = automatique)" + }, + "routing-table": { + "label": "Table de routage", + "placeholder": "L'ID de la table de routage", + "description": "Cas particuliers : off = ne pas gérer les routes, 0 = automatique" + }, + "pre-up": { + "label": "Pré-Up", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "post-up": { + "label": "Post-Up", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "pre-down": { + "label": "Pré-Down", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "post-down": { + "label": "Post-Down", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "disabled": { + "label": "Interface désactivée" + }, + "save-config": { + "label": "Enregistrer automatiquement la configuration wg-quick" + }, + "defaults": { + "endpoint": { + "label": "Adresse du point de terminaison", + "placeholder": "Adresse du point de terminaison", + "description": "L'adresse du point de terminaison auquel les pairs se connecteront. (par exemple, wg.example.com ou wg.example.com:51820)" + }, + "networks": { + "label": "Réseaux IP", + "placeholder": "Adresses de réseau", + "description": "Les pairs recevront des adresses IP de ces sous-réseaux." + }, + "allowed-ip": { + "label": "Adresses IP autorisées", + "placeholder": "Adresses IP autorisées par défaut" + }, + "mtu": { + "label": "MTU", + "placeholder": "Le MTU du client (0 = conserver la valeur par défaut)" + }, + "keep-alive": { + "label": "Intervalle Keep Alive", + "placeholder": "Persistent Keepalive (0 = par défaut)" + } + }, + "button-apply-defaults": "Appliquer les valeurs par défaut des pairs" + }, + "peer-view": { + "headline-peer": "Pair :", + "headline-endpoint": "Point de terminaison :", + "section-info": "Informations sur le pair", + "section-status": "État actuel", + "section-config": "Configuration", + "identifier": "Identifiant", + "ip": "Adresses IP", + "user": "Utilisateur associé", + "notes": "Notes", + "expiry-status": "Expire le", + "disabled-status": "Désactivé le", + "traffic": "Trafic", + "connection-status": "Statistiques de connexion", + "upload": "Octets envoyés (du serveur au pair)", + "download": "Octets téléchargés (du pair au serveur)", + "pingable": "Peut être pingé", + "handshake": "Dernière négociation", + "connected-since": "Connecté depuis", + "endpoint": "Point de terminaison", + "button-download": "Télécharger la configuration", + "button-email": "Envoyer la configuration par e-mail" + }, + "peer-edit": { + "headline-edit-peer": "Modifier le pair :", + "headline-edit-endpoint": "Modifier le point de terminaison :", + "headline-new-peer": "Créer un pair", + "headline-new-endpoint": "Créer un point de terminaison", + "header-general": "Général", + "header-network": "Réseau", + "header-crypto": "Cryptographie", + "header-hooks": "Hooks (exécutés sur le pair)", + "header-state": "État", + "display-name": { + "label": "Nom d'affichage", + "placeholder": "Le nom descriptif du pair" + }, + "linked-user": { + "label": "Utilisateur lié", + "placeholder": "Le compte utilisateur qui possède ce pair" + }, + "private-key": { + "label": "Clé privée", + "placeholder": "La clé privée" + }, + "public-key": { + "label": "Clé publique", + "placeholder": "La clé publique" + }, + "preshared-key": { + "label": "Clé pré-partagée", + "placeholder": "Clé pré-partagée facultative" + }, + "endpoint-public-key": { + "label": "Clé publique du point de terminaison", + "placeholder": "La clé publique du point de terminaison distant" + }, + "endpoint": { + "label": "Adresse du point de terminaison", + "placeholder": "L'adresse du point de terminaison distant" + }, + "ip": { + "label": "Adresses IP", + "placeholder": "Adresses IP (format CIDR)" + }, + "allowed-ip": { + "label": "Adresses IP autorisées", + "placeholder": "Adresses IP autorisées (format CIDR)" + }, + "extra-allowed-ip": { + "label": "Adresses IP autorisées supplémentaires", + "placeholder": "IP autorisées supplémentaires (côté serveur)", + "description": "Ces IP seront ajoutées à l'interface WireGuard distante comme IP autorisées." + }, + "dns": { + "label": "Serveur DNS", + "placeholder": "Les serveurs DNS qui doivent être utilisés" + }, + "dns-search": { + "label": "Domaines de recherche DNS", + "placeholder": "Préfixes de recherche DNS" + }, + "keep-alive": { + "label": "Intervalle Keep Alive", + "placeholder": "Persistent Keepalive (0 = par défaut)" + }, + "mtu": { + "label": "MTU", + "placeholder": "Le MTU du client (0 = conserver la valeur par défaut)" + }, + "pre-up": { + "label": "Pré-Up", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "post-up": { + "label": "Post-Up", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "pre-down": { + "label": "Pré-Down", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "post-down": { + "label": "Post-Down", + "placeholder": "Une ou plusieurs commandes bash séparées par ;" + }, + "disabled": { + "label": "Pair désactivé" + }, + "ignore-global": { + "label": "Ignorer les paramètres globaux" + }, + "expires-at": { + "label": "Date d'expiration" + } + }, + "peer-multi-create": { + "headline-peer": "Créer plusieurs pairs", + "headline-endpoint": "Créer plusieurs points de terminaison", + "identifiers": { + "label": "Identifiants d'utilisateur", + "placeholder": "Identifiants d'utilisateur", + "description": "Un identifiant d'utilisateur (le nom d'utilisateur) pour lequel un pair doit être créé." + }, + "prefix": { + "headline-peer": "Pair :", + "headline-endpoint": "Point de terminaison :", + "label": "Préfixe du nom d'affichage", + "placeholder": "Le préfixe", + "description": "Un préfixe qui est ajouté au nom d'affichage des pairs." + } + } + } +}