diff --git a/public/index.html b/public/index.html
index f78fc13..6f20d48 100644
--- a/public/index.html
+++ b/public/index.html
@@ -150,6 +150,7 @@
+
diff --git a/public/lang/fr.json b/public/lang/fr.json
new file mode 100644
index 0000000..6fcc7dc
--- /dev/null
+++ b/public/lang/fr.json
@@ -0,0 +1,160 @@
+{
+ "header": {
+ "about_title": "A propos de",
+ "language-selector_title": "Choix de la langue",
+ "about_aria-label": "Ouvrir à propos de",
+ "theme-auto_title": "Adapter le thème au système",
+ "theme-light_title": "Toujours utiliser le thème clair",
+ "theme-dark_title": "Toujours utiliser le thème sombre",
+ "notification_title": "Activer les notifications",
+ "install_title": "Installer PairDrop",
+ "pair-device_title": "Associez vos appareils de manière permanente",
+ "edit-paired-devices_title": "Gérer les appareils couplés",
+ "join-public-room_title": "Rejoindre temporairement la salle publique",
+ "cancel-paste-mode": "Terminé"
+ },
+ "instructions": {
+ "no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
+ "no-peers-title": "Ouvrez PairDrop sur d'autres appareils pour envoyer des fichiers",
+ "no-peers-subtitle": "Associez des appareils ou entrez dans une salle publique pour être visible sur d'autres réseaux",
+ "x-instructions_desktop": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
+ "x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
+ "x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
+ "x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
+ "click-to-send": "Cliquez pour envoyer",
+ "tap-to-send": "Appuyez pour envoyer",
+ "activate-paste-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
+ "activate-paste-mode-and-other-files": "et {{count}} autres fichiers",
+ "activate-paste-mode-shared-text": "texte partagé"
+ },
+ "footer": {
+ "known-as": "Vous êtes connu sous le nom de:",
+ "display-name_data-placeholder": "Chargement…",
+ "display-name_title": "Modifiez le nom de votre appareil de manière permanente",
+ "discovery": "Vous pouvez être découvert:",
+ "on-this-network": "sur ce réseau",
+ "on-this-network_title": "Vous pouvez être découvert par tout le monde sur ce réseau.",
+ "paired-devices": "par les appareils couplés",
+ "paired-devices_title": "Vous pouvez être découvert par les appareils couplés à tout moment, indépendamment du réseau.",
+ "public-room-devices": "dans la salle {{roomId}}",
+ "public-room-devices_title": "Vous pouvez être découvert par les appareils de cette salle publique indépendamment du réseau.",
+ "traffic": "Le trafic est",
+ "routed": "routé via le serveur",
+ "webrtc": "si WebRTC n'est pas disponible.",
+ "display-name_placeholder": "Chargement…"
+ },
+ "dialogs": {
+ "pair-devices-title": "Associer les appareils de manière permanente",
+ "input-key-on-this-device": "Saisissez cette clé sur un autre appareil",
+ "scan-qr-code": "ou scannez le QR-code.",
+ "enter-key-from-another-device": "Entrez ici la clé d'un autre appareil.",
+ "temporary-public-room-title": "Salle publique temporaire",
+ "input-room-id-on-another-device": "Saisissez cet ID de salle sur un autre appareil",
+ "enter-room-id-from-another-device": "Entrez l'ID de la salle depuis un autre appareil pour rejoindre la salle.",
+ "hr-or": "OU",
+ "pair": "associer",
+ "cancel": "Annuler",
+ "edit-paired-devices-title": "Modifier les appareils couplés",
+ "unpair": "Dissocier",
+ "paired-devices-wrapper_data-empty": "Aucun appareil couplé.",
+ "auto-accept-instructions-1": "Activer",
+ "auto-accept": "auto-accepter",
+ "auto-accept-instructions-2": "pour accepter automatiquement tous les fichiers envoyés depuis cet appareil.",
+ "close": "Fermer",
+ "join": "Rejoindre",
+ "leave": "Partir",
+ "would-like-to-share": "aimerait partager",
+ "accept": "Accepter",
+ "decline": "Refuser",
+ "has-sent": "a envoyé:",
+ "share": "Partage",
+ "download": "Télécharger",
+ "send-message-title": "Envoyer un message",
+ "send-message-to": "Envoyer un message à",
+ "send": "Envoyer",
+ "receive-text-title": "Message reçu",
+ "copy": "Copier",
+ "base64-processing": "Traitement…",
+ "base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
+ "base64-paste-to-send": "Coller ici pour envoyer {{type}}",
+ "base64-text": "texte",
+ "base64-files": "fichiers",
+ "file-other-description-image": "et 1 autre image",
+ "file-other-description-file": "et 1 autre fichier",
+ "file-other-description-image-plural": "et {{count}} autres images",
+ "file-other-description-file-plural": "et {{count}} autres fichiers",
+ "title-image": "Image",
+ "title-file": "Fichier",
+ "title-image-plural": "Images",
+ "title-file-plural": "Fichiers",
+ "receive-title": "{{descriptor}} Reçu",
+ "download-again": "Télécharger à nouveau",
+ "language-selector-title": "Sélectionnez la langue",
+ "system-language": "Langue du système"
+ },
+ "about": {
+ "close-about_aria-label": "Fermer à propos de PairDrop",
+ "claim": "Le moyen le plus simple de transférer des fichiers entre appareils",
+ "github_title": "PairDrop sur GitHub",
+ "buy-me-a-coffee_title": "Achete-moi un café!",
+ "tweet_title": "Tweet à propos de PairDrop",
+ "faq_title": "Questions fréquemment posées"
+ },
+ "notifications": {
+ "display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente.",
+ "display-name-changed-temporarily": "Le nom d'affichage est modifié uniquement pour cette session.",
+ "display-name-random-again": "Le nom d'affichage est à nouveau généré aléatoirement.",
+ "download-successful": "{{descriptor}} téléchargé",
+ "pairing-tabs-error": "Le couplage de deux onglets de navigateur Web est impossible.",
+ "pairing-success": "Appareils couplés.",
+ "pairing-not-persistent": "Les appareils couplés ne sont pas persistants.",
+ "pairing-key-invalid": "Clé invalide",
+ "pairing-key-invalidated": "Clé {{key}} invalidée.",
+ "pairing-cleared": "Tous les appareils ne sont plus appairés.",
+ "public-room-id-invalid": "ID de salle non valide",
+ "public-room-left": "Salle publique {{publicRoomId}} quittée",
+ "copied-to-clipboard": "Copié dans le presse-papier",
+ "copied-to-clipboard-error": "Copie impossible. Copier manuellement.",
+ "text-content-incorrect": "Le contenu du texte est incorrect.",
+ "file-content-incorrect": "Le contenu du fichier est incorrect.",
+ "clipboard-content-incorrect": "Le contenu du presse-papiers est incorrect.",
+ "notifications-enabled": "Notifications activées.",
+ "link-received": "Lien reçu par {{name}} - Cliquez pour ouvrir",
+ "message-received": "Message reçu par {{name}} - Cliquez pour copier",
+ "click-to-download": "Cliquez pour télécharger",
+ "request-title": "{{name}} souhaite transférer {{count}} {{descriptor}}",
+ "click-to-show": "Cliquez pour afficher",
+ "copied-text": "Texte copié dans le presse-papiers",
+ "copied-text-error": "L'écriture dans le presse-papiers a échoué. Copiez manuellement!",
+ "offline": "Vous êtes hors ligne",
+ "online": "Vous êtes de nouveau en ligne",
+ "connected": "Connecté.",
+ "online-requirement-pairing": "Vous devez être en ligne pour coupler des appareils.",
+ "online-requirement-public-room": "Vous devez être en ligne pour créer une salle publique.",
+ "connecting": "Connexion…",
+ "files-incorrect": "Les fichiers sont incorrects.",
+ "file-transfer-completed": "Transfert de fichier terminé.",
+ "ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
+ "message-transfer-completed": "Transfert de message terminé.",
+ "unfinished-transfers-warning": "Il y a des transferts inachevés. Etes-vous sûr de vouloir fermer PairDrop?",
+ "rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
+ "selected-peer-left": "Appareils selectionnés restants."
+ },
+ "document-titles": {
+ "file-received": "Fichier reçu",
+ "file-received-plural": "{{count}} fichiers reçus",
+ "file-transfer-requested": "Transfert de fichier demandé",
+ "image-transfer-requested": "Transfert d'image demandé",
+ "message-received": "Message reçu",
+ "message-received-plural": "{{count}} Messages reçus"
+ },
+ "peer-ui": {
+ "click-to-send-paste-mode": "Cliquez pour envoyer {{descriptor}}",
+ "click-to-send": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
+ "connection-hash": "Pour vérifier la sécurité du chiffrement de bout en bout, comparez ce numéro de sécurité sur les deux appareils",
+ "preparing": "Préparation…",
+ "waiting": "En attente…",
+ "processing": "En cours…",
+ "transferring": "Transfert en cours…"
+ }
+}
diff --git a/public/scripts/localization.js b/public/scripts/localization.js
index cc6f87c..8d471cb 100644
--- a/public/scripts/localization.js
+++ b/public/scripts/localization.js
@@ -1,7 +1,7 @@
class Localization {
constructor() {
Localization.defaultLocale = "en";
- Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id"];
+ Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
Localization.translations = {};
Localization.defaultTranslations = {};
diff --git a/public_included_ws_fallback/index.html b/public_included_ws_fallback/index.html
index b5d9694..f2819b6 100644
--- a/public_included_ws_fallback/index.html
+++ b/public_included_ws_fallback/index.html
@@ -155,6 +155,7 @@
+
diff --git a/public_included_ws_fallback/lang/fr.json b/public_included_ws_fallback/lang/fr.json
new file mode 100644
index 0000000..6fcc7dc
--- /dev/null
+++ b/public_included_ws_fallback/lang/fr.json
@@ -0,0 +1,160 @@
+{
+ "header": {
+ "about_title": "A propos de",
+ "language-selector_title": "Choix de la langue",
+ "about_aria-label": "Ouvrir à propos de",
+ "theme-auto_title": "Adapter le thème au système",
+ "theme-light_title": "Toujours utiliser le thème clair",
+ "theme-dark_title": "Toujours utiliser le thème sombre",
+ "notification_title": "Activer les notifications",
+ "install_title": "Installer PairDrop",
+ "pair-device_title": "Associez vos appareils de manière permanente",
+ "edit-paired-devices_title": "Gérer les appareils couplés",
+ "join-public-room_title": "Rejoindre temporairement la salle publique",
+ "cancel-paste-mode": "Terminé"
+ },
+ "instructions": {
+ "no-peers_data-drop-bg": "Déposer pour choisir le destinataire",
+ "no-peers-title": "Ouvrez PairDrop sur d'autres appareils pour envoyer des fichiers",
+ "no-peers-subtitle": "Associez des appareils ou entrez dans une salle publique pour être visible sur d'autres réseaux",
+ "x-instructions_desktop": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
+ "x-instructions_mobile": "Appuyez pour envoyer des fichiers ou appuyez longuement pour envoyer un message",
+ "x-instructions_data-drop-peer": "Déposer pour envoyer au destinataire",
+ "x-instructions_data-drop-bg": "Lâcher pour choisir le destinataire",
+ "click-to-send": "Cliquez pour envoyer",
+ "tap-to-send": "Appuyez pour envoyer",
+ "activate-paste-mode-base": "Ouvrez PairDrop sur d'autres appareils pour envoyer",
+ "activate-paste-mode-and-other-files": "et {{count}} autres fichiers",
+ "activate-paste-mode-shared-text": "texte partagé"
+ },
+ "footer": {
+ "known-as": "Vous êtes connu sous le nom de:",
+ "display-name_data-placeholder": "Chargement…",
+ "display-name_title": "Modifiez le nom de votre appareil de manière permanente",
+ "discovery": "Vous pouvez être découvert:",
+ "on-this-network": "sur ce réseau",
+ "on-this-network_title": "Vous pouvez être découvert par tout le monde sur ce réseau.",
+ "paired-devices": "par les appareils couplés",
+ "paired-devices_title": "Vous pouvez être découvert par les appareils couplés à tout moment, indépendamment du réseau.",
+ "public-room-devices": "dans la salle {{roomId}}",
+ "public-room-devices_title": "Vous pouvez être découvert par les appareils de cette salle publique indépendamment du réseau.",
+ "traffic": "Le trafic est",
+ "routed": "routé via le serveur",
+ "webrtc": "si WebRTC n'est pas disponible.",
+ "display-name_placeholder": "Chargement…"
+ },
+ "dialogs": {
+ "pair-devices-title": "Associer les appareils de manière permanente",
+ "input-key-on-this-device": "Saisissez cette clé sur un autre appareil",
+ "scan-qr-code": "ou scannez le QR-code.",
+ "enter-key-from-another-device": "Entrez ici la clé d'un autre appareil.",
+ "temporary-public-room-title": "Salle publique temporaire",
+ "input-room-id-on-another-device": "Saisissez cet ID de salle sur un autre appareil",
+ "enter-room-id-from-another-device": "Entrez l'ID de la salle depuis un autre appareil pour rejoindre la salle.",
+ "hr-or": "OU",
+ "pair": "associer",
+ "cancel": "Annuler",
+ "edit-paired-devices-title": "Modifier les appareils couplés",
+ "unpair": "Dissocier",
+ "paired-devices-wrapper_data-empty": "Aucun appareil couplé.",
+ "auto-accept-instructions-1": "Activer",
+ "auto-accept": "auto-accepter",
+ "auto-accept-instructions-2": "pour accepter automatiquement tous les fichiers envoyés depuis cet appareil.",
+ "close": "Fermer",
+ "join": "Rejoindre",
+ "leave": "Partir",
+ "would-like-to-share": "aimerait partager",
+ "accept": "Accepter",
+ "decline": "Refuser",
+ "has-sent": "a envoyé:",
+ "share": "Partage",
+ "download": "Télécharger",
+ "send-message-title": "Envoyer un message",
+ "send-message-to": "Envoyer un message à",
+ "send": "Envoyer",
+ "receive-text-title": "Message reçu",
+ "copy": "Copier",
+ "base64-processing": "Traitement…",
+ "base64-tap-to-paste": "Appuyez ici pour coller {{type}}",
+ "base64-paste-to-send": "Coller ici pour envoyer {{type}}",
+ "base64-text": "texte",
+ "base64-files": "fichiers",
+ "file-other-description-image": "et 1 autre image",
+ "file-other-description-file": "et 1 autre fichier",
+ "file-other-description-image-plural": "et {{count}} autres images",
+ "file-other-description-file-plural": "et {{count}} autres fichiers",
+ "title-image": "Image",
+ "title-file": "Fichier",
+ "title-image-plural": "Images",
+ "title-file-plural": "Fichiers",
+ "receive-title": "{{descriptor}} Reçu",
+ "download-again": "Télécharger à nouveau",
+ "language-selector-title": "Sélectionnez la langue",
+ "system-language": "Langue du système"
+ },
+ "about": {
+ "close-about_aria-label": "Fermer à propos de PairDrop",
+ "claim": "Le moyen le plus simple de transférer des fichiers entre appareils",
+ "github_title": "PairDrop sur GitHub",
+ "buy-me-a-coffee_title": "Achete-moi un café!",
+ "tweet_title": "Tweet à propos de PairDrop",
+ "faq_title": "Questions fréquemment posées"
+ },
+ "notifications": {
+ "display-name-changed-permanently": "Le nom d'affichage est modifié de manière permanente.",
+ "display-name-changed-temporarily": "Le nom d'affichage est modifié uniquement pour cette session.",
+ "display-name-random-again": "Le nom d'affichage est à nouveau généré aléatoirement.",
+ "download-successful": "{{descriptor}} téléchargé",
+ "pairing-tabs-error": "Le couplage de deux onglets de navigateur Web est impossible.",
+ "pairing-success": "Appareils couplés.",
+ "pairing-not-persistent": "Les appareils couplés ne sont pas persistants.",
+ "pairing-key-invalid": "Clé invalide",
+ "pairing-key-invalidated": "Clé {{key}} invalidée.",
+ "pairing-cleared": "Tous les appareils ne sont plus appairés.",
+ "public-room-id-invalid": "ID de salle non valide",
+ "public-room-left": "Salle publique {{publicRoomId}} quittée",
+ "copied-to-clipboard": "Copié dans le presse-papier",
+ "copied-to-clipboard-error": "Copie impossible. Copier manuellement.",
+ "text-content-incorrect": "Le contenu du texte est incorrect.",
+ "file-content-incorrect": "Le contenu du fichier est incorrect.",
+ "clipboard-content-incorrect": "Le contenu du presse-papiers est incorrect.",
+ "notifications-enabled": "Notifications activées.",
+ "link-received": "Lien reçu par {{name}} - Cliquez pour ouvrir",
+ "message-received": "Message reçu par {{name}} - Cliquez pour copier",
+ "click-to-download": "Cliquez pour télécharger",
+ "request-title": "{{name}} souhaite transférer {{count}} {{descriptor}}",
+ "click-to-show": "Cliquez pour afficher",
+ "copied-text": "Texte copié dans le presse-papiers",
+ "copied-text-error": "L'écriture dans le presse-papiers a échoué. Copiez manuellement!",
+ "offline": "Vous êtes hors ligne",
+ "online": "Vous êtes de nouveau en ligne",
+ "connected": "Connecté.",
+ "online-requirement-pairing": "Vous devez être en ligne pour coupler des appareils.",
+ "online-requirement-public-room": "Vous devez être en ligne pour créer une salle publique.",
+ "connecting": "Connexion…",
+ "files-incorrect": "Les fichiers sont incorrects.",
+ "file-transfer-completed": "Transfert de fichier terminé.",
+ "ios-memory-limit": "L'envoi de fichiers vers iOS n'est possible que jusqu'à 200 Mo à la fois",
+ "message-transfer-completed": "Transfert de message terminé.",
+ "unfinished-transfers-warning": "Il y a des transferts inachevés. Etes-vous sûr de vouloir fermer PairDrop?",
+ "rate-limit-join-key": "Limite de débit atteinte. Attendez 10 secondes et réessayez.",
+ "selected-peer-left": "Appareils selectionnés restants."
+ },
+ "document-titles": {
+ "file-received": "Fichier reçu",
+ "file-received-plural": "{{count}} fichiers reçus",
+ "file-transfer-requested": "Transfert de fichier demandé",
+ "image-transfer-requested": "Transfert d'image demandé",
+ "message-received": "Message reçu",
+ "message-received-plural": "{{count}} Messages reçus"
+ },
+ "peer-ui": {
+ "click-to-send-paste-mode": "Cliquez pour envoyer {{descriptor}}",
+ "click-to-send": "Cliquez pour envoyer des fichiers ou faites un clic droit pour envoyer un message",
+ "connection-hash": "Pour vérifier la sécurité du chiffrement de bout en bout, comparez ce numéro de sécurité sur les deux appareils",
+ "preparing": "Préparation…",
+ "waiting": "En attente…",
+ "processing": "En cours…",
+ "transferring": "Transfert en cours…"
+ }
+}
diff --git a/public_included_ws_fallback/scripts/localization.js b/public_included_ws_fallback/scripts/localization.js
index cc6f87c..8d471cb 100644
--- a/public_included_ws_fallback/scripts/localization.js
+++ b/public_included_ws_fallback/scripts/localization.js
@@ -1,7 +1,7 @@
class Localization {
constructor() {
Localization.defaultLocale = "en";
- Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id"];
+ Localization.supportedLocales = ["en", "nb", "ru", "zh-CN", "de", "ro", "id", "fr"];
Localization.translations = {};
Localization.defaultTranslations = {};