diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 262471c9..c4e1b5e9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,11 +141,12 @@ If the second command reports `[+]` for the fake username, the check is a false ## Editing documentation -The docs under `docs/source/` use Sphinx (reStructuredText) with a Simplified Chinese translation in `docs/source/locale/zh_CN/`. **If you edit any `.rst` file, refresh the translation catalogs so the Chinese build does not silently fall back to English on the changed strings:** +The docs under `docs/source/` use Sphinx (reStructuredText) with Simplified Chinese and French translations under `docs/source/locale/`. **If you edit any `.rst` file, refresh the translation catalogs so the translated builds do not silently fall back to English on the changed strings:** ```bash cd docs make intl-update LANG=zh_CN +make intl-update LANG=fr ``` This regenerates the `.po` files — new strings appear with empty `msgstr ""` and changed ones get a `#, fuzzy` marker. Translating them is optional for a PR (a maintainer or translator can fill them in later), but committing the regenerated `.po` files is **not** optional — otherwise the next person who runs `intl-update` gets a noisy diff for changes that aren't theirs. Full workflow, CJK-specific gotchas, and how to add a new language: [development guide](docs/source/development.rst), section *Translations*. diff --git a/README.fr.md b/README.fr.md new file mode 100644 index 00000000..48748524 --- /dev/null +++ b/README.fr.md @@ -0,0 +1,430 @@ +# Maigret + +
+ +**Maigret** rassemble un dossier sur une personne **à partir d'un simple nom d'utilisateur** : il recherche ses comptes sur un très grand nombre de sites et collecte toutes les informations disponibles sur les pages web. Aucune clé d'API n'est nécessaire. **[Profilage par IA (démo)](#ai-analysis)**. + +## Sponsors + +
+
+
+
+
+
+
+ RapidProxy fournit des proxys résidentiels performants pour le scraping de Twitter, l'automatisation avec Selenium et l'extraction de données web. Plus de 90 millions d'IP · rotation intelligente · anti-blocage · trafic sans expiration.
+Offre spéciale : essai gratuit, formules à partir de 0,65 $/Go. Utilisez le code RAPID10 pour 10 % de réduction.
+
+
+
+
+
+ MangoProxy est un service de proxys résidentiels, ISP, mobiles et de datacenter, conçu pour les usages professionnels où la stabilité, la vitesse et l'anonymat comptent.
+Code promo : SOXOJ - 8 % de réduction sur les proxys ISP statiques
+
+
+
+
+
+ Thordata fournit des proxys résidentiels fiables pour la recherche OSINT, la recherche de noms d'utilisateur et la collecte de données publiques.
+Accédez à plus de 100 millions d'IP résidentielles réelles dans plus de 195 pays, avec des connexions simultanées illimitées, 99,99 % de disponibilité, des connexions stables, des sessions rotatives ou persistantes et un taux de réussite élevé.
+
+Offre spéciale : 3 jours d'essai gratuit + 10 % de réduction avec le code SOXOJ10.
+
+
+`) builds a local HTML preview
+# in that language.
#
# To bootstrap a new language, run `make intl-update LANG=`.
LANG ?= zh_CN
@@ -31,8 +32,8 @@ gettext:
intl-update: gettext
sphinx-intl update -p "$(BUILDDIR)/gettext" -l $(LANG) -d "$(SOURCEDIR)/locale"
-html-zh_CN:
- $(SPHINXBUILD) -b html -D language=zh_CN $(SPHINXOPTS) "$(SOURCEDIR)" "$(BUILDDIR)/html_zh_CN"
+html-%:
+ $(SPHINXBUILD) -b html -D language=$* $(SPHINXOPTS) "$(SOURCEDIR)" "$(BUILDDIR)/html_$*"
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
diff --git a/docs/source/development.rst b/docs/source/development.rst
index f1324dd5..477dac25 100644
--- a/docs/source/development.rst
+++ b/docs/source/development.rst
@@ -450,7 +450,7 @@ Translations
The docs are translated via Sphinx's standard gettext workflow. English ``.rst`` files
are the source of truth; translations live as ``.po`` catalogs under
-``docs/source/locale//LC_MESSAGES/`` (currently only ``zh_CN``).
+``docs/source/locale//LC_MESSAGES/`` (currently ``zh_CN`` and ``fr``).
After editing any English ``.rst`` file, refresh the catalogs so existing
translations stay aligned with the new strings:
diff --git a/docs/source/locale/fr/LC_MESSAGES/command-line-options.po b/docs/source/locale/fr/LC_MESSAGES/command-line-options.po
new file mode 100644
index 00000000..b6c4817c
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/command-line-options.po
@@ -0,0 +1,1019 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/command-line-options.rst:4 b8d147dd2c5e4fe298840e5ddf66d706
+msgid "Command line options"
+msgstr "Options de ligne de commande"
+
+#: ../../source/command-line-options.rst:7 3d13047f6d9b47b0a9488c237082c427
+msgid "Usernames"
+msgstr "Noms d'utilisateur"
+
+#: ../../source/command-line-options.rst:9 42185cd0554649e09110c7d2a110da40
+msgid "``maigret username1 username2 ...``"
+msgstr "``maigret nomdutilisateur1 nomdutilisateur2 ...``"
+
+#: ../../source/command-line-options.rst:11 00a93d35b20e445c911edb914d89d448
+msgid ""
+"You can specify several usernames separated by space. Usernames are "
+"**not** mandatory as there are other operations modes (see below)."
+msgstr ""
+"Vous pouvez indiquer plusieurs noms d'utilisateur séparés par des "
+"espaces. Les noms d'utilisateur ne sont **pas** obligatoires, car il "
+"existe d'autres modes de fonctionnement (voir plus bas)."
+
+#: ../../source/command-line-options.rst:17 9172eef8b4dc4f0bad82a0b8c5bf2a6a
+msgid "Identifiers from a file"
+msgstr "Identifiants depuis un fichier"
+
+#: ../../source/command-line-options.rst:19 0ad23abc5e784d95979ac0825f237d91
+msgid "``maigret --input-file ids.txt``"
+msgstr "``maigret --input-file ids.txt``"
+
+#: ../../source/command-line-options.rst:21 3b19b2e15da9414190a8aedfe51a85b1
+msgid ""
+"Reads identifiers from a file, one per line, and searches them exactly "
+"like positional ones. A single ``-`` as the path reads standard input "
+"instead, so a generator can be piped straight in. Blank lines and lines "
+"starting with ``#`` are skipped."
+msgstr ""
+"Lit les identifiants depuis un fichier, un par ligne, et les recherche "
+"exactement comme des arguments positionnels. Un simple ``-`` comme chemin"
+" lit l'entrée standard à la place, ce qui permet de brancher directement "
+"un générateur. Les lignes vides et celles commençant par ``#`` sont "
+"ignorées."
+
+#: ../../source/command-line-options.rst:26 779532ddb0684b48830135f105eb434d
+msgid ""
+"Every line is searched as the type given by ``--id-type``, which is "
+"``username`` unless you change it. A line can also carry its own type as "
+"an ``id_type:value`` prefix, and that is how one run can mix usernames "
+"with social network ids."
+msgstr ""
+"Chaque ligne est recherchée avec le type indiqué par ``--id-type``, qui "
+"vaut ``username`` tant que vous ne le changez pas. Une ligne peut aussi "
+"porter son propre type sous la forme d'un préfixe ``id_type:valeur`` : "
+"c'est ainsi qu'une seule exécution peut mélanger des noms d'utilisateur "
+"et des identifiants de réseaux sociaux."
+
+#: ../../source/command-line-options.rst:31 b58ebacf3c4c4b738494b9bee0789897
+msgid "For example, ``ids.txt``:"
+msgstr "Par exemple, ``ids.txt`` :"
+
+#: ../../source/command-line-options.rst:44 bb052c03b2424915887fd4929e9b3135
+msgid "Then run Maigret against it:"
+msgstr "Lancez ensuite Maigret dessus :"
+
+#: ../../source/command-line-options.rst:50 2d71debd173449029074c6116a72fac1
+msgid ""
+"Every line is searched with the type Maigret picked for it, and the type "
+"is printed as it goes:"
+msgstr ""
+"Chaque ligne est recherchée avec le type que Maigret a retenu pour elle, "
+"et ce type est affiché au fil de l'exécution :"
+
+#: ../../source/command-line-options.rst:61 e55895069377483da7c9d2d9bb2e0f2e
+msgid "A generator can also be piped in directly, without a file in between:"
+msgstr ""
+"Un générateur peut aussi être branché directement, sans fichier "
+"intermédiaire :"
+
+#: ../../source/command-line-options.rst:67 7d2ece91d36c44afaa05c9d1eeb9331a
+msgid ""
+"Mixing types in one run is worth it because everything found lands in a "
+"single report and a single connections graph, while separate runs give "
+"you separate ones."
+msgstr ""
+"Mélanger les types en une seule exécution a un intérêt : tout ce qui est "
+"trouvé atterrit dans un seul rapport et un seul graphe de connexions, "
+"alors que des exécutions séparées en produisent autant de séparés."
+
+#: ../../source/command-line-options.rst:71 6efcd1f57a4242b99e4828caede055e2
+msgid ""
+"Note that ``--permute`` applies to positional usernames only. Names "
+"coming from a file are searched as they are written, because a file can "
+"hold thousands of lines and permuting those is rarely what you want."
+msgstr ""
+"À noter : ``--permute`` ne s'applique qu'aux noms d'utilisateur passés en"
+" arguments positionnels. Les noms venant d'un fichier sont recherchés "
+"tels qu'ils sont écrits, car un fichier peut contenir des milliers de "
+"lignes et en permuter le contenu est rarement ce que l'on veut."
+
+#: ../../source/command-line-options.rst:76 55cbdbdd7e1c40489fdbea2e69c5ce40
+msgid "Parsing of account pages and online documents"
+msgstr "Analyse des pages de comptes et des documents en ligne"
+
+#: ../../source/command-line-options.rst:78 2140b01e8ecc4c7fb943475fb575cad4
+msgid "``maigret --parse URL``"
+msgstr "``maigret --parse URL``"
+
+#: ../../source/command-line-options.rst:80 bf224b4be03e4efc8bed5216d119cf5a
+msgid ""
+"Maigret will try to extract information about the document/account owner "
+"(including username and other ids) and will make a search by the "
+"extracted username and ids. See examples in the :ref:`extracting-"
+"information-from-pages` section."
+msgstr ""
+"Maigret tentera d'extraire des informations sur le titulaire du document "
+"ou du compte (dont son nom d'utilisateur et d'autres identifiants), puis "
+"lancera une recherche à partir du nom d'utilisateur et des identifiants "
+"extraits. Voir les exemples dans la section :ref:`extracting-information-"
+"from-pages`."
+
+#: ../../source/command-line-options.rst:85 71de4fc966bd47efb8a17906728ee316
+msgid "Main options"
+msgstr "Options principales"
+
+#: ../../source/command-line-options.rst:87 13cde4a2ba5e47ec9d5b19746e804264
+msgid ""
+"Options are also configurable through settings files, see :doc:`settings "
+"section `."
+msgstr ""
+"Les options sont également configurables via des fichiers de paramètres, "
+"voir la :doc:`section Paramètres `."
+
+#: ../../source/command-line-options.rst:90 2e98b41408324aef9c0e2f6415ac2ec9
+msgid ""
+"``--tags`` - Filter sites for searching by tags: sites categories and "
+"two-letter country codes (**not a language!**). E.g. photo, dating, "
+"sport; jp, us, global. Multiple tags can be associated with one site. "
+"**Warning**: tags markup is not stable now. Read more :doc:`in the "
+"separate section `."
+msgstr ""
+"``--tags`` - Filtre les sites de la recherche par tags : catégories de "
+"sites et codes pays à deux lettres (**pas une langue !**). Par exemple "
+"photo, dating, sport ; jp, us, global. Plusieurs tags peuvent être "
+"associés à un même site. **Attention** : le balisage par tags n'est pas "
+"encore stable. Plus de détails :doc:`dans la section dédiée `."
+
+#: ../../source/command-line-options.rst:95 f97cfdc4d2684fb296ac9b2ebebe708d
+msgid ""
+"``--exclude-tags`` - Exclude sites with specific tags from the search "
+"(blacklist). E.g. ``--exclude-tags porn,dating`` will skip all sites "
+"tagged with ``porn`` or ``dating``. Can be combined with ``--tags`` to "
+"include certain categories while excluding others. Read more :doc:`in the"
+" separate section `."
+msgstr ""
+"``--exclude-tags`` - Exclut de la recherche les sites portant certains "
+"tags (liste noire). Par exemple, ``--exclude-tags porn,dating`` ignorera "
+"tous les sites marqués ``porn`` ou ``dating``. Peut se combiner avec "
+"``--tags`` pour inclure certaines catégories tout en en excluant "
+"d'autres. Plus de détails :doc:`dans la section dédiée `."
+
+#: ../../source/command-line-options.rst:101 2579aaf6ecba4604ad5a893afbe191a7
+msgid ""
+"``-n``, ``--max-connections`` - Allowed number of concurrent connections "
+"**(default: 100)**."
+msgstr ""
+"``-n``, ``--max-connections`` - Nombre de connexions simultanées "
+"autorisées **(par défaut : 100)**."
+
+#: ../../source/command-line-options.rst:104 f5db788c9b794d5aa64aedf3a842920a
+msgid "``-a``, ``--all-sites`` - Use all sites for scan **(default: top 500)**."
+msgstr ""
+"``-a``, ``--all-sites`` - Utilise tous les sites pour la recherche **(par"
+" défaut : les 500 premiers)**."
+
+#: ../../source/command-line-options.rst:106 eaf636e3de8a44a38d34c0a69f48db4f
+msgid ""
+"``--top-sites`` - Count of sites for scan ranked by Majestic Million "
+"**(default: top 500)**."
+msgstr ""
+"``--top-sites`` - Nombre de sites à parcourir, classés selon Majestic "
+"Million **(par défaut : les 500 premiers)**."
+
+#: ../../source/command-line-options.rst:109 8d48504140c745aea1da10c9dc367515
+msgid ""
+"**Mirrors:** After the top *N* sites by Majestic Million rank are chosen "
+"(respecting ``--tags``, ``--use-disabled-sites``, etc.), Maigret may add "
+"extra sites whose database field ``source`` names a **parent platform** "
+"that itself falls in the Majestic Million top *N* when ranking "
+"**including disabled** sites. For example, if ``Twitter`` ranks in the "
+"first 500 by Majestic Million, a mirror such as ``memory.lol`` (with "
+"``source: Twitter``) is included even though it has no rank and would "
+"otherwise be cut off. The same applies to Instagram-related mirrors (e.g."
+" Picuki) when ``Instagram`` is in that parent top *N* by rank—even if the"
+" official ``Instagram`` entry is disabled and not scanned by default, its"
+" mirrors can still be pulled in. The final list is the ranked top *N* "
+"plus these mirrors (no fixed upper bound on mirror count)."
+msgstr ""
+"**Miroirs :** une fois choisis les *N* premiers sites au classement "
+"Majestic Million (en respectant ``--tags``, ``--use-disabled-sites``, "
+"etc.), Maigret peut ajouter des sites supplémentaires dont le champ "
+"``source`` de la base désigne une **plateforme parente** qui figure elle-"
+"même dans les *N* premiers du Majestic Million, **sites désactivés "
+"inclus** dans ce classement. Par exemple, si ``Twitter`` figure dans les "
+"500 premiers du Majestic Million, un miroir comme ``memory.lol`` (avec "
+"``source: Twitter``) est inclus, alors même qu'il n'a aucun rang et "
+"serait autrement écarté. Il en va de même pour les miroirs liés à "
+"Instagram (Picuki, par exemple) lorsque ``Instagram`` fait partie de ces "
+"*N* premiers par rang : même si l'entrée officielle ``Instagram`` est "
+"désactivée et n'est pas parcourue par défaut, ses miroirs peuvent quand "
+"même être tirés. La liste finale est donc celle des *N* premiers au "
+"classement, plus ces miroirs (sans limite supérieure fixe sur le nombre "
+"de miroirs)."
+
+#: ../../source/command-line-options.rst:121 328eece5f2a742738c9a437ece59d764
+msgid ""
+"``--timeout`` - Time (in seconds) to wait for responses from sites "
+"**(default: 30)**. A longer timeout will be more likely to get results "
+"from slow sites. On the other hand, this may cause a long delay to gather"
+" all results. The choice of the right timeout should be carried out "
+"taking into account the bandwidth of the Internet connection."
+msgstr ""
+"``--timeout`` - Temps d'attente (en secondes) des réponses des sites "
+"**(par défaut : 30)**. Un délai plus long donne plus de chances d'obtenir"
+" des résultats des sites lents. En contrepartie, cela peut allonger "
+"considérablement la collecte de tous les résultats. Le bon délai se "
+"choisit en tenant compte du débit de la connexion internet."
+
+#: ../../source/command-line-options.rst:128 2f285fc5668347949928fbf3cb42051e
+msgid "Network and proxy options"
+msgstr "Options de réseau et de proxy"
+
+#: ../../source/command-line-options.rst:130 469a4d5c709e4513a2a99b2235c6c90a
+msgid ""
+"``--proxy PROXY_URL`` / ``-p PROXY_URL`` - Route **every** check through "
+"the given HTTP or SOCKS proxy. Example: ``socks5://127.0.0.1:1080``, "
+"``http://user:pass@proxy.example:3128``. This is the flag to use for "
+"routing the whole run through Tor (``--proxy socks5://127.0.0.1:9050``), "
+"a residential proxy, or any corporate gateway. No default."
+msgstr ""
+"``--proxy URL_PROXY`` / ``-p URL_PROXY`` - Fait passer **toutes** les "
+"vérifications par le proxy HTTP ou SOCKS indiqué. Exemples : "
+"``socks5://127.0.0.1:1080``, ``http://user:pass@proxy.example:3128``. "
+"C'est l'option à utiliser pour faire passer toute la recherche par Tor "
+"(``--proxy socks5://127.0.0.1:9050``), par un proxy résidentiel ou par "
+"n'importe quelle passerelle d'entreprise. Aucune valeur par défaut."
+
+#: ../../source/command-line-options.rst:136 f45e39f281df44428732a50b449c9ee3
+msgid ""
+"``socks5://`` and ``socks5h://`` are interchangeable: Maigret rewrites "
+"the scheme to the spelling expected by the transport handling each site, "
+"so either one resolves hostnames **at the proxy** for the whole database."
+msgstr ""
+"``socks5://`` et ``socks5h://`` sont interchangeables : Maigret réécrit "
+"le schéma dans la forme attendue par le transport qui traite chaque site,"
+" de sorte que l'un comme l'autre résout les noms d'hôte **au niveau du "
+"proxy** pour toute la base."
+
+#: ../../source/command-line-options.rst:140 eb8057e15a784358902c7d70af9895d7
+msgid ""
+"``--tor-proxy TOR_PROXY_URL`` - Gateway used **only** for ``.onion`` "
+"sites in the database **(default: socks5://127.0.0.1:9050)**. Clearweb "
+"sites are unaffected — for them Maigret uses your direct connection or "
+"``--proxy`` if you set one. Without this flag, ``.onion`` sites are "
+"silently skipped."
+msgstr ""
+"``--tor-proxy URL_PROXY_TOR`` - Passerelle utilisée **uniquement** pour "
+"les sites ``.onion`` de la base **(par défaut : "
+"socks5://127.0.0.1:9050)**. Les sites du web classique ne sont pas "
+"concernés : pour eux, Maigret utilise votre connexion directe, ou "
+"``--proxy`` si vous en avez défini un. Sans cette option, les sites "
+"``.onion`` sont silencieusement ignorés."
+
+#: ../../source/command-line-options.rst:146 c82c6fddea73447d8968f6e206605cb5
+msgid ""
+"``--i2p-proxy I2P_PROXY_URL`` - Gateway used **only** for ``.i2p`` sites "
+"in the database **(default: http://127.0.0.1:4444)**. Same \"only "
+"matching protocol\" rule as ``--tor-proxy``."
+msgstr ""
+"``--i2p-proxy URL_PROXY_I2P`` - Passerelle utilisée **uniquement** pour "
+"les sites ``.i2p`` de la base **(par défaut : http://127.0.0.1:4444)**. "
+"Même règle de « protocole correspondant uniquement » que pour ``--tor-"
+"proxy``."
+
+#: ../../source/command-line-options.rst:150 28955e6400684cc9ba7993a456433479
+msgid ""
+"Maigret does not start the Tor or I2P daemon for you — launch it first. "
+"For a full walkthrough (Tor Browser vs system ``tor`` port numbers, Tails"
+" OS recipe, timeout/retry tuning), see :doc:`tor-and-proxies`."
+msgstr ""
+"Maigret ne démarre ni le démon Tor ni le routeur I2P à votre place : "
+"lancez-le d'abord. Pour une explication complète (ports de Tor Browser et"
+" du ``tor`` système, recette pour Tails OS, réglage des délais et des "
+"nouvelles tentatives), voir :doc:`tor-and-proxies`."
+
+#: ../../source/command-line-options.rst:154 96f8c57425544027a2d07916cc6a1668
+msgid ""
+"``--cookies-jar-file`` - File with custom cookies in Netscape format (aka"
+" cookies.txt). You can install an extension to your browser to download "
+"own cookies (`Chrome `_, `Firefox "
+" `_)."
+msgstr ""
+"``--cookies-jar-file`` - Fichier de cookies personnalisés au format "
+"Netscape (alias cookies.txt). Vous pouvez installer une extension dans "
+"votre navigateur pour télécharger vos propres cookies (`Chrome "
+"`_, `Firefox "
+" `_)."
+
+#: ../../source/command-line-options.rst:158 154a8b7d243e4166bf7c2cf7e6e1ed75
+msgid ""
+"``--no-recursion`` - Disable parsing pages for other usernames and "
+"recursive search by them."
+msgstr ""
+"``--no-recursion`` - Désactive l'analyse des pages à la recherche "
+"d'autres noms d'utilisateur, ainsi que la recherche récursive à partir de"
+" ceux-ci."
+
+#: ../../source/command-line-options.rst:161 5f9b9f5fd66046ad9ade5ceb02173cbe
+msgid ""
+"``--use-disabled-sites`` - Use disabled sites to search (may cause many "
+"false positives)."
+msgstr ""
+"``--use-disabled-sites`` - Utilise également les sites désactivés pour la"
+" recherche (risque de nombreux faux positifs)."
+
+#: ../../source/command-line-options.rst:164 9979dec31a994027ac1398a34a6cf912
+msgid ""
+"``--id-type`` - Specify identifier(s) type (default: username). Supported"
+" types: gaia_id, steam_id, vk_id, yandex_public_id, ok_id, wikimapia_uid,"
+" uidme_uguid, yelp_userid, orcid, qq_id, bilibili_id. Sites whose type "
+"does not match are filtered out automatically. See :ref:`supported-"
+"identifier-types` for details and an example."
+msgstr ""
+"``--id-type`` - Précise le type des identifiants (``username`` par "
+"défaut). Types pris en charge : gaia_id, steam_id, vk_id, "
+"yandex_public_id, ok_id, wikimapia_uid, uidme_uguid, yelp_userid, orcid, "
+"qq_id, bilibili_id. Les sites dont le type ne correspond pas sont écartés"
+" automatiquement. Voir :ref:`supported-identifier-types` pour les détails"
+" et un exemple."
+
+#: ../../source/command-line-options.rst:170 d13aa9ce26ab4e629f3a9c5e4193cc57
+msgid ""
+"``--input-file`` - Read identifiers from a file, one per line. See :ref"
+":`identifiers-from-a-file` above."
+msgstr ""
+"``--input-file`` - Lit les identifiants depuis un fichier, un par ligne. "
+"Voir :ref:`identifiers-from-a-file` ci-dessus."
+
+#: ../../source/command-line-options.rst:173 585ab26839364a08b43205108efbc4a1
+msgid ""
+"``--ignore-ids`` - Do not make search by the specified username or other "
+"ids. Useful for repeated scanning with found known irrelevant usernames."
+msgstr ""
+"``--ignore-ids`` - Ne pas rechercher le nom d'utilisateur ou les "
+"identifiants indiqués. Utile pour relancer un scan en écartant des noms "
+"d'utilisateur déjà identifiés comme hors sujet."
+
+#: ../../source/command-line-options.rst:176 fbeb9b462ad044699cb400bbf241e490
+msgid ""
+"``--db`` - Load Maigret database from a JSON file or an online, valid, "
+"JSON file. See :ref:`custom-database` below."
+msgstr ""
+"``--db`` - Charge la base de Maigret depuis un fichier JSON local ou un "
+"fichier JSON valide en ligne. Voir :ref:`custom-database` ci-dessous."
+
+#: ../../source/command-line-options.rst:179 bafd6173526b4bdbae8f24e9ef2707dc
+msgid ""
+"``--no-autoupdate`` - Disable the automatic database update check that "
+"runs at startup. The currently cached (or bundled) database is used as-"
+"is."
+msgstr ""
+"``--no-autoupdate`` - Désactive la vérification automatique des mises à "
+"jour de la base au démarrage. La base actuellement en cache (ou "
+"embarquée) est utilisée telle quelle."
+
+#: ../../source/command-line-options.rst:183 c5122d8448fc4a9ba76d5b949c600f7f
+msgid ""
+"``--force-update`` - Force a database update check at startup, ignoring "
+"the usual check interval. Implies ``--no-autoupdate`` for the rest of the"
+" run after the explicit update finishes."
+msgstr ""
+"``--force-update`` - Force une vérification des mises à jour de la base "
+"au démarrage, sans tenir compte de l'intervalle habituel. Implique "
+"``--no-autoupdate`` pour le reste de l'exécution, une fois la mise à jour"
+" explicite terminée."
+
+#: ../../source/command-line-options.rst:187 3af3a55c069243d99943f842a6fc6bf6
+msgid ""
+"``--retries RETRIES`` - Count of attempts to restart temporarily failed "
+"requests."
+msgstr ""
+"``--retries RETRIES`` - Nombre de tentatives de relance des requêtes "
+"ayant échoué temporairement."
+
+#: ../../source/command-line-options.rst:190 b5a9b31868d44bd4af4a1ee10fae237e
+#, python-brace-format
+msgid ""
+"``--with-domains`` *(experimental)* - Also resolve a small set of "
+"``{username}.`` patterns through DNS (A-records) in parallel with "
+"the normal HTTP checks. Currently 7 entries in the database use this path"
+" (``.ddns.net``, ``.com``, ``.pro``, ``.me``, ``.biz``, ``.email``, "
+"``.guru``). DNS-only hits can include parking domains and catch-all "
+"wildcards, so treat results as a lead rather than confirmation. See the "
+":doc:`FAQ entry on DNS domain checks `."
+msgstr ""
+"``--with-domains`` *(expérimental)* - Résout également par DNS "
+"(enregistrements A) un petit ensemble de motifs ``{username}.``, en "
+"parallèle des vérifications HTTP habituelles. Actuellement, 7 entrées de "
+"la base empruntent ce chemin (``.ddns.net``, ``.com``, ``.pro``, ``.me``,"
+" ``.biz``, ``.email``, ``.guru``). Un résultat purement DNS peut "
+"correspondre à un domaine parqué ou à un joker attrape-tout : traitez-le "
+"comme une piste, pas comme une confirmation. Voir l':doc:`entrée de la "
+"FAQ sur les vérifications DNS `."
+
+#: ../../source/command-line-options.rst:198 1278f941926643d6baa535fa6807d491
+msgid ""
+"``--cloudflare-bypass`` *(experimental)* - Route checks for sites tagged "
+"``protection: [\"cf_js_challenge\"]`` / ``[\"cf_firewall\"]`` / "
+"``[\"webgate\"]`` through a local Chrome-based solver (FlareSolverr by "
+"default). The bypass is opt-in — without this flag (or "
+"``settings.cloudflare_bypass.enabled = true``) those sites are checked "
+"the usual way, which Cloudflare almost always blocks: you get an UNKNOWN "
+"status with a JS-challenge / firewall error rather than a real result. "
+"Configure the backend in ``settings.cloudflare_bypass.modules``. See :ref"
+":`cloudflare-bypass`. **Experimental** — the flag, schema and routing "
+"rules may change without backwards-compatibility guarantees."
+msgstr ""
+"``--cloudflare-bypass`` *(expérimental)* - Fait passer les vérifications "
+"des sites marqués ``protection: [\"cf_js_challenge\"]`` / "
+"``[\"cf_firewall\"]`` / ``[\"webgate\"]`` par un solveur local basé sur "
+"Chrome (FlareSolverr par défaut). Le contournement est facultatif : sans "
+"cette option (ou sans ``settings.cloudflare_bypass.enabled = true``), ces"
+" sites sont vérifiés de la façon habituelle, ce que Cloudflare bloque "
+"presque toujours ; vous obtenez alors un statut UNKNOWN avec une erreur "
+"de défi JavaScript ou de pare-feu, plutôt qu'un vrai résultat. Le backend"
+" se configure dans ``settings.cloudflare_bypass.modules``. Voir :ref"
+":`cloudflare-bypass`. **Expérimental** : l'option, le schéma et les "
+"règles de routage peuvent changer sans garantie de compatibilité "
+"ascendante."
+
+#: ../../source/command-line-options.rst:212 29c41c569f98470fb0e4a78b8bb139db
+msgid "Using a custom sites database"
+msgstr "Utiliser une base de sites personnalisée"
+
+#: ../../source/command-line-options.rst:214 b42ec5f4563e4879a96d4c256d826a6e
+msgid "The ``--db`` flag accepts three forms:"
+msgstr "L'option ``--db`` accepte trois formes :"
+
+#: ../../source/command-line-options.rst:216 e96286cbc2314d309ac8c93977277e34
+msgid ""
+"**HTTP(S) URL** — fetched as-is, e.g. ``--db "
+"https://example.com/my_db.json``."
+msgstr ""
+"**Une URL HTTP(S)** — récupérée telle quelle, par exemple ``--db "
+"https://example.com/ma_base.json``."
+
+#: ../../source/command-line-options.rst:218 0bff112a4cec4c4492afa63af9e5d1a1
+msgid ""
+"**Local file path** — absolute (``--db /tmp/private.json``) or relative "
+"to the current working directory (``--db LLM/maigret_private_db.json``)."
+msgstr ""
+"**Un chemin de fichier local** — absolu (``--db /tmp/private.json``) ou "
+"relatif au répertoire de travail courant (``--db "
+"LLM/maigret_private_db.json``)."
+
+#: ../../source/command-line-options.rst:221 eed9bc6ac67f49879a865a471c244aa4
+msgid ""
+"**Module-relative path** — kept for backwards compatibility, resolved "
+"against the installed ``maigret/`` package directory (e.g. the default "
+"``resources/data.json``)."
+msgstr ""
+"**Un chemin relatif au module** — conservé pour la compatibilité "
+"ascendante, résolu par rapport au répertoire du paquet ``maigret/`` "
+"installé (par exemple le ``resources/data.json`` par défaut)."
+
+#: ../../source/command-line-options.rst:225 5ffeaba33d524489beb7e9e742d8c529
+msgid ""
+"Resolution order for local paths: the path is first tried as given "
+"(absolute or cwd-relative); if that file does not exist, Maigret falls "
+"back to the legacy module-relative resolution. If neither location "
+"contains the file, Maigret exits with an error rather than silently "
+"loading the bundled database."
+msgstr ""
+"Ordre de résolution des chemins locaux : le chemin est d'abord essayé tel"
+" quel (absolu ou relatif au répertoire courant) ; si ce fichier n'existe "
+"pas, Maigret se rabat sur l'ancienne résolution relative au module. Si le"
+" fichier ne se trouve à aucun de ces endroits, Maigret s'arrête sur une "
+"erreur plutôt que de charger silencieusement la base embarquée."
+
+#: ../../source/command-line-options.rst:231 a5b0d7b56f1743569b4d851d61326e49
+msgid ""
+"When ``--db`` points to a custom file, automatic database updates are "
+"skipped — the file is used exactly as provided."
+msgstr ""
+"Lorsque ``--db`` désigne un fichier personnalisé, les mises à jour "
+"automatiques de la base sont ignorées : le fichier est utilisé exactement"
+" tel qu'il est fourni."
+
+#: ../../source/command-line-options.rst:234 2ef8d38c6a8f4126a4a4145ef416b559
+msgid "On every run Maigret prints the database it actually loaded, for example::"
+msgstr ""
+"À chaque exécution, Maigret affiche la base qu'il a réellement chargée, "
+"par exemple ::"
+
+#: ../../source/command-line-options.rst:239 bf8ebe6badd34738a655ebd38c46d7f7
+msgid ""
+"If loading the requested database fails for any other reason (corrupt "
+"JSON, missing required keys, …), Maigret prints a warning, falls back to "
+"the bundled database, and reports the fallback explicitly::"
+msgstr ""
+"Si le chargement de la base demandée échoue pour une autre raison (JSON "
+"corrompu, clés obligatoires manquantes, etc.), Maigret affiche un "
+"avertissement, se rabat sur la base embarquée et signale explicitement ce"
+" repli ::"
+
+#: ../../source/command-line-options.rst:246 3ef5935ef0844dde9052d99812e3bd66
+msgid ""
+"A typical invocation against a private database, with auto-update "
+"disabled and all sites scanned, looks like::"
+msgstr ""
+"Un appel typique sur une base privée, avec la mise à jour automatique "
+"désactivée et tous les sites parcourus, ressemble à ceci ::"
+
+#: ../../source/command-line-options.rst:254 97fcd4ecdb3344c8ba37fc0f8118025f
+msgid "Reports"
+msgstr "Rapports"
+
+#: ../../source/command-line-options.rst:256 f3c1d62ce1b843c182678493dd19faad
+msgid ""
+"``-P``, ``--pdf`` - Generate a PDF report (general report on all "
+"usernames)."
+msgstr ""
+"``-P``, ``--pdf`` - Génère un rapport PDF (rapport global sur tous les "
+"noms d'utilisateur)."
+
+#: ../../source/command-line-options.rst:259 f6dddd707b344b3ead8ec1d8cfce4daf
+msgid ""
+"``-H``, ``--html`` - Generate an HTML report file (general report on all "
+"usernames)."
+msgstr ""
+"``-H``, ``--html`` - Génère un rapport HTML (rapport global sur tous les "
+"noms d'utilisateur)."
+
+#: ../../source/command-line-options.rst:262 884510421f124215b58b10346f18bf91
+msgid ""
+"``-X``, ``--xmind`` - Generate a legacy XML XMind mindmap with a manifest"
+" for modern readers (one report per username)."
+msgstr ""
+"``-X``, ``--xmind`` - Génère une carte mentale XMind au format XML "
+"hérité, avec un manifeste pour les lecteurs récents (un rapport par nom "
+"d'utilisateur)."
+
+#: ../../source/command-line-options.rst:265 799d83ec57984953830af49a17a3ce87
+msgid "``-C``, ``--csv`` - Generate a CSV report (one report per username)."
+msgstr ""
+"``-C``, ``--csv`` - Génère un rapport CSV (un rapport par nom "
+"d'utilisateur)."
+
+#: ../../source/command-line-options.rst:267 b98a18e94ada4863a385edef78bb4ed8
+msgid "``-T``, ``--txt`` - Generate a TXT report (one report per username)."
+msgstr ""
+"``-T``, ``--txt`` - Génère un rapport TXT (un rapport par nom "
+"d'utilisateur)."
+
+#: ../../source/command-line-options.rst:269 3169d073ba814ef2a7ae4998c56113c2
+msgid ""
+"``-J``, ``--json`` - Generate a JSON report of specific type: simple, "
+"ndjson (one report per username). E.g. ``--json ndjson``"
+msgstr ""
+"``-J``, ``--json`` - Génère un rapport JSON du type indiqué : simple, "
+"ndjson (un rapport par nom d'utilisateur). Par exemple ``--json ndjson``"
+
+#: ../../source/command-line-options.rst:272 077348779720483a8dbfc410cbcc2164
+msgid ""
+"``-M``, ``--md`` - Generate a Markdown report (general report on all "
+"usernames). See :ref:`markdown-report` below."
+msgstr ""
+"``-M``, ``--md`` - Génère un rapport Markdown (rapport global sur tous "
+"les noms d'utilisateur). Voir :ref:`markdown-report` ci-dessous."
+
+#: ../../source/command-line-options.rst:275 febacdc7306e4200954f142ad61bf9c5
+msgid ""
+"``--neo4j`` - Generate a Neo4j Cypher report: a ``.cypher`` script that "
+"recreates the maigret graph (the same one produced by ``--graph``) in a "
+"Neo4j database, importable with ``cypher-shell`` or the Neo4j Browser "
+"(general report on all usernames). See :ref:`neo4j-export` below."
+msgstr ""
+"``--neo4j`` - Génère un rapport Cypher pour Neo4j : un script ``.cypher``"
+" qui recrée le graphe de Maigret (celui-là même que produit ``--graph``) "
+"dans une base Neo4j, importable avec ``cypher-shell`` ou le Neo4j Browser"
+" (rapport global sur tous les noms d'utilisateur). Voir :ref:`neo4j-"
+"export` ci-dessous."
+
+#: ../../source/command-line-options.rst:280 abbccc69b80a46a2913115a6d17760a0
+msgid ""
+"``--ai`` - Run an AI-powered analysis of the search results using an "
+"OpenAI-compatible chat completion API. The internal Markdown report is "
+"sent to the model, which returns a short investigation summary that is "
+"streamed to the terminal. See :ref:`ai-analysis` below."
+msgstr ""
+"``--ai`` - Lance une analyse des résultats par IA via une API de "
+"complétion de conversation compatible OpenAI. Le rapport Markdown interne"
+" est envoyé au modèle, qui renvoie une courte synthèse d'enquête, "
+"diffusée au fil de l'eau dans le terminal. Voir :ref:`ai-analysis` ci-"
+"dessous."
+
+#: ../../source/command-line-options.rst:285 1966c6fbfca34b98b577ca0b0c3ff7a6
+msgid ""
+"``--ai-model`` - Model name to use with ``--ai``. Defaults to "
+"``openai_model`` from settings (``gpt-4o`` out of the box)."
+msgstr ""
+"``--ai-model`` - Nom du modèle à utiliser avec ``--ai``. Par défaut, la "
+"valeur ``openai_model`` des paramètres (``gpt-4o`` d'origine)."
+
+#: ../../source/command-line-options.rst:288 910bae8a3bcd4579a7300ccfcad401c1
+msgid ""
+"``-fo``, ``--folderoutput`` - Results will be saved to this folder, "
+"``results`` by default. Will be created if doesn’t exist."
+msgstr ""
+"``-fo``, ``--folderoutput`` - Les résultats seront enregistrés dans ce "
+"dossier, ``results`` par défaut. Il sera créé s'il n'existe pas."
+
+#: ../../source/command-line-options.rst:291 88420e1f8c4e4225b6762a9fe4666c49
+msgid ""
+"``--web PORT`` - Start the built-in web interface on the given port and "
+"serve results / downloadable reports from a single page. Example: "
+"``maigret --web 5000`` → open ``http://127.0.0.1:5000``. Full walkthrough"
+" with screenshots: :ref:`web-interface`."
+msgstr ""
+"``--web PORT`` - Démarre l'interface web intégrée sur le port indiqué et "
+"sert les résultats et les rapports téléchargeables depuis une seule page."
+" Exemple : ``maigret --web 5000`` → ouvrez ``http://127.0.0.1:5000``. "
+"Présentation complète avec captures d'écran : :ref:`web-interface`."
+
+#: ../../source/command-line-options.rst:297 0bee9446c0b648c6b11b8a088ced9a71
+msgid "Output options"
+msgstr "Options de sortie"
+
+#: ../../source/command-line-options.rst:299 25078a3a94174fefbaa17815df86e8e4
+msgid ""
+"``-v``, ``--verbose`` - Display extra information and metrics. "
+"*(loglevel=WARNING)*"
+msgstr ""
+"``-v``, ``--verbose`` - Affiche des informations et des métriques "
+"supplémentaires. *(loglevel=WARNING)*"
+
+#: ../../source/command-line-options.rst:302 36c272624e4e413497200a49754ffdec
+msgid "``-vv``, ``--info`` - Display service information. *(loglevel=INFO)*"
+msgstr ""
+"``-vv``, ``--info`` - Affiche des informations de service. "
+"*(loglevel=INFO)*"
+
+#: ../../source/command-line-options.rst:304 34f6911c5bdb4ebf903fe231add50895
+msgid ""
+"``-vvv``, ``--debug``, ``-d`` - Display debugging information and site "
+"responses. *(loglevel=DEBUG)*"
+msgstr ""
+"``-vvv``, ``--debug``, ``-d`` - Affiche les informations de débogage et "
+"les réponses des sites. *(loglevel=DEBUG)*"
+
+#: ../../source/command-line-options.rst:307 24d29d1d533143a896b2f2c88e0e822e
+msgid "``--print-not-found`` - Print sites where the username was not found."
+msgstr ""
+"``--print-not-found`` - Affiche les sites où le nom d'utilisateur n'a pas"
+" été trouvé."
+
+#: ../../source/command-line-options.rst:309 89841f65b77d4ccf83e684f039f54c78
+msgid ""
+"``--print-errors`` - Print errors messages: connection, captcha, site "
+"country ban, etc."
+msgstr ""
+"``--print-errors`` - Affiche les messages d'erreur : connexion, captcha, "
+"blocage par pays, etc."
+
+#: ../../source/command-line-options.rst:313 3922327d83f743c3bda52289b651b4cc
+msgid "Other operations modes"
+msgstr "Autres modes de fonctionnement"
+
+#: ../../source/command-line-options.rst:315 4d334b00f27941f2a7d7ce1d8f609024
+msgid "``--version`` - Display version information and dependencies."
+msgstr "``--version`` - Affiche les informations de version et les dépendances."
+
+#: ../../source/command-line-options.rst:317 aa94b6114d344af7b0caad0fadd6572d
+msgid ""
+"``--self-check`` - Do self-checking for sites and database. Each site is "
+"tested by looking up its known-claimed and known-unclaimed usernames and "
+"verifying that the results match expectations. Individual site failures "
+"(network errors, unexpected exceptions, etc.) are caught and logged "
+"without stopping the overall process, so the check always runs to "
+"completion. After checking, Maigret reports a summary of issues found. If"
+" any sites were disabled (see ``--auto-disable``), Maigret asks if you "
+"want to save updates; answering y/Y will rewrite the local database."
+msgstr ""
+"``--self-check`` - Effectue une auto-vérification des sites et de la "
+"base. Chaque site est testé en recherchant ses noms d'utilisateur connus "
+"comme existants et comme inexistants, puis en vérifiant que les résultats"
+" correspondent aux attentes. Les échecs individuels (erreurs réseau, "
+"exceptions inattendues, etc.) sont capturés et journalisés sans "
+"interrompre le processus global : la vérification va donc toujours à son "
+"terme. À la fin, Maigret présente un résumé des problèmes trouvés. Si des"
+" sites ont été désactivés (voir ``--auto-disable``), Maigret demande si "
+"vous voulez enregistrer les modifications ; répondre y/Y réécrit la base "
+"locale."
+
+#: ../../source/command-line-options.rst:326 f4f5e252b8214612912eb41670d8b5f0
+msgid ""
+"``--auto-disable`` - Used with ``--self-check``: automatically disable "
+"sites that fail checks (incorrect detection of claimed/unclaimed "
+"usernames, connection errors, or unexpected exceptions). Without this "
+"flag, ``--self-check`` only **reports** issues without modifying the "
+"database."
+msgstr ""
+"``--auto-disable`` - À utiliser avec ``--self-check`` : désactive "
+"automatiquement les sites qui échouent aux vérifications (mauvaise "
+"détection des noms d'utilisateur existants ou inexistants, erreurs de "
+"connexion, exceptions inattendues). Sans cette option, ``--self-check`` "
+"se contente de **signaler** les problèmes, sans modifier la base."
+
+#: ../../source/command-line-options.rst:332 17de0af7307b49a09440630925e931e5
+msgid ""
+"``--diagnose`` - Used with ``--self-check``: print detailed diagnosis "
+"information for each failing site, including the check type, the list of "
+"issues found, and recommendations (e.g. suggesting a different "
+"``checkType``)."
+msgstr ""
+"``--diagnose`` - À utiliser avec ``--self-check`` : affiche un diagnostic"
+" détaillé pour chaque site en échec, comprenant le type de vérification, "
+"la liste des problèmes trouvés et des recommandations (par exemple un "
+"autre ``checkType``)."
+
+#: ../../source/command-line-options.rst:337 88d3a11257864b1e98087686b8adb94f
+msgid ""
+"``--submit URL`` - Do an automatic analysis of the given account URL or "
+"site main page URL to determine the site engine and methods to check "
+"account presence. After checking Maigret asks if you want to add the "
+"site, answering y/Y will rewrite the local database."
+msgstr ""
+"``--submit URL`` - Analyse automatiquement l'URL de compte ou la page "
+"d'accueil de site indiquée, afin de déterminer le moteur du site et les "
+"méthodes de vérification de l'existence d'un compte. À la fin, Maigret "
+"demande si vous voulez ajouter le site ; répondre y/Y réécrit la base "
+"locale."
+
+#: ../../source/command-line-options.rst:345 6ba7d6a3aeb84bc4875613d2d9192fce
+msgid "Markdown report (LLM-friendly)"
+msgstr "Rapport Markdown (adapté aux LLM)"
+
+#: ../../source/command-line-options.rst:347 73b9e9433356475fbdc5078e64b7b8df
+msgid ""
+"The ``--md`` / ``-M`` flag generates a Markdown report designed for both "
+"human reading and analysis by AI assistants (ChatGPT, Claude, etc.)."
+msgstr ""
+"L'option ``--md`` / ``-M`` génère un rapport Markdown conçu à la fois "
+"pour la lecture humaine et pour l'analyse par des assistants IA (ChatGPT,"
+" Claude, etc.)."
+
+#: ../../source/command-line-options.rst:353 4b31ca23db944f789b804d191eb1b6ef
+msgid "The report includes:"
+msgstr "Le rapport contient :"
+
+#: ../../source/command-line-options.rst:355 6810ca7d1e3d4ecb986a2df44822a7c8
+msgid ""
+"**Summary** with aggregated personal data (all fullnames, locations, bios"
+" found across accounts), country tags, website tags, first/last seen "
+"timestamps."
+msgstr ""
+"Un **résumé** des données personnelles agrégées (tous les noms complets, "
+"localisations et biographies trouvés sur l'ensemble des comptes), les "
+"tags pays, les tags de sites et les dates de première et de dernière "
+"activité."
+
+#: ../../source/command-line-options.rst:356 7b1c63e7a9a940008f8ffbe1b1c51871
+msgid ""
+"**Per-account sections** with profile URL, site tags, and all extracted "
+"fields (username, bio, follower count, linked accounts, etc.)."
+msgstr ""
+"Des **sections par compte**, avec l'URL du profil, les tags du site et "
+"tous les champs extraits (nom d'utilisateur, biographie, nombre "
+"d'abonnés, comptes associés, etc.)."
+
+#: ../../source/command-line-options.rst:357 9dddf612e5d7499a8ea82ab9125fc09c
+msgid ""
+"**Possible false positives** disclaimer explaining that accounts may "
+"belong to different people."
+msgstr ""
+"Un avertissement sur les **faux positifs possibles**, rappelant que les "
+"comptes peuvent appartenir à des personnes différentes."
+
+#: ../../source/command-line-options.rst:358 9f9e7ef42f8146918c2d097c1ea1f9fd
+msgid "**Ethical use** notice about applicable data protection laws."
+msgstr ""
+"Une note sur l'**usage éthique** et les lois applicables en matière de "
+"protection des données."
+
+#: ../../source/command-line-options.rst:360 7491158adfd94da6b659ef34a0c335b0
+msgid "**Using with AI tools:**"
+msgstr "**Utilisation avec des outils d'IA :**"
+
+#: ../../source/command-line-options.rst:362 f6e1b6a713994139b210e5e4bacab923
+msgid ""
+"The Markdown format is optimized for LLM context windows. You can feed "
+"the report directly to an AI assistant for follow-up analysis:"
+msgstr ""
+"Le format Markdown est optimisé pour les fenêtres de contexte des LLM. "
+"Vous pouvez donner le rapport directement à un assistant IA pour une "
+"analyse complémentaire :"
+
+#: ../../source/command-line-options.rst:372 d09f016a434942488884439e0e11bf8f
+msgid ""
+"The structured Markdown with per-site sections makes it easy for AI tools"
+" to extract relationships, cross-reference identities, and identify "
+"patterns across accounts."
+msgstr ""
+"Un Markdown structuré, avec une section par site, permet aux outils d'IA "
+"de repérer facilement les relations, de recouper les identités et de "
+"dégager des motifs communs à plusieurs comptes."
+
+#: ../../source/command-line-options.rst:374 878ae418358b4939b02d2d68acef4753
+msgid ""
+"For a built-in alternative that calls the model for you and prints the "
+"summary directly, see :ref:`ai-analysis` below."
+msgstr ""
+"Pour une solution intégrée qui appelle le modèle à votre place et affiche"
+" directement la synthèse, voir :ref:`ai-analysis` ci-dessous."
+
+#: ../../source/command-line-options.rst:380 6b717654f9614ff1bdc3f6f6ddf6b90b
+msgid "AI analysis (built-in)"
+msgstr "Analyse par IA (intégrée)"
+
+#: ../../source/command-line-options.rst:382 9a12e730b9ae4797aafc10d2313f8eb0
+msgid ""
+"The ``--ai`` flag turns the search results into a short investigation "
+"summary by sending the internal Markdown report to an OpenAI-compatible "
+"chat completion API and streaming the model's reply to the terminal."
+msgstr ""
+"L'option ``--ai`` transforme les résultats de la recherche en une courte "
+"synthèse d'enquête : elle envoie le rapport Markdown interne à une API de"
+" complétion de conversation compatible OpenAI et diffuse la réponse du "
+"modèle dans le terminal."
+
+#: ../../source/command-line-options.rst:394 ac52898af2f64d06bb5ced5df2ef5883
+msgid ""
+"While ``--ai`` is active, per-site progress lines and the short text "
+"report at the end are suppressed so the streamed summary is the main "
+"output. The Markdown report itself is built in memory and is **not** "
+"written to disk by ``--ai`` alone — combine with ``--md`` if you also "
+"want the file on disk."
+msgstr ""
+"Tant que ``--ai`` est actif, les lignes de progression site par site et "
+"le court rapport textuel final sont masqués, afin que la synthèse "
+"diffusée reste la sortie principale. Le rapport Markdown lui-même est "
+"construit en mémoire et n'est **pas** écrit sur le disque par ``--ai`` "
+"seul : combinez-le avec ``--md`` si vous voulez aussi le fichier."
+
+#: ../../source/command-line-options.rst:400 e02e590dbeca4f548903c47f9171dd9c
+msgid ""
+"The summary follows a fixed format with sections for the most likely real"
+" name, location, occupation, interests, languages, main website, username"
+" variants, number of platforms, active years, a confidence rating, and a "
+"short list of follow-up leads. The model is instructed to rely only on "
+"what is supported by the report and to avoid mixing clearly unrelated "
+"profiles into the main identity."
+msgstr ""
+"La synthèse suit un format fixe, avec des sections pour le nom réel le "
+"plus probable, la localisation, la profession, les centres d'intérêt, les"
+" langues, le site web principal, les variantes de nom d'utilisateur, le "
+"nombre de plateformes, les années d'activité, un indice de confiance et "
+"une courte liste de pistes à creuser. Le modèle a pour consigne de s'en "
+"tenir à ce que le rapport étaye, et d'éviter de mêler à l'identité "
+"principale des profils manifestement sans rapport."
+
+#: ../../source/command-line-options.rst:407 53939b6e82f141579e47ce2aeb895654
+msgid ""
+"**Configuration.** The API key is resolved from "
+"``settings.openai_api_key`` first, then from the ``OPENAI_API_KEY`` "
+"environment variable. The endpoint defaults to "
+"``https://api.openai.com/v1`` and can be redirected to any OpenAI-"
+"compatible service (Azure OpenAI, OpenRouter, a local server, …) by "
+"setting ``openai_api_base_url`` in ``settings.json``. See :ref:`settings`"
+" for the full list of options."
+msgstr ""
+"**Configuration.** La clé d'API est d'abord cherchée dans "
+"``settings.openai_api_key``, puis dans la variable d'environnement "
+"``OPENAI_API_KEY``. Le point d'entrée vaut par défaut "
+"``https://api.openai.com/v1`` et peut être redirigé vers n'importe quel "
+"service compatible OpenAI (Azure OpenAI, OpenRouter, un serveur local, "
+"etc.) en définissant ``openai_api_base_url`` dans ``settings.json``. Voir"
+" :ref:`settings` pour la liste complète des options."
+
+#: ../../source/command-line-options.rst:417 3d6a5d97676942489615962e297e176f
+msgid ""
+"``--ai`` makes a network request to the configured chat completion "
+"endpoint and sends the full Markdown report (which contains the gathered "
+"profile data). Use it only with providers and accounts you trust with "
+"that data."
+msgstr ""
+"``--ai`` effectue une requête réseau vers le point d'entrée de complétion"
+" configuré et lui envoie l'intégralité du rapport Markdown, qui contient "
+"les données de profil collectées. Ne l'utilisez qu'avec des fournisseurs "
+"et des comptes auxquels vous confiez ces données."
+
+#: ../../source/command-line-options.rst:425 7911216d24fd4abeafd4e19488587519
+msgid "Neo4j export"
+msgstr "Export Neo4j"
+
+#: ../../source/command-line-options.rst:427 f1e6df660311480e9c6f09133e39efce
+msgid ""
+"The ``--neo4j`` flag serializes the maigret graph — the same nodes and "
+"relationships behind ``--graph`` — into a ``*_neo4j.cypher`` script you "
+"can load into a `Neo4j `_ database for querying and "
+"visual exploration of how identities, accounts, sites, and extracted data"
+" points link together."
+msgstr ""
+"L'option ``--neo4j`` sérialise le graphe de Maigret, avec les mêmes nœuds"
+" et relations que ceux derrière ``--graph``, dans un script "
+"``*_neo4j.cypher`` que vous pouvez charger dans une base `Neo4j "
+" `_ pour interroger et explorer visuellement les liens"
+" entre identités, comptes, sites et données extraites."
+
+#: ../../source/command-line-options.rst:437 04702cb8b8064635ac4b81309c81ea8c
+msgid ""
+"This writes ``reports/report_username_neo4j.cypher``. No extra runtime "
+"dependency is required (it reuses the ``networkx`` graph that ``--graph``"
+" already builds)."
+msgstr ""
+"Cela écrit ``reports/report_username_neo4j.cypher``. Aucune dépendance "
+"supplémentaire n'est nécessaire à l'exécution (le script réutilise le "
+"graphe ``networkx`` que ``--graph`` construit déjà)."
+
+#: ../../source/command-line-options.rst:441 e05fe34582b243b39074c46c75b3be37
+msgid "**What the script contains.**"
+msgstr "**Ce que contient le script.**"
+
+#: ../../source/command-line-options.rst:443 6f7c070c20f8454a89240f05bc279a30
+msgid ""
+"A ``CREATE CONSTRAINT ... IF NOT EXISTS`` ensuring the ``name`` property "
+"of every ``:MaigretNode`` is unique."
+msgstr ""
+"Un ``CREATE CONSTRAINT ... IF NOT EXISTS`` qui garantit l'unicité de la "
+"propriété ``name`` de chaque ``:MaigretNode``."
+
+#: ../../source/command-line-options.rst:445 fbbbb8c2d1cf4ee4940b8c8d9e875027
+msgid ""
+"One ``MERGE`` per node. Each node carries three properties: ``name`` (the"
+" unique key, e.g. ``account: https://github.com/user``), ``type`` "
+"(``username``, ``account``, ``fullname``, ``uid``, …) and ``label`` (the "
+"human-readable value)."
+msgstr ""
+"Un ``MERGE`` par nœud. Chaque nœud porte trois propriétés : ``name`` (la "
+"clé unique, par exemple ``account: https://github.com/user``), ``type`` "
+"(``username``, ``account``, ``fullname``, ``uid``, etc.) et ``label`` (la"
+" valeur lisible)."
+
+#: ../../source/command-line-options.rst:449 caf3fb3be9624608bb895e1f472d182c
+msgid "One ``MERGE`` per edge as a ``[:LINKED_TO]`` relationship."
+msgstr "Un ``MERGE`` par arête, sous forme de relation ``[:LINKED_TO]``."
+
+#: ../../source/command-line-options.rst:451 3828c9269b9a43b49082bc95f5f27dff
+msgid ""
+"Because every node and edge is ``MERGE``-d on its unique key, importing "
+"the same report twice is **idempotent** — it updates existing nodes "
+"instead of creating duplicates."
+msgstr ""
+"Comme chaque nœud et chaque arête sont fusionnés par ``MERGE`` sur leur "
+"clé unique, importer deux fois le même rapport est **idempotent** : les "
+"nœuds existants sont mis à jour plutôt que dupliqués."
+
+#: ../../source/command-line-options.rst:455 73409d1c895242d48a8a7636a1f1578a
+msgid "**Importing.**"
+msgstr "**Import.**"
+
+#: ../../source/command-line-options.rst:462 de96b834cf734d09a52fda462dc3ec24
+msgid ""
+"Alternatively, open the Neo4j Browser at ``http://localhost:7474`` and "
+"paste the script contents into the query editor. Drop the ``-p`` flag if "
+"authentication is disabled, or let ``cypher-shell`` prompt for the "
+"password interactively."
+msgstr ""
+"Vous pouvez aussi ouvrir le Neo4j Browser à l'adresse "
+"``http://localhost:7474`` et coller le contenu du script dans l'éditeur "
+"de requêtes. Retirez l'option ``-p`` si l'authentification est "
+"désactivée, ou laissez ``cypher-shell`` demander le mot de passe de façon"
+" interactive."
+
+#: ../../source/command-line-options.rst:467 2447db3729894df097fc5e287162b741
+msgid "**Exploring the graph.** Once imported, inspect it with Cypher, e.g.:"
+msgstr ""
+"**Explorer le graphe.** Une fois importé, examinez-le en Cypher, par "
+"exemple :"
+
+#: ../../source/command-line-options.rst:478 4990f77da50b48daa0baac451b67df93
+msgid ""
+"The ``CREATE CONSTRAINT ... IF NOT EXISTS FOR ... REQUIRE`` syntax "
+"requires Neo4j 4.4+; the ``MERGE`` statements themselves work on any "
+"version."
+msgstr ""
+"La syntaxe ``CREATE CONSTRAINT ... IF NOT EXISTS FOR ... REQUIRE`` "
+"demande Neo4j 4.4 ou supérieur ; les instructions ``MERGE`` elles-mêmes "
+"fonctionnent avec n'importe quelle version."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/development.po b/docs/source/locale/fr/LC_MESSAGES/development.po
new file mode 100644
index 00000000..512dbb4c
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/development.po
@@ -0,0 +1,1402 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:17+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/development.rst:4 a43b33c7531942fd9d9336387b108044
+msgid "Development"
+msgstr "Développement"
+
+#: ../../source/development.rst:7 40eda00e03aa4dc39fab23352e0d2d6e
+msgid "Frequently Asked Questions"
+msgstr "Questions fréquentes"
+
+#: ../../source/development.rst:9 00969eb0c28d442c9a8a2bb6a3330981
+msgid "Where to find the list of supported sites?"
+msgstr "Où trouver la liste des sites pris en charge ?"
+
+#: ../../source/development.rst:11 099e1479af3e41009ebc81b02f64bdff
+msgid ""
+"The human-readable list of supported sites is available in the `sites.md "
+"`_ file in the "
+"repository. It's been generated automatically from the main JSON file "
+"with the list of supported sites."
+msgstr ""
+"La liste lisible des sites pris en charge se trouve dans le fichier "
+"`sites.md `_ du "
+"dépôt. Elle est générée automatiquement à partir du fichier JSON "
+"principal qui contient la liste des sites pris en charge."
+
+#: ../../source/development.rst:14 af0d740dc6cc4a60a7481394f77f4f93
+msgid ""
+"The machine-readable JSON file with the list of supported sites is "
+"available in the `data.json "
+"`_"
+" file in the directory `resources`."
+msgstr ""
+"Le fichier JSON exploitable par une machine, avec la liste des sites pris"
+" en charge, se trouve dans le fichier `data.json "
+"`_,"
+" dans le répertoire `resources`."
+
+#: ../../source/development.rst:17 a17b8e1c46ee4f199ab3664dae82f4a5
+msgid "Which methods to check the account presence are supported?"
+msgstr ""
+"Quelles méthodes de vérification de l'existence d'un compte sont prises "
+"en charge ?"
+
+#: ../../source/development.rst:19 8d19deba68864e6b8269f9c2800121f8
+msgid "The supported methods (``checkType`` values in ``data.json``) are:"
+msgstr ""
+"Les méthodes prises en charge (valeurs de ``checkType`` dans "
+"``data.json``) sont :"
+
+#: ../../source/development.rst:21 59172000409c4f5f96fe33a99e26fd81
+msgid ""
+"``message`` - the most reliable method, checks if any string from "
+"``presenceStrs`` is present and none of the strings from ``absenceStrs`` "
+"are present in the HTML response"
+msgstr ""
+"``message`` - la méthode la plus fiable : elle vérifie qu'au moins une "
+"chaîne de ``presenceStrs`` est présente et qu'aucune chaîne "
+"d'``absenceStrs`` ne l'est dans la réponse HTML"
+
+#: ../../source/development.rst:22 b10ba36e33f244aab5dfcb8a9b49ee7b
+msgid "``status_code`` - checks that status code of the response is 2XX"
+msgstr "``status_code`` - vérifie que le code de statut de la réponse est un 2XX"
+
+#: ../../source/development.rst:23 dd5cba5eec254d02b385ef4c67be0f0c
+msgid "``response_url`` - check if there is not redirect and the response is 2XX"
+msgstr ""
+"``response_url`` - vérifie qu'il n'y a pas de redirection et que la "
+"réponse est un 2XX"
+
+#: ../../source/development.rst:26 754da98327cf4c889a4f04dfe286c642
+msgid ""
+"Maigret natively treats specific anti-bot HTTP status codes (like "
+"LinkedIn's ``HTTP 999``) as a standard \"Not Found/Available\" signal "
+"instead of throwing an infrastructure Server Error, gracefully preventing"
+" false positives."
+msgstr ""
+"Maigret traite nativement certains codes de statut HTTP anti-bots (comme "
+"le ``HTTP 999`` de LinkedIn) comme un signal standard « non trouvé / non "
+"disponible », au lieu de lever une erreur serveur d'infrastructure : cela"
+" évite proprement les faux positifs."
+
+#: ../../source/development.rst:28 034ec83238d449ccaec5167bf4a71939
+msgid ""
+"See the details of check mechanisms in the `checking.py "
+"`_ "
+"file."
+msgstr ""
+"Les détails des mécanismes de vérification se trouvent dans le fichier "
+"`checking.py "
+"`_."
+
+#: ../../source/development.rst:31 eca82c1387bf4f57afec10f6f2a1ae98
+msgid ""
+"Maigret now uses the **Majestic Million** dataset for site popularity "
+"sorting instead of the discontinued Alexa Rank API. For backward "
+"compatibility with existing configurations and parsers, the ranking field"
+" in `data.json` and internal site models remains named ``alexaRank`` and "
+"``alexa_rank``."
+msgstr ""
+"Maigret utilise désormais le jeu de données **Majestic Million** pour "
+"trier les sites par popularité, à la place de l'API Alexa Rank, "
+"abandonnée. Pour rester compatible avec les configurations et les "
+"analyseurs existants, le champ de classement de `data.json` et des "
+"modèles de site internes conserve les noms ``alexaRank`` et "
+"``alexa_rank``."
+
+#: ../../source/development.rst:33 82e85f9108ef4b96a8601966f84e8e02
+msgid ""
+"**Mirrors and ``--top-sites``:** When you limit scans with ``--top-sites "
+"N``, Maigret also includes *mirror* sites (entries whose ``source`` field"
+" points at a parent platform such as Twitter or Instagram) if that parent"
+" would appear in the Majestic Million top *N* when disabled sites are "
+"considered for ranking. See the **Mirrors** paragraph under ``--top-"
+"sites`` in :doc:`command-line-options`."
+msgstr ""
+"**Miroirs et ``--top-sites`` :** lorsque vous limitez le parcours avec "
+"``--top-sites N``, Maigret inclut aussi les sites *miroirs* (les entrées "
+"dont le champ ``source`` désigne une plateforme parente comme Twitter ou "
+"Instagram), si cette plateforme parente figurerait dans les *N* premiers "
+"du Majestic Million lorsque les sites désactivés sont pris en compte dans"
+" le classement. Voir le paragraphe **Miroirs** sous ``--top-sites`` dans "
+":doc:`command-line-options`."
+
+#: ../../source/development.rst:36 68047d79d24043a48964ab4964ca1abe
+msgid "Testing"
+msgstr "Tests"
+
+#: ../../source/development.rst:38 ffad6e12ca7544dca6c98d69bfc97adb
+msgid "It is recommended use Python 3.10 for testing."
+msgstr "Il est recommandé d'utiliser Python 3.10 pour les tests."
+
+#: ../../source/development.rst:40 958f6789a6fc432ba351a67112d059a9
+msgid "Install test requirements:"
+msgstr "Installez les dépendances de test :"
+
+#: ../../source/development.rst:47 223439d6d6434b31b08a9eebe5285888
+msgid "Use the following commands to check Maigret:"
+msgstr "Utilisez les commandes suivantes pour vérifier Maigret :"
+
+#: ../../source/development.rst:69 ff09090282df4b69a14e58909e2889a3
+msgid "Running the tests offline"
+msgstr "Lancer les tests hors ligne"
+
+#: ../../source/development.rst:71 fa574e6c65374bcca1e25aeb437f489c
+msgid ""
+"Some tests reach real sites, which is why CI runs pytest with ``--reruns "
+"3 --reruns-delay 5``. They all carry the ``slow`` marker, so deselecting "
+"it leaves a suite that passes with no network at all:"
+msgstr ""
+"Certains tests interrogent de vrais sites, et c'est pour cela que "
+"l'intégration continue lance pytest avec ``--reruns 3 --reruns-delay 5``."
+" Ils portent tous le marqueur ``slow`` : les désélectionner laisse une "
+"suite qui passe sans le moindre accès réseau."
+
+#: ../../source/development.rst:79 9656c049d01f4a2ba81f94621b7b33f9
+msgid ""
+"This is the invocation to use when building a distribution package, since"
+" distribution builders run without network access. Measured on 0.6.4: the"
+" full suite fails 9 tests offline, ``-m \"not slow\"`` passes 403 and "
+"deselects 24."
+msgstr ""
+"C'est l'invocation à utiliser pour construire un paquet de distribution, "
+"car les systèmes de construction des distributions n'ont pas accès au "
+"réseau. Mesuré sur la 0.6.4 : hors ligne, la suite complète échoue sur 9 "
+"tests, tandis que ``-m \"not slow\"`` en fait passer 403 et en "
+"désélectionne 24."
+
+#: ../../source/development.rst:83 f07e5c435bd5447198ad84f3e6a6e23c
+msgid ""
+"If you add a test that talks to the network, mark it ``slow`` — otherwise"
+" you silently break offline builds for every downstream packager."
+msgstr ""
+"Si vous ajoutez un test qui utilise le réseau, marquez-le ``slow`` ; "
+"sinon vous cassez silencieusement les constructions hors ligne de tous "
+"les empaqueteurs en aval."
+
+#: ../../source/development.rst:86 b3d5f91c0a644498a79ce0175e77a48b
+msgid "# get flamechart of imports to estimate startup time make speed"
+msgstr ""
+"# obtenir le flamechart des imports pour estimer le temps de démarrage "
+"make speed"
+
+#: ../../source/development.rst:91 c447f5287bf44efcad0c2df789e17e79
+msgid "Site naming conventions"
+msgstr "Conventions de nommage des sites"
+
+#: ../../source/development.rst:93 76bc268ca38a4acf893fcb7fff6ca554
+msgid ""
+"Site names are the keys in ``data.json`` and appear in user-facing "
+"reports. Follow these rules:"
+msgstr ""
+"Les noms de sites sont les clés de ``data.json`` et apparaissent dans les"
+" rapports vus par les utilisateurs. Suivez ces règles :"
+
+#: ../../source/development.rst:95 b99ad9cdfc7a4ebebffac69b3d803740
+msgid "**Title Case** by default: ``Product Hunt``, ``Hacker News``."
+msgstr "**Majuscules de titre** par défaut : ``Product Hunt``, ``Hacker News``."
+
+#: ../../source/development.rst:96 4052aa2aa6854360a9e33f9d64542bea
+msgid ""
+"**Lowercase** only if the brand itself is written that way: ``kofi``, "
+"``note``, ``hi5``."
+msgstr ""
+"**Minuscules** uniquement si la marque s'écrit ainsi : ``kofi``, "
+"``note``, ``hi5``."
+
+#: ../../source/development.rst:97 68cb139d75b040b5b7911a1e784f0e5d
+msgid ""
+"**No domain suffix** (``calendly.com`` → ``Calendly``), unless the domain"
+" is part of the recognized brand name: ``last.fm``, ``VC.ru``, "
+"``Archive.org``."
+msgstr ""
+"**Pas de suffixe de domaine** (``calendly.com`` → ``Calendly``), sauf si "
+"le domaine fait partie du nom de marque reconnu : ``last.fm``, ``VC.ru``,"
+" ``Archive.org``."
+
+#: ../../source/development.rst:98 78e20b26f111411b9e5eabd1a4e9a317
+msgid ""
+"**No full UPPERCASE** unless the brand is an acronym: ``VK``, ``CNET``, "
+"``ICQ``, ``IFTTT``."
+msgstr ""
+"**Pas de MAJUSCULES intégrales**, sauf si la marque est un acronyme : "
+"``VK``, ``CNET``, ``ICQ``, ``IFTTT``."
+
+#: ../../source/development.rst:99 84c3f5a66ed24300b3005860dd57a7bc
+msgid "**No** ``www.`` **or** ``https://`` **prefix** in the name."
+msgstr "**Pas de préfixe** ``www.`` **ni** ``https://`` dans le nom."
+
+#: ../../source/development.rst:100 c518f9bd738d4b7093ccb51578f18ec6
+msgid ""
+"**Spaces** are allowed when the brand uses them: ``Star Citizen``, "
+"``Google Maps``."
+msgstr ""
+"**Les espaces** sont autorisés lorsque la marque en utilise : ``Star "
+"Citizen``, ``Google Maps``."
+
+#: ../../source/development.rst:101 e9d0525d06b4451f85c46b260ad5dbbb
+#, python-brace-format
+msgid "**{username} templates** in names are acceptable: ``{username}.tilda.ws``."
+msgstr ""
+"**Les gabarits {username}** dans les noms sont acceptés : "
+"``{username}.tilda.ws``."
+
+#: ../../source/development.rst:103 f182134fa0ac47918fc9af752202166d
+msgid "When in doubt, check how the service refers to itself on its homepage."
+msgstr ""
+"En cas de doute, regardez comment le service se désigne lui-même sur sa "
+"page d'accueil."
+
+#: ../../source/development.rst:106 74ca4d33aab849df91e4823276970170
+msgid "How to fix false-positives"
+msgstr "Comment corriger les faux positifs"
+
+#: ../../source/development.rst:108 c72ca7ca61fa4b7aa727dee0c87e2cb6
+msgid ""
+"If you want to work with sites database, don't forget to activate "
+"statistics update git hook, command for it would look like this: ``git "
+"config --local core.hooksPath .githooks/``."
+msgstr ""
+"Si vous voulez travailler sur la base de sites, n'oubliez pas d'activer "
+"le hook git de mise à jour des statistiques ; la commande ressemble à "
+"ceci : ``git config --local core.hooksPath .githooks/``."
+
+#: ../../source/development.rst:110 7e44eb195ce0479990d58f5c57839af7
+msgid ""
+"You should make your git commits from your maigret git repo folder, or "
+"else the hook wouldn't find the statistics update script."
+msgstr ""
+"Vous devez faire vos commits git depuis le répertoire de votre dépôt "
+"maigret, sans quoi le hook ne trouvera pas le script de mise à jour des "
+"statistiques."
+
+#: ../../source/development.rst:112 485ae61d71be45b0812909e17bcab75b
+msgid "Determine the problematic site."
+msgstr "Identifiez le site problématique."
+
+#: ../../source/development.rst:114 97ed0f7a25fe4d72b1c2f763568ac65f
+msgid ""
+"If you already know which site has a false-positive and want to fix it "
+"specifically, go to the next step."
+msgstr ""
+"Si vous savez déjà quel site produit un faux positif et que vous voulez "
+"le corriger précisément, passez à l'étape suivante."
+
+#: ../../source/development.rst:116 34733d31c251413fb2c8674f7973e173
+msgid ""
+"Otherwise, simply run a search with a random username (e.g. "
+"`laiuhi3h4gi3u4hgt`) and check the results. Alternatively, you can use "
+"the `community Telegram bot `_."
+msgstr ""
+"Sinon, lancez simplement une recherche avec un nom d'utilisateur "
+"aléatoire (par exemple `laiuhi3h4gi3u4hgt`) et regardez les résultats. "
+"Vous pouvez aussi utiliser le `bot Telegram communautaire "
+"`_."
+
+#: ../../source/development.rst:119 ceeefe652a6642ada98fecb28ea8dec1
+msgid "Open the account link in your browser and check:"
+msgstr "Ouvrez le lien du compte dans votre navigateur et vérifiez :"
+
+#: ../../source/development.rst:121 52bf41bfcb3548d8b015fae7fe836747
+msgid "If the site is completely gone, remove it from the list"
+msgstr "Si le site a complètement disparu, retirez-le de la liste"
+
+#: ../../source/development.rst:122 c1440320738748d88819dbf077e5c4b3
+msgid ""
+"If the site still works but looks different, update in data.json how we "
+"check it"
+msgstr ""
+"Si le site fonctionne encore mais a changé d'apparence, mettez à jour "
+"dans data.json la façon dont nous le vérifions"
+
+#: ../../source/development.rst:123 e13af15b29584d8abe2187896c1e6b40
+msgid "If the site requires login to view profiles, disable checking it"
+msgstr ""
+"Si le site exige une connexion pour consulter les profils, désactivez sa "
+"vérification"
+
+#: ../../source/development.rst:125 5b69d8992b644d449ae3004bcd78407e
+msgid ""
+"Find the site in the `data.json "
+"`_"
+" file."
+msgstr ""
+"Trouvez le site dans le fichier `data.json "
+"`_."
+
+#: ../../source/development.rst:127 1108c96e2b4a488fa21bdb69bde43e21
+msgid ""
+"If the ``checkType`` method is not ``message`` and you are going to fix "
+"check, update it: - put ``message`` in ``checkType`` - put in "
+"``absenceStrs`` a keyword that is present in the HTML response for an "
+"non-existing account - put in ``presenceStrs`` a keyword that is present "
+"in the HTML response for an existing account"
+msgstr ""
+"Si la méthode ``checkType`` n'est pas ``message`` et que vous comptez "
+"corriger la vérification, changez-la : - mettez ``message`` dans "
+"``checkType`` - mettez dans ``absenceStrs`` un mot-clé présent dans la "
+"réponse HTML d'un compte inexistant - mettez dans ``presenceStrs`` un "
+"mot-clé présent dans la réponse HTML d'un compte existant"
+
+#: ../../source/development.rst:132 de36a51d8d774e3088a9a06b26fe0f05
+msgid ""
+"If you have trouble determining the right keywords, you can use automatic"
+" detection by passing the account URL with the ``--submit`` option:"
+msgstr ""
+"Si vous avez du mal à déterminer les bons mots-clés, vous pouvez utiliser"
+" la détection automatique en passant l'URL du compte avec l'option "
+"``--submit`` :"
+
+#: ../../source/development.rst:138 e345ed5fa4fd442fa7d949d7acc4f8f3
+msgid "To disable checking, set ``disabled`` to ``true`` or simply run:"
+msgstr ""
+"Pour désactiver la vérification, mettez ``disabled`` à ``true`` ou lancez"
+" simplement :"
+
+#: ../../source/development.rst:144 037f9527ab024ecd99999ab7400dc421
+msgid "To debug the check method using the response HTML, you can run:"
+msgstr ""
+"Pour déboguer la méthode de vérification à partir du HTML de la réponse, "
+"vous pouvez lancer :"
+
+#: ../../source/development.rst:150 2cd5529b22c2488b9889c22b5124f60f
+msgid "There are few options for sites data.json helpful in various cases:"
+msgstr "Il existe quelques options de data.json utiles selon les cas :"
+
+#: ../../source/development.rst:152 b7f7d6bfbf0f4602a533240be8dc7607
+msgid ""
+"``engine`` - a predefined check for the sites of certain type (e.g. "
+"forums), see the ``engines`` section in the JSON file"
+msgstr ""
+"``engine`` - une vérification prédéfinie pour les sites d'un certain type"
+" (les forums, par exemple), voir la section ``engines`` du fichier JSON"
+
+#: ../../source/development.rst:153 a488857d86fe47de996f0012025f52f2
+msgid "``headers`` - a dictionary of additional headers to be sent to the site"
+msgstr "``headers`` - un dictionnaire d'en-têtes supplémentaires à envoyer au site"
+
+#: ../../source/development.rst:154 9e64d08d2c944008ae78fe1521a15da4
+msgid ""
+"``requestHeadOnly`` - set to ``true`` if it's enough to make a HEAD "
+"request to the site"
+msgstr ""
+"``requestHeadOnly`` - à mettre à ``true`` s'il suffit d'envoyer une "
+"requête HEAD au site"
+
+#: ../../source/development.rst:155 2f043f4fd985435f93dec3135c0393e4
+msgid ""
+"``regexCheck`` - a regex to check if the username is valid, in case of "
+"frequent false-positives"
+msgstr ""
+"``regexCheck`` - une expression régulière qui valide le nom "
+"d'utilisateur, en cas de faux positifs fréquents"
+
+#: ../../source/development.rst:156 b4fdb15605b54654b651f183aee519a6
+msgid ""
+"``requestMethod`` - set the HTTP method to use (e.g., ``POST``). By "
+"default, Maigret natively defaults to GET or HEAD."
+msgstr ""
+"``requestMethod`` - définit la méthode HTTP à utiliser (``POST``, par "
+"exemple). Par défaut, Maigret utilise nativement GET ou HEAD."
+
+#: ../../source/development.rst:157 379cbcfb5ee44d24aeea82a1de4c601a
+#, python-brace-format
+msgid ""
+"``requestPayload`` - a dictionary with the JSON payload to send for POST "
+"requests (e.g., ``{\"username\": \"{username}\"}``), extremely useful for"
+" parsing GraphQL or modern JSON APIs."
+msgstr ""
+"``requestPayload`` - un dictionnaire contenant la charge utile JSON à "
+"envoyer pour les requêtes POST (par exemple ``{\"username\": "
+"\"{username}\"}``), extrêmement utile pour interroger des API GraphQL ou "
+"des API JSON modernes."
+
+#: ../../source/development.rst:158 ed8e443aed0d4f17aaed2803df4db302
+msgid ""
+"``protection`` - a list of protection types detected on the site (see "
+"below)."
+msgstr ""
+"``protection`` - la liste des types de protection détectés sur le site "
+"(voir plus bas)."
+
+#: ../../source/development.rst:161 84af2329b98f4ba7a2668b4bef74a66d
+msgid "``protection`` (site protection tracking)"
+msgstr "``protection`` (suivi des protections d'un site)"
+
+#: ../../source/development.rst:163 f1f4dd7b6fe14888aeaf3f9de439b9c1
+msgid ""
+"The ``protection`` field records what kind of anti-bot protection a site "
+"uses. Maigret reads this field and automatically applies the appropriate "
+"bypass mechanism where one exists."
+msgstr ""
+"Le champ ``protection`` consigne le type de protection anti-bot utilisé "
+"par un site. Maigret lit ce champ et applique automatiquement le "
+"mécanisme de contournement adapté lorsqu'il en existe un."
+
+#: ../../source/development.rst:165 c2d84abfc45742acb9d572b5f31aa227
+msgid "Two categories of tag:"
+msgstr "Deux catégories de tags :"
+
+#: ../../source/development.rst:167 d1767a4e82f84aba9be30dc54a41f87b
+msgid ""
+"**Load-bearing.** Maigret changes its HTTP client or headers based on the"
+" tag. Currently only ``tls_fingerprint`` (switches to ``curl_cffi`` with "
+"Chrome-class TLS)."
+msgstr ""
+"**Porteurs de comportement.** Maigret change de client HTTP ou d'en-têtes"
+" en fonction du tag. Actuellement, seul ``tls_fingerprint`` est dans ce "
+"cas (bascule vers ``curl_cffi`` avec un TLS de type Chrome)."
+
+#: ../../source/development.rst:168 044bb6b018174dd0a42dd3aaca8ea230
+msgid ""
+"**Documentation-only.** Maigret does **not** change behavior based on the"
+" tag; it records *why* the site is hard so a future solver can target the"
+" right set of sites without re-auditing."
+msgstr ""
+"**Purement documentaires.** Maigret ne change **pas** de comportement "
+"selon le tag ; il consigne *pourquoi* le site est difficile, afin qu'un "
+"futur solveur puisse viser le bon ensemble de sites sans tout réauditer."
+
+#: ../../source/development.rst:170 c3137263bb9644c8abc979efed8a0634
+msgid ""
+"Within the documentation-only tags, there is a further split that "
+"dictates whether the site is ``disabled: true``:"
+msgstr ""
+"Parmi les tags purement documentaires, une autre distinction détermine si"
+" le site est ``disabled: true`` :"
+
+#: ../../source/development.rst:172 5faf4cd734284f8bb9bea0bcfd2038e0
+msgid ""
+"``ip_reputation`` is the **only** doc-tag that **keeps the site "
+"enabled**. It means \"works for most users, fails from datacenter/cloud "
+"IPs.\" Disabling would silently hide a working site from anyone with a "
+"clean IP. The fix is **external** to Maigret (residential IP or "
+"``--proxy``)."
+msgstr ""
+"``ip_reputation`` est le **seul** tag documentaire qui **laisse le site "
+"activé**. Il signifie « fonctionne pour la plupart des utilisateurs, "
+"échoue depuis les IP de datacenter ou de cloud ». Le désactiver "
+"masquerait silencieusement un site fonctionnel à tous ceux qui ont une IP"
+" propre. Le remède est **extérieur** à Maigret (IP résidentielle ou "
+"``--proxy``)."
+
+#: ../../source/development.rst:173 b8830faf49d241cbb71588b74549961b
+msgid ""
+"``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, "
+"``ddos_guard_challenge``, ``custom_bot_protection``, ``js_challenge`` all"
+" pair with ``disabled: true``. They mean \"does not work for anyone right"
+" now\"; the tag identifies the provider so that when a bypass ships, "
+"every site with that tag can be re-enabled in one pass."
+msgstr ""
+"``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, "
+"``ddos_guard_challenge``, ``custom_bot_protection`` et ``js_challenge`` "
+"vont tous de pair avec ``disabled: true``. Ils signifient « ne fonctionne"
+" actuellement pour personne » ; le tag identifie le fournisseur, de sorte"
+" que le jour où un contournement arrive, tous les sites portant ce tag "
+"peuvent être réactivés d'un coup."
+
+#: ../../source/development.rst:175 f8d91ac8cc3348eca96f6eebadc20374
+msgid "Supported values:"
+msgstr "Valeurs prises en charge :"
+
+#: ../../source/development.rst:177 9a65fdd49c2d4a2ba56fcfa98ff4ecee
+msgid ""
+"``tls_fingerprint`` *(load-bearing; site stays enabled)* — the site "
+"fingerprints the TLS handshake (JA3/JA4) and blocks non-browser clients. "
+"Maigret automatically uses ``curl_cffi`` with Chrome browser emulation to"
+" bypass this. Requires the ``curl_cffi`` package (included as a "
+"dependency). Examples: Instagram, NPM, Codepen, Kickstarter, Letterboxd."
+msgstr ""
+"``tls_fingerprint`` *(porteur de comportement ; le site reste activé)* — "
+"le site prend l'empreinte de la poignée de main TLS (JA3/JA4) et bloque "
+"les clients qui ne sont pas des navigateurs. Maigret utilise "
+"automatiquement ``curl_cffi`` avec une émulation de navigateur Chrome "
+"pour contourner cela. Nécessite le paquet ``curl_cffi`` (inclus dans les "
+"dépendances). Exemples : Instagram, NPM, Codepen, Kickstarter, "
+"Letterboxd."
+
+#: ../../source/development.rst:178 3e6a51830670477baf895536c447c8c6
+msgid ""
+"``ip_reputation`` *(documentation-only; site stays enabled)* — the site "
+"blocks requests from datacenter/cloud IPs regardless of headers or TLS. "
+"Cannot be bypassed automatically; run Maigret from a regular internet "
+"connection (not a datacenter) or use a proxy (``--proxy``). The site is "
+"**not** marked ``disabled`` because it continues to work for users on "
+"residential IPs. Examples: Reddit, Patreon, Figma, OnlyFans."
+msgstr ""
+"``ip_reputation`` *(purement documentaire ; le site reste activé)* — le "
+"site bloque les requêtes venant d'IP de datacenter ou de cloud, quels que"
+" soient les en-têtes ou le TLS. Impossible à contourner automatiquement :"
+" lancez Maigret depuis une connexion internet ordinaire (pas depuis un "
+"datacenter), ou utilisez un proxy (``--proxy``). Le site n'est **pas** "
+"marqué ``disabled``, car il continue de fonctionner pour les utilisateurs"
+" sur IP résidentielle. Exemples : Reddit, Patreon, Figma, OnlyFans."
+
+#: ../../source/development.rst:179 e612faece996499a8957c0cbbc312ef2
+msgid ""
+"``cf_js_challenge`` *(documentation-only; pair with ``disabled: true``)* "
+"— Cloudflare Managed Challenge / Turnstile JS challenge. Symptom: HTTP "
+"403 with ``cf-mitigated: challenge`` header; body contains "
+"``challenges.cloudflare.com``, ``_cf_chl_opt``, ``window._cf_chl``, or "
+"\"Just a moment\". Not bypassable via ``curl_cffi`` TLS impersonation "
+"(verified across Chrome 123/124/131, Safari 17/18, Firefox 133/135, Edge "
+"101 — all return the same 403 challenge page); a real browser executing "
+"the challenge JS is required to obtain the clearance cookie. Sites stay "
+"``disabled: true`` until a CF-challenge solver is integrated. Examples: "
+"DMOJ, Elakiri, Fanlore, Bdoutdoors, TheStudentRoom, forum.hr."
+msgstr ""
+"``cf_js_challenge`` *(purement documentaire ; à associer à ``disabled: "
+"true``)* — défi JavaScript Cloudflare Managed Challenge ou Turnstile. "
+"Symptôme : un HTTP 403 avec l'en-tête ``cf-mitigated: challenge`` ; le "
+"corps contient ``challenges.cloudflare.com``, ``_cf_chl_opt``, "
+"``window._cf_chl``, ou « Just a moment ». Non contournable par "
+"l'imitation TLS de ``curl_cffi`` (vérifié avec Chrome 123/124/131, Safari"
+" 17/18, Firefox 133/135 et Edge 101 : tous renvoient la même page de défi"
+" en 403) ; il faut un vrai navigateur exécutant le JavaScript du défi "
+"pour obtenir le cookie de clearance. Ces sites restent ``disabled: true``"
+" tant qu'un solveur de défis CF n'est pas intégré. Exemples : DMOJ, "
+"Elakiri, Fanlore, Bdoutdoors, TheStudentRoom, forum.hr."
+
+#: ../../source/development.rst:180 0bbca66ef9a540de9090428b762108e8
+msgid ""
+"``cf_firewall`` *(documentation-only; pair with ``disabled: true``)* — "
+"Cloudflare firewall rule / bot score block (WAF action=block, **not** "
+"action=challenge). Symptom: HTTP 403 served by Cloudflare (``server: "
+"cloudflare``, ``cf-ray`` header) **without** JS-challenge markers — body "
+"typically shows \"Access denied\", \"Attention Required\", or just a bare"
+" 1015/1016/1020 error page. Unlike ``ip_reputation``, residential IPs are"
+" **not** sufficient to bypass — Cloudflare decides based on a composite "
+"of bot score, TLS fingerprint, UA, ASN, and custom site-owner rules, so "
+"``curl_cffi`` Chrome impersonation from a residential line still returns "
+"403. Sites stay ``disabled: true`` until a per-site bypass (cookies, real"
+" browser, or residential+clean session) is found. Examples: Fark, Fodors,"
+" Huntingnet, Hunttalk."
+msgstr ""
+"``cf_firewall`` *(purement documentaire ; à associer à ``disabled: "
+"true``)* — règle de pare-feu Cloudflare ou blocage sur score de bot (WAF "
+"action=block, et **non** action=challenge). Symptôme : un HTTP 403 servi "
+"par Cloudflare (``server: cloudflare``, en-tête ``cf-ray``) **sans** "
+"marqueur de défi JavaScript ; le corps affiche typiquement « Access "
+"denied », « Attention Required », ou simplement une page d'erreur "
+"1015/1016/1020 nue. Contrairement à ``ip_reputation``, une IP "
+"résidentielle ne suffit **pas** à passer : Cloudflare décide à partir "
+"d'un ensemble composite (score de bot, empreinte TLS, agent utilisateur, "
+"ASN et règles propres au propriétaire du site), si bien que l'imitation "
+"de Chrome par ``curl_cffi`` depuis une ligne résidentielle renvoie encore"
+" un 403. Ces sites restent ``disabled: true`` tant qu'un contournement "
+"propre au site (cookies, vrai navigateur, ou session propre en "
+"résidentiel) n'a pas été trouvé. Exemples : Fark, Fodors, Huntingnet, "
+"Hunttalk."
+
+#: ../../source/development.rst:181 f7085a8bc89f41398338ae9a73fc1be7
+msgid ""
+"``aws_waf_js_challenge`` *(documentation-only; pair with ``disabled: "
+"true``)* — the site is protected by AWS WAF with a JavaScript challenge. "
+"Symptom: HTTP 202 with empty body and ``x-amzn-waf-action: challenge`` "
+"header (a token-granting challenge that requires executing the "
+"CAPTCHA/challenge JS bundle). Neither ``curl_cffi`` TLS impersonation nor"
+" User-Agent changes bypass this — a real browser or the official AWS WAF "
+"challenge-solver SDK is required. Sites stay ``disabled: true`` until a "
+"solver is integrated. Example: Dreamwidth."
+msgstr ""
+"``aws_waf_js_challenge`` *(purement documentaire ; à associer à "
+"``disabled: true``)* — le site est protégé par AWS WAF avec un défi "
+"JavaScript. Symptôme : un HTTP 202 au corps vide, avec l'en-tête ``x"
+"-amzn-waf-action: challenge`` (un défi délivrant un jeton, qui exige "
+"d'exécuter le bundle JavaScript du CAPTCHA ou du défi). Ni l'imitation "
+"TLS de ``curl_cffi`` ni un changement d'agent utilisateur n'en viennent à"
+" bout : il faut un vrai navigateur ou le SDK officiel de résolution de "
+"défis AWS WAF. Ces sites restent ``disabled: true`` tant qu'un solveur "
+"n'est pas intégré. Exemple : Dreamwidth."
+
+#: ../../source/development.rst:182 e2911baa0a0a4755be3acb73a127e73f
+msgid ""
+"``ddos_guard_challenge`` *(documentation-only; pair with ``disabled: "
+"true``)* — DDoS-Guard (ddos-guard.net) anti-bot page. Symptom: HTTP 403 "
+"with ``server: ddos-guard`` header; body contains \"DDoS-Guard\". DDoS-"
+"Guard fingerprints different UAs per source IP, so a single User-Agent "
+"override does not work across environments; a JS-capable bypass or DDoS-"
+"Guard-aware solver is required. Sites stay ``disabled: true`` until a "
+"solver is integrated. Example: ForumHouse."
+msgstr ""
+"``ddos_guard_challenge`` *(purement documentaire ; à associer à "
+"``disabled: true``)* — page anti-bot DDoS-Guard (ddos-guard.net). "
+"Symptôme : un HTTP 403 avec l'en-tête ``server: ddos-guard`` ; le corps "
+"contient « DDoS-Guard ». DDoS-Guard prend l'empreinte d'agents "
+"utilisateurs différents selon l'IP source : remplacer un seul agent "
+"utilisateur ne fonctionne donc pas d'un environnement à l'autre. Il faut "
+"un contournement capable d'exécuter du JavaScript, ou un solveur qui "
+"connaît DDoS-Guard. Ces sites restent ``disabled: true`` tant qu'un "
+"solveur n'est pas intégré. Exemple : ForumHouse."
+
+#: ../../source/development.rst:183 0c6eb74688474b2ba42f2e3d1c93d207
+msgid ""
+"``js_challenge`` *(documentation-only; pair with ``disabled: true``)* — "
+"**fallback** for JavaScript-challenge systems whose provider cannot be "
+"identified (custom in-house challenge pages that are not Cloudflare, AWS "
+"WAF, or any other recognized vendor). Prefer a provider-specific tag "
+"whenever the provider can be pinned down from response headers or body "
+"signatures."
+msgstr ""
+"``js_challenge`` *(purement documentaire ; à associer à ``disabled: "
+"true``)* — **valeur de repli** pour les systèmes de défi JavaScript dont "
+"le fournisseur ne peut pas être identifié (pages de défi maison, qui ne "
+"relèvent ni de Cloudflare, ni d'AWS WAF, ni d'aucun autre éditeur "
+"reconnu). Préférez toujours un tag propre au fournisseur dès que celui-ci"
+" peut être identifié à partir des en-têtes ou des signatures du corps de "
+"la réponse."
+
+#: ../../source/development.rst:184 43e3531e0bc342c4b8433fc36a06bf51
+msgid ""
+"``custom_bot_protection`` *(documentation-only; pair with ``disabled: "
+"true``)* — **fallback** for non-JS-challenge bot protection served by a "
+"custom/in-house system (not Cloudflare, not AWS WAF, not DDoS-Guard). "
+"Typical symptom: HTTP 403 from the site's own origin server (``server: "
+"nginx``, AWS ELB, etc.) with a branded block page, returned regardless of"
+" TLS fingerprint or residential IP. Not generically bypassable; "
+"investigate per site (cookies, session, proxy geography). Examples: "
+"Hackerearth (\"HackerEarth Guardian\"), FreelanceJob (nginx-level block)."
+msgstr ""
+"``custom_bot_protection`` *(purement documentaire ; à associer à "
+"``disabled: true``)* — **valeur de repli** pour les protections anti-bot "
+"sans défi JavaScript, servies par un système maison (ni Cloudflare, ni "
+"AWS WAF, ni DDoS-Guard). Symptôme typique : un HTTP 403 venant du serveur"
+" d'origine du site lui-même (``server: nginx``, un ELB AWS, etc.), avec "
+"une page de blocage aux couleurs du site, renvoyée quels que soient "
+"l'empreinte TLS ou le caractère résidentiel de l'IP. Pas de contournement"
+" générique : il faut enquêter site par site (cookies, session, géographie"
+" du proxy). Exemples : Hackerearth (« HackerEarth Guardian »), "
+"FreelanceJob (blocage au niveau de nginx)."
+
+#: ../../source/development.rst:186 f3ca7715161b4707a448d314d846aa19
+msgid ""
+"**Rule: prefer provider-specific protection tags.** When a site is "
+"blocked by an identifiable anti-bot vendor, always record the vendor in "
+"the tag (``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, "
+"``ddos_guard_challenge``, and future additions such as "
+"``sucuri_challenge``, ``incapsula_challenge``). The generic "
+"``js_challenge`` and ``custom_bot_protection`` tags are reserved for "
+"custom/unknown systems. Rationale: bypass solvers are inherently "
+"provider-specific (a Cloudflare Turnstile solver does not help with AWS "
+"WAF); recording the provider in advance lets us fan out fixes the moment "
+"a per-provider solver is added, without re-auditing every disabled site. "
+"The same principle applies to other protection categories when the "
+"provider is identifiable."
+msgstr ""
+"**Règle : préférez les tags de protection propres au fournisseur.** "
+"Lorsqu'un site est bloqué par un éditeur anti-bot identifiable, consignez"
+" toujours cet éditeur dans le tag (``cf_js_challenge``, ``cf_firewall``, "
+"``aws_waf_js_challenge``, ``ddos_guard_challenge``, et les ajouts futurs "
+"comme ``sucuri_challenge`` ou ``incapsula_challenge``). Les tags "
+"génériques ``js_challenge`` et ``custom_bot_protection`` sont réservés "
+"aux systèmes maison ou inconnus. La raison : les solveurs sont par nature"
+" propres à un fournisseur (un solveur Cloudflare Turnstile n'aide en rien"
+" face à AWS WAF) ; consigner le fournisseur à l'avance permet de déployer"
+" les corrections dès qu'un solveur pour ce fournisseur est ajouté, sans "
+"réauditer chaque site désactivé. Le même principe vaut pour les autres "
+"catégories de protection lorsque le fournisseur est identifiable."
+
+#: ../../source/development.rst:188 cd9a47001b5641339b3c69d8b0a6c95c
+msgid "Example:"
+msgstr "Exemple :"
+
+#: ../../source/development.rst:201 7e39ef6271f84d7eb7690e2780094c05
+msgid "``urlProbe`` (optional profile probe URL)"
+msgstr "``urlProbe`` (URL de sonde facultative)"
+
+#: ../../source/development.rst:203 22b693bb8bbe487ea6f9cd2fb36ba236
+msgid ""
+"By default Maigret performs the HTTP request to the same URL as ``url`` "
+"(the public profile link pattern)."
+msgstr ""
+"Par défaut, Maigret envoie sa requête HTTP à la même URL que ``url``, le "
+"gabarit du lien de profil public."
+
+#: ../../source/development.rst:205 60c7717eebe34292a84ae10db722a7c0
+msgid ""
+"If you set ``urlProbe`` in ``data.json``, Maigret **fetches** that URL "
+"for the presence check (API, GraphQL, JSON endpoint, etc.), while "
+"**reports and ``url_user``** still use ``url`` — the human-readable "
+"profile page users should open."
+msgstr ""
+"Si vous définissez ``urlProbe`` dans ``data.json``, Maigret **interroge**"
+" cette URL pour la vérification de présence (API, GraphQL, point d'entrée"
+" JSON, etc.), tandis que **les rapports et ``url_user``** continuent "
+"d'utiliser ``url``, la page de profil lisible que les utilisateurs "
+"doivent pouvoir ouvrir."
+
+#: ../../source/development.rst:207 9ab1711d96a84f769eead7fb9961e740
+#, python-brace-format
+msgid ""
+"Placeholders: ``{username}``, ``{urlMain}``, ``{urlSubpath}`` (same as "
+"for ``url``). Example: GitHub uses ``url`` "
+"``https://github.com/{username}`` and ``urlProbe`` "
+"``https://api.github.com/users/{username}``; Picsart uses the web profile"
+" ``https://picsart.com/u/{username}`` and probes "
+"``https://api.picsart.com/users/show/{username}.json``."
+msgstr ""
+"Emplacements disponibles : ``{username}``, ``{urlMain}``, "
+"``{urlSubpath}`` (les mêmes que pour ``url``). Exemple : GitHub utilise "
+"l'``url`` ``https://github.com/{username}`` et l'``urlProbe`` "
+"``https://api.github.com/users/{username}`` ; Picsart utilise le profil "
+"web ``https://picsart.com/u/{username}`` et sonde "
+"``https://api.picsart.com/users/show/{username}.json``."
+
+#: ../../source/development.rst:210 482b5057ffa34690aa598685a636cfc5
+#, python-brace-format
+msgid ""
+"``url`` must **always** stay a human-openable profile page — it is shown "
+"to the user and printed as the clickable result link. Never put an API / "
+"JSON / GraphQL endpoint in ``url``; that belongs in ``urlProbe``. If the "
+"check needs an API endpoint, keep the browsable profile in ``url`` and "
+"add the API URL as ``urlProbe`` (e.g. Weibo: ``url`` "
+"``https://weibo.com/n/{username}``, ``urlProbe`` "
+"``https://weibo.com/ajax/profile/info?screen_name={username}``)."
+msgstr ""
+"``url`` doit **toujours** rester une page de profil ouvrable par un "
+"humain : elle est montrée à l'utilisateur et affichée comme lien "
+"cliquable dans les résultats. Ne mettez jamais de point d'entrée API / "
+"JSON / GraphQL dans ``url`` ; sa place est dans ``urlProbe``. Si la "
+"vérification a besoin d'un point d'entrée d'API, gardez le profil "
+"navigable dans ``url`` et ajoutez l'URL de l'API dans ``urlProbe`` (par "
+"exemple Weibo : ``url`` ``https://weibo.com/n/{username}``, ``urlProbe`` "
+"``https://weibo.com/ajax/profile/info?screen_name={username}``)."
+
+#: ../../source/development.rst:217 b461fbd83a4d40e9b1e8afbcd1c112a6
+msgid ""
+"Implementation: ``make_site_result`` in `checking.py "
+"`__."
+msgstr ""
+"Implémentation : ``make_site_result`` dans `checking.py "
+"`__."
+
+#: ../../source/development.rst:220 cbe7c176b405412fa2659339e387b677
+msgid "Site check fixes using LLM"
+msgstr "Corriger les vérifications de sites à l'aide d'un LLM"
+
+#: ../../source/development.rst:223 efab790423694b08829e4d5e0ad96645
+msgid ""
+"The ``LLM/`` directory at the root of the repository contains detailed "
+"instructions for editing site checks (in Markdown format): checklist, "
+"full guide to ``checkType`` / ``data.json`` / ``urlProbe``, handling "
+"false positives, searching for public JSON APIs, and the proposal log for"
+" `socid_extractor `_."
+msgstr ""
+"Le répertoire ``LLM/``, à la racine du dépôt, contient des instructions "
+"détaillées pour modifier les vérifications de sites (au format Markdown) "
+": liste de contrôle, guide complet de ``checkType`` / ``data.json`` / "
+"``urlProbe``, traitement des faux positifs, recherche d'API JSON "
+"publiques, et journal de propositions pour `socid_extractor `_."
+
+#: ../../source/development.rst:225 7405f8aa21244e358fee13dd6c3cefcf
+msgid "Main files:"
+msgstr "Fichiers principaux :"
+
+#: ../../source/development.rst:227 4d3927018c404e70971e8794ea091fcb
+msgid ""
+"`site-checks-playbook.md `_ — short checklist"
+msgstr ""
+"`site-checks-playbook.md `_ — liste de contrôle courte"
+
+#: ../../source/development.rst:228 2e3b3f7a970a44668914fe4a1d856855
+msgid ""
+"`site-checks-guide.md `_ — detailed guide"
+msgstr ""
+"`site-checks-guide.md `_ — guide détaillé"
+
+#: ../../source/development.rst:229 ec16764a5e4c49169ab4d3cecb73b7c8
+msgid ""
+"`socid_extractor_improvements.log "
+"`_"
+" — template and entries for identity extractor improvements; the upstream"
+" how-to is `Adding a scheme `_"
+msgstr ""
+"`socid_extractor_improvements.log "
+"`_"
+" — modèle et entrées pour les améliorations de l'extracteur d'identités ;"
+" le mode d'emploi en amont est `Adding a scheme `_"
+
+#: ../../source/development.rst:231 205f96a212fc49d9833e8800db4cac6d
+msgid ""
+"These files should be kept up-to-date whenever changes are made to the "
+"check logic in the code or in ``data.json``."
+msgstr ""
+"Ces fichiers doivent être tenus à jour à chaque modification de la "
+"logique de vérification, dans le code comme dans ``data.json``."
+
+#: ../../source/development.rst:236 5c4c006abed946e2bcd9a2c85cd7b157
+msgid "Activation mechanism"
+msgstr "Mécanisme d'activation"
+
+#: ../../source/development.rst:238 8711119dfd7b415fbf3f65f2ebef4926
+msgid ""
+"The activation mechanism helps make requests to sites requiring "
+"additional authentication like cookies, JWT tokens, or custom headers."
+msgstr ""
+"Le mécanisme d'activation permet d'interroger les sites qui exigent une "
+"authentification supplémentaire : cookies, jetons JWT ou en-têtes "
+"personnalisés."
+
+#: ../../source/development.rst:240 49a33164a1254c92aa7af386cd949edc
+msgid "Let's study the Vimeo site check record from the Maigret database:"
+msgstr "Examinons la fiche de vérification du site Vimeo dans la base de Maigret :"
+
+#: ../../source/development.rst:268 6359f39a3c5c4005b3273330e2ce1fde
+msgid "The activation method is:"
+msgstr "La méthode d'activation est :"
+
+#: ../../source/development.rst:282 44e0f0bb1186492c812d0bf6801f735d
+msgid "Here's how the activation process works when a JWT token becomes invalid:"
+msgstr ""
+"Voici comment se déroule le processus d'activation lorsqu'un jeton JWT "
+"devient invalide :"
+
+#: ../../source/development.rst:284 0c52dda242774fdfbf4734ffbd9fa2c3
+msgid ""
+"The site check makes an HTTP request to ``urlProbe`` with the invalid "
+"token"
+msgstr ""
+"La vérification du site envoie une requête HTTP à ``urlProbe`` avec le "
+"jeton invalide"
+
+#: ../../source/development.rst:285 bb09eac30cb147b7bce4b33f8b0db418
+msgid ""
+"The response contains an error message specified in the "
+"``activation``/``marks`` field"
+msgstr ""
+"La réponse contient un message d'erreur indiqué dans le champ "
+"``activation``/``marks``"
+
+#: ../../source/development.rst:286 3c1946f49ff544bc8762339d18d73758
+msgid ""
+"When this error is detected, the ``vimeo`` activation function is "
+"triggered"
+msgstr ""
+"Lorsque cette erreur est détectée, la fonction d'activation ``vimeo`` est"
+" déclenchée"
+
+#: ../../source/development.rst:287 075145a25d3d45698757b17c1e49efb0
+msgid ""
+"The activation function obtains a new JWT token and updates it in the "
+"site check record"
+msgstr ""
+"La fonction d'activation obtient un nouveau jeton JWT et le met à jour "
+"dans la fiche de vérification du site"
+
+#: ../../source/development.rst:288 bbe1932a3d104efaaef0ed7f348a29ce
+msgid ""
+"On the next site check (either through retry or a new Maigret run), the "
+"valid token is used and the check succeeds"
+msgstr ""
+"À la vérification suivante (par une nouvelle tentative ou par une "
+"nouvelle exécution de Maigret), le jeton valide est utilisé et la "
+"vérification réussit"
+
+#: ../../source/development.rst:290 d6092cf5662c4067928586c09a5ab24f
+msgid ""
+"Step 5 works across runs because minted tokens are written to a per-user "
+"cache rather than back into the site database — see :ref:`activation-"
+"token-cache`."
+msgstr ""
+"L'étape 5 fonctionne d'une exécution à l'autre parce que les jetons "
+"générés sont écrits dans un cache propre à l'utilisateur, et non "
+"réinjectés dans la base de sites, voir :ref:`activation-token-cache`."
+
+#: ../../source/development.rst:292 4eb6e5f5a70b4246a9f1ee08d1503748
+msgid ""
+"Examples of activation mechanism implementation are available in "
+"`activation.py "
+"`_ "
+"file."
+msgstr ""
+"Des exemples d'implémentation du mécanisme d'activation se trouvent dans "
+"le fichier `activation.py "
+"`_."
+
+#: ../../source/development.rst:295 130c83c1455f4a989f7455efc8d1d398
+msgid "How to publish new version of Maigret"
+msgstr "Comment publier une nouvelle version de Maigret"
+
+#: ../../source/development.rst:297 476e1c1c99d3454fa813e59eeb631b6a
+msgid "**Collaborats rights are requires, write Soxoj to get them**."
+msgstr ""
+"**Les droits de collaborateur sont nécessaires, écrivez à Soxoj pour les "
+"obtenir**."
+
+#: ../../source/development.rst:299 47da948d8e88410d8cecd1a71f34613c
+msgid ""
+"For new version publishing you must create a new branch in repository "
+"with a bumped version number and actual changelog first. After it you "
+"must create a release, and GitHub action automatically create a new PyPi "
+"package."
+msgstr ""
+"Pour publier une nouvelle version, vous devez d'abord créer dans le dépôt"
+" une branche portant le numéro de version incrémenté et le changelog à "
+"jour. Ensuite, vous créez une release, et une action GitHub crée "
+"automatiquement un nouveau paquet PyPI."
+
+#: ../../source/development.rst:304 ba55b1b8b54748359919d6144a74d1dc
+msgid ""
+"New branch example: "
+"https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39"
+msgstr ""
+"Exemple de nouvelle branche : "
+"https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39"
+
+#: ../../source/development.rst:305 f9661b2afa5e4bc9b8c58460ed0dd250
+msgid "Release example: https://github.com/soxoj/maigret/releases/tag/v0.4.1"
+msgstr "Exemple de release : https://github.com/soxoj/maigret/releases/tag/v0.4.1"
+
+#: ../../source/development.rst:307 b52f760c7c4f45aa8c0352c089e011c4
+msgid ""
+"1. Make a new branch locally with a new version name. Check the current "
+"version number here: https://pypi.org/project/maigret/. **Increase only "
+"patch version (third number)** if there are no breaking changes."
+msgstr ""
+"1. Créez localement une branche portant le nom de la nouvelle version. "
+"Vérifiez le numéro de version actuel ici : "
+"https://pypi.org/project/maigret/. **N'incrémentez que la version de "
+"correctif (le troisième nombre)** s'il n'y a pas de changement "
+"incompatible."
+
+#: ../../source/development.rst:314 443f7ed9c07e4a3d91aa6be91ac9da74
+msgid ""
+"2. Update Maigret version in three files manually. **All three must be in"
+" sync** — an earlier bump missed ``docs/source/conf.py`` and it fell "
+"behind by a release."
+msgstr ""
+"2. Mettez à jour la version de Maigret à la main dans trois fichiers. "
+"**Les trois doivent rester synchronisés** : une montée de version "
+"précédente avait oublié ``docs/source/conf.py``, qui a pris une version "
+"de retard."
+
+#: ../../source/development.rst:318 72842dfad4d0410687fe2037deda9bf6
+msgid ""
+"``pyproject.toml`` — single line ``version = \"X.Y.Z\"`` under "
+"``[tool.poetry]``. Leave every ``[tool.poetry.dependencies]`` entry "
+"alone: ``python-bidi = \"^0.6.3\"`` is a third-party version that happens"
+" to look like ours."
+msgstr ""
+"``pyproject.toml`` — une seule ligne ``version = \"X.Y.Z\"`` sous "
+"``[tool.poetry]``. Ne touchez à aucune entrée de "
+"``[tool.poetry.dependencies]`` : ``python-bidi = \"^0.6.3\"`` est la "
+"version d'une bibliothèque tierce, qui ressemble seulement à la nôtre."
+
+#: ../../source/development.rst:322 67d8d03a84d94ee9857b53cb4184a6fb
+msgid "``maigret/__version__.py`` — single line ``__version__ = 'X.Y.Z'``."
+msgstr "``maigret/__version__.py`` — une seule ligne ``__version__ = 'X.Y.Z'``."
+
+#: ../../source/development.rst:323 5eb4430737d14dadb0448537e668f369
+msgid ""
+"``docs/source/conf.py`` — **two** Sphinx fields. ``release`` is the full "
+"version (``'X.Y.Z'``); ``version`` is the short ``major.minor`` "
+"(``'X.Y'``, **without** the patch number). Update **both**."
+msgstr ""
+"``docs/source/conf.py`` — **deux** champs Sphinx. ``release`` est la "
+"version complète (``'X.Y.Z'``) ; ``version`` est la forme courte "
+"``majeure.mineure`` (``'X.Y'``, **sans** le numéro de correctif). Mettez "
+"les **deux** à jour."
+
+#: ../../source/development.rst:327 b5222c8fb2d449cb81f07ef63dd0966b
+msgid ""
+"``snap/snapcraft.yaml`` is **not** in this list any more. It carries "
+"``adopt-info: maigret`` and reads the version out of "
+"``maigret/__version__.py`` at build time, so it follows automatically."
+msgstr ""
+"``snap/snapcraft.yaml`` ne fait **plus** partie de cette liste. Il porte "
+"``adopt-info: maigret`` et lit la version depuis "
+"``maigret/__version__.py`` au moment de la construction : il suit donc "
+"automatiquement."
+
+#: ../../source/development.rst:331 0d8b412e3ec74e078be2f277f40b8eb0
+msgid "After editing, check that nothing was missed:"
+msgstr "Après ces modifications, vérifiez que rien n'a été oublié :"
+
+#: ../../source/development.rst:338 7d249a431841419f8ae26271c57689d6
+msgid ""
+"Create a new empty text section in the beginning of the file "
+"`CHANGELOG.md` with a current date:"
+msgstr ""
+"Créez une nouvelle section de texte vide au début du fichier "
+"`CHANGELOG.md`, avec la date du jour :"
+
+#: ../../source/development.rst:344 74590483e89b463e88e18e951fc5825b
+msgid "Get auto-generate release notes:"
+msgstr "Obtenez des notes de version générées automatiquement :"
+
+#: ../../source/development.rst:346 44eb0723672b4430a5c0094c56a0504e
+msgid "Open https://github.com/soxoj/maigret/releases/new"
+msgstr "Ouvrez https://github.com/soxoj/maigret/releases/new"
+
+#: ../../source/development.rst:347 6d769a8487274710b27aa3dc5ccca9eb
+msgid "Click `Choose a tag`, enter `v0.4.0` (your version)"
+msgstr "Cliquez sur `Choose a tag` et saisissez `v0.4.0` (votre version)"
+
+#: ../../source/development.rst:348 ../../source/development.rst:390
+#: 49007f863d2e471c91c56ff25c3c3699 ab69a0bd58d445879ad9b306a8ea2afc
+msgid "Click `Create new tag`"
+msgstr "Cliquez sur `Create new tag`"
+
+#: ../../source/development.rst:349 ../../source/development.rst:393
+#: eb0fa6aed0c947e49bec3b215054e5e7 eb75395cc1f645908557265de8ba49af
+msgid "Press `+ Auto-generate release notes`"
+msgstr "Appuyez sur `+ Auto-generate release notes`"
+
+#: ../../source/development.rst:350 f7f3526fe70945ab90e4f70fc10e5560
+msgid "Copy all the text from description text field below"
+msgstr "Copiez tout le texte du champ de description ci-dessous"
+
+#: ../../source/development.rst:351 8f8fde06fb9240e3b41420a40f732f33
+msgid "Paste it to empty text section in `CHANGELOG.md`"
+msgstr "Collez-le dans la section vide de `CHANGELOG.md`"
+
+#: ../../source/development.rst:352 f177d5679b0d42878df120a0e19769f4
+msgid "*Close the new release page*"
+msgstr "*Fermez la page de création de release*"
+
+#: ../../source/development.rst:354 e47f7f434d76421db9672dc4f81561f9
+msgid ""
+"Keep the ``## What's Changed`` heading, the ``## New Contributors`` "
+"section and the ``**Full Changelog**`` line — every existing section in "
+"``CHANGELOG.md`` has them."
+msgstr ""
+"Conservez le titre ``## What's Changed``, la section ``## New "
+"Contributors`` et la ligne ``**Full Changelog**`` : toutes les sections "
+"existantes de ``CHANGELOG.md`` les contiennent."
+
+#: ../../source/development.rst:358 80db39d834d94860b846dc4f58f1653c
+msgid ""
+"The same notes can be generated without opening the browser, which is "
+"handy when you want them in a file:"
+msgstr ""
+"Les mêmes notes peuvent être générées sans ouvrir le navigateur, ce qui "
+"est pratique quand on veut les récupérer dans un fichier :"
+
+#: ../../source/development.rst:367 0e247b932d634e79a2f7edb7562287d2
+msgid ""
+"This is the same generator the `+ Auto-generate release notes` button "
+"calls, so the contributor handles are the real GitHub logins. Do not "
+"assemble the list from ``git log`` instead: authors who commit without a "
+"``@users.noreply.github.com`` address have no derivable handle there, and"
+" guessing from the display name produces entries like ``@Danilo Salve`` "
+"that are not valid GitHub users."
+msgstr ""
+"C'est le générateur qu'appelle le bouton `+ Auto-generate release notes` "
+": les identifiants de contributeurs sont donc de vrais comptes GitHub. "
+"N'assemblez pas la liste à partir de ``git log`` : les auteurs qui "
+"commitent sans adresse ``@users.noreply.github.com`` n'y ont aucun "
+"identifiant déductible, et deviner à partir du nom affiché produit des "
+"entrées comme ``@Danilo Salve``, qui ne correspondent à aucun utilisateur"
+" GitHub valide."
+
+#: ../../source/development.rst:374 b07a9409c48740aeb78a51e250b3c000
+msgid "Commit all the changes, push, make pull request"
+msgstr "Commitez toutes les modifications, poussez, ouvrez une pull request"
+
+#: ../../source/development.rst:383 ffe74564f0c74b5782b21350432a5f85
+msgid "Merge pull request"
+msgstr "Fusionnez la pull request"
+
+#: ../../source/development.rst:385 b56d01d107114164bbb6ce480edf33e1
+msgid "Create new release"
+msgstr "Créez la nouvelle release"
+
+#: ../../source/development.rst:387 87e0ea32afda47e6b39b0ba5a45ebbc9
+msgid "Open https://github.com/soxoj/maigret/releases/new again"
+msgstr "Ouvrez de nouveau https://github.com/soxoj/maigret/releases/new"
+
+#: ../../source/development.rst:388 fe6e97b96dae4bd4ba25d1bae6d9a9cf
+msgid "Click `Choose a tag`"
+msgstr "Cliquez sur `Choose a tag`"
+
+#: ../../source/development.rst:389 99502e4ab3694e43b171fcf913fe85e2
+msgid "Enter actual version in format `v0.4.0`"
+msgstr "Saisissez la version réelle au format `v0.4.0`"
+
+#: ../../source/development.rst:391 9bbe2653eabf4b7b917ee434e33aef18
+msgid "**Set** `Target` **to your version branch** (``0.4.0``), not ``main``"
+msgstr ""
+"**Réglez** `Target` **sur la branche de votre version** (``0.4.0``), et "
+"non sur ``main``"
+
+#: ../../source/development.rst:392 b027d0f79e83481c803d2671b5f1abde
+msgid "Also enter actual version in the field `Release title`"
+msgstr "Saisissez également la version réelle dans le champ `Release title`"
+
+#: ../../source/development.rst:394 7ce87aefb2d44d38ac3e77215654395d
+msgid "**Press \"Publish release\" button**"
+msgstr "**Appuyez sur le bouton « Publish release »**"
+
+#: ../../source/development.rst:398 170058620c324f87a2ec09f26a35d57c
+msgid ""
+"``Target`` defaults to ``main``, and that default is wrong here. The tag "
+"must point at a commit that already contains the bumped version — "
+"otherwise the tag lands on the tip of ``main``, where the version is "
+"still the previous one, and ``python-publish.yml`` builds and tries to "
+"upload a package with the **old** version number. PyPI rejects it as a "
+"duplicate and the release job fails."
+msgstr ""
+"``Target`` vaut ``main`` par défaut, et ce choix par défaut est mauvais "
+"ici. Le tag doit pointer sur un commit qui contient déjà la version "
+"incrémentée ; sinon il atterrit sur la tête de ``main``, où la version "
+"est encore la précédente, et ``python-publish.yml`` construit puis tente "
+"de téléverser un paquet portant l'**ancien** numéro de version. PyPI le "
+"rejette comme doublon et la tâche de publication échoue."
+
+#: ../../source/development.rst:405 5cc01d38545a40e8bb6ddc95db3d5614
+msgid ""
+"This is why the release tags of ``v0.6.1``, ``v0.6.2`` and ``v0.6.3`` all"
+" point at commits on their version branches rather than at ``main``. "
+"Merging the pull request from step 6 first is *not* required — pointing "
+"the tag at the version branch is what matters."
+msgstr ""
+"C'est pourquoi les tags de version ``v0.6.1``, ``v0.6.2`` et ``v0.6.3`` "
+"pointent tous sur des commits de leurs branches de version, et non sur "
+"``main``. Fusionner d'abord la pull request de l'étape 6 n'est *pas* "
+"obligatoire : ce qui compte, c'est que le tag pointe sur la branche de "
+"version."
+
+#: ../../source/development.rst:410 41a6a682b4654a6297ae092631edd600
+msgid ""
+"To check a published tag: ``git show v0.4.0:maigret/__version__.py`` must"
+" print the new version."
+msgstr ""
+"Pour vérifier un tag publié : ``git show v0.4.0:maigret/__version__.py`` "
+"doit afficher la nouvelle version."
+
+#: ../../source/development.rst:413 2dcfcc7d8f8a4011a84b2e92e960ed68
+msgid ""
+"The whole step can be done from the command line instead. ``--target`` "
+"takes a branch name or a commit SHA:"
+msgstr ""
+"Toute cette étape peut aussi se faire en ligne de commande. ``--target`` "
+"accepte un nom de branche ou un SHA de commit :"
+
+#: ../../source/development.rst:420 4c2fd1f2e6144d51baa32479ece90ed0
+msgid ""
+"If a release was published against the wrong target, delete it together "
+"with its tag and recreate it — the ``release: published`` event fires "
+"again and PyPI upload is retried:"
+msgstr ""
+"Si une release a été publiée sur la mauvaise cible, supprimez-la avec son"
+" tag et recréez-la : l'événement ``release: published`` se déclenche de "
+"nouveau et le téléversement vers PyPI est retenté."
+
+#: ../../source/development.rst:429 8d71351a848d4604b7efdf27f1bbc495
+msgid ""
+"That's all, now you can simply wait push to PyPi. You can monitor it in "
+"Action page: https://github.com/soxoj/maigret/actions/workflows/python-"
+"publish.yml"
+msgstr ""
+"C'est tout : il ne reste qu'à attendre la publication sur PyPI. Vous "
+"pouvez la suivre sur la page Actions : "
+"https://github.com/soxoj/maigret/actions/workflows/python-publish.yml"
+
+#: ../../source/development.rst:432 10ad64f81da844a8bd7d9af5d8d0dc3d
+msgid "Documentation updates"
+msgstr "Mises à jour de la documentation"
+
+#: ../../source/development.rst:434 b25468b0d82d457dac0105abec3ae6a3
+msgid ""
+"Documentations is auto-generated and auto-deployed from the ``docs`` "
+"directory."
+msgstr ""
+"La documentation est générée et déployée automatiquement depuis le "
+"répertoire ``docs``."
+
+#: ../../source/development.rst:436 b9f3ab6142e34c9e84b018b9ed95fa78
+msgid "To manually update documentation:"
+msgstr "Pour mettre à jour la documentation à la main :"
+
+#: ../../source/development.rst:438 4b42894d249b452784f6b7c7bc20abd2
+msgid "Change something in the ``.rst`` files in the ``docs/source`` directory."
+msgstr ""
+"Modifiez quelque chose dans les fichiers ``.rst`` du répertoire "
+"``docs/source``."
+
+#: ../../source/development.rst:439 6bc7bd83f85e4cc1bde02e3cc892492b
+msgid "Install ``python -m pip install -e .`` in the docs directory."
+msgstr "Lancez ``python -m pip install -e .`` dans le répertoire docs."
+
+#: ../../source/development.rst:440 93e6e437efd243cd8a009df239f11b3d
+msgid "Run ``make singlehtml`` in the terminal in the docs directory."
+msgstr "Lancez ``make singlehtml`` dans un terminal, depuis le répertoire docs."
+
+#: ../../source/development.rst:441 cfb32db3e3b643b18fa2e3168aa20a09
+msgid "Open ``build/singlehtml/index.html`` in your browser to see the result."
+msgstr ""
+"Ouvrez ``build/singlehtml/index.html`` dans votre navigateur pour voir le"
+" résultat."
+
+#: ../../source/development.rst:442 f541c51c9b3340d79cf4740bff9aa3a4
+msgid ""
+"If you edited any English ``.rst`` text (not just code blocks), refresh "
+"the per-language translation catalogs — see *Translations* below. "
+"Skipping this step lets the non-English builds silently fall back to "
+"English on the changed strings."
+msgstr ""
+"Si vous avez modifié du texte ``.rst`` anglais (et pas seulement des "
+"blocs de code), rafraîchissez les catalogues de traduction de chaque "
+"langue, voir *Traductions* ci-dessous. Sauter cette étape fait "
+"silencieusement retomber les constructions non anglaises sur l'anglais "
+"pour les chaînes modifiées."
+
+#: ../../source/development.rst:446 220b819693084fa086429c546170f67a
+msgid "If everything is ok, commit and push your changes to GitHub."
+msgstr "Si tout va bien, commitez et poussez vos modifications sur GitHub."
+
+#: ../../source/development.rst:449 bb3763cfbfa14670b1de7b0cb1a84fd9
+msgid "Translations"
+msgstr "Traductions"
+
+#: ../../source/development.rst:451 a88f4c440d3443f78eb02015786a849e
+msgid ""
+"The docs are translated via Sphinx's standard gettext workflow. English "
+"``.rst`` files are the source of truth; translations live as ``.po`` "
+"catalogs under ``docs/source/locale//LC_MESSAGES/`` (currently "
+"``zh_CN`` and ``fr``)."
+msgstr ""
+"La documentation est traduite via le flux gettext standard de Sphinx. Les"
+" fichiers ``.rst`` anglais font foi ; les traductions vivent sous forme "
+"de catalogues ``.po`` dans ``docs/source/locale//LC_MESSAGES/`` "
+"(actuellement ``zh_CN`` et ``fr``)."
+
+#: ../../source/development.rst:455 1dec2ecb3c8c4838b62ef957c897ab0d
+msgid ""
+"After editing any English ``.rst`` file, refresh the catalogs so existing"
+" translations stay aligned with the new strings:"
+msgstr ""
+"Après avoir modifié un fichier ``.rst`` anglais, rafraîchissez les "
+"catalogues pour que les traductions existantes restent alignées sur les "
+"nouvelles chaînes :"
+
+#: ../../source/development.rst:463 901f348f88764af89b6a88e240a238fc
+msgid ""
+"This regenerates the ``.pot`` files via ``sphinx-build -b gettext`` and "
+"runs ``sphinx-intl update`` to merge them into the per-language ``.po`` "
+"files. New English strings appear with an empty ``msgstr \"\"``; changed "
+"strings get a ``#, fuzzy`` marker that translators should review and re-"
+"translate."
+msgstr ""
+"Cela regénère les fichiers ``.pot`` via ``sphinx-build -b gettext`` et "
+"lance ``sphinx-intl update`` pour les fusionner dans les fichiers ``.po``"
+" de chaque langue. Les nouvelles chaînes anglaises apparaissent avec un "
+"``msgstr \"\"`` vide ; les chaînes modifiées reçoivent un marqueur ``#, "
+"fuzzy`` que les traducteurs doivent relire et retraduire."
+
+#: ../../source/development.rst:468 3210120f78e14f12b0ed340ed31047e9
+msgid "Preview a translated build locally:"
+msgstr "Pour prévisualiser localement une construction traduite :"
+
+#: ../../source/development.rst:476 eed9b2c934c14311bafacc98510099d4
+msgid "CJK escape-spaces gotcha"
+msgstr "Le piège des espaces d'échappement en CJK"
+
+#: ../../source/development.rst:478 b48fe69580484f24a00f75b5bb401e7d
+msgid ""
+"reStructuredText inline markup (bold, inline code, hyperlinks) requires "
+"whitespace or punctuation on both sides to close. In English this is "
+"free: a space or full stop always follows. In Chinese / Japanese / Korean"
+" translations the next character is often a CJK letter with no separator,"
+" and docutils then emits warnings like::"
+msgstr ""
+"Le balisage en ligne de reStructuredText (gras, code en ligne, "
+"hyperliens) a besoin d'une espace ou d'une ponctuation de chaque côté "
+"pour se refermer. En anglais, cela va de soi : une espace ou un point "
+"suit toujours. Dans les traductions chinoises, japonaises et coréennes, "
+"le caractère suivant est souvent une lettre CJK sans séparateur, et "
+"docutils émet alors des avertissements comme ceux-ci ::"
+
+#: ../../source/development.rst:487 1c9d90292efb4493b6ed837ac8d7da50
+msgid ""
+"The fix is an explicit RST escape-space — a backslash followed by a space"
+" — between the closing marker and the next CJK character. In the rendered"
+" ``.rst`` this is written as ``\\``; inside a ``.po`` ``msgstr`` "
+"it must be written as ``\\\\`` because the ``.po`` parser eats one"
+" backslash level."
+msgstr ""
+"Le remède est une espace d'échappement RST explicite, une barre oblique "
+"inverse suivie d'une espace, entre le marqueur de fermeture et le "
+"caractère CJK suivant. Dans le ``.rst`` rendu, cela s'écrit "
+"``\\`` ; à l'intérieur d'un ``msgstr`` de fichier ``.po``, il "
+"faut écrire ``\\\\``, car l'analyseur de ``.po`` consomme un "
+"niveau de barre oblique inverse."
+
+#: ../../source/development.rst:503 085df902375749488264fb04f1b015ea
+msgid ""
+"The same rule applies after inline code before a CJK character, and after"
+" a hyperlink before a CJK opening bracket — always insert "
+"``\\\\``. After editing any ``.po`` file, run ``make html-zh_CN``;"
+" these warnings only surface at build time."
+msgstr ""
+"La même règle vaut après du code en ligne suivi d'un caractère CJK, et "
+"après un hyperlien suivi d'une parenthèse ouvrante CJK : insérez toujours"
+" ``\\\\``. Après avoir modifié un fichier ``.po``, lancez ``make "
+"html-zh_CN`` ; ces avertissements n'apparaissent qu'à la construction."
+
+#: ../../source/development.rst:508 44dcbb13f4c548f492790f4403a88076
+msgid ""
+"To add a new language, run ``make intl-update LANG=`` (e.g. ``ja``,"
+" ``de``, ``pt_BR``) — this scaffolds an empty catalog. Read the Docs "
+"publishes each language as a separate project linked under the parent "
+"(see the `Localization guide "
+"`_); a "
+"maintainer needs to create the translation project once in the RTD admin "
+"UI, set its language, and mark it as a translation of the main "
+"``maigret`` project to enable the language switcher."
+msgstr ""
+"Pour ajouter une nouvelle langue, lancez ``make intl-update LANG=``"
+" (par exemple ``ja``, ``de``, ``pt_BR``) : cela met en place un catalogue"
+" vide. Read the Docs publie chaque langue comme un projet distinct "
+"rattaché au projet parent (voir le `guide de localisation "
+"`_) ; un "
+"mainteneur doit créer une fois le projet de traduction dans l'interface "
+"d'administration de RTD, définir sa langue et le marquer comme traduction"
+" du projet principal ``maigret``, afin d'activer le sélecteur de langue."
+
+#: ../../source/development.rst:517 bc3fa58ac1af422d89924250bbb27125
+msgid "Roadmap"
+msgstr "Feuille de route"
+
+#: ../../source/development.rst:520 7ddabf328d604b62986d56a3da6ac30c
+msgid ""
+"This roadmap requires updating to reflect the current project status and "
+"future plans."
+msgstr ""
+"Cette feuille de route doit être mise à jour pour refléter l'état actuel "
+"du projet et les plans à venir."
+
+#~ msgid ""
+#~ "The docs are translated via Sphinx's "
+#~ "standard gettext workflow. English ``.rst``"
+#~ " files are the source of truth; "
+#~ "translations live as ``.po`` catalogs "
+#~ "under ``docs/source/locale//LC_MESSAGES/`` "
+#~ "(currently only ``zh_CN``)."
+#~ msgstr ""
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/faq.po b/docs/source/locale/fr/LC_MESSAGES/faq.po
new file mode 100644
index 00000000..b76a3734
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/faq.po
@@ -0,0 +1,583 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/faq.rst:4 0da8c66733d348fc9b00ba5a1a76aa73
+msgid "FAQ"
+msgstr "FAQ"
+
+#: ../../source/faq.rst:6 2ae724d004154176be5080383d04f54a
+msgid ""
+"Short answers to the questions users most often type into the docs "
+"search. For deeper coverage each section links to the relevant page."
+msgstr ""
+"Réponses courtes aux questions que les utilisateurs tapent le plus "
+"souvent dans la recherche de la documentation. Chaque section renvoie "
+"vers la page correspondante pour plus de détails."
+
+#: ../../source/faq.rst:10 9bb042d046f640119b891ab1c0435f0e
+msgid "Can I search by email address?"
+msgstr "Puis-je faire une recherche par adresse e-mail ?"
+
+#: ../../source/faq.rst:12 92d82ec421f54914a366fff12bb10ba6
+msgid ""
+"**No.** Maigret only takes a username (or one of the :doc:`supported "
+"identifier types `) as input — searching by "
+"an email or mail address is out of scope. Looking up a mail address "
+"requires different techniques (probing password-reset flows, registration"
+" endpoints) and is the job of a separate class of tool."
+msgstr ""
+"**Non.** Maigret n'accepte en entrée qu'un nom d'utilisateur (ou l'un des"
+" :doc:`types d'identifiants pris en charge `)"
+" : la recherche par adresse e-mail sort de son périmètre. Retrouver une "
+"adresse e-mail demande d'autres techniques (sonder les procédures de "
+"réinitialisation de mot de passe, les points d'entrée d'inscription) et "
+"relève d'une autre catégorie d'outils."
+
+#: ../../source/faq.rst:19 3ddb8801c7294968ba06946911e0f4bc
+msgid "Recommended open-source tools for email lookup:"
+msgstr "Outils open source recommandés pour la recherche par e-mail :"
+
+#: ../../source/faq.rst:21 ef0949e641b547239bf0abc2c39a5724
+msgid "`mailcat `_"
+msgstr "`mailcat `_"
+
+#: ../../source/faq.rst:22 99b07239fa61487ab55e3bebfb8076f8
+msgid "`holehe `_"
+msgstr "`holehe `_"
+
+#: ../../source/faq.rst:23 769abcb0d6814c859f9af00831f80620
+msgid "`user-scanner `_"
+msgstr "`user-scanner `_"
+
+#: ../../source/faq.rst:25 c35794d9d73d469e97539a39527812cb
+msgid "Online services:"
+msgstr "Services en ligne :"
+
+#: ../../source/faq.rst:27 189251bc33624e62b4a28aadbb2bcb50
+msgid "`Noimosiny `_"
+msgstr "`Noimosiny `_"
+
+#: ../../source/faq.rst:28 401a10ff8ce74ceabb38fdb9fe8d0c56
+msgid "`OSINT Industries `_"
+msgstr "`OSINT Industries `_"
+
+#: ../../source/faq.rst:29 3decfb5f127c47578076cd716cbc53c9
+msgid "`Epieos `_"
+msgstr "`Epieos `_"
+
+#: ../../source/faq.rst:31 2a1148f2c20c48f19b3347ab344be010
+msgid ""
+"Note: if Maigret has already found an account for a username, it often "
+"extracts the linked email from the profile page automatically — see :ref"
+":`extracting-information-from-pages`."
+msgstr ""
+"À noter : si Maigret a déjà trouvé un compte pour un nom d'utilisateur, "
+"il extrait souvent automatiquement l'e-mail associé depuis la page de "
+"profil, voir :ref:`extracting-information-from-pages`."
+
+#: ../../source/faq.rst:36 9bddb16d5c3d47d6b1825415599861dc
+msgid "Can I configure a proxy / SOCKS / Tor / I2P?"
+msgstr "Puis-je configurer un proxy / SOCKS / Tor / I2P ?"
+
+#: ../../source/faq.rst:38 663009588299428985b0006fa0471a1a
+msgid "**Yes.** Three flags cover three distinct goals:"
+msgstr "**Oui.** Trois options couvrent trois objectifs distincts :"
+
+#: ../../source/faq.rst:40 0a8ae8051ff64cc39c439eed7deb24b2
+msgid ""
+"``--proxy URL`` — route **every** check through the given HTTP or SOCKS "
+"proxy (also the right flag for routing the whole run through Tor with "
+"``socks5://127.0.0.1:9050``, a residential proxy, or a corporate "
+"gateway)."
+msgstr ""
+"``--proxy URL`` — faire passer **toutes** les vérifications par le proxy "
+"HTTP ou SOCKS indiqué (c'est aussi la bonne option pour faire passer "
+"toute la recherche par Tor avec ``socks5://127.0.0.1:9050``, par un proxy"
+" résidentiel ou par une passerelle d'entreprise)."
+
+#: ../../source/faq.rst:44 5660a1a875684394be59c898612b05e0
+msgid ""
+"``--tor-proxy URL`` — used **only** for ``.onion`` sites in the database."
+" Clearweb sites still go via your direct connection (or ``--proxy`` if "
+"set)."
+msgstr ""
+"``--tor-proxy URL`` — utilisé **uniquement** pour les sites ``.onion`` de"
+" la base. Les sites du web classique continuent de passer par votre "
+"connexion directe (ou par ``--proxy`` s'il est défini)."
+
+#: ../../source/faq.rst:47 aae64ef1456b4567acededd84132be89
+msgid "``--i2p-proxy URL`` — same idea, only for ``.i2p`` hosts."
+msgstr "``--i2p-proxy URL`` — même principe, uniquement pour les hôtes ``.i2p``."
+
+#: ../../source/faq.rst:49 b324f9d45ec04859b5170140d8d2539c
+msgid ""
+"The most common confusion is ``--proxy`` vs ``--tor-proxy``: ``--proxy`` "
+"is \"everything through this gateway\", ``--tor-proxy`` is \"only onion "
+"sites through Tor\"."
+msgstr ""
+"La confusion la plus fréquente oppose ``--proxy`` à ``--tor-proxy`` : "
+"``--proxy`` veut dire « tout passe par cette passerelle », ``--tor-"
+"proxy`` veut dire « seuls les sites onion passent par Tor »."
+
+#: ../../source/faq.rst:53 77baa5cf834548c4a18b1c3966a9132c
+msgid ""
+"Full walkthrough (Tor Browser vs system ``tor`` port numbers, Tails OS, "
+"timeout / retry tuning): :doc:`tor-and-proxies`."
+msgstr ""
+"Explication complète (ports de Tor Browser et du ``tor`` système, Tails "
+"OS, réglage des délais et des nouvelles tentatives) : :doc:`tor-and-"
+"proxies`."
+
+#: ../../source/faq.rst:56 145e05d0d19040a3bf5327d301ca9354
+msgid ""
+"If your goal is actually \"bypass WAF blocks / fix 403 errors\", see the "
+"*Sites fail / timeout / 403* section below — a residential proxy almost "
+"always outperforms Tor or a VPN for that."
+msgstr ""
+"Si votre objectif est en réalité de « contourner les blocages des WAF / "
+"corriger les erreurs 403 », voir la section *Des sites échouent, expirent"
+" ou renvoient 403* ci-dessous : pour cela, un proxy résidentiel fait "
+"presque toujours mieux que Tor ou un VPN."
+
+#: ../../source/faq.rst:61 04d8647301cc429c995b8d9dcd3d4932
+msgid "Can I use a VPN with Maigret?"
+msgstr "Puis-je utiliser un VPN avec Maigret ?"
+
+#: ../../source/faq.rst:63 4f7ea8f6001b480ea0221702a1ca960c
+msgid ""
+"**Yes**, but ``--proxy`` is usually a better choice. A VPN works "
+"transparently at the OS level — Maigret needs no special configuration to"
+" use one. However:"
+msgstr ""
+"**Oui**, mais ``--proxy`` est généralement un meilleur choix. Un VPN agit"
+" de façon transparente au niveau du système : Maigret n'a besoin d'aucune"
+" configuration particulière pour en profiter. Cependant :"
+
+#: ../../source/faq.rst:67 8976ab8ffdc045e2862d0dcb88a1015c
+msgid ""
+"``--proxy`` is per-process: it does not affect other apps and does not "
+"leak when toggled."
+msgstr ""
+"``--proxy`` s'applique au seul processus : il n'affecte pas les autres "
+"applications et ne fuit pas lorsqu'on l'active ou le désactive."
+
+#: ../../source/faq.rst:69 bfb80e29a9b94b4bbd870de2e2ae8a34
+msgid ""
+"``--proxy`` makes the egress IP visible in logs, which is useful when "
+"diagnosing why a batch of sites returned ``UNKNOWN``."
+msgstr ""
+"``--proxy`` rend l'IP de sortie visible dans les journaux, ce qui aide à "
+"comprendre pourquoi un lot de sites a renvoyé ``UNKNOWN``."
+
+#: ../../source/faq.rst:71 a1aaf0415a744afe89ffa0bb1c010d9a
+msgid ""
+"``--proxy`` accepts a different value per run, so you can rotate between "
+"residential and datacenter exits without touching system network "
+"settings."
+msgstr ""
+"``--proxy`` accepte une valeur différente à chaque exécution : vous "
+"pouvez donc alterner entre sorties résidentielles et sorties de "
+"datacenter sans toucher à la configuration réseau du système."
+
+#: ../../source/faq.rst:75 c564d9c3962a402daa5caabc0fc7a561
+msgid ""
+"If a lot of sites are returning 403, the cause is almost certainly that "
+"the VPN exit IP is on a WAF blocklist (Cloudflare, DDoS-Guard, Akamai all"
+" blanket-block common VPN ranges). A residential proxy via ``--proxy`` is"
+" the usual fix — see the `\"Lots of sites fail / timeout / return 403\" "
+"section `_ in TROUBLESHOOTING.md."
+msgstr ""
+"Si beaucoup de sites renvoient 403, la cause est presque certainement que"
+" l'IP de sortie du VPN figure sur une liste de blocage de WAF "
+"(Cloudflare, DDoS-Guard et Akamai bloquent en bloc les plages VPN "
+"courantes). Un proxy résidentiel via ``--proxy`` est le remède habituel, "
+"voir la `section « Lots of sites fail / timeout / return 403 » "
+"`_ de TROUBLESHOOTING.md."
+
+#: ../../source/faq.rst:84 4ebf5be9a3504afd89108f38c4640260
+msgid "Does Maigret check domains via DNS?"
+msgstr "Maigret vérifie-t-il les domaines via DNS ?"
+
+#: ../../source/faq.rst:86 6328b1f58f644ee6a94453221739d4e0
+#, python-brace-format
+msgid ""
+"**Yes, experimentally.** With ``--with-domains`` Maigret resolves a small"
+" set of ``{username}.`` patterns through DNS (A-records) in parallel"
+" with the normal HTTP checks. The current set is ``.ddns.net``, ``.com``,"
+" ``.pro``, ``.me``, ``.biz``, ``.email``, ``.guru`` — 7 entries in the "
+"database with ``protocol: dns``."
+msgstr ""
+"**Oui, à titre expérimental.** Avec ``--with-domains``, Maigret résout "
+"par DNS (enregistrements A) un petit ensemble de motifs "
+"``{username}.``, en parallèle des vérifications HTTP habituelles. "
+"L'ensemble actuel est ``.ddns.net``, ``.com``, ``.pro``, ``.me``, "
+"``.biz``, ``.email``, ``.guru``, soit 7 entrées de la base avec "
+"``protocol: dns``."
+
+#: ../../source/faq.rst:96 78e55c6575b94ea9896e0cbb0dc5c27c
+msgid ""
+"The flag is marked **experimental**: DNS-only checks can flag parking "
+"domains and catch-all wildcards as if the username were registered, so "
+"treat hits as a lead rather than confirmation."
+msgstr ""
+"L'option est marquée **expérimentale** : une vérification purement DNS "
+"peut signaler des domaines parqués ou des jokers attrape-tout comme si le"
+" nom d'utilisateur était enregistré. Traitez donc un résultat comme une "
+"piste, pas comme une confirmation."
+
+#: ../../source/faq.rst:100 95168070d79f4ac8a01d23aa343cbd49
+msgid ""
+"If your task is wider DNS reconnaissance — subdomain enumeration, WHOIS "
+"history, typo-squatting — Maigret is the wrong tool. Established "
+"alternatives:"
+msgstr ""
+"Si votre tâche relève d'une reconnaissance DNS plus large (énumération de"
+" sous-domaines, historique WHOIS, typosquattage), Maigret n'est pas le "
+"bon outil. Les alternatives établies :"
+
+#: ../../source/faq.rst:104 816dba62a5ec4c19b8a7410d8ba8bde1
+msgid ""
+"`dnstwist `_ — typo-squatting and "
+"look-alike domains."
+msgstr ""
+"`dnstwist `_ — typosquattage et "
+"domaines ressemblants."
+
+#: ../../source/faq.rst:106 cdab0a3e38f64e27b731f643d90d1545
+msgid ""
+"`amass `_ / `subfinder "
+"`_ — subdomain "
+"enumeration."
+msgstr ""
+"`amass `_ / `subfinder "
+"`_ — énumération de sous-"
+"domaines."
+
+#: ../../source/faq.rst:109 2a76a0bbf0c148c48e97f81d73f4cd18
+msgid ""
+"`theHarvester `_ — email / host"
+" / subdomain harvesting by domain."
+msgstr ""
+"`theHarvester `_ — collecte "
+"d'e-mails, d'hôtes et de sous-domaines à partir d'un domaine."
+
+#: ../../source/faq.rst:113 44b36009952b48edb97d8a5c377a0a25
+msgid "Is there a Maigret Telegram bot?"
+msgstr "Existe-t-il un bot Telegram pour Maigret ?"
+
+#: ../../source/faq.rst:115 7c1712f69ba543e6805e36ed15fb2b9e
+msgid ""
+"**Yes.** A community-maintained bot lets you run Maigret without "
+"installing anything locally:"
+msgstr ""
+"**Oui.** Un bot maintenu par la communauté permet d'utiliser Maigret sans"
+" rien installer en local :"
+
+#: ../../source/faq.rst:118 e9be390bcfa74adf9a6bd84a0e98af79
+msgid ""
+"Working instance: `maigret.app/docs-en `_ "
+"(redirect — the hosted bot may move between providers)."
+msgstr ""
+"Instance en service : `maigret.app/docs-en `_ (redirection, car le bot hébergé peut changer d'hébergeur)."
+
+#: ../../source/faq.rst:121 0e5a05c6e2a348c78b2ad7476f8e670d
+msgid ""
+"Source code: `github.com/soxoj/maigret-tg-bot `_."
+msgstr ""
+"Code source : `github.com/soxoj/maigret-tg-bot `_."
+
+#: ../../source/faq.rst:124 3be3d00b7aff4ec6b627dfadf1bdc3c4
+msgid ""
+"On the question of *searching Telegram itself*: Maigret checks whether a "
+"``t.me/`` page exists as part of the normal run, but it does not "
+"parse channels, posts, members, or message contents. For Telegram content"
+" OSINT you need a dedicated tool."
+msgstr ""
+"Quant à la recherche *dans Telegram lui-même* : Maigret vérifie "
+"l'existence d'une page ``t.me/`` dans le cadre d'une recherche "
+"normale, mais il n'analyse ni les canaux, ni les publications, ni les "
+"membres, ni le contenu des messages. Pour de l'OSINT sur les contenus "
+"Telegram, il vous faut un outil dédié."
+
+#: ../../source/faq.rst:130 f922999a761a46c2a029255e30a1cdd6
+msgid "Where is the web interface?"
+msgstr "Où est l'interface web ?"
+
+#: ../../source/faq.rst:136 1fa865f76f26450c922ccf0e8f90a4ac
+msgid ""
+"Then open http://127.0.0.1:5000. Screenshots and a full walkthrough are "
+"in :ref:`web-interface`."
+msgstr ""
+"Ouvrez ensuite http://127.0.0.1:5000. Des captures d'écran et une "
+"présentation complète se trouvent dans :ref:`web-interface`."
+
+#: ../../source/faq.rst:140 3e436d461dec4cce96cf7b54f7f6e159
+msgid "Sites fail / timeout / return 403 — connection failures"
+msgstr "Des sites échouent, expirent ou renvoient 403 : les échecs de connexion"
+
+#: ../../source/faq.rst:142 dabfefba32e84ab8a1f393f9d51b3ca5
+msgid ""
+"This is the most common report and is almost always caused by anti-bot "
+"protection (Cloudflare, DDoS-Guard, Akamai) or a slow link, not by a bug "
+"in Maigret. Quick tweaks, in order:"
+msgstr ""
+"C'est le problème le plus souvent signalé, et il vient presque toujours "
+"d'une protection anti-bot (Cloudflare, DDoS-Guard, Akamai) ou d'une "
+"liaison lente, pas d'un bug de Maigret. Les réglages rapides, dans "
+"l'ordre :"
+
+#: ../../source/faq.rst:146 30f82061263c4f1abb1e6048ab945631
+msgid ""
+"``--timeout 60`` — the default 30 s is tight for slow networks and for "
+"Tor."
+msgstr ""
+"``--timeout 60`` — les 30 s par défaut sont justes pour les réseaux lents"
+" et pour Tor."
+
+#: ../../source/faq.rst:148 ed82c79d4ddf48feae90c1d03f7c1799
+msgid "``--retries 2`` — covers transient failures."
+msgstr "``--retries 2`` — couvre les échecs passagers."
+
+#: ../../source/faq.rst:149 217b6eb8e9c64fffb996f1473a9613ff
+msgid "``-n 20`` — lower concurrency reduces WAF rate-limiting."
+msgstr ""
+"``-n 20`` — une concurrence plus basse réduit la limitation de débit par "
+"les WAF."
+
+#: ../../source/faq.rst:150 aa11f1f1dae64d6bb96546179f7de99c
+msgid ""
+"``--proxy http://user:pass@residential-proxy:port`` — datacenter IPs "
+"(AWS, GCP, DigitalOcean) and most VPN ranges are blanket-blocked; "
+"residential / mobile exits usually fix the bulk of 403s."
+msgstr ""
+"``--proxy http://user:pass@residential-proxy:port`` — les IP de "
+"datacenter (AWS, GCP, DigitalOcean) et la plupart des plages VPN sont "
+"bloquées en bloc ; des sorties résidentielles ou mobiles règlent en "
+"général l'essentiel des 403."
+
+#: ../../source/faq.rst:154 56ef75bcc49c42e2ae7247820d1df35b
+msgid ""
+"The full troubleshooting matrix (per-error recipes for 403, timeout, SSL,"
+" captcha, ``UNKNOWN`` floods) lives in `TROUBLESHOOTING.md "
+"`_."
+msgstr ""
+"La matrice de dépannage complète (recettes par type d'erreur pour les "
+"403, les dépassements de délai, le SSL, les captchas et les vagues de "
+"``UNKNOWN``) se trouve dans `TROUBLESHOOTING.md "
+"`_."
+
+#: ../../source/faq.rst:160 98f6bcb928354d92bcdf560d15eeb4f0
+msgid "How do I generate a PDF report?"
+msgstr "Comment générer un rapport PDF ?"
+
+#: ../../source/faq.rst:162 0b427429d75b4b1890dc20ec93d411e1
+msgid ""
+"PDF support is an optional extra because it pulls heavy graphics "
+"dependencies:"
+msgstr ""
+"Le support du PDF est une extension facultative, car il entraîne de "
+"lourdes dépendances graphiques :"
+
+#: ../../source/faq.rst:170 5d96d3cc456c4b74a49c80adecc86d08
+msgid ""
+"On Linux / macOS you also need system libraries (Pango, Cairo, GDK-"
+"PixBuf). Per-OS install steps are in the *Optional: PDF reports* section "
+"of :doc:`installation`."
+msgstr ""
+"Sous Linux et macOS, il vous faut également des bibliothèques système "
+"(Pango, Cairo, GDK-PixBuf). Les étapes d'installation par système "
+"d'exploitation figurent dans la section *Optional: PDF reports* de "
+":doc:`installation`."
+
+#: ../../source/faq.rst:174 01f17b6d73e24c8aa9a03417fadbac0f
+msgid ""
+"For other report formats (``--html``, ``--md``, ``--json``, ``--csv``, "
+"``--txt``, ``--xmind``), see :doc:`command-line-options`."
+msgstr ""
+"Pour les autres formats de rapport (``--html``, ``--md``, ``--json``, "
+"``--csv``, ``--txt``, ``--xmind``), voir :doc:`command-line-options`."
+
+#: ../../source/faq.rst:178 bdc2c81bf7b749e7b0eacf79b433a1df
+msgid "``maigret: command not found``"
+msgstr "``maigret: command not found``"
+
+#: ../../source/faq.rst:180 93679e6cba864a0c84689ccffcda8ed7
+msgid ""
+"The install succeeded but your shell can't find the ``maigret`` launcher "
+"(you may see ``-bash: maigret: command not found`` or a *not recognized* "
+"message on Windows). The package is installed — only the entry-point "
+"script is not on your ``PATH``. Fixes, in order of laziness:"
+msgstr ""
+"L'installation a réussi, mais votre shell ne trouve pas le lanceur "
+"``maigret`` (vous verrez peut-être ``-bash: maigret: command not found``,"
+" ou un message *not recognized* sous Windows). Le paquet est bien "
+"installé : c'est seulement le script de point d'entrée qui n'est pas dans"
+" votre ``PATH``. Les solutions, de la plus paresseuse à la moins "
+"paresseuse :"
+
+#: ../../source/faq.rst:185 83f7492c96894886af3bf56b83e75fcc
+msgid "Run it as a module instead — this always works if the package imported:"
+msgstr ""
+"Lancez-le comme un module : cela fonctionne toujours si le paquet a pu "
+"être importé."
+
+#: ../../source/faq.rst:191 9b8678954f2e47759e3e8c0edc7d8f59
+msgid ""
+"``pip install --user`` puts the script in a per-user ``bin`` / "
+"``Scripts`` directory that is often not on ``PATH``. The cleanest fix is "
+"to install into an isolated environment that manages ``PATH`` for you:"
+msgstr ""
+"``pip install --user`` place le script dans un répertoire ``bin`` / "
+"``Scripts`` propre à l'utilisateur, souvent absent du ``PATH``. La "
+"solution la plus propre est d'installer dans un environnement isolé qui "
+"gère le ``PATH`` pour vous :"
+
+#: ../../source/faq.rst:199 194c5f44b5db4f10a8d009981d85a845
+msgid ""
+"On Windows, reopen the terminal after installing (``PATH`` is only read "
+"at startup), or use the standalone ``maigret_standalone.exe`` — see "
+":doc:`installation`."
+msgstr ""
+"Sous Windows, rouvrez le terminal après l'installation (le ``PATH`` n'est"
+" lu qu'au démarrage), ou utilisez l'exécutable autonome "
+"``maigret_standalone.exe``, voir :doc:`installation`."
+
+#: ../../source/faq.rst:204 59342aea53064f56abcfd0fa7d228334
+msgid "``error: metadata-generation-failed``"
+msgstr "``error: metadata-generation-failed``"
+
+#: ../../source/faq.rst:206 71790a70caa44957bf8f8a0cac42a2d2
+msgid ""
+"This comes from **pip**, not Maigret: pip could not build one of the "
+"dependencies. Almost always the build toolchain is stale or a native "
+"dependency is missing its system libraries. Try, in order:"
+msgstr ""
+"Cette erreur vient de **pip**, pas de Maigret : pip n'a pas réussi à "
+"construire l'une des dépendances. Presque toujours, la chaîne de "
+"compilation est trop ancienne, ou une dépendance native n'a pas ses "
+"bibliothèques système. Essayez, dans l'ordre :"
+
+#: ../../source/faq.rst:210 224b4f76b6ae4ce1aa9525cb3c3aad22
+msgid "Upgrade the toolchain and retry:"
+msgstr "Mettez à jour la chaîne d'outils et réessayez :"
+
+#: ../../source/faq.rst:216 391579687d664158825de7fed4002bb0
+msgid ""
+"Use a supported interpreter (Python 3.10–3.12). Bleeding-edge or end-of-"
+"life versions frequently have no prebuilt wheels, forcing a source build "
+"that then fails."
+msgstr ""
+"Utilisez un interpréteur pris en charge (Python 3.10 à 3.12). Les "
+"versions toutes fraîches ou en fin de vie n'ont souvent pas de wheels "
+"précompilées, ce qui force une compilation depuis les sources, laquelle "
+"échoue ensuite."
+
+#: ../../source/faq.rst:219 2b28b6f59b8543e693478f9c37a4dd27
+msgid ""
+"If the failing package is a native one (``lxml``, ``reportlab``, "
+"``_renderPM``, or an error mentioning ``ft2build.h`` / ``cairo``), you "
+"need system build dependencies — see the *Troubleshooting* section of "
+":doc:`installation`, or skip the compilers entirely and use Docker."
+msgstr ""
+"Si le paquet en échec est un paquet natif (``lxml``, ``reportlab``, "
+"``_renderPM``, ou une erreur mentionnant ``ft2build.h`` / ``cairo``), il "
+"vous faut les dépendances de compilation système : voir la section "
+"*Troubleshooting* de :doc:`installation`, ou évitez complètement les "
+"compilateurs en passant par Docker."
+
+#: ../../source/faq.rst:225 eeea5be67b82440ca1189998429dc76d
+msgid "``Too many errors of type \"...\"``"
+msgstr "``Too many errors of type \"...\"``"
+
+#: ../../source/faq.rst:227 d032a122036d453a9e756bb0c0dabc3b
+msgid ""
+"This is Maigret's **end-of-run summary**, not a crash — the run finished."
+" It means a large share of sites failed the *same* way, so the fix "
+"depends on the class printed in the quotes:"
+msgstr ""
+"C'est le **résumé de fin d'exécution** de Maigret, pas un plantage : la "
+"recherche est allée à son terme. Cela signifie qu'une grande partie des "
+"sites a échoué de la *même* façon ; le remède dépend donc de la catégorie"
+" affichée entre guillemets :"
+
+#: ../../source/faq.rst:231 bb55ffce4a3049d0b871229316d14d4b
+msgid ""
+"``Connecting failure`` — check your internet connection; if only a subset"
+" of sites fails, lower parallelism with ``-n 10``."
+msgstr ""
+"``Connecting failure`` — vérifiez votre connexion internet ; si seule une"
+" partie des sites échoue, baissez le parallélisme avec ``-n 10``."
+
+#: ../../source/faq.rst:233 380f20253ca34c9ea8a7cde8c550cc36
+msgid ""
+"``Connecting failure (DNS)`` — DNS resolution failed for most sites. Try "
+"``--dns-resolver threaded`` (often fixes Windows / VPN / corporate "
+"networks); failing that, check your VPN / firewall and consider a public "
+"resolver (``1.1.1.1`` or ``8.8.8.8``)."
+msgstr ""
+"``Connecting failure (DNS)`` — la résolution DNS a échoué pour la plupart"
+" des sites. Essayez ``--dns-resolver threaded`` (cela règle souvent le "
+"problème sous Windows, en VPN ou en réseau d'entreprise) ; sinon, "
+"vérifiez votre VPN et votre pare-feu, et envisagez un résolveur public "
+"(``1.1.1.1`` ou ``8.8.8.8``)."
+
+#: ../../source/faq.rst:237 ed15f78ec1904519aab1309de90d0577
+msgid "``Request timeout`` — raise ``--timeout`` or switch ISP / network."
+msgstr ""
+"``Request timeout`` — augmentez ``--timeout``, ou changez de fournisseur "
+"d'accès ou de réseau."
+
+#: ../../source/faq.rst:238 61df6881f45c4f64b728fed6c7719305
+msgid "``Captcha`` — switch to another IP address, or supply service cookies."
+msgstr "``Captcha`` — changez d'adresse IP, ou fournissez les cookies du service."
+
+#: ../../source/faq.rst:239 2b68df5a17fd41d49b8d3f267e7bd99a
+msgid ""
+"``Bot protection`` / ``Access denied`` — switch IP; a residential "
+"``--proxy`` or ``--cloudflare-bypass`` is the usual fix."
+msgstr ""
+"``Bot protection`` / ``Access denied`` — changez d'IP ; un ``--proxy`` "
+"résidentiel ou ``--cloudflare-bypass`` est le remède habituel."
+
+#: ../../source/faq.rst:241 153c51e51cca49968ba213f00de0fc00
+msgid ""
+"``Webgate unavailable`` — ``--cloudflare-bypass`` is on but no solver is "
+"reachable; start FlareSolverr, or drop the flag to skip protected sites."
+msgstr ""
+"``Webgate unavailable`` — ``--cloudflare-bypass`` est actif, mais aucun "
+"solveur n'est joignable ; démarrez FlareSolverr, ou retirez l'option pour"
+" ignorer les sites protégés."
+
+#: ../../source/faq.rst:244 fbfd239ae2544d29a6c3d5608e6537fb
+msgid ""
+"If most of your run is one of the last three, see the *Sites fail / "
+"timeout / return 403* section above and the full `TROUBLESHOOTING.md "
+"`_."
+msgstr ""
+"Si l'essentiel de votre recherche tombe dans l'une des trois dernières "
+"catégories, voir la section *Des sites échouent, expirent ou renvoient "
+"403* ci-dessus, ainsi que le `TROUBLESHOOTING.md "
+"`_ "
+"complet."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/features.po b/docs/source/locale/fr/LC_MESSAGES/features.po
new file mode 100644
index 00000000..19f3b9ef
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/features.po
@@ -0,0 +1,658 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/features.rst:4 479e20927d724f059ad1ea5f902dc956
+msgid "Features"
+msgstr "Fonctionnalités"
+
+#: ../../source/features.rst:6 6484d057341e4a168c97de336c5c2344
+msgid "This is the list of Maigret features."
+msgstr "Voici la liste des fonctionnalités de Maigret."
+
+#: ../../source/features.rst:11 f61e2f47116d4b94972b0efaa6096fc6
+msgid "Web Interface"
+msgstr "Interface web"
+
+#: ../../source/features.rst:13 294bbc18f2664c50a47136d1ead36ed5
+msgid ""
+"You can run Maigret with a web interface, where you can view the graph "
+"with results and download reports of all formats on a single page."
+msgstr ""
+"Vous pouvez lancer Maigret avec une interface web, où vous pouvez "
+"consulter le graphe des résultats et télécharger les rapports dans tous "
+"les formats depuis une seule page."
+
+#: ../../source/features.rst:16 60894afb27eb4a15b7da47e20f0101fb
+msgid "Web interface: how to start"
+msgstr "Interface web : comment la démarrer"
+
+#: ../../source/features.rst:20 7fe46da3e65c422da7c757cbfdaf93b2
+msgid "Web interface: results"
+msgstr "Interface web : les résultats"
+
+#: ../../source/features.rst:24 5e5351615ca64b27b939f0609d1ad1f1
+msgid "Instructions:"
+msgstr "Marche à suivre :"
+
+#: ../../source/features.rst:26 22af91e9e7ff4a84a9a800944ef29413
+msgid "Run Maigret with the ``--web`` flag and specify the port number."
+msgstr "Lancez Maigret avec l'option ``--web`` en précisant le numéro de port."
+
+#: ../../source/features.rst:32 c3440b2e4fa84098944e08f34c7b1ed3
+msgid ""
+"Open http://127.0.0.1:5000 in your browser and enter one or more "
+"usernames to make a search."
+msgstr ""
+"Ouvrez http://127.0.0.1:5000 dans votre navigateur et saisissez un ou "
+"plusieurs noms d'utilisateur pour lancer une recherche."
+
+#: ../../source/features.rst:34 3dfd160b980f415da57058945a2f3919
+msgid ""
+"Wait a bit for the search to complete and view the graph with results, "
+"the table with all accounts found, and download reports of all formats."
+msgstr ""
+"Patientez le temps que la recherche se termine, puis consultez le graphe "
+"des résultats, le tableau de tous les comptes trouvés, et téléchargez les"
+" rapports dans tous les formats."
+
+#: ../../source/features.rst:39 50b6b82cf6c24d07a586fcb3d7d3997a
+msgid "Telegram bot"
+msgstr "Bot Telegram"
+
+#: ../../source/features.rst:41 3c3166f22118428ca282adc1f4c4ff5b
+msgid ""
+"A community-maintained Telegram bot lets you run Maigret without "
+"installing anything locally."
+msgstr ""
+"Un bot Telegram maintenu par la communauté permet d'utiliser Maigret sans"
+" rien installer en local."
+
+#: ../../source/features.rst:44 c8962593353244ccace601c7b80eb8df
+msgid ""
+"Working instance: `maigret.app/docs-en `_ "
+"(redirect — the hosted bot may move between providers)."
+msgstr ""
+"Instance en service : `maigret.app/docs-en `_ (redirection, car le bot hébergé peut changer d'hébergeur)."
+
+#: ../../source/features.rst:47 342c0c7bd4d14f23a8708a07a480eda1
+msgid ""
+"Source code: `github.com/soxoj/maigret-tg-bot `_."
+msgstr ""
+"Code source : `github.com/soxoj/maigret-tg-bot `_."
+
+#: ../../source/features.rst:51 ad736673a67c4c0da5d8055546b1595e
+msgid "Personal info gathering"
+msgstr "Collecte d'informations personnelles"
+
+#: ../../source/features.rst:53 8018434bf9d44a7b8cc2d64329d90b8f
+msgid ""
+"Maigret does the `parsing of accounts webpages and extraction `_ "
+"of personal info, links to other profiles, etc. Extracted info displayed "
+"as an additional result in CLI output and as tables in HTML and PDF "
+"reports. Also, Maigret use found ids and usernames from links to start a "
+"recursive search."
+msgstr ""
+"Maigret effectue l'`analyse des pages de comptes et l'extraction `_ "
+"des informations personnelles, des liens vers d'autres profils, etc. Les "
+"informations extraites apparaissent comme résultat complémentaire dans la"
+" sortie en ligne de commande, et sous forme de tableaux dans les rapports"
+" HTML et PDF. Maigret utilise également les identifiants et noms "
+"d'utilisateur trouvés dans les liens pour lancer une recherche récursive."
+
+#: ../../source/features.rst:57 e816605686c14c2f86c08b9bb8a854e5
+msgid "Enabled by default, can be disabled with ``--no extracting``."
+msgstr "Activée par défaut, désactivable avec ``--no extracting``."
+
+#: ../../source/features.rst:83 5f7a75cb1e534a1795713c3ca5fa3fc9
+msgid "Recursive search"
+msgstr "Recherche récursive"
+
+#: ../../source/features.rst:85 b90df80adc2c4a9594cea049beb5db42
+msgid ""
+"Maigret has the ability to scan account pages for :ref:`common "
+"identifiers ` and usernames found in links. "
+"When people include links to their other social media accounts, Maigret "
+"can automatically detect and initiate new searches for those profiles. "
+"Any information discovered through this process will be shown in both the"
+" command-line interface output and generated reports."
+msgstr ""
+"Maigret est capable d'examiner les pages de comptes à la recherche "
+"d':ref:`identifiants courants ` et de noms "
+"d'utilisateur présents dans les liens. Lorsque les gens incluent des "
+"liens vers leurs autres comptes de réseaux sociaux, Maigret peut les "
+"détecter automatiquement et lancer de nouvelles recherches sur ces "
+"profils. Tout ce qui est découvert par ce biais apparaît à la fois dans "
+"la sortie en ligne de commande et dans les rapports générés."
+
+#: ../../source/features.rst:89 59c6a0ba733049eb8de9bdb518b0117f
+msgid "Enabled by default, can be disabled with ``--no-recursion``."
+msgstr "Activée par défaut, désactivable avec ``--no-recursion``."
+
+#: ../../source/features.rst:122 f8537054424d4a019b8ae620c86104b4
+msgid "Username permutations"
+msgstr "Permutations de noms d'utilisateur"
+
+#: ../../source/features.rst:124 aac4ccb303bb44849ae6ee621213e3d7
+msgid ""
+"Maigret can generate permutations of usernames. Just pass a few usernames"
+" in the CLI and use ``--permute`` flag. Thanks to `@balestek "
+"`_ for the idea and implementation."
+msgstr ""
+"Maigret peut générer des permutations de noms d'utilisateur. Il suffit de"
+" passer plusieurs noms d'utilisateur en ligne de commande et d'ajouter "
+"l'option ``--permute``. Merci à `@balestek "
+"`_ pour l'idée et son implémentation."
+
+#: ../../source/features.rst:149 209c9ad7230c4ac0970cf290fb49a3b4
+msgid "Reports"
+msgstr "Rapports"
+
+#: ../../source/features.rst:151 b2b750c8109e49a8aef8ddf3609918d0
+msgid ""
+"Maigret currently supports HTML, PDF, TXT, CSV, XMind 8 mindmap, JSON, "
+"and Markdown reports, plus graph exports: an interactive HTML graph "
+"(``--graph``) and a Neo4j Cypher script (``--neo4j``) for loading the "
+"results into a graph database."
+msgstr ""
+"Maigret prend actuellement en charge les rapports HTML, PDF, TXT, CSV, "
+"carte mentale XMind 8, JSON et Markdown, ainsi que les exports de graphe "
+": un graphe HTML interactif (``--graph``) et un script Cypher pour Neo4j "
+"(``--neo4j``), qui charge les résultats dans une base de données orientée"
+" graphe."
+
+#: ../../source/features.rst:156 349b1030217b42fc8fc21bdbcc9a3d17
+msgid "HTML/PDF reports contain:"
+msgstr "Les rapports HTML et PDF contiennent :"
+
+#: ../../source/features.rst:158 05417aab0c9340598c4663b376980288
+msgid "profile photo"
+msgstr "la photo de profil"
+
+#: ../../source/features.rst:159 3bbd0fbc731a4c508f6f8bcfd5efdbbd
+msgid "all the gathered personal info"
+msgstr "toutes les informations personnelles collectées"
+
+#: ../../source/features.rst:160 78847ee3e4984c3fb4388095808ee499
+msgid ""
+"additional information about supposed personal data (full name, gender, "
+"location), resulting from statistics of all found accounts"
+msgstr ""
+"des informations complémentaires sur les données personnelles supposées "
+"(nom complet, genre, localisation), déduites des statistiques de "
+"l'ensemble des comptes trouvés"
+
+#: ../../source/features.rst:162 3d7d6cb2d82d484a8a6450b4ed1e0c72
+msgid ""
+"Also, there is a short text report in the CLI output after the end of a "
+"searching phase."
+msgstr ""
+"Un court rapport textuel est également affiché en ligne de commande à la "
+"fin de la phase de recherche."
+
+#: ../../source/features.rst:164 83fbef94d39847329f2ceae1d19f8d30
+msgid ""
+"The ``--neo4j`` flag serialises the same graph that ``--graph`` builds "
+"into an idempotent ``.cypher`` script, importable with ``cypher-shell`` "
+"or the Neo4j Browser. See :ref:`neo4j-export` for the schema and import "
+"instructions."
+msgstr ""
+"L'option ``--neo4j`` sérialise le graphe construit par ``--graph`` dans "
+"un script ``.cypher`` idempotent, importable avec ``cypher-shell`` ou le "
+"Neo4j Browser. Voir :ref:`neo4j-export` pour le schéma et les "
+"instructions d'import."
+
+#: ../../source/features.rst:169 b13d136ad3054aaf82f50ccaf2c3c2d7
+msgid "XMind 8 mindmaps are incompatible with XMind 2022!"
+msgstr "Les cartes mentales XMind 8 sont incompatibles avec XMind 2022 !"
+
+#: ../../source/features.rst:172 3de1b6a6ce0349548af48f2e049f1ec9
+msgid "AI analysis"
+msgstr "Analyse par IA"
+
+#: ../../source/features.rst:174 94e92083aacb4e0bab22f0b03b7bbecc
+msgid ""
+"Maigret can produce a short, human-readable investigation summary on top "
+"of the raw search results using the ``--ai`` flag. It builds the internal"
+" Markdown report, sends it to an OpenAI-compatible chat completion "
+"endpoint, and streams the model's reply directly to the terminal."
+msgstr ""
+"Avec l'option ``--ai``, Maigret peut produire une courte synthèse "
+"d'enquête lisible, en plus des résultats bruts de la recherche. Il "
+"construit le rapport Markdown interne, l'envoie à un point d'entrée de "
+"complétion de conversation compatible OpenAI, et diffuse la réponse du "
+"modèle directement dans le terminal."
+
+#: ../../source/features.rst:185 2e295078a99c4e349478af255afdf1e5
+msgid ""
+"The summary uses a fixed format with the most likely real name, location,"
+" occupation, interests, languages, main website, username variants, "
+"number of platforms, active years, a confidence rating, and a short list "
+"of follow-up leads. While ``--ai`` is active, per-site progress and the "
+"short text report are suppressed so the streamed summary is the main "
+"output."
+msgstr ""
+"La synthèse suit un format fixe : nom réel le plus probable, "
+"localisation, profession, centres d'intérêt, langues, site web principal,"
+" variantes de nom d'utilisateur, nombre de plateformes, années "
+"d'activité, un indice de confiance et une courte liste de pistes à "
+"creuser. Tant que ``--ai`` est actif, la progression site par site et le "
+"court rapport textuel sont masqués, afin que la synthèse diffusée reste "
+"la sortie principale."
+
+#: ../../source/features.rst:192 5efa4c4e80864b3aab242f0fb06faa11
+msgid ""
+"The endpoint, model, and API key are configured via ``settings.json`` "
+"(``openai_api_key``, ``openai_model``, ``openai_api_base_url``) or the "
+"``OPENAI_API_KEY`` environment variable. Any OpenAI-compatible API can be"
+" used (Azure OpenAI, OpenRouter, a local server, …). See :ref:`ai-"
+"analysis` and :ref:`settings` for details."
+msgstr ""
+"Le point d'entrée, le modèle et la clé d'API se configurent via "
+"``settings.json`` (``openai_api_key``, ``openai_model``, "
+"``openai_api_base_url``) ou via la variable d'environnement "
+"``OPENAI_API_KEY``. N'importe quelle API compatible OpenAI convient "
+"(Azure OpenAI, OpenRouter, un serveur local, etc.). Voir :ref:`ai-"
+"analysis` et :ref:`settings` pour les détails."
+
+#: ../../source/features.rst:199 fd0a6689621246be8249f3506802dbd3
+msgid "Tags"
+msgstr "Tags"
+
+#: ../../source/features.rst:201 d4b844a709234973b8d25c1cdc7c5e6e
+msgid ""
+"The Maigret sites database very big (and will be bigger), and it is maybe"
+" an overhead to run a search for all the sites. Also, it is often hard to"
+" understand, what sites more interesting for us in the case of a certain "
+"person."
+msgstr ""
+"La base de sites de Maigret est très grande (et continuera de grandir) : "
+"lancer une recherche sur tous les sites est parfois excessif. De plus, il"
+" est souvent difficile de savoir quels sites nous intéressent vraiment "
+"dans le cas d'une personne donnée."
+
+#: ../../source/features.rst:204 0e1d4cf2b29f45e99f8eba51c6a55990
+msgid ""
+"Tags markup allows selecting a subset of sites by interests (photo, "
+"messaging, finance, etc.) or by country. Tags of found accounts grouped "
+"and displayed in the reports."
+msgstr ""
+"Le balisage par tags permet de sélectionner un sous-ensemble de sites par"
+" centre d'intérêt (photo, messagerie, finance, etc.) ou par pays. Les "
+"tags des comptes trouvés sont regroupés et affichés dans les rapports."
+
+#: ../../source/features.rst:206 ea8c630e68174ea99427d3e75a9b8dbc
+msgid "See full description :doc:`in the Tags Wiki page `."
+msgstr "Voir la description complète :doc:`sur la page Tags `."
+
+#: ../../source/features.rst:209 a5ac0a8df67f40f2838b46116c6702f2
+msgid "Censorship and captcha detection"
+msgstr "Détection de la censure et des captchas"
+
+#: ../../source/features.rst:211 832f8e2b8a804d81a93f71ac8f662ff2
+#, python-format
+msgid ""
+"Maigret can detect common errors such as censorship stub pages, "
+"CloudFlare captcha pages, and others. If you get more them 3% errors of a"
+" certain type in a session, you've got a warning message in the CLI "
+"output with recommendations to improve performance and avoid problems."
+msgstr ""
+"Maigret sait repérer les erreurs courantes : pages de blocage liées à la "
+"censure, pages de captcha CloudFlare, et d'autres encore. Si plus de 3 % "
+"des résultats d'une session relèvent d'un même type d'erreur, un "
+"avertissement s'affiche en ligne de commande, avec des recommandations "
+"pour améliorer les performances et éviter les problèmes."
+
+#: ../../source/features.rst:215 f802bac3b7da45088d444fa30278700e
+msgid "Retries"
+msgstr "Nouvelles tentatives"
+
+#: ../../source/features.rst:217 883e29ba66584ce5989807e91f2b9d36
+msgid ""
+"Maigret will do retries of the requests with temporary errors got "
+"(connection failures, proxy errors, etc.)."
+msgstr ""
+"Maigret réessaie les requêtes ayant rencontré une erreur temporaire "
+"(échec de connexion, erreur de proxy, etc.)."
+
+#: ../../source/features.rst:219 d620f8f374f5495fb6f86697f474d306
+msgid "One attempt by default, can be changed with option ``--retries N``."
+msgstr "Une tentative par défaut, modifiable avec l'option ``--retries N``."
+
+#: ../../source/features.rst:222 992f53992514497b8ea244dd679cc29a
+msgid "Database self-check"
+msgstr "Auto-vérification de la base"
+
+#: ../../source/features.rst:224 056b798c883845179a9a7645849c4e99
+msgid ""
+"Maigret includes a self-check mode (``--self-check``) that validates "
+"every site in the database by looking up its known-claimed and known-"
+"unclaimed usernames and verifying that the detection results match "
+"expectations."
+msgstr ""
+"Maigret dispose d'un mode d'auto-vérification (``--self-check``) qui "
+"valide chaque site de la base : il recherche les noms d'utilisateur "
+"connus comme existants et comme inexistants, puis vérifie que les "
+"résultats de détection correspondent aux attentes."
+
+#: ../../source/features.rst:228 5198351c6e054d71bd7e4713ba07af29
+msgid ""
+"The self-check is **error-resilient**: if an individual site check raises"
+" an unexpected exception (e.g. a network error or a parsing failure), the"
+" error is caught, logged, and recorded as an issue — the remaining sites "
+"continue to be checked without interruption. This means the process "
+"always runs to completion, even when checking hundreds of sites with ``-a"
+" --self-check``."
+msgstr ""
+"L'auto-vérification est **résistante aux erreurs** : si la vérification "
+"d'un site déclenche une exception inattendue (erreur réseau, échec "
+"d'analyse, etc.), l'erreur est capturée, journalisée et enregistrée comme"
+" un problème, et les sites restants continuent d'être vérifiés sans "
+"interruption. Le processus va donc toujours jusqu'au bout, même en "
+"vérifiant des centaines de sites avec ``-a --self-check``."
+
+#: ../../source/features.rst:234 9607ee58ae894d45bffdce32b4afeeb3
+msgid ""
+"Use ``--auto-disable`` together with ``--self-check`` to automatically "
+"disable sites that fail checks. Without it, issues are only reported. Use"
+" ``--diagnose`` to print detailed per-site diagnosis including the check "
+"type, specific issues, and recommendations."
+msgstr ""
+"Utilisez ``--auto-disable`` avec ``--self-check`` pour désactiver "
+"automatiquement les sites qui échouent. Sans cette option, les problèmes "
+"sont seulement signalés. Utilisez ``--diagnose`` pour afficher un "
+"diagnostic détaillé par site, comprenant le type de vérification, les "
+"problèmes précis et des recommandations."
+
+#: ../../source/features.rst:251 17167ef126684ef08e1204c050c09b04
+msgid "Archives and mirrors checking"
+msgstr "Vérification des archives et des miroirs"
+
+#: ../../source/features.rst:253 b18f2af770cb45368a948821d4df5c38
+msgid ""
+"The Maigret database contains not only the original websites, but also "
+"mirrors, archives, and aggregators. For example:"
+msgstr ""
+"La base de Maigret contient non seulement les sites d'origine, mais aussi"
+" des miroirs, des archives et des agrégateurs. Par exemple :"
+
+#: ../../source/features.rst:255 b0a8dbb769a144b792207968d13013bf
+msgid "`Picuki `_, Instagram mirror"
+msgstr "`Picuki `_, un miroir d'Instagram"
+
+#: ../../source/features.rst:256 e4fcdf7b43894ea18390e499271ab2c8
+msgid ""
+"(no longer available) `Reddit BigData search `_"
+msgstr ""
+"(n'est plus disponible) `la recherche Reddit BigData "
+" `_"
+
+#: ../../source/features.rst:257 b3f099e32909431eb66efb0c15cc4f01
+msgid "(no longer available) `Twitter shadowban `_ checker"
+msgstr ""
+"(n'est plus disponible) le vérificateur de `shadowban Twitter "
+" `_"
+
+#: ../../source/features.rst:259 c1b8bf1cd73845479a486bbdfc3b7eeb
+msgid ""
+"It allows getting additional info about the person and checking the "
+"existence of the account even if the main site is unavailable (bot "
+"protection, captcha, etc.)"
+msgstr ""
+"Cela permet d'obtenir des informations supplémentaires sur la personne et"
+" de vérifier l'existence du compte même lorsque le site principal est "
+"inaccessible (protection anti-bot, captcha, etc.)"
+
+#: ../../source/features.rst:264 b67a0daf798149dbb527019cc0eb419a
+msgid "Cloudflare webgate bypass"
+msgstr "Contournement du webgate Cloudflare"
+
+#: ../../source/features.rst:268 7546a25ae1f04cb3a2de678c604965b7
+msgid ""
+"**Experimental feature.** The Cloudflare webgate is under active "
+"development. The configuration schema, CLI flag behaviour, and the set of"
+" sites that route through it may change without backwards-compatibility "
+"guarantees. Expect rough edges (CF rate limits, occasional solver "
+"failures) and report issues so they can be ironed out."
+msgstr ""
+"**Fonctionnalité expérimentale.** Le webgate Cloudflare est en cours de "
+"développement actif. Le schéma de configuration, le comportement de "
+"l'option en ligne de commande et l'ensemble des sites qui y sont routés "
+"peuvent changer sans garantie de compatibilité ascendante. Attendez-vous "
+"à quelques aspérités (limites de débit CF, échecs occasionnels du "
+"solveur) et signalez les problèmes pour qu'ils puissent être corrigés."
+
+#: ../../source/features.rst:274 e13b5e80e27d4347918380b7c974d318
+msgid ""
+"Some sites sit behind a full Cloudflare JavaScript challenge or a CF "
+"firewall hard block — these are tagged ``protection: "
+"[\"cf_js_challenge\"]`` or ``protection: [\"cf_firewall\"]`` in the "
+"database and are normally kept disabled because neither aiohttp nor "
+"curl_cffi can solve the JS challenge on their own."
+msgstr ""
+"Certains sites sont protégés par un défi JavaScript Cloudflare complet ou"
+" par un blocage ferme du pare-feu CF : ils portent ``protection: "
+"[\"cf_js_challenge\"]`` ou ``protection: [\"cf_firewall\"]`` dans la base"
+" et sont normalement désactivés, car ni aiohttp ni curl_cffi ne savent "
+"résoudre seuls le défi JavaScript."
+
+#: ../../source/features.rst:279 e14e98d42ed44fb9845f4a2f6bca7059
+msgid ""
+"Maigret can offload these checks to a local Chrome-based solver. Two "
+"backends are supported, configured in ``settings.json`` under "
+"``cloudflare_bypass.modules`` (the first reachable module wins; "
+"subsequent ones are tried as a fallback chain):"
+msgstr ""
+"Maigret peut déléguer ces vérifications à un solveur local basé sur "
+"Chrome. Deux backends sont pris en charge, configurés dans "
+"``settings.json`` sous ``cloudflare_bypass.modules`` (le premier module "
+"joignable l'emporte ; les suivants forment une chaîne de repli) :"
+
+#: ../../source/features.rst:284 53658267d63d4ee0975d88a63ab246cd
+msgid ""
+"**FlareSolverr** (recommended). Runs a real Chrome instance and exposes a"
+" JSON API. The upstream HTTP status, headers and final URL are preserved,"
+" so ``checkType: status_code`` and ``checkType: response_url`` keep "
+"working through the bypass."
+msgstr ""
+"**FlareSolverr** (recommandé). Fait tourner une véritable instance de "
+"Chrome et expose une API JSON. Le statut HTTP en amont, les en-têtes et "
+"l'URL finale sont préservés : les vérifications ``checkType: "
+"status_code`` et ``checkType: response_url`` continuent donc de "
+"fonctionner à travers le contournement."
+
+#: ../../source/features.rst:293 8f2f975ca31940aeb6430c09a7e5f3ab
+msgid ""
+"**CloudflareBypassForScraping** (legacy fallback). Returns rendered HTML "
+"only, so the upstream status code is lost — ``checkType: message`` keeps "
+"working but ``status_code`` checks misfire (treated as 200 on success)."
+msgstr ""
+"**CloudflareBypassForScraping** (repli hérité). Ne renvoie que du HTML "
+"rendu : le code de statut en amont est perdu. Les vérifications "
+"``checkType: message`` continuent de fonctionner, mais celles de type "
+"``status_code`` se déclenchent à tort (un succès est traité comme un "
+"200)."
+
+#: ../../source/features.rst:297 649fdad8fc8d4fffa0e9066e394f2747
+msgid "Activate the bypass either with the CLI flag::"
+msgstr "Activez le contournement soit avec l'option de ligne de commande ::"
+
+#: ../../source/features.rst:301 f2df085e2974481bbe96d03c1dd54c46
+msgid ""
+"or by setting ``cloudflare_bypass.enabled`` to ``true`` in "
+"``settings.json``. The web UI (``python -m maigret.web.app``) reads the "
+"same setting — there is no separate toggle in the form, so flipping "
+"``enabled`` is what activates the bypass for browser-driven runs."
+msgstr ""
+"soit en mettant ``cloudflare_bypass.enabled`` à ``true`` dans "
+"``settings.json``. L'interface web (``python -m maigret.web.app``) lit le"
+" même paramètre : il n'y a pas d'interrupteur distinct dans le "
+"formulaire, c'est donc bien ``enabled`` qui active le contournement pour "
+"les recherches lancées depuis le navigateur."
+
+#: ../../source/features.rst:306 30203a1de79a4ec38594f56133db3bb4
+msgid ""
+"The bypass only fires for sites whose ``protection`` field intersects "
+"``cloudflare_bypass.trigger_protection`` (default ``[\"cf_js_challenge\","
+" \"cf_firewall\", \"webgate\"]``); all other sites use the normal aiohttp"
+" / curl_cffi path."
+msgstr ""
+"Le contournement ne se déclenche que pour les sites dont le champ "
+"``protection`` recoupe ``cloudflare_bypass.trigger_protection`` (par "
+"défaut ``[\"cf_js_challenge\", \"cf_firewall\", \"webgate\"]``) ; tous "
+"les autres sites empruntent le chemin habituel, aiohttp / curl_cffi."
+
+#: ../../source/features.rst:311 b0cee78cdffd468a8422bb75dad37cc0
+msgid ""
+"If all configured modules are unreachable, affected sites get an UNKNOWN "
+"status with an actionable error pointing at the first module's URL — the "
+"fix is almost always to start the FlareSolverr container."
+msgstr ""
+"Si aucun des modules configurés n'est joignable, les sites concernés "
+"reçoivent le statut UNKNOWN, accompagné d'une erreur explicite pointant "
+"vers l'URL du premier module : le remède consiste presque toujours à "
+"démarrer le conteneur FlareSolverr."
+
+#: ../../source/features.rst:315 1f7ba21a5e8a4ce8b9239dffb4619306
+msgid ""
+"FlareSolverr session reuse is automatic: Maigret pins a single ``session:"
+" -`` per run, so cf_clearance cookies are shared "
+"between checks of the same domain (5–10× faster on subsequent requests to"
+" that host)."
+msgstr ""
+"La réutilisation des sessions FlareSolverr est automatique : Maigret fixe"
+" une seule ``session: -`` par exécution, si bien que"
+" les cookies cf_clearance sont partagés entre les vérifications d'un même"
+" domaine (5 à 10 fois plus rapide pour les requêtes suivantes vers cet "
+"hôte)."
+
+#: ../../source/features.rst:321 f9215d5c4d494d8ebb416dd81a6f7bb3
+msgid "Activation"
+msgstr "Activation"
+
+#: ../../source/features.rst:322 caa751fc5dee4a57af2b85cfa91eb239
+msgid ""
+"The activation mechanism helps make requests to sites requiring "
+"additional authentication like cookies, JWT tokens, or custom headers."
+msgstr ""
+"Le mécanisme d'activation permet d'interroger les sites qui exigent une "
+"authentification supplémentaire : cookies, jetons JWT ou en-têtes "
+"personnalisés."
+
+#: ../../source/features.rst:324 2c80373446a74fa3aa0f8b7929a142ed
+msgid "It works by implementing a custom function that:"
+msgstr "Il repose sur une fonction dédiée qui :"
+
+#: ../../source/features.rst:326 3520e93d4f284550a37046b054d4681b
+msgid "Makes a specialized HTTP request to a specific website endpoint"
+msgstr "Envoie une requête HTTP spécifique à un point d'entrée précis du site"
+
+#: ../../source/features.rst:327 ac6abe41f22d47f38e582e12b9bb7f57
+msgid "Processes the response"
+msgstr "Traite la réponse"
+
+#: ../../source/features.rst:328 fe331ebd523d4f6bbe86eff5eb387b65
+msgid "Updates the headers/cookies for that site in the local Maigret database"
+msgstr ""
+"Met à jour les en-têtes et les cookies de ce site dans la base locale de "
+"Maigret"
+
+#: ../../source/features.rst:330 11b64bdd8d4442fbb48dbb61aa169ff1
+msgid ""
+"Since activation only triggers after encountering specific errors, a "
+"retry (or another Maigret run) is needed to obtain a valid response with "
+"the updated authentication."
+msgstr ""
+"Comme l'activation ne se déclenche qu'après certaines erreurs, il faut "
+"une nouvelle tentative (ou une nouvelle exécution de Maigret) pour "
+"obtenir une réponse valide avec l'authentification mise à jour."
+
+#: ../../source/features.rst:332 d3aab7ded9564938bbfd7edd7beef961
+msgid ""
+"The activation mechanism is enabled by default, and cannot be disabled at"
+" the moment."
+msgstr ""
+"Le mécanisme d'activation est activé par défaut et ne peut pas être "
+"désactivé pour l'instant."
+
+#: ../../source/features.rst:334 e1fb739f230343648a9269e9156d8f1b
+msgid "See for more details in Development section :ref:`activation-mechanism`."
+msgstr ""
+"Plus de détails dans la section Développement : :ref:`activation-"
+"mechanism`."
+
+#: ../../source/features.rst:339 1562cfeb06714cdb8ef1a326975aa934
+msgid "Extraction of information from account pages"
+msgstr "Extraction d'informations depuis les pages de comptes"
+
+#: ../../source/features.rst:341 c2fe7d33ae3b4e5f9407da29a74ec0a0
+msgid ""
+"Maigret can parse URLs and content of web pages by URLs to extract info "
+"about account owner and other meta information."
+msgstr ""
+"Maigret peut analyser des URL et le contenu des pages web correspondantes"
+" pour en extraire des informations sur le titulaire du compte, ainsi que "
+"d'autres métadonnées."
+
+#: ../../source/features.rst:343 662b33d4252b4479a952d390a29d66a5
+msgid ""
+"You must specify the URL with the option ``--parse``, it's can be a link "
+"to an account or an online document. List of supported sites `see here "
+"`_."
+msgstr ""
+"Vous devez indiquer l'URL avec l'option ``--parse`` ; ce peut être un "
+"lien vers un compte ou vers un document en ligne. La liste des sites pris"
+" en charge est `consultable ici `_."
+
+#: ../../source/features.rst:345 8c959114771d4786b7ab897d2c5adb9d
+msgid ""
+"After the end of the parsing phase, Maigret will start the search phase "
+"by :doc:`supported identifiers ` found "
+"(usernames, ids, etc.)."
+msgstr ""
+"Une fois la phase d'analyse terminée, Maigret lance la phase de recherche"
+" à partir des :doc:`identifiants pris en charge ` qu'il a trouvés (noms d'utilisateur, identifiants, etc.)."
+
+#: ../../source/features.rst:373 ef504f888bbc4e16ba26424238ba6b5a
+msgid "Simple API"
+msgstr "Une API simple"
+
+#: ../../source/features.rst:375 323a72fa184646b893b6db3ab5bdb0e6
+msgid ""
+"Maigret can be easily integrated with the use of Python package `maigret "
+" `_."
+msgstr ""
+"Maigret s'intègre facilement grâce au paquet Python `maigret "
+" `_."
+
+#: ../../source/features.rst:377 6c84748652ae44458942673e05b2e7b3
+msgid ""
+"Example: the community `Telegram bot `_"
+msgstr ""
+"Exemple : le `bot Telegram `_ "
+"communautaire"
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/index.po b/docs/source/locale/fr/LC_MESSAGES/index.po
new file mode 100644
index 00000000..aa4a6553
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/index.po
@@ -0,0 +1,136 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/index.rst:37
+msgid "Sections"
+msgstr "Sections"
+
+#: ../../source/index.rst:54
+msgid "Advanced usage"
+msgstr "Utilisation avancée"
+
+#: ../../source/index.rst:62
+msgid "Use cases"
+msgstr "Cas d'usage"
+
+#: ../../source/index.rst:4 fad01d7dff7f42f68a16deaa3fd906e4
+msgid "Welcome to the Maigret docs!"
+msgstr "Bienvenue dans la documentation de Maigret !"
+
+#: ../../source/index.rst:6 900b077c3fb44cbe92ad5c2b8be261a9
+msgid ""
+"**Maigret** is an easy-to-use and powerful OSINT tool for collecting a "
+"dossier on a person by a username (alias) only."
+msgstr ""
+"**Maigret** est un outil OSINT puissant et simple d'utilisation qui "
+"rassemble un dossier sur une personne à partir d'un simple nom "
+"d'utilisateur (alias)."
+
+#: ../../source/index.rst:8 55318f1d11ad471e9b6b39ca59512f7c
+msgid ""
+"This is achieved by checking for accounts on a huge number of sites and "
+"gathering all the available information from web pages."
+msgstr ""
+"Pour cela, il recherche des comptes sur un très grand nombre de sites et "
+"collecte toutes les informations disponibles sur les pages web."
+
+#: ../../source/index.rst:10 9794f69651da48878e7d8d0ce2cea9f3
+msgid ""
+"The project's main goal — give to OSINT researchers and pentesters a "
+"**universal tool** to get maximum information about a person of interest "
+"by a username and integrate it with other tools in automatization "
+"pipelines."
+msgstr ""
+"L'objectif principal du projet est de donner aux chercheurs OSINT et aux "
+"pentesteurs un **outil universel** pour obtenir un maximum d'informations"
+" sur une personne d'intérêt à partir d'un nom d'utilisateur, et pour "
+"l'intégrer à d'autres outils dans des chaînes d'automatisation."
+
+#: ../../source/index.rst:14 720aeb80d8a24cb9b674429476305f4f
+msgid ""
+"**This tool is intended for educational and lawful purposes only.** The "
+"developers do not endorse or encourage any illegal activities or misuse "
+"of this tool. Regulations regarding the collection and use of personal "
+"data vary by country and region, including but not limited to GDPR in the"
+" EU, CCPA in the USA, and similar laws worldwide."
+msgstr ""
+"**Cet outil est destiné à un usage éducatif et légal uniquement.** Les "
+"développeurs n'approuvent ni n'encouragent aucune activité illégale ou "
+"aucun usage abusif de cet outil. La réglementation sur la collecte et "
+"l'utilisation des données personnelles varie selon les pays et les "
+"régions, notamment le RGPD dans l'Union européenne, le CCPA aux États-"
+"Unis et des lois similaires partout dans le monde."
+
+#: ../../source/index.rst:19 d4f32a286e3c4c7a898ab0b82dc633d1
+msgid ""
+"It is your sole responsibility to ensure that your use of this tool "
+"complies with all applicable laws and regulations in your jurisdiction. "
+"Any illegal use of this tool is strictly prohibited, and you are fully "
+"accountable for your actions."
+msgstr ""
+"Il vous appartient de vous assurer que votre utilisation de cet outil "
+"respecte l'ensemble des lois et réglementations en vigueur dans votre "
+"juridiction. Toute utilisation illégale de cet outil est strictement "
+"interdite et vous êtes seul responsable de vos actes."
+
+#: ../../source/index.rst:23 4fa98ee9737e41538fa3347940b4fdac
+msgid ""
+"The authors and developers of this tool bear no responsibility for any "
+"misuse or unlawful activities conducted by its users."
+msgstr ""
+"Les auteurs et les développeurs de cet outil déclinent toute "
+"responsabilité en cas d'usage abusif ou d'activité illégale de la part de"
+" ses utilisateurs."
+
+#: ../../source/index.rst:27 9a0991e8625d4602969c0714dc9ecc48
+msgid "You may be interested in:"
+msgstr "Cela pourrait vous intéresser :"
+
+#: ../../source/index.rst:28 37d9aa336989400696700609c83cf4ee
+msgid ":doc:`Quick start `"
+msgstr ":doc:`Démarrage rapide `"
+
+#: ../../source/index.rst:29 ec10922b61ac4fcda95dcdf834b2a91a
+msgid ":doc:`Usage examples `"
+msgstr ":doc:`Exemples d'utilisation `"
+
+#: ../../source/index.rst:30 566754f6b68949b3a912c31f86c09691
+msgid ":doc:`FAQ `"
+msgstr ":doc:`FAQ `"
+
+#: ../../source/index.rst:31 65182c75c2e74e3184bd9a0ef18a91e7
+msgid ":doc:`Command line options `"
+msgstr ":doc:`Options de ligne de commande `"
+
+#: ../../source/index.rst:32 d9ca5fb8c2994a62ab07c8d7cc468eb8
+msgid ":doc:`Features list `"
+msgstr ":doc:`Liste des fonctionnalités `"
+
+#: ../../source/index.rst:33 4f370d1bdd7a43fbb67896a61d1869f2
+msgid ":doc:`Library usage `"
+msgstr ":doc:`Utilisation en tant que bibliothèque `"
+
+#: ../../source/index.rst:34 9f5ac354804b47fdbdc079cc529e527b
+msgid ":doc:`Tor, I2P, and proxies `"
+msgstr ":doc:`Tor, I2P et proxys `"
+
+#: ../../source/index.rst:35 2ee7f1fe29a64905a8ef4b91d635bcb0
+msgid "`Run it online without installing `_"
+msgstr "`Lancez-le en ligne, sans rien installer `_"
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/installation.po b/docs/source/locale/fr/LC_MESSAGES/installation.po
new file mode 100644
index 00000000..a1e60cd6
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/installation.po
@@ -0,0 +1,571 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/installation.rst:4 06a66d93711c44e098e3199117c071a0
+msgid "Installation"
+msgstr "Installation"
+
+#: ../../source/installation.rst:6 1f3e8df4b1594961a5b2017919d2ece1
+msgid ""
+"Maigret can be installed using pip, Docker, or simply can be launched "
+"from the cloned repo. Also, it is available online via the `community "
+"Telegram bot `_, source code of a bot is "
+"`available on GitHub `_."
+msgstr ""
+"Maigret s'installe avec pip ou Docker, ou peut simplement être lancé "
+"depuis le dépôt cloné. Il est également accessible en ligne via le `bot "
+"Telegram communautaire `_, dont le code "
+"source est `disponible sur GitHub `_."
+
+#: ../../source/installation.rst:11 b7a88c45e72c47eeb2f162626ef22c76
+msgid "Windows Standalone EXE-binaries"
+msgstr "Binaires EXE autonomes pour Windows"
+
+#: ../../source/installation.rst:13 c2809428072744c588eacec66d8bcdd0
+msgid ""
+"A standalone ``maigret_standalone.exe`` for Windows is published in the "
+"`Releases section `_ of the "
+"GitHub repository. A fresh build is produced automatically after each "
+"commit to the **main** and **dev** branches."
+msgstr ""
+"Un ``maigret_standalone.exe`` autonome pour Windows est publié dans la "
+"`section Releases `_ du dépôt "
+"GitHub. Une nouvelle version est construite automatiquement après chaque "
+"commit sur les branches **main** et **dev**."
+
+#: ../../source/installation.rst:18 e30c98267c014253bc76467286f392e6
+msgid "There are two ways to launch the EXE:"
+msgstr "Il y a deux façons de lancer l'EXE :"
+
+#: ../../source/installation.rst:20 c4a5b9064afd4e1fabf88db60e4b9bdf
+msgid ""
+"**Double-click it from Explorer.** Maigret will prompt you for a "
+"username, run a default search, and pause at the end so the printed "
+"report links remain on screen until you press Enter."
+msgstr ""
+"**Double-cliquez dessus depuis l'Explorateur.** Maigret vous demandera un"
+" nom d'utilisateur, lancera une recherche par défaut et marquera une "
+"pause à la fin, afin que les liens des rapports affichés restent à "
+"l'écran jusqu'à ce que vous appuyiez sur Entrée."
+
+#: ../../source/installation.rst:23 e5f7ec1cf9304f6eae6c22cd2b5618ff
+msgid "**Run it from a terminal** for full control over options:"
+msgstr "**Lancez-le depuis un terminal** pour maîtriser toutes les options :"
+
+#: ../../source/installation.rst:25 dbdee53d7f3b43dcaed861971bc41d8e
+msgid "Press ``Win+R``, type ``cmd``, and hit Enter (or use PowerShell)."
+msgstr ""
+"Appuyez sur ``Win+R``, tapez ``cmd`` et appuyez sur Entrée (ou utilisez "
+"PowerShell)."
+
+#: ../../source/installation.rst:26 a8729a58fb004d1ab4ce2fc46aecbcc0
+msgid ""
+"Change to the folder where you saved the file, e.g. ``cd "
+"%USERPROFILE%\\Downloads``."
+msgstr ""
+"Placez-vous dans le dossier où vous avez enregistré le fichier, par "
+"exemple ``cd %USERPROFILE%\\Downloads``."
+
+#: ../../source/installation.rst:28 eb986c4f79ee4fd09db66e3ee2a8553b
+msgid "Run it with at least one username:"
+msgstr "Lancez-le avec au moins un nom d'utilisateur :"
+
+#: ../../source/installation.rst:37 5af6dbd07f1c415486c2886d222b84a5
+msgid "Reports are written next to the EXE in a ``reports\\`` subfolder."
+msgstr ""
+"Les rapports sont écrits à côté de l'EXE, dans un sous-dossier "
+"``reports\\``."
+
+#: ../../source/installation.rst:39 54a2539fd6154a4fbd391f335ab1b37e
+msgid "Video guide on how to run it: https://youtu.be/qIgwTZOmMmM."
+msgstr "Guide vidéo pour le lancer : https://youtu.be/qIgwTZOmMmM."
+
+#: ../../source/installation.rst:42 94d7a2c0f5d548d39505a7603c7d2b85
+msgid "Code signing"
+msgstr "Signature du code"
+
+#: ../../source/installation.rst:44 1ab5c3b634424b88bef4ff2ed94037e9
+msgid ""
+"Windows binaries are built on GitHub Actions from this repository. The "
+"project has applied to the `SignPath Foundation `_"
+" for a free code signing certificate; once issued, released Windows "
+"binaries will be signed as part of the same automated build."
+msgstr ""
+"Les binaires Windows sont construits par GitHub Actions depuis ce dépôt. "
+"Le projet a déposé une demande de certificat de signature de code gratuit"
+" auprès de la `SignPath Foundation `_ ; une fois "
+"le certificat délivré, les binaires Windows publiés seront signés dans le"
+" cadre de la même construction automatisée."
+
+#: ../../source/installation.rst:51 856db4923f7a434ea6697835d01204cf
+msgid "Cloud Shells and Jupyter notebooks"
+msgstr "Shells cloud et notebooks Jupyter"
+
+#: ../../source/installation.rst:53 a41bfce77f3f4edf9fc072968525b594
+msgid ""
+"In case you don't want to install Maigret locally, you can use cloud "
+"shells and Jupyter notebooks. Press one of the buttons below and follow "
+"the instructions to launch it in your browser."
+msgstr ""
+"Si vous ne souhaitez pas installer Maigret en local, vous pouvez passer "
+"par un shell cloud ou un notebook Jupyter. Cliquez sur l'un des boutons "
+"ci-dessous et suivez les instructions pour le lancer dans votre "
+"navigateur."
+
+#: ../../source/installation.rst:58 b58b319427fe45c3a4c39224369ad653
+msgid "Open in Cloud Shell"
+msgstr "Ouvrir dans Cloud Shell"
+
+#: ../../source/installation.rst:62 ef3ca92574364f68a70558ebb085e6d3
+msgid "Run on Replit"
+msgstr "Exécuter sur Replit"
+
+#: ../../source/installation.rst:67 6e04705fe7be4601911d0882d3da201d
+msgid "Open In Colab"
+msgstr "Ouvrir dans Colab"
+
+#: ../../source/installation.rst:72 0b998ed69a2d4831b6c64bd98a83fdfe
+msgid "Open In Binder"
+msgstr "Ouvrir dans Binder"
+
+#: ../../source/installation.rst:79 1f97c5338f344107b23874e0ff130513
+msgid ""
+"Cloud Shell: "
+"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md"
+msgstr ""
+"Cloud Shell : "
+"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md"
+
+#: ../../source/installation.rst:81 0997baf81bf34042b29f8ae53ba80296
+msgid "Replit: https://repl.it/github/soxoj/maigret"
+msgstr "Replit : https://repl.it/github/soxoj/maigret"
+
+#: ../../source/installation.rst:83 86c39f5e02f441e69c36261eeed262f1
+msgid ""
+"Google Colab: "
+"https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000"
+"/maigret-collab.ipynb"
+msgstr ""
+"Google Colab : "
+"https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000"
+"/maigret-collab.ipynb"
+
+#: ../../source/installation.rst:85 d2f5724223e84c4d95f4ab49a8ce0d9e
+msgid ""
+"Binder: "
+"https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD"
+msgstr ""
+"Binder : "
+"https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD"
+
+#: ../../source/installation.rst:88 89ed6a6dd30c4182aaf4f2fa3e9c7a4f
+msgid "Snap (Linux)"
+msgstr "Snap (Linux)"
+
+#: ../../source/installation.rst:90 92125d486460422f8b24cea270654837
+msgid ""
+"Maigret is on the `Snap Store `_ for amd64 "
+"and arm64. It needs neither Python nor pip:"
+msgstr ""
+"Maigret est sur le `Snap Store `_ pour "
+"amd64 et arm64. Il ne nécessite ni Python ni pip :"
+
+#: ../../source/installation.rst:95 9dce1ae260ec48888b7ff6ef434552eb
+msgid "Get it from the Snap Store"
+msgstr "Télécharger depuis le Snap Store"
+
+#: ../../source/installation.rst:107 9bed91bd19c04740a85961e314059b77
+msgid ""
+"The snap is strictly confined: it can read and write your home directory "
+"and very little else. Run it from a directory under ``$HOME`` and reports"
+" land in ``./reports`` as usual. Running it from somewhere it cannot see,"
+" ``/tmp`` for instance, fails before the search starts."
+msgstr ""
+"Le snap est strictement confiné : il peut lire et écrire dans votre "
+"répertoire personnel, et presque rien d'autre. Lancez-le depuis un "
+"répertoire situé sous ``$HOME`` et les rapports atterriront dans "
+"``./reports`` comme d'habitude. Le lancer depuis un endroit qu'il ne voit"
+" pas, ``/tmp`` par exemple, échoue avant même le début de la recherche."
+
+#: ../../source/installation.rst:112 ace0141ecf294c5f8d14e138b89b5ba7
+msgid ""
+"Access to USB drives and other removable media is not connected by "
+"default:"
+msgstr ""
+"L'accès aux clés USB et autres supports amovibles n'est pas connecté par "
+"défaut :"
+
+#: ../../source/installation.rst:118 0828b539d0f34b6aaacf3d43288a613a
+msgid ""
+"Updates arrive on their own through snapd, so the bundled site database "
+"and the code both stay current without any action."
+msgstr ""
+"Les mises à jour arrivent d'elles-mêmes via snapd : la base de sites "
+"embarquée et le code restent donc à jour sans aucune intervention."
+
+#: ../../source/installation.rst:122 1ec82465d26b4120b3d3d4fcbb19dee0
+msgid "Local installation from PyPi"
+msgstr "Installation locale depuis PyPI"
+
+#: ../../source/installation.rst:124 12173ce540f5403388ccc280f250cabd
+msgid ""
+"Maigret ships with a bundled site database. After installation from PyPI "
+"(or any other method), it can **automatically fetch a newer compatible "
+"database from GitHub** when you run it—see :ref:`database-auto-update` in"
+" :doc:`settings`."
+msgstr ""
+"Maigret est livré avec une base de sites embarquée. Après une "
+"installation depuis PyPI (ou par toute autre méthode), il peut "
+"**récupérer automatiquement depuis GitHub une base plus récente et "
+"compatible** lors de son exécution, voir :ref:`database-auto-update` dans"
+" :doc:`settings`."
+
+#: ../../source/installation.rst:127 919ab3e4873d4aff96827d2db9de1cb6
+msgid "Python 3.10 or higher and pip is required, **Python 3.11 is recommended.**"
+msgstr ""
+"Python 3.10 ou supérieur et pip sont requis, **Python 3.11 est "
+"recommandé.**"
+
+#: ../../source/installation.rst:137 1103ac355d6640da9b52fbb153170e1f
+msgid ""
+"PDF report support is shipped as an **optional extra** because it relies "
+"on system-level graphics libraries that pip cannot install for you. If "
+"you plan to use ``--pdf``, install Maigret with the ``pdf`` extra:"
+msgstr ""
+"La prise en charge des rapports PDF est fournie comme **extra "
+"facultatif**, car elle repose sur des bibliothèques graphiques système "
+"que pip ne peut pas installer à votre place. Si vous comptez utiliser "
+"``--pdf``, installez Maigret avec l'extra ``pdf`` :"
+
+#: ../../source/installation.rst:145 e97dcce05ad04b538bdc67ee648fe977
+msgid ""
+"See :ref:`pdf-extra` below for the full background on why PDF support is "
+"optional and how to fix the most common build errors."
+msgstr ""
+"Voir :ref:`pdf-extra` plus bas pour comprendre en détail pourquoi le PDF "
+"est facultatif et comment corriger les erreurs de compilation les plus "
+"courantes."
+
+#: ../../source/installation.rst:149 65b089af5d28448a9ee0ad1dc8d9a0a2
+msgid "Isolated installation with pipx"
+msgstr "Installation isolée avec pipx"
+
+#: ../../source/installation.rst:151 276b036bb3c64ba9917e07a42ee7a5e5
+msgid ""
+"``pip3 install maigret`` drops Maigret and its dependencies into "
+"whichever Python environment happens to be active. If that is the system "
+"Python, the install can collide with packages your distribution manages, "
+"and on recent Debian, Ubuntu and Fedora pip refuses outright with "
+"``error: externally-managed-environment``."
+msgstr ""
+"``pip3 install maigret`` installe Maigret et ses dépendances dans "
+"l'environnement Python actif, quel qu'il soit. Si c'est le Python du "
+"système, l'installation peut entrer en conflit avec des paquets gérés par"
+" votre distribution ; sur les versions récentes de Debian, Ubuntu et "
+"Fedora, pip refuse d'ailleurs catégoriquement, avec ``error: externally-"
+"managed-environment``."
+
+#: ../../source/installation.rst:157 078d4e27d6f74638a16d696510d4dc70
+msgid ""
+"`pipx `_ avoids all of that. It gives Maigret its "
+"own virtual environment, puts only the ``maigret`` command on your "
+"``PATH``, and keeps the dependencies away from everything else on the "
+"machine:"
+msgstr ""
+"`pipx `_ évite tout cela. Il donne à Maigret son "
+"propre environnement virtuel, ne place que la commande ``maigret`` dans "
+"votre ``PATH`` et tient ses dépendances à l'écart du reste de la machine "
+":"
+
+#: ../../source/installation.rst:168 9317bc2f43ad4f458e577bb555a1d242
+msgid "The ``pdf`` extra works the same way:"
+msgstr "L'extra ``pdf`` fonctionne de la même façon :"
+
+#: ../../source/installation.rst:174 1c98ca1719c0422fbd032def184d62c0
+msgid "Upgrading and removing are one command each:"
+msgstr "La mise à jour et la désinstallation tiennent chacune en une commande :"
+
+#: ../../source/installation.rst:182 bfff887fdbf84278989660d995b1d905
+msgid ""
+"If you already use `uv `_, ``uv tool install "
+"maigret`` does the same job."
+msgstr ""
+"Si vous utilisez déjà `uv `_, ``uv tool "
+"install maigret`` fait le même travail."
+
+#: ../../source/installation.rst:186 71e910c286c24fa49484357d20120531
+msgid "Development version (GitHub)"
+msgstr "Version de développement (GitHub)"
+
+#: ../../source/installation.rst:204 2cc8141fb061418bbb9232680bf0e13f
+msgid "Docker"
+msgstr "Docker"
+
+#: ../../source/installation.rst:218 97a9de8e485947b1bd8ac653b104c859
+msgid "Troubleshooting"
+msgstr "Dépannage"
+
+#: ../../source/installation.rst:220 522571e237844c87aae52c6e86c584eb
+msgid ""
+"If you encounter build errors during installation such as ``cannot find "
+"ft2build.h`` or errors related to ``reportlab`` / ``_renderPM``, you need"
+" to install system-level dependencies required to compile native "
+"extensions."
+msgstr ""
+"Si vous rencontrez des erreurs de compilation pendant l'installation, du "
+"type ``cannot find ft2build.h``, ou des erreurs liées à ``reportlab`` / "
+"``_renderPM``, vous devez installer les dépendances système nécessaires à"
+" la compilation des extensions natives."
+
+#: ../../source/installation.rst:224 0ee73bf0a7c9417b8c7a9847fe20e853
+msgid "**Debian/Ubuntu/Kali:**"
+msgstr "**Debian/Ubuntu/Kali :**"
+
+#: ../../source/installation.rst:230 9e36d358b98f45a1961561607fc4162a
+msgid "**Fedora/RHEL/CentOS:**"
+msgstr "**Fedora/RHEL/CentOS :**"
+
+#: ../../source/installation.rst:236 ../../source/installation.rst:321
+#: c36e50a1c5b24578a4962ae622b47e8e d5a516382529413e8be81b95cb0be1a9
+msgid "**Arch Linux:**"
+msgstr "**Arch Linux :**"
+
+#: ../../source/installation.rst:242 ../../source/installation.rst:335
+#: 666c0f5d202e41c3bd86cb77c223926c beb188bcaf4c42508de02f870c4f704f
+msgid "**macOS (Homebrew):**"
+msgstr "**macOS (Homebrew) :**"
+
+#: ../../source/installation.rst:248 9e78be48570447adb214c02a9b625213
+msgid "After installing the system dependencies, retry the maigret installation."
+msgstr ""
+"Une fois les dépendances système installées, relancez l'installation de "
+"Maigret."
+
+#: ../../source/installation.rst:250 bd967f67b9784fdfa617dc6e53f3b789
+msgid ""
+"If you continue to have issues, consider using Docker instead, which "
+"includes all necessary dependencies."
+msgstr ""
+"Si le problème persiste, envisagez plutôt Docker, qui embarque toutes les"
+" dépendances nécessaires."
+
+#: ../../source/installation.rst:256 3ecbbfd49e9348139ee72e10512df817
+msgid "Optional: PDF reports (``maigret[pdf]``)"
+msgstr "Facultatif : les rapports PDF (``maigret[pdf]``)"
+
+#: ../../source/installation.rst:258 fc50376c42d942509ae889b0ada51093
+msgid "The ``--pdf`` report format is shipped as an optional extra. To enable it:"
+msgstr ""
+"Le format de rapport ``--pdf`` est fourni comme extra facultatif. Pour "
+"l'activer :"
+
+#: ../../source/installation.rst:264 c49adf2626ba433295a740db9484d06e
+msgid ""
+"If PDF support is not installed and you pass ``--pdf``, Maigret prints a "
+"warning and continues without crashing — every other output format "
+"(``--html``, ``--json``, ``--csv``, ``--txt``, ``--xmind``, ``--graph``) "
+"keeps working."
+msgstr ""
+"Si la prise en charge du PDF n'est pas installée et que vous passez "
+"``--pdf``, Maigret affiche un avertissement et continue sans planter : "
+"tous les autres formats de sortie (``--html``, ``--json``, ``--csv``, "
+"``--txt``, ``--xmind``, ``--graph``) continuent de fonctionner."
+
+#: ../../source/installation.rst:270 a7010a5e92e84074ab24613ff6740fea
+msgid "Why is PDF optional?"
+msgstr "Pourquoi le PDF est-il facultatif ?"
+
+#: ../../source/installation.rst:272 f2d8cf8c6aac4147a14eca93d6f0fd87
+msgid ""
+"Maigret renders PDFs by converting an HTML template, and that conversion "
+"pipeline ultimately depends on the ``cairo`` graphics library through a "
+"chain of Python packages roughly shaped like::"
+msgstr ""
+"Maigret produit ses PDF en convertissant un modèle HTML, et cette chaîne "
+"de conversion dépend au bout du compte de la bibliothèque graphique "
+"``cairo``, via une succession de paquets Python à peu près comme ceci ::"
+
+#: ../../source/installation.rst:278 8567fbe97a6c47fab6fab0eebaaf8838
+msgid ""
+"The bottom of that chain is a C library — ``libcairo2`` — that has to "
+"exist on the host *before* pip can build the Python bindings. The Python "
+"binding package (``pycairo``) currently ships **only Windows wheels** on "
+"PyPI; on Linux and macOS pip falls back to building from source, and the "
+"build fails the moment ``pkg-config`` cannot find ``cairo``. The error "
+"looks like::"
+msgstr ""
+"Au bas de cette chaîne se trouve une bibliothèque C, ``libcairo2``, qui "
+"doit être présente sur la machine *avant* que pip ne puisse construire "
+"les liaisons Python. Le paquet de liaison Python (``pycairo``) ne publie "
+"actuellement **que des wheels Windows** sur PyPI ; sous Linux et macOS, "
+"pip se rabat donc sur une compilation depuis les sources, qui échoue dès "
+"que ``pkg-config`` ne trouve pas ``cairo``. L'erreur ressemble à ceci ::"
+
+#: ../../source/installation.rst:288 62199bb508f74bc3813f257546f83759
+msgid ""
+"Pulling this whole chain for every Maigret install just so the much "
+"smaller group of users who actually want PDFs can have them is a poor "
+"trade — so ``xhtml2pdf`` is gated behind the ``pdf`` extra."
+msgstr ""
+"Imposer toute cette chaîne à chaque installation de Maigret, uniquement "
+"pour que le groupe bien plus restreint d'utilisateurs qui veulent "
+"vraiment des PDF puisse en avoir, serait un mauvais compromis : "
+"``xhtml2pdf`` est donc placé derrière l'extra ``pdf``."
+
+#: ../../source/installation.rst:292 a4126865ad10432ab9cf6b2d33e26480
+msgid ""
+"Two more packages — ``arabic-reshaper`` and ``python-bidi`` — are bundled"
+" into the same extra. Maigret core never imports them; they are only used"
+" by ``xhtml2pdf`` to shape Arabic glyphs and lay out right-to-left text "
+"in PDFs. ``python-bidi`` v0.5+ is also a Rust binding, so on niche "
+"platforms without a published wheel it would otherwise pull in a Cargo "
+"build for users who never asked for PDF support."
+msgstr ""
+"Deux autres paquets, ``arabic-reshaper`` et ``python-bidi``, sont réunis "
+"dans le même extra. Le cœur de Maigret ne les importe jamais ; ils ne "
+"servent qu'à ``xhtml2pdf``, pour façonner les glyphes arabes et mettre en"
+" page le texte de droite à gauche dans les PDF. ``python-bidi`` v0.5+ est"
+" en outre une liaison Rust : sur les plateformes de niche sans wheel "
+"publiée, il déclencherait une compilation Cargo chez des utilisateurs qui"
+" n'ont jamais demandé le PDF."
+
+#: ../../source/installation.rst:300 d9c3f909c29441c283b07779c370e608
+msgid "Installing the system prerequisites"
+msgstr "Installer les prérequis système"
+
+#: ../../source/installation.rst:302 4e207f5b27854c2d8b1dcedea0289a20
+msgid ""
+"Install the cairo headers, ``pkg-config``, and a working C toolchain "
+"*before* running ``pip install 'maigret[pdf]'``."
+msgstr ""
+"Installez les en-têtes de cairo, ``pkg-config`` et une chaîne de "
+"compilation C fonctionnelle *avant* de lancer ``pip install "
+"'maigret[pdf]'``."
+
+#: ../../source/installation.rst:305 ab52341b4c6f4a62b58624da37566ec2
+msgid "**Debian / Ubuntu / Linux Mint / Kali:**"
+msgstr "**Debian / Ubuntu / Linux Mint / Kali :**"
+
+#: ../../source/installation.rst:314 dad4389c52bc4db7984b188d2525ed5d
+msgid "**Fedora / RHEL / CentOS:**"
+msgstr "**Fedora / RHEL / CentOS :**"
+
+#: ../../source/installation.rst:328 f3a52a0a27c14654b3f15601a8dcdbfe
+msgid "**Alpine Linux:**"
+msgstr "**Alpine Linux :**"
+
+#: ../../source/installation.rst:343 bd33aa76918847e7af4087328369d212
+msgid "**Windows:**"
+msgstr "**Windows :**"
+
+#: ../../source/installation.rst:345 a3d64de62d56499fa54e306c20e8c052
+msgid ""
+"No system packages are needed — ``pycairo`` ships prebuilt wheels for "
+"Windows. Just run:"
+msgstr ""
+"Aucun paquet système n'est nécessaire : ``pycairo`` publie des wheels "
+"précompilées pour Windows. Lancez simplement :"
+
+#: ../../source/installation.rst:352 b905ed5326634b5ba7624b27b6c99499
+msgid "**Google Cloud Shell / Colab / Replit / generic CI:**"
+msgstr "**Google Cloud Shell / Colab / Replit / CI générique :**"
+
+#: ../../source/installation.rst:354 0b9a480210c44561a1c2954d9650dacf
+msgid ""
+"These environments behave like Debian/Ubuntu — install the same "
+"``libcairo2-dev pkg-config python3-dev build-essential`` triple before "
+"``pip install 'maigret[pdf]'``. If you do not control the base image and "
+"cannot ``apt install``, skip the extra and use ``--html`` reports "
+"instead; HTML reports contain the same data and open in any browser."
+msgstr ""
+"Ces environnements se comportent comme Debian/Ubuntu : installez le même "
+"trio ``libcairo2-dev pkg-config python3-dev build-essential`` avant ``pip"
+" install 'maigret[pdf]'``. Si vous ne maîtrisez pas l'image de base et ne"
+" pouvez pas faire ``apt install``, laissez tomber l'extra et utilisez les"
+" rapports ``--html`` : ils contiennent les mêmes données et s'ouvrent "
+"dans n'importe quel navigateur."
+
+#: ../../source/installation.rst:361 294ca985b3a9483985b2b65888a845bf
+msgid "``maigret: command not found`` after install"
+msgstr "``maigret: command not found`` après l'installation"
+
+#: ../../source/installation.rst:363 80541d64922147d98cecd810f48a6d12
+msgid "If pip prints warnings like::"
+msgstr "Si pip affiche des avertissements du type ::"
+
+#: ../../source/installation.rst:368 c241b60227bf46188300c27f8abbe41c
+msgid ""
+"…and ``maigret --version`` then fails with ``command not found``, your "
+"``--user`` install put the entry-point script in a directory the shell "
+"does not search. Add it to ``PATH``:"
+msgstr ""
+"…et que ``maigret --version`` échoue ensuite avec ``command not found``, "
+"c'est que votre installation ``--user`` a placé le script de point "
+"d'entrée dans un répertoire que le shell ne parcourt pas. Ajoutez-le au "
+"``PATH`` :"
+
+#: ../../source/installation.rst:377 de778c1f45e34d23900fd1945882fe9d
+msgid ""
+"Or install into a virtual environment, where the entry point lands in the"
+" venv's ``bin/`` automatically:"
+msgstr ""
+"Ou installez dans un environnement virtuel, où le point d'entrée atterrit"
+" automatiquement dans le ``bin/`` du venv :"
+
+#: ../../source/installation.rst:387 0360ba072a0b44589d39d7066b682e68
+msgid "Optional: Cloudflare bypass solver"
+msgstr "Facultatif : le solveur de contournement Cloudflare"
+
+#: ../../source/installation.rst:391 80057a95b58b4a8db8f45bbd2830826f
+msgid ""
+"**Experimental.** The Cloudflare webgate is under active development; the"
+" configuration schema and CLI behaviour may change without backwards-"
+"compatibility guarantees."
+msgstr ""
+"**Expérimental.** Le webgate Cloudflare est en cours de développement "
+"actif ; le schéma de configuration et le comportement en ligne de "
+"commande peuvent changer sans garantie de compatibilité ascendante."
+
+#: ../../source/installation.rst:395 079b60030ede488eaf4b51a68abd3af7
+msgid ""
+"Sites tagged ``cf_js_challenge`` / ``cf_firewall`` need a real browser to"
+" pass their JavaScript challenge. To check those sites you can run a "
+"local `FlareSolverr `_ "
+"instance — Maigret will route protected checks to it when ``--cloudflare-"
+"bypass`` is set:"
+msgstr ""
+"Les sites marqués ``cf_js_challenge`` / ``cf_firewall`` exigent un vrai "
+"navigateur pour passer leur défi JavaScript. Pour vérifier ces sites, "
+"vous pouvez lancer une instance locale de `FlareSolverr "
+"`_ : Maigret y redirigera "
+"les vérifications protégées lorsque ``--cloudflare-bypass`` est activé :"
+
+#: ../../source/installation.rst:404 cd5f65e9e39049988fbdd7e9a488db44
+msgid ""
+"This is **optional** — Maigret runs without it; only sites whose "
+"``protection`` field intersects "
+"``settings.cloudflare_bypass.trigger_protection`` require the solver. See"
+" :ref:`cloudflare-bypass` for details."
+msgstr ""
+"C'est **facultatif** : Maigret fonctionne sans. Seuls les sites dont le "
+"champ ``protection`` recoupe "
+"``settings.cloudflare_bypass.trigger_protection`` ont besoin du solveur. "
+"Voir :ref:`cloudflare-bypass` pour les détails."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/library-usage.po b/docs/source/locale/fr/LC_MESSAGES/library-usage.po
new file mode 100644
index 00000000..e42a1f39
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/library-usage.po
@@ -0,0 +1,142 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/library-usage.rst:4 912ee46973c845bb83e2007caf60807d
+msgid "Library usage"
+msgstr "Utilisation en tant que bibliothèque"
+
+#: ../../source/library-usage.rst:6 1dc5af2d1bc94caf898ae0dfba28ab99
+msgid ""
+"Maigret's CLI is a thin wrapper around an async Python API. You can embed"
+" Maigret in your own tools, pipelines, and OSINT workflows — no need to "
+"shell out."
+msgstr ""
+"L'interface en ligne de commande de Maigret n'est qu'une fine couche au-"
+"dessus d'une API Python asynchrone. Vous pouvez intégrer Maigret à vos "
+"propres outils, pipelines et workflows OSINT, sans passer par un appel "
+"système."
+
+#: ../../source/library-usage.rst:8 689a5527381f4eb2986c9928ea5063cd
+msgid ""
+"This page covers the common patterns. For the full argument list of the "
+"underlying function, see ``maigret.checking.maigret`` in the source."
+msgstr ""
+"Cette page couvre les usages courants. Pour la liste complète des "
+"arguments de la fonction sous-jacente, voir ``maigret.checking.maigret`` "
+"dans le code source."
+
+#: ../../source/library-usage.rst:11 9fc2fae4f56f467c98d82f2eb5cae83f
+msgid "Installation"
+msgstr "Installation"
+
+#: ../../source/library-usage.rst:18 3593c7ee3c024bb3932f00ce062d2918
+msgid "Minimal example"
+msgstr "Exemple minimal"
+
+#: ../../source/library-usage.rst:20 163725f129db46428386562d5e60daf3
+msgid "A working end-to-end search against the top 500 sites:"
+msgstr "Une recherche complète et fonctionnelle sur les 500 premiers sites :"
+
+#: ../../source/library-usage.rst:52 1b8d59523b644de2826a34890bb83005
+msgid "Key points:"
+msgstr "Points importants :"
+
+#: ../../source/library-usage.rst:54 9febe61ea25341fe89f67792bce0dd7b
+msgid ""
+"``maigret_search`` is an ``async`` function — wrap it with "
+"``asyncio.run(...)`` or ``await`` it from inside your own event loop."
+msgstr ""
+"``maigret_search`` est une fonction ``async`` : encapsulez-la dans "
+"``asyncio.run(...)`` ou faites ``await`` depuis votre propre boucle "
+"d'événements."
+
+#: ../../source/library-usage.rst:55 94cba639a3fd48d59f757a97923bbcce
+msgid ""
+"``is_parsing_enabled=True`` turns on ``socid_extractor`` so "
+"``result[\"ids_data\"]`` is populated with profile fields (bio, linked "
+"accounts, uids, etc.). See its `Library usage `_ page for calling"
+" it directly, and `Maigret integration `_ for how "
+"the two projects fit together."
+msgstr ""
+"``is_parsing_enabled=True`` active ``socid_extractor``, si bien que "
+"``result[\"ids_data\"]`` est rempli avec les champs du profil "
+"(biographie, comptes liés, uids, etc.). Voir sa page `Library usage "
+"`_ "
+"pour l'appeler directement, et `Maigret integration `_ pour "
+"comprendre comment les deux projets s'articulent."
+
+#: ../../source/library-usage.rst:56 9d8f67adc20e46818a07c55a1e8d0d1c
+msgid ""
+"Each entry in the returned dict has a ``\"status\"`` object with "
+"``is_found()``, plus ``url_user``, ``http_status``, ``rank``, "
+"``ids_data``, and more."
+msgstr ""
+"Chaque entrée du dictionnaire renvoyé contient un objet ``\"status\"`` "
+"avec ``is_found()``, ainsi que ``url_user``, ``http_status``, ``rank``, "
+"``ids_data``, et d'autres champs."
+
+#: ../../source/library-usage.rst:59 cf296c815a41463dba25bdac37e1ea1f
+msgid "Filtering sites"
+msgstr "Filtrer les sites"
+
+#: ../../source/library-usage.rst:61 4f08358e924546e78d3120153934da7f
+msgid "``ranked_sites_dict`` accepts the same filters as the CLI:"
+msgstr "``ranked_sites_dict`` accepte les mêmes filtres que la ligne de commande :"
+
+#: ../../source/library-usage.rst:78 7bf2776ae3014fe581e9b36eacd7f9eb
+msgid "Running inside an existing event loop"
+msgstr "Exécution dans une boucle d'événements existante"
+
+#: ../../source/library-usage.rst:80 10de59061386431aa4d2f569c60eff6b
+msgid ""
+"If your application already runs an asyncio loop (FastAPI, aiohttp "
+"server, a Discord bot, etc.), ``await`` ``maigret_search`` directly "
+"instead of calling ``asyncio.run``:"
+msgstr ""
+"Si votre application fait déjà tourner une boucle asyncio (FastAPI, un "
+"serveur aiohttp, un bot Discord, etc.), faites directement ``await`` sur "
+"``maigret_search`` au lieu d'appeler ``asyncio.run`` :"
+
+#: ../../source/library-usage.rst:98 70183995fad54862aa732fc4a9790811
+msgid "Routing through a proxy"
+msgstr "Passer par un proxy"
+
+#: ../../source/library-usage.rst:100 c960cc0b366f4d05a2a658b63825ad93
+msgid ""
+"The same proxy / Tor / I2P flags the CLI exposes are plain keyword "
+"arguments:"
+msgstr ""
+"Les options proxy / Tor / I2P de la ligne de commande sont de simples "
+"arguments nommés :"
+
+#: ../../source/library-usage.rst:115 b29d27764029441fa483a633e5da903b
+msgid "Full function signature"
+msgstr "Signature complète de la fonction"
+
+#: ../../source/library-usage.rst:139 cae3576edbd84cf89e8857094185c1b0
+msgid ""
+"See :doc:`command-line-options` for a description of each option — the "
+"semantics match the CLI flags one-to-one."
+msgstr ""
+"Voir :doc:`command-line-options` pour la description de chaque option : "
+"la sémantique correspond exactement aux options de la ligne de commande."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/philosophy.po b/docs/source/locale/fr/LC_MESSAGES/philosophy.po
new file mode 100644
index 00000000..e3f222b2
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/philosophy.po
@@ -0,0 +1,131 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/philosophy.rst:4 9419a206dfa64d9f9bf6375368d36521
+msgid "Philosophy"
+msgstr "Philosophie"
+
+#: ../../source/philosophy.rst:6 50632721642b477ab022ab1b137949d4
+msgid ""
+"*The Commissioner Jules Maigret is a fictional French police detective, "
+"created by Georges Simenon. His investigation method is based on "
+"understanding the personality of different people and their "
+"interactions.*"
+msgstr ""
+"*Le commissaire Jules Maigret est un policier de fiction français, créé "
+"par Georges Simenon. Sa méthode d'enquête repose sur la compréhension de "
+"la personnalité des gens et de leurs interactions.*"
+
+#: ../../source/philosophy.rst:10 cfee4a15fc074a97aaa20c8a272c7087
+msgid "TL;DR: Username => Dossier"
+msgstr "En bref : un nom d'utilisateur => un dossier"
+
+#: ../../source/philosophy.rst:12 8d4120f7e65d4cf0bf1ec2f1394234bb
+msgid ""
+"Maigret is designed to gather all the available information about person "
+"by his username."
+msgstr ""
+"Maigret est conçu pour rassembler toutes les informations disponibles sur"
+" une personne à partir de son nom d'utilisateur."
+
+#: ../../source/philosophy.rst:14 3d6c38de4f3d46b29532fd470a6eac0c
+msgid ""
+"What kind of information is this? First, links to person accounts. "
+"Secondly, all the machine-extractable pieces of info, such as: other "
+"usernames, full name, URLs to people's images, birthday, location "
+"(country, city, etc.), gender."
+msgstr ""
+"De quelles informations s'agit-il ? D'abord, des liens vers les comptes "
+"de la personne. Ensuite, tous les éléments extractibles automatiquement, "
+"tels que : d'autres noms d'utilisateur, le nom complet, les URL des "
+"photos, la date de naissance, la localisation (pays, ville, etc.) et le "
+"genre."
+
+#: ../../source/philosophy.rst:18 8d2202a1c40341d7ba45ddd5d1aa8b9f
+msgid ""
+"All this information forms some dossier, but it also useful for other "
+"tools and analytical purposes. Each collected piece of data has a label "
+"of a certain format (for example, ``follower_count`` for the number of "
+"subscribers or ``created_at`` for account creation time) so that it can "
+"be parsed and analyzed by various systems and stored in databases."
+msgstr ""
+"Toutes ces informations forment un dossier, mais elles sont aussi utiles "
+"à d'autres outils et à des fins analytiques. Chaque donnée collectée "
+"porte une étiquette d'un format précis (par exemple ``follower_count`` "
+"pour le nombre d'abonnés ou ``created_at`` pour la date de création du "
+"compte), afin de pouvoir être analysée par différents systèmes et stockée"
+" dans des bases de données."
+
+#: ../../source/philosophy.rst:24 1ae72284813b436aa617c2ec0b2221c9
+msgid "Origins"
+msgstr "Origines"
+
+#: ../../source/philosophy.rst:26 99f6cd04767e447ab5438cc079c92739
+msgid ""
+"Maigret started from studying what OSINT investigators actually use in "
+"practice — and from the realization that many popular tools do not "
+"deliver real investigative value. The original research behind this "
+"observation is summarized in the article `What's wrong with namecheckers "
+"`_. "
+"For a broader landscape of username-checking tools, see the curated "
+"`OSINT namecheckers list `_."
+msgstr ""
+"Maigret est né de l'étude de ce que les enquêteurs OSINT utilisent "
+"réellement sur le terrain, et du constat que beaucoup d'outils populaires"
+" n'apportent pas de véritable valeur d'enquête. La recherche à l'origine "
+"de ce constat est résumée dans l'article `What's wrong with namecheckers "
+"`_. "
+"Pour un panorama plus large des outils de vérification de noms "
+"d'utilisateur, voir la `liste d'outils OSINT namecheckers "
+"`_."
+
+#: ../../source/philosophy.rst:33 74d74e5ae95b48ad82039fd1c87d75f0
+msgid "Two ideas grew out of that research:"
+msgstr "Deux idées sont nées de cette recherche :"
+
+#: ../../source/philosophy.rst:35 b76d9b534a7947b0a821d62c550fd835
+msgid ""
+"`socid-extractor `_ "
+"(`documentation `_) — a library "
+"focused on pulling structured identity data (user IDs, full names, linked"
+" accounts, bios, timestamps, etc.) out of account pages and public API "
+"responses, so that finding an account is not the end of the pipeline."
+msgstr ""
+"`socid-extractor `_ "
+"(`documentation `_) — une "
+"bibliothèque dédiée à l'extraction de données d'identité structurées "
+"(identifiants d'utilisateur, noms complets, comptes liés, biographies, "
+"horodatages, etc.) depuis les pages de comptes et les réponses d'API "
+"publiques, pour que trouver un compte ne soit pas la fin de la chaîne."
+
+#: ../../source/philosophy.rst:39 7c7af688ca7b4d78a78f6dafc5d1e959
+msgid ""
+"**Maigret** itself — which started as a fork of `Sherlock "
+"`_ but has long since "
+"outgrown the original project in coverage, extraction depth, and check "
+"reliability. Today Maigret is used as a component by major OSINT vendors "
+"in their commercial products."
+msgstr ""
+"**Maigret** lui-même, qui a commencé comme un fork de `Sherlock "
+"`_ mais a depuis longtemps "
+"dépassé le projet d'origine en couverture, en profondeur d'extraction et "
+"en fiabilité des vérifications. Aujourd'hui, Maigret est utilisé comme "
+"composant par de grands éditeurs OSINT dans leurs produits commerciaux."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/privacy.po b/docs/source/locale/fr/LC_MESSAGES/privacy.po
new file mode 100644
index 00000000..5d60de17
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/privacy.po
@@ -0,0 +1,54 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/privacy.rst:4 3ea365e65eb64603a69b0bab4828d720
+msgid "Privacy"
+msgstr "Confidentialité"
+
+#: ../../source/privacy.rst:6 7245b4e2ae184a61aea5a951d22c1a08
+msgid ""
+"Maigret runs entirely on your machine. It has no telemetry, no analytics "
+"and no update pings, and it sends nothing to the project maintainers."
+msgstr ""
+"Maigret s'exécute entièrement sur votre machine. Il n'y a ni télémétrie, "
+"ni statistiques d'usage, ni vérification de mise à jour, et rien n'est "
+"envoyé aux mainteneurs du projet."
+
+#: ../../source/privacy.rst:9 eac51965e9034c3da052c5809dce3215
+msgid ""
+"The usernames you search for are sent to the websites being checked, "
+"because that is how the check works: Maigret requests public profile URLs"
+" the same way a browser would. Reports are written to local files only."
+msgstr ""
+"Les noms d'utilisateur que vous recherchez sont envoyés aux sites "
+"vérifiés, car c'est ainsi que fonctionne la vérification : Maigret "
+"demande les URL des profils publics exactement comme le ferait un "
+"navigateur. Les rapports sont écrits uniquement dans des fichiers locaux."
+
+#: ../../source/privacy.rst:13 a1b4b0ea5592439396e88743155ce39d
+msgid ""
+"One feature is opt-in and involves a third party: the AI analysis of a "
+"report is sent to the OpenAI API, and only if you supply your own API "
+"key. Without a key the feature is inactive."
+msgstr ""
+"Une seule fonctionnalité fait intervenir un tiers, et elle est "
+"facultative : l'analyse d'un rapport par IA est envoyée à l'API d'OpenAI,"
+" et uniquement si vous fournissez votre propre clé d'API. Sans clé, la "
+"fonctionnalité reste inactive."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/quick-start.po b/docs/source/locale/fr/LC_MESSAGES/quick-start.po
new file mode 100644
index 00000000..d617ee29
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/quick-start.po
@@ -0,0 +1,60 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/quick-start.rst:4 03d07f6e7c524cac827c0528846e6f0b
+msgid "Quick start"
+msgstr "Démarrage rapide"
+
+#: ../../source/quick-start.rst:6 009c3ff4ff9f4c95a6ac4812c50fb91b
+msgid ""
+"After :doc:`installing Maigret `, you can begin searching "
+"by providing one or more usernames to look up:"
+msgstr ""
+"Une fois :doc:`Maigret installé `, vous pouvez lancer une "
+"recherche en fournissant un ou plusieurs noms d'utilisateur :"
+
+#: ../../source/quick-start.rst:8 06ab1e6636264f909fde1256f92e87d0
+msgid "``maigret username1 username2 ...``"
+msgstr "``maigret nomdutilisateur1 nomdutilisateur2 ...``"
+
+#: ../../source/quick-start.rst:10 303ee7d0f61848bfa82a56ae5677b3f8
+msgid ""
+"Maigret will search for accounts with the specified usernames across a "
+"vast number of websites. It will provide you with a list of URLs to any "
+"discovered accounts, along with relevant information extracted from those"
+" profiles."
+msgstr ""
+"Maigret recherche les comptes correspondant aux noms d'utilisateur "
+"indiqués sur un très grand nombre de sites. Il vous renvoie la liste des "
+"URL des comptes trouvés, accompagnée des informations pertinentes "
+"extraites de ces profils."
+
+#: ../../source/quick-start.rst:14 be975e1e40c04e8d85e6db9c24148640
+msgid ""
+"Don't want to install anything? Run Maigret in your browser via the "
+"`Telegram bot `_ — same engine, no setup."
+msgstr ""
+"Vous ne voulez rien installer ? Lancez Maigret dans votre navigateur via "
+"le `bot Telegram `_ : le même moteur, sans "
+"aucune configuration."
+
+#: ../../source/quick-start.rst:17 b0e7682f1d984b1b93a62a16712b62d5
+msgid "Maigret search results screenshot"
+msgstr "Capture d'écran des résultats de recherche de Maigret"
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/release-process.po b/docs/source/locale/fr/LC_MESSAGES/release-process.po
new file mode 100644
index 00000000..92b933fb
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/release-process.po
@@ -0,0 +1,326 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/release-process.rst:4 17a339e706284f4a85c691897df85738
+msgid "Release process"
+msgstr "Processus de publication"
+
+#: ../../source/release-process.rst:6 aefbb5a49b9341f68f5086531f4363de
+msgid ""
+"This page describes how a Maigret release is cut, what each git tag in "
+"the repository means, and which automation reacts to what. It is written "
+"for maintainers and for downstream packagers who need to know which ref "
+"to build from."
+msgstr ""
+"Cette page décrit comment une version de Maigret est publiée, ce que "
+"signifie chaque tag git du dépôt et quelle automatisation réagit à quoi. "
+"Elle s'adresse aux mainteneurs et aux empaqueteurs en aval, qui doivent "
+"savoir depuis quelle référence construire."
+
+#: ../../source/release-process.rst:12 1e74bb38a83f4bf2bcb877afebcf6256
+msgid "Where the version lives"
+msgstr "Où se trouve le numéro de version"
+
+#: ../../source/release-process.rst:14 b6576061e660449893640bc12d1697e5
+msgid "The version is stored in two files and both have to be changed together:"
+msgstr ""
+"La version est stockée dans deux fichiers, qui doivent être modifiés "
+"ensemble :"
+
+#: ../../source/release-process.rst:16 bdc5ce0a756048588fc6bd4fc5babe57
+msgid "``pyproject.toml``, the ``version`` field under ``[tool.poetry]``"
+msgstr "``pyproject.toml``, le champ ``version`` sous ``[tool.poetry]``"
+
+#: ../../source/release-process.rst:17 cef162954f8e4b84bc1a036aba630ad8
+msgid "``maigret/__version__.py``, the ``__version__`` string"
+msgstr "``maigret/__version__.py``, la chaîne ``__version__``"
+
+#: ../../source/release-process.rst:19 237e5c1ed8cf4a2a9b443fe1f4b1281e
+msgid ""
+"``maigret/__version__.py`` is what the snap packaging reads through "
+"``craftctl set version``, and ``pyproject.toml`` is what ends up in the "
+"PyPI metadata. A mismatch between them produces a package that reports "
+"one version and is published as another."
+msgstr ""
+"``maigret/__version__.py`` est ce que lit l'empaquetage snap via "
+"``craftctl set version``, et ``pyproject.toml`` est ce qui se retrouve "
+"dans les métadonnées PyPI. Une divergence entre les deux produit un "
+"paquet qui annonce une version et qui est publié sous une autre."
+
+#: ../../source/release-process.rst:25 a92d26566ec94a2f940411d2aaf8dbf4
+msgid "Cutting a release"
+msgstr "Préparer une version"
+
+#: ../../source/release-process.rst:27 f34e7a60d13d4d379930f58cee1bf22b
+msgid ""
+"Branch off ``main``. The branch is normally named after the version, for "
+"example ``0.6.5``."
+msgstr ""
+"Créez une branche à partir de ``main``. Elle porte normalement le nom de "
+"la version, par exemple ``0.6.5``."
+
+#: ../../source/release-process.rst:29 025928a1d2054936a551727ac52e5a34
+msgid "Bump the two version files on that branch."
+msgstr "Incrémentez les deux fichiers de version sur cette branche."
+
+#: ../../source/release-process.rst:30 b576ce4c678a4c62ae94596beba1db7c
+msgid ""
+"Open a pull request for the bump, so the change is reviewed like any "
+"other."
+msgstr ""
+"Ouvrez une pull request pour cette montée de version, afin qu'elle soit "
+"relue comme n'importe quel autre changement."
+
+#: ../../source/release-process.rst:32 ad1c5257714046a1b132082636dcbd73
+msgid ""
+"The release branch is where the tag will live. It is deliberately "
+"separate from ``main``: the tag has to point at a commit whose version "
+"files already say the new number, and ``main`` only receives that commit "
+"after the release is out."
+msgstr ""
+"C'est sur la branche de version que vivra le tag. Elle est volontairement"
+" distincte de ``main`` : le tag doit pointer sur un commit dont les "
+"fichiers de version annoncent déjà le nouveau numéro, et ``main`` ne "
+"reçoit ce commit qu'une fois la version publiée."
+
+#: ../../source/release-process.rst:37 9b0fd23d4f83496aa2b3b0339aa9b63b
+msgid "Publishing"
+msgstr "Publication"
+
+#: ../../source/release-process.rst:39 cd1ba051900c45f68ad00bc86f881d50
+msgid ""
+"Create a GitHub Release whose tag is ``vX.Y.Z`` and whose target is the "
+"release branch. Publishing it is the event that starts everything else, "
+"so the release notes should be finished before you publish rather than "
+"after."
+msgstr ""
+"Créez une GitHub Release dont le tag est ``vX.Y.Z`` et dont la cible est "
+"la branche de version. C'est sa publication qui déclenche tout le reste, "
+"donc les notes de version doivent être terminées avant de publier, pas "
+"après."
+
+#: ../../source/release-process.rst:43 564a58b206c14bc8a6ad3b7404fa9fff
+msgid "Two workflows listen for ``release: types: [published]``:"
+msgstr "Deux workflows écoutent ``release: types: [published]`` :"
+
+#: ../../source/release-process.rst:45 ea4d208e7f084977a98696fbff688f94
+msgid ""
+"``python-publish.yml`` builds the source distribution and the wheel and "
+"uploads them to PyPI through trusted publishing."
+msgstr ""
+"``python-publish.yml`` construit la distribution source et la wheel, puis"
+" les téléverse sur PyPI via le trusted publishing."
+
+#: ../../source/release-process.rst:47 af70ac77d9864f228f7ca81e486f3876
+msgid ""
+"``pyinstaller.yml`` builds ``maigret_standalone.exe`` under Wine and "
+"attaches it to the release. The binary appears a few minutes after the "
+"release itself, because PyInstaller is slow under Wine."
+msgstr ""
+"``pyinstaller.yml`` construit ``maigret_standalone.exe`` sous Wine et "
+"l'attache à la release. Le binaire apparaît quelques minutes après la "
+"release elle-même, car PyInstaller est lent sous Wine."
+
+#: ../../source/release-process.rst:51 dcbf2f54af9d498d9ab76133fe766e0f
+msgid ""
+"Both check out ``refs/tags/vX.Y.Z``, so both build the released code "
+"rather than the current head of a branch."
+msgstr ""
+"Les deux font un checkout de ``refs/tags/vX.Y.Z`` : ils construisent donc"
+" le code publié, et non la tête actuelle d'une branche."
+
+#: ../../source/release-process.rst:55 795f5e6ef9c54986aafe1e91e65752e7
+msgid ""
+"The ``pypi`` environment has no protection rules, so publishing any "
+"release sends a package straight to PyPI with no human gate. Publishing a"
+" test release from a branch whose version is not yet on PyPI will publish"
+" that version for real."
+msgstr ""
+"L'environnement ``pypi`` n'a aucune règle de protection : publier une "
+"release quelconque envoie le paquet directement sur PyPI, sans validation"
+" humaine. Publier une release de test depuis une branche dont la version "
+"n'est pas encore sur PyPI publiera cette version pour de bon."
+
+#: ../../source/release-process.rst:61 5ddb2c3d69154ecbb85d3409d3322111
+msgid "After the release"
+msgstr "Après la publication"
+
+#: ../../source/release-process.rst:63 517ac4e667aa440c80cd998100432260
+msgid ""
+"Merge the release branch into ``main``. In practice this happens a couple"
+" of minutes after the release is published."
+msgstr ""
+"Fusionnez la branche de version dans ``main``. En pratique, cela se fait "
+"quelques minutes après la publication."
+
+#: ../../source/release-process.rst:66 07b11fd6ec564244a88153832522526f
+msgid ""
+"The push to ``main`` is a separate trigger and starts the routine "
+"automation: the nightly Windows build, the Docker Hub images, the site "
+"database refresh and the test suite."
+msgstr ""
+"Le push sur ``main`` est un déclencheur distinct, qui lance "
+"l'automatisation de routine : la construction nocturne pour Windows, les "
+"images Docker Hub, le rafraîchissement de la base de sites et la suite de"
+" tests."
+
+#: ../../source/release-process.rst:70 daa606217c2a4fad89b8dc9a1cbe017f
+msgid ""
+"Because the release branch is merged with a squash, the commit that lands"
+" on ``main`` is not the commit the tag points at. This means ``vX.Y.Z`` "
+"is not an ancestor of ``main``. It is expected, and it is why a packager "
+"should build from the tag rather than looking for it in the branch "
+"history."
+msgstr ""
+"Comme la branche de version est fusionnée en squash, le commit qui arrive"
+" sur ``main`` n'est pas celui sur lequel pointe le tag. Autrement dit, "
+"``vX.Y.Z`` n'est pas un ancêtre de ``main``. C'est attendu, et c'est la "
+"raison pour laquelle un empaqueteur doit construire depuis le tag plutôt "
+"que de le chercher dans l'historique de la branche."
+
+#: ../../source/release-process.rst:76 1fc5ebf8ebde4634917f70b5e6a06681
+msgid "Tags in this repository"
+msgstr "Les tags de ce dépôt"
+
+#: ../../source/release-process.rst:78 b3d0729bb2b2432fac9969ed9600c617
+msgid ""
+"**Release tags**, ``vX.Y.Z``. Immutable, one per release, pointing at the"
+" tip of a release branch. These are the only tags a packager should build"
+" from."
+msgstr ""
+"**Tags de version**, ``vX.Y.Z``. Immuables, un par version, pointant sur "
+"la tête d'une branche de version. Ce sont les seuls tags depuis lesquels "
+"un empaqueteur doit construire."
+
+#: ../../source/release-process.rst:81 6328e93333ab4c8e8204cf15a6f9b3f0
+msgid ""
+"**Nightly tags**, ``nightly-main`` and ``nightly-dev``. Moving tags. "
+"Every push to the matching branch rebuilds the Windows binary and force-"
+"updates the tag to the built commit, so the tag always matches the "
+"attached ``.exe``. The releases behind them are marked as prereleases so "
+"they never take the \"latest\" marker from a real release. Never pin "
+"anything to these: the ref is stable but its content is not."
+msgstr ""
+"**Tags nocturnes**, ``nightly-main`` et ``nightly-dev``. Des tags "
+"mobiles. Chaque push sur la branche correspondante reconstruit le binaire"
+" Windows et force la mise à jour du tag vers le commit construit, de "
+"sorte que le tag corresponde toujours au ``.exe`` attaché. Les releases "
+"associées sont marquées comme préversions, afin de ne jamais prendre le "
+"marqueur « latest » d'une vraie version. N'épinglez jamais quoi que ce "
+"soit dessus : la référence est stable, mais son contenu ne l'est pas."
+
+#: ../../source/release-process.rst:88 7403364086e84a208f960ad875e398b6
+msgid ""
+"**Legacy tags**, ``main``, ``dev``, ``test`` and ``dev-564`` through "
+"``dev-571``. Left over from an earlier version of the Windows build, "
+"which used the branch name directly as the tag name. Nothing creates or "
+"updates them any more. Two of them still carry GitHub releases with a "
+"Windows binary attached, built in April 2026, so anything downloaded from"
+" them is old."
+msgstr ""
+"**Tags hérités**, ``main``, ``dev``, ``test`` et ``dev-564`` à "
+"``dev-571``. Reliquats d'une ancienne version de la construction Windows,"
+" qui utilisait directement le nom de la branche comme nom de tag. Plus "
+"rien ne les crée ni ne les met à jour. Deux d'entre eux portent encore "
+"des releases GitHub avec un binaire Windows attaché, construit en avril "
+"2026 : tout ce qui en est téléchargé est donc ancien."
+
+#: ../../source/release-process.rst:95 499996b2bb6e49f2841c32bb58528637
+msgid ""
+"A tag named ``main`` shadows the branch of the same name. ``git rev-parse"
+" main`` warns that the refname is ambiguous and answers with the tag, so "
+"``git show main:some/file`` reads from the tag's commit and not from the "
+"branch head. Tools that resolve a bare ref hit this too: a remote build "
+"that is told to build ``main`` may build the tag. Use ``refs/heads/main``"
+" explicitly, or clone with ``--no-tags``. The site data workflow works "
+"around it with a ``git tag -d main`` step before it touches any ref."
+msgstr ""
+"Un tag nommé ``main`` masque la branche du même nom. ``git rev-parse "
+"main`` avertit que la référence est ambiguë et répond avec le tag, si "
+"bien que ``git show main:un/fichier`` lit le commit du tag et non la tête"
+" de la branche. Les outils qui résolvent une référence nue tombent dans "
+"le même piège : une construction distante à laquelle on demande ``main`` "
+"risque de construire le tag. Utilisez explicitement ``refs/heads/main``, "
+"ou clonez avec ``--no-tags``. Le workflow des données de sites contourne "
+"le problème avec une étape ``git tag -d main`` avant de toucher à la "
+"moindre référence."
+
+#: ../../source/release-process.rst:104 24e401ea5e3c47e686b40255ab6cedaf
+msgid "Where the artifacts end up"
+msgstr "Où atterrissent les artefacts"
+
+#: ../../source/release-process.rst:106 181b3e7dbf0f41799e28eb956e8f3e66
+msgid "Published automatically on release:"
+msgstr "Publiés automatiquement à chaque release :"
+
+#: ../../source/release-process.rst:108 ad0c797d160441e199fecf92ff51f677
+msgid "**PyPI**, the source distribution and the wheel."
+msgstr "**PyPI**, la distribution source et la wheel."
+
+#: ../../source/release-process.rst:109 f83b2aa49f584014ab6a2516b60ce11b
+msgid "**GitHub release assets**, the Windows ``maigret_standalone.exe``."
+msgstr ""
+"**Les assets de la release GitHub**, le ``maigret_standalone.exe`` pour "
+"Windows."
+
+#: ../../source/release-process.rst:111 27c81092af374faa8a7bdd3eec745e1b
+msgid "Published automatically on every push to ``main``:"
+msgstr "Publiés automatiquement à chaque push sur ``main`` :"
+
+#: ../../source/release-process.rst:113 b4f0d324b8794cf4a27fc500fa138912
+msgid "**Docker Hub**, the CLI and web images."
+msgstr "**Docker Hub**, les images CLI et web."
+
+#: ../../source/release-process.rst:115 d7a8efffcb2844a0b8eed26caf6da766
+msgid "Published by hand:"
+msgstr "Publiés à la main :"
+
+#: ../../source/release-process.rst:117 e45ef970948044078020146a411921ee
+msgid ""
+"**Snap**, built with ``snapcraft`` and uploaded to the ``latest/stable`` "
+"channel for amd64 and arm64. Uploading a revision does not touch the "
+"store listing: the summary, the description and the icon change only when"
+" ``snapcraft upload-metadata `` is run, so run it whenever "
+"those fields change in ``snap/snapcraft.yaml``, or the store keeps "
+"serving the old text."
+msgstr ""
+"**Snap**, construit avec ``snapcraft`` et téléversé sur le canal "
+"``latest/stable`` pour amd64 et arm64. Téléverser une révision ne touche "
+"pas à la fiche du store : le résumé, la description et l'icône ne "
+"changent que lorsque ``snapcraft upload-metadata `` est "
+"exécuté. Lancez-le donc dès que ces champs changent dans "
+"``snap/snapcraft.yaml``, sinon le store continue de servir l'ancien "
+"texte."
+
+#: ../../source/release-process.rst:124 edcc5592473f4eb5bbf9f9fab4d50848
+msgid "Maintained downstream, outside this repository:"
+msgstr "Maintenus en aval, en dehors de ce dépôt :"
+
+#: ../../source/release-process.rst:126 da25d33954774695b15ca4ea695982ba
+msgid ""
+"The AUR, Homebrew core, MacPorts and nixpkgs normally follow a new "
+"release within a day or two without being asked."
+msgstr ""
+"AUR, Homebrew core, MacPorts et nixpkgs suivent normalement une nouvelle "
+"version en un jour ou deux, sans qu'on ait à le demander."
+
+#: ../../source/release-process.rst:128 edbbf6cb578d4be9acbbfb2d7a000193
+msgid "BlackArch is updated through a pull request to the BlackArch repository."
+msgstr "BlackArch est mis à jour via une pull request sur le dépôt BlackArch."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/settings.po b/docs/source/locale/fr/LC_MESSAGES/settings.po
new file mode 100644
index 00000000..1d4d4a8a
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/settings.po
@@ -0,0 +1,569 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/settings.rst:4 712aa27723a44c47a41b5ec1c1c6f9a4
+msgid "Settings"
+msgstr "Paramètres"
+
+#: ../../source/settings.rst:7 c5ccdfd8a85f4cbdac40dabb3e2b82a2
+msgid "The settings system is under development and may be subject to change."
+msgstr "Le système de paramètres est en cours de développement et peut évoluer."
+
+#: ../../source/settings.rst:9 1699072abb98497c98cb9f53aec2cbb4
+msgid ""
+"Options are also configurable through settings files. See `settings JSON "
+"file "
+"`_"
+" for the list of currently supported options."
+msgstr ""
+"Les options sont également configurables via des fichiers de paramètres. "
+"Voir le `fichier JSON de paramètres "
+"`_"
+" pour la liste des options actuellement prises en charge."
+
+#: ../../source/settings.rst:13 c6cbc3056c9343738eda818a9f364130
+msgid ""
+"After start Maigret tries to load configuration from the following "
+"sources in exactly the same order:"
+msgstr ""
+"Au démarrage, Maigret tente de charger sa configuration depuis les "
+"sources suivantes, exactement dans cet ordre :"
+
+#: ../../source/settings.rst:29 7a538929815f498187ca348a85567bea
+msgid ""
+"Missing any of these files is not an error. If the next settings file "
+"contains already known option, this option will be rewritten. So it is "
+"possible to make custom configuration for different users and "
+"directories."
+msgstr ""
+"L'absence de l'un de ces fichiers n'est pas une erreur. Si le fichier de "
+"paramètres suivant contient une option déjà connue, cette option est "
+"écrasée. Il est donc possible d'avoir une configuration différente selon "
+"les utilisateurs et les répertoires."
+
+#: ../../source/settings.rst:37 a4f24518d9984c04b0e8a8b2fee23b6a
+msgid "Database auto-update"
+msgstr "Mise à jour automatique de la base"
+
+#: ../../source/settings.rst:39 402f5cc3c5634bc6863e5b69bcf977d6
+msgid ""
+"Maigret ships with a bundled site database, but it gets outdated between "
+"releases. To keep the database current, Maigret automatically checks for "
+"updates on startup."
+msgstr ""
+"Maigret est livré avec une base de sites embarquée, mais celle-ci se "
+"périme entre deux versions. Pour la garder à jour, Maigret vérifie "
+"automatiquement au démarrage si une mise à jour est disponible."
+
+#: ../../source/settings.rst:41 669b989f8d8d4ed38786d6595015e2ec
+msgid "**How it works:**"
+msgstr "**Comment cela fonctionne :**"
+
+#: ../../source/settings.rst:43 38c301861c6747e7a5324bfc4fe1c32d
+msgid ""
+"On startup, Maigret checks if more than 24 hours have passed since the "
+"last update check."
+msgstr ""
+"Au démarrage, Maigret regarde si plus de 24 heures se sont écoulées "
+"depuis la dernière vérification."
+
+#: ../../source/settings.rst:44 514089cd2e0e4c9e8b143fe28da78667
+msgid ""
+"If so, it fetches a lightweight metadata file (~200 bytes) from GitHub to"
+" see if a newer database is available."
+msgstr ""
+"Si c'est le cas, il récupère depuis GitHub un fichier de métadonnées "
+"léger (environ 200 octets) pour savoir si une base plus récente est "
+"disponible."
+
+#: ../../source/settings.rst:45 cd91691de90d491fb891524cedf55218
+msgid ""
+"If a newer, compatible database exists, Maigret downloads it to "
+"``~/.maigret/data.json`` and uses it instead of the bundled copy."
+msgstr ""
+"S'il existe une base plus récente et compatible, Maigret la télécharge "
+"dans ``~/.maigret/data.json`` et l'utilise à la place de la copie "
+"embarquée."
+
+#: ../../source/settings.rst:46 837e88ded4ad42e4b3d3a70dd57e81f2
+msgid ""
+"If the download fails or the new database is incompatible with your "
+"Maigret version, the bundled database is used as a fallback."
+msgstr ""
+"Si le téléchargement échoue ou si la nouvelle base est incompatible avec "
+"votre version de Maigret, la base embarquée sert de solution de repli."
+
+#: ../../source/settings.rst:48 13f6ae56504342d9be93259b0fa33003
+msgid ""
+"The downloaded database has **higher priority** than the bundled one — it"
+" replaces, not overlays."
+msgstr ""
+"La base téléchargée a une **priorité supérieure** à la base embarquée : "
+"elle la remplace, elle ne se superpose pas à elle."
+
+#: ../../source/settings.rst:50 b3f4963f12094f9e8546f5d595197bb6
+msgid "**Status messages** are printed only when an action occurs:"
+msgstr "**Les messages d'état** ne sont affichés que lorsqu'une action a lieu :"
+
+#: ../../source/settings.rst:59 42e5b4887cde4660a2f0542c07dcedf7
+msgid "**Forcing an update:**"
+msgstr "**Forcer une mise à jour :**"
+
+#: ../../source/settings.rst:61 89faa3328804430cbf93746ada4a4d88
+msgid ""
+"Use the ``--force-update`` flag to check for updates immediately, "
+"ignoring the check interval:"
+msgstr ""
+"Utilisez l'option ``--force-update`` pour vérifier immédiatement les "
+"mises à jour, sans tenir compte de l'intervalle de vérification :"
+
+#: ../../source/settings.rst:67 220037a894014d9dbd366fb2a99e6119
+msgid ""
+"The update happens at startup, then the search continues normally with "
+"the freshly downloaded database."
+msgstr ""
+"La mise à jour a lieu au démarrage, puis la recherche se poursuit "
+"normalement avec la base fraîchement téléchargée."
+
+#: ../../source/settings.rst:69 0cdb36848da640d7b692f7977f1725a1
+msgid "**Disabling auto-update:**"
+msgstr "**Désactiver la mise à jour automatique :**"
+
+#: ../../source/settings.rst:71 6db5793be50e4c90a24734da0cec98ee
+msgid "Use the ``--no-autoupdate`` flag to skip the update check entirely:"
+msgstr ""
+"Utilisez l'option ``--no-autoupdate`` pour ignorer complètement la "
+"vérification :"
+
+#: ../../source/settings.rst:77 17cfc74f62cf46c7bc54a75f1cca8802
+msgid "Or set it permanently in ``~/.maigret/settings.json``:"
+msgstr "Ou définissez-la de façon permanente dans ``~/.maigret/settings.json`` :"
+
+#: ../../source/settings.rst:85 18273bd5be604dd5ad97821b35719b1b
+msgid ""
+"This is recommended for **Docker containers**, **CI pipelines**, and "
+"**air-gapped environments**."
+msgstr ""
+"C'est recommandé pour les **conteneurs Docker**, les **pipelines "
+"d'intégration continue** et les **environnements isolés du réseau**."
+
+#: ../../source/settings.rst:87 0faa9c4c7e424e399b9f835443034182
+msgid "**Configuration options** (in ``settings.json``):"
+msgstr "**Options de configuration** (dans ``settings.json``) :"
+
+#: ../../source/settings.rst:93 ../../source/settings.rst:266
+#: 054564c056d1494597e89a3b742ed39e 98e3efc70a3447bc94d733611d6e6975
+msgid "Setting"
+msgstr "Paramètre"
+
+#: ../../source/settings.rst:94 ../../source/settings.rst:267
+#: 7e337b8f63fe4f32be13ca02bb5ace44 e25fa57cf77e4ab889a5bf5a992825f9
+msgid "Default"
+msgstr "Valeur par défaut"
+
+#: ../../source/settings.rst:95 ../../source/settings.rst:207
+#: ../../source/settings.rst:268 1eef0cc76a07448095ccd2b997421ef9
+#: 787e234e02fd4f7a99cbe355d077843d e77ed8266a944fcaa3f90d87537d3095
+msgid "Description"
+msgstr "Description"
+
+#: ../../source/settings.rst:96 06d5a75f72a345fba5c82712a61e59a1
+msgid "``no_autoupdate``"
+msgstr "``no_autoupdate``"
+
+#: ../../source/settings.rst:97 f17a17726d7f4ee8ae5d59efe7d4dca8
+msgid "``false``"
+msgstr "``false``"
+
+#: ../../source/settings.rst:98 95e7c7537f0144dcb59cdb9a2eab5b6f
+msgid "Disable auto-update entirely"
+msgstr "Désactive entièrement la mise à jour automatique"
+
+#: ../../source/settings.rst:99 83fcbad2d96647989c7c711cf5305975
+msgid "``autoupdate_check_interval_hours``"
+msgstr "``autoupdate_check_interval_hours``"
+
+#: ../../source/settings.rst:100 cdf137d498454401827eb2036818e001
+msgid "``24``"
+msgstr "``24``"
+
+#: ../../source/settings.rst:101 6c2b200410174d0e934b4c975d0bee3e
+msgid "How often to check for updates (in hours)"
+msgstr "Fréquence de vérification des mises à jour (en heures)"
+
+#: ../../source/settings.rst:102 5005644bf3194dcbb9af0cfaf0f046c8
+msgid "``db_update_meta_url``"
+msgstr "``db_update_meta_url``"
+
+#: ../../source/settings.rst:103 29ba9a1f3730400bb470873a1621dc7b
+msgid "GitHub raw URL"
+msgstr "URL brute GitHub"
+
+#: ../../source/settings.rst:104 0fdbf51eb2a54f9bb9016db8680409d2
+msgid "URL of the metadata file (for custom mirrors)"
+msgstr "URL du fichier de métadonnées (pour un miroir personnalisé)"
+
+#: ../../source/settings.rst:106 84cd7381bc154facaad49be53c844b1b
+msgid ""
+"**Using a custom database** with ``--db`` always skips auto-update — you "
+"are explicitly choosing your data source."
+msgstr ""
+"**Utiliser une base personnalisée** avec ``--db`` désactive toujours la "
+"mise à jour automatique : vous choisissez explicitement votre source de "
+"données."
+
+#: ../../source/settings.rst:111 0e60ce383c304cd79a73b9ba9900aa90
+msgid "Activation token cache"
+msgstr "Cache des jetons d'activation"
+
+#: ../../source/settings.rst:113 88fccff8940b44f689a41f95715e0c15
+msgid ""
+"A handful of sites reject anonymous requests until a short-lived token is"
+" obtained: Twitter needs a guest token, Vimeo a JWT, Weibo and Wikimapia "
+"a session cookie, OnlyFans a signed header pair, ProtonMail a bearer "
+"token. Maigret mints these during a run, the first time such a site "
+"answers with a challenge instead of a profile page."
+msgstr ""
+"Quelques sites rejettent les requêtes anonymes tant qu'un jeton de courte"
+" durée n'a pas été obtenu : Twitter demande un jeton invité, Vimeo un "
+"JWT, Weibo et Wikimapia un cookie de session, OnlyFans une paire d'en-"
+"têtes signés, ProtonMail un jeton bearer. Maigret les génère en cours "
+"d'exécution, la première fois qu'un tel site répond par un défi plutôt "
+"que par une page de profil."
+
+#: ../../source/settings.rst:115 2a4f0dcd05724ed49fcffb57e8e6a8e2
+msgid "Minted values are cached in:"
+msgstr "Les valeurs générées sont mises en cache dans :"
+
+#: ../../source/settings.rst:121 714de8be43ad497d9418deb973aae4f0
+msgid ""
+"so the next run starts with a warm token and skips the extra round trip. "
+"The file is created with ``0600`` permissions because these tokens are "
+"session credentials — treat it as one, and do not attach it to a bug "
+"report."
+msgstr ""
+"de sorte que l'exécution suivante démarre avec un jeton déjà chaud et "
+"évite un aller-retour supplémentaire. Le fichier est créé avec les "
+"permissions ``0600``, car ces jetons sont des identifiants de session : "
+"traitez-le comme tel et ne le joignez pas à un rapport de bug."
+
+#: ../../source/settings.rst:123 270653671f0449f2ad474d0e10f5af8a
+msgid ""
+"**What is stored:** only the header values that differ from what the site"
+" database shipped. Storing the whole header set would pin the shipped "
+"values, so a later database update could never change them again."
+msgstr ""
+"**Ce qui est stocké :** uniquement les valeurs d'en-tête qui diffèrent de"
+" celles fournies par la base de sites. Stocker l'ensemble des en-têtes "
+"figerait les valeurs livrées, et une mise à jour ultérieure de la base ne"
+" pourrait plus jamais les modifier."
+
+#: ../../source/settings.rst:125 98960ee7d2374592994f81ea5ccdca2d
+msgid ""
+"**Safe to delete:** yes. The next run mints whatever it needs again; the "
+"only cost is one extra request per affected site."
+msgstr ""
+"**Peut-on le supprimer sans risque :** oui. L'exécution suivante regénère"
+" ce dont elle a besoin ; cela ne coûte qu'une requête supplémentaire par "
+"site concerné."
+
+#: ../../source/settings.rst:127 ac64c5f1e78c45c2a293c37c9876b7e7
+msgid ""
+"**Why it is not kept in the site database:** the database is package "
+"data. It is versioned, checksum-verified and replaced wholesale by :ref"
+":`database-auto-update`, and on a system-wide install (distribution "
+"package, snap, ``/nix/store``) its directory is not writable at all. "
+"Tokens are per-user state with a different lifetime, so they live in a "
+"separate file."
+msgstr ""
+"**Pourquoi il n'est pas conservé dans la base de sites :** la base fait "
+"partie des données du paquet. Elle est versionnée, vérifiée par somme de "
+"contrôle et remplacée intégralement par la :ref:`database-auto-update` ; "
+"de plus, lors d'une installation à l'échelle du système (paquet de "
+"distribution, snap, ``/nix/store``), son répertoire n'est pas du tout "
+"accessible en écriture. Les jetons, eux, sont un état propre à "
+"l'utilisateur, avec une durée de vie différente : ils vivent donc dans un"
+" fichier séparé."
+
+#: ../../source/settings.rst:130 ebb029ea82714466a8b97d847050b429
+msgid "Cloudflare webgate"
+msgstr "Webgate Cloudflare"
+
+#: ../../source/settings.rst:134 202f1602b947481783614809cdbc065e
+msgid ""
+"**Experimental.** The ``cloudflare_bypass`` block is under active "
+"development; field names, defaults, and the trigger-protection routing "
+"rules may change without backwards-compatibility guarantees."
+msgstr ""
+"**Expérimental.** Le bloc ``cloudflare_bypass`` est en cours de "
+"développement actif ; les noms de champs, les valeurs par défaut et les "
+"règles de routage par protection déclenchante peuvent changer sans "
+"garantie de compatibilité ascendante."
+
+#: ../../source/settings.rst:138 cb36b917c00e40fb8d3ba14fc8a395fe
+msgid ""
+"The ``cloudflare_bypass`` block in ``settings.json`` configures the "
+"optional bypass described in :ref:`cloudflare-bypass`. The same block is "
+"honoured by the CLI, the Python API, and the web UI (``python -m "
+"maigret.web.app``); set ``enabled: true`` once and every entry point "
+"routes cf-protected sites through the solver."
+msgstr ""
+"Le bloc ``cloudflare_bypass`` de ``settings.json`` configure le "
+"contournement facultatif décrit dans :ref:`cloudflare-bypass`. Ce même "
+"bloc est pris en compte par la ligne de commande, l'API Python et "
+"l'interface web (``python -m maigret.web.app``) : définissez ``enabled: "
+"true`` une fois et tous les points d'entrée feront passer les sites "
+"protégés par Cloudflare via le solveur."
+
+#: ../../source/settings.rst:144 3b75de84595f42028bfffc394e04e301
+msgid ""
+"**Minimal FlareSolverr setup.** Start the solver in Docker, then drop the"
+" following snippet into ``~/.maigret/settings.json`` (or any path listed "
+"in :ref:`settings`):"
+msgstr ""
+"**Configuration FlareSolverr minimale.** Démarrez le solveur dans Docker,"
+" puis déposez l'extrait suivant dans ``~/.maigret/settings.json`` (ou "
+"dans l'un des chemins listés dans :ref:`settings`) :"
+
+#: ../../source/settings.rst:169 3d652af4ea5a4865a6e16540c63c8ac9
+msgid ""
+"That is enough — ``session_prefix`` and ``trigger_protection`` fall back "
+"to sensible defaults (``\"maigret\"`` and ``[\"cf_js_challenge\", "
+"\"cf_firewall\", \"webgate\"]`` respectively). On the next run, Maigret "
+"logs ``Cloudflare webgate active: ...`` and routes matching sites through"
+" the solver."
+msgstr ""
+"Cela suffit : ``session_prefix`` et ``trigger_protection`` reprennent des"
+" valeurs par défaut raisonnables (respectivement ``\"maigret\"`` et "
+"``[\"cf_js_challenge\", \"cf_firewall\", \"webgate\"]``). À l'exécution "
+"suivante, Maigret journalise ``Cloudflare webgate active: ...`` et fait "
+"passer les sites correspondants par le solveur."
+
+#: ../../source/settings.rst:175 2097863779d344e1ae247dc569b4b68f
+msgid "Default value (full schema with every supported field):"
+msgstr "Valeur par défaut (schéma complet, avec tous les champs pris en charge) :"
+
+#: ../../source/settings.rst:200 06eb5435ed3146a6971008b016481164
+msgid "**Fields.**"
+msgstr "**Champs.**"
+
+#: ../../source/settings.rst:206 07846b8d0d0a45ba804c0ec91d6e180b
+msgid "Field"
+msgstr "Champ"
+
+#: ../../source/settings.rst:208 02494ad45b71492a9e303b7d8f6c52dc
+msgid "``enabled``"
+msgstr "``enabled``"
+
+#: ../../source/settings.rst:209 e1811ab924fa4ac0a7b2635c203141a2
+msgid ""
+"When ``true``, the bypass is active for every run; when ``false`` (the "
+"default), it activates only on ``--cloudflare-bypass``."
+msgstr ""
+"Lorsqu'il vaut ``true``, le contournement est actif à chaque exécution ; "
+"lorsqu'il vaut ``false`` (par défaut), il ne s'active qu'avec "
+"``--cloudflare-bypass``."
+
+#: ../../source/settings.rst:211 9ea31bd9dff64928906a771fff1a2379
+msgid "``trigger_protection``"
+msgstr "``trigger_protection``"
+
+#: ../../source/settings.rst:212 ca70603566b84654ad457beed9aa9d0f
+msgid ""
+"List of ``site.protection`` values that route a check through the "
+"webgate. Sites whose protection is empty or doesn't intersect this list "
+"use the default (aiohttp / curl_cffi) checker."
+msgstr ""
+"Liste des valeurs de ``site.protection`` qui font passer une vérification"
+" par le webgate. Les sites dont la protection est vide, ou ne recoupe pas"
+" cette liste, utilisent le vérificateur par défaut (aiohttp / curl_cffi)."
+
+#: ../../source/settings.rst:215 3bfd5c6ea6404a489dded9f36f7c89f2
+msgid "``session_prefix``"
+msgstr "``session_prefix``"
+
+#: ../../source/settings.rst:216 fff9872f0a094dd6998b4b6967874ec7
+msgid ""
+"Prefix for the FlareSolverr ``session`` field. Maigret appends the "
+"process PID so concurrent runs don't collide. Reusing a session caches "
+"cf_clearance between checks of the same domain."
+msgstr ""
+"Préfixe du champ ``session`` de FlareSolverr. Maigret y ajoute le PID du "
+"processus pour que des exécutions concurrentes n'entrent pas en "
+"collision. Réutiliser une session met en cache le cf_clearance entre les "
+"vérifications d'un même domaine."
+
+#: ../../source/settings.rst:219 9df6df011a394313b225a818cc62c8b9
+msgid "``modules``"
+msgstr "``modules``"
+
+#: ../../source/settings.rst:220 a9fe0c319fb246e9998bebc72113fd48
+msgid ""
+"Ordered list of backend modules. The first reachable module handles the "
+"check; later ones serve as a fallback chain."
+msgstr ""
+"Liste ordonnée des modules de backend. Le premier module joignable traite"
+" la vérification ; les suivants forment une chaîne de repli."
+
+#: ../../source/settings.rst:223 c06ae16380b24123b94106c7e1167569
+msgid "**Module methods.**"
+msgstr "**Méthodes des modules.**"
+
+#: ../../source/settings.rst:225 3d04b828e60845028a7f0481de8f0542
+msgid ""
+"``json_api`` — FlareSolverr-compatible POST endpoint at ``url``. "
+"Preserves real upstream HTTP status, headers and final URL. Optional "
+"``max_timeout_ms`` (default ``60000``) is the per-request budget the "
+"solver is allowed to spend on the JS challenge."
+msgstr ""
+"``json_api`` — point d'entrée POST compatible FlareSolverr à l'adresse "
+"``url``. Préserve le vrai statut HTTP en amont, les en-têtes et l'URL "
+"finale. Le champ facultatif ``max_timeout_ms`` (``60000`` par défaut) est"
+" le budget par requête que le solveur peut consacrer au défi JavaScript."
+
+#: ../../source/settings.rst:229 1420b85d982147069d53596ac7f48bce
+#, python-brace-format
+msgid ""
+"``url_rewrite`` — legacy CloudflareBypassForScraping endpoint. The "
+"``url`` must contain a ``{url}`` placeholder; the original probe URL is "
+"URL-encoded and substituted in. Returns rendered HTML only — ``checkType:"
+" status_code`` and ``response_url`` checks misfire under this method "
+"(treated as a synthetic HTTP 200 on success)."
+msgstr ""
+"``url_rewrite`` — ancien point d'entrée CloudflareBypassForScraping. "
+"L'``url`` doit contenir un emplacement ``{url}`` ; l'URL de sonde "
+"d'origine y est insérée après encodage. Ne renvoie que du HTML rendu : "
+"les vérifications ``checkType: status_code`` et ``response_url`` se "
+"déclenchent donc à tort avec cette méthode (un succès est traité comme un"
+" HTTP 200 synthétique)."
+
+#: ../../source/settings.rst:235 1b9745c5d3af407a9288281aee2fe95e
+msgid "**Optional ``proxy`` field (``json_api`` only).**"
+msgstr "**Champ facultatif ``proxy`` (``json_api`` uniquement).**"
+
+#: ../../source/settings.rst:237 b6c0c59d51a94d08ba4d073fdd37b32e
+msgid ""
+"A module may carry a ``proxy`` entry that the solver routes the upstream "
+"request through. Useful when a site enforces ``ip_reputation`` rules that"
+" block the solver host. Two forms are accepted:"
+msgstr ""
+"Un module peut porter une entrée ``proxy``, par laquelle le solveur fait "
+"passer la requête en amont. C'est utile quand un site applique des règles"
+" d'``ip_reputation`` qui bloquent la machine du solveur. Deux formes sont"
+" acceptées :"
+
+#: ../../source/settings.rst:251 0ac86ff3f5044119a00dbdf68a58a185
+msgid ""
+"Only ``url``/``username``/``password`` are forwarded; other keys are "
+"dropped. Cloudflare ``Error 1015 / 1020`` responses indicate the IP is "
+"rate-limited or banned — switch the proxy rather than retrying. .. _ai-"
+"analysis-settings:"
+msgstr ""
+"Seuls ``url``/``username``/``password`` sont transmis ; les autres clés "
+"sont ignorées. Une réponse Cloudflare ``Error 1015 / 1020`` signale que "
+"l'IP est limitée en débit ou bannie : changez de proxy plutôt que de "
+"réessayer. .. _ai-analysis-settings:"
+
+#: ../../source/settings.rst:257 a1e518dd3b5947d39bd7987a5cc798a5
+msgid "AI analysis"
+msgstr "Analyse par IA"
+
+#: ../../source/settings.rst:259 e19f1fb9a5cc4be5a6b9e128953afeb9
+msgid ""
+"The ``--ai`` flag (see :ref:`ai-analysis`) talks to an OpenAI-compatible "
+"chat completion API. Three settings control how that request is made:"
+msgstr ""
+"L'option ``--ai`` (voir :ref:`ai-analysis`) interroge une API de "
+"complétion de conversation compatible OpenAI. Trois paramètres contrôlent"
+" la façon dont cette requête est faite :"
+
+#: ../../source/settings.rst:269 31b8625625904e5483c9f9639ab2bca1
+msgid "``openai_api_key``"
+msgstr "``openai_api_key``"
+
+#: ../../source/settings.rst:270 2863d798e677471fab8d2b8f48ffbc5a
+msgid "``\"\"`` (empty)"
+msgstr "``\"\"`` (vide)"
+
+#: ../../source/settings.rst:271 26e54b9ec8054552b525569a0a11a5e0
+msgid ""
+"API key. If empty, Maigret falls back to the ``OPENAI_API_KEY`` "
+"environment variable."
+msgstr ""
+"Clé d'API. Si elle est vide, Maigret se rabat sur la variable "
+"d'environnement ``OPENAI_API_KEY``."
+
+#: ../../source/settings.rst:273 ceb65e8a17544b47b0b6efe6d7209ca0
+msgid "``openai_model``"
+msgstr "``openai_model``"
+
+#: ../../source/settings.rst:274 81861a14dba74c349adac984cb651b9f
+msgid "``gpt-4o``"
+msgstr "``gpt-4o``"
+
+#: ../../source/settings.rst:275 6131b48ea228457d9ae08a4fd376b145
+msgid "Default model name. Overridable per-run with ``--ai-model``."
+msgstr ""
+"Nom du modèle par défaut. Remplaçable à chaque exécution avec ``--ai-"
+"model``."
+
+#: ../../source/settings.rst:276 c852e9ea39044dde86a4654d01d1f875
+msgid "``openai_api_base_url``"
+msgstr "``openai_api_base_url``"
+
+#: ../../source/settings.rst:277 5be258415c7a4149817299b196894f5d
+msgid "``https://api.openai.com/v1``"
+msgstr "``https://api.openai.com/v1``"
+
+#: ../../source/settings.rst:278 1369709baf5e4a4687c0a7cd466d5000
+msgid ""
+"Base URL of the chat completion API. Point this at any OpenAI-compatible "
+"service (Azure OpenAI, OpenRouter, a local server, …) to use it instead "
+"of OpenAI directly."
+msgstr ""
+"URL de base de l'API de complétion de conversation. Pointez-la vers "
+"n'importe quel service compatible OpenAI (Azure OpenAI, OpenRouter, un "
+"serveur local, etc.) pour l'utiliser à la place d'OpenAI."
+
+#: ../../source/settings.rst:282 63d2dbcdd40a40f085fffa6529ec3bcf
+msgid "Example ``~/.maigret/settings.json`` snippet using a non-OpenAI endpoint:"
+msgstr ""
+"Exemple d'extrait de ``~/.maigret/settings.json`` utilisant un point "
+"d'entrée autre qu'OpenAI :"
+
+#: ../../source/settings.rst:293 71073712475a480e91641719e3bb8f01
+msgid ""
+"The key resolution order is ``settings.openai_api_key`` → "
+"``OPENAI_API_KEY`` environment variable; the first non-empty value wins."
+msgstr ""
+"L'ordre de résolution de la clé est ``settings.openai_api_key`` → "
+"variable d'environnement ``OPENAI_API_KEY`` ; la première valeur non vide"
+" l'emporte."
+
+#: ../../source/settings.rst:298 f39019712ea04850b9f4cfb253e2ed9e
+msgid ""
+"``--ai`` sends the full internal Markdown report (which contains the "
+"gathered profile data) to the configured endpoint. Only use providers and"
+" accounts you trust with that data."
+msgstr ""
+"``--ai`` envoie au point d'entrée configuré l'intégralité du rapport "
+"Markdown interne, qui contient les données de profil collectées. "
+"N'utilisez donc que des fournisseurs et des comptes auxquels vous confiez"
+" ces données."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/supported-identifier-types.po b/docs/source/locale/fr/LC_MESSAGES/supported-identifier-types.po
new file mode 100644
index 00000000..eabee5b1
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/supported-identifier-types.po
@@ -0,0 +1,151 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/supported-identifier-types.rst:4
+#: 4e3ddb50a05a41aa8214a14b15d3adc2
+msgid "Supported identifier types"
+msgstr "Types d'identifiants pris en charge"
+
+#: ../../source/supported-identifier-types.rst:6
+#: e9df9fe1a98a46fd8df7aece5a7aee6d
+msgid ""
+"Maigret can search against not only ordinary usernames, but also through "
+"certain common identifiers. There is a list of all currently supported "
+"identifiers."
+msgstr ""
+"Maigret peut effectuer des recherches non seulement sur des noms "
+"d'utilisateur ordinaires, mais aussi sur certains identifiants courants. "
+"Voici la liste de tous les identifiants actuellement pris en charge."
+
+#: ../../source/supported-identifier-types.rst:8
+#: f49a3ce4a041444e87b581bc53fbd426
+msgid ""
+"**gaia_id** - Google inner numeric user identifier, in former times was "
+"placed in a Google Plus account URL."
+msgstr ""
+"**gaia_id** - identifiant numérique interne d'un utilisateur Google, "
+"autrefois présent dans l'URL d'un compte Google Plus."
+
+#: ../../source/supported-identifier-types.rst:9
+#: e7a2c873d0d545729a3a56a7a7eceb88
+msgid "**steam_id** - Steam inner numeric user identifier."
+msgstr "**steam_id** - identifiant numérique interne d'un utilisateur Steam."
+
+#: ../../source/supported-identifier-types.rst:10
+#: cb153f404b2b4d7091352146268d2338
+msgid "**wikimapia_uid** - Wikimapia.org inner numeric user identifier."
+msgstr ""
+"**wikimapia_uid** - identifiant numérique interne d'un utilisateur "
+"Wikimapia.org."
+
+#: ../../source/supported-identifier-types.rst:11
+#: fdd65b9f7a4f43079409417deb8061d4
+msgid "**uidme_uguid** - uID.me inner numeric user identifier."
+msgstr "**uidme_uguid** - identifiant numérique interne d'un utilisateur uID.me."
+
+#: ../../source/supported-identifier-types.rst:12
+#: 09f3da88f83149ed966de82bb2fb6fc9
+msgid ""
+"**yandex_public_id** - Yandex sites inner letter user identifier. See "
+"also: `YaSeeker `_."
+msgstr ""
+"**yandex_public_id** - identifiant alphabétique interne d'un utilisateur "
+"des sites Yandex. Voir aussi : `YaSeeker `_."
+
+#: ../../source/supported-identifier-types.rst:13
+#: 7c1bb033f4ce4410b1e785545fe3f596
+msgid "**vk_id** - VK.com inner numeric user identifier."
+msgstr "**vk_id** - identifiant numérique interne d'un utilisateur VK.com."
+
+#: ../../source/supported-identifier-types.rst:14
+#: e9fa70fec80d43c6ae5469e23015687b
+msgid "**ok_id** - OK.ru inner numeric user identifier."
+msgstr "**ok_id** - identifiant numérique interne d'un utilisateur OK.ru."
+
+#: ../../source/supported-identifier-types.rst:15
+#: 33a528dbf2b448878889bc9be31d2cbe
+msgid "**yelp_userid** - Yelp inner user identifier."
+msgstr "**yelp_userid** - identifiant interne d'un utilisateur Yelp."
+
+#: ../../source/supported-identifier-types.rst:16
+#: f508891fe0a6448c83ed1f5239265b72
+msgid ""
+"**qq_id** - QQ (Tencent) numeric account number, also used as the Qzone "
+"profile id."
+msgstr ""
+"**qq_id** - numéro de compte QQ (Tencent), également utilisé comme "
+"identifiant de profil Qzone."
+
+#: ../../source/supported-identifier-types.rst:17
+#: cab2098d1f2e444a8050027f792d61cb
+#, python-brace-format
+msgid ""
+"**bilibili_id** - Bilibili numeric user id (the ``mid`` in a "
+"``space.bilibili.com/{mid}`` profile URL)."
+msgstr ""
+"**bilibili_id** - identifiant numérique d'un utilisateur Bilibili (le "
+"``mid`` dans l'URL de profil ``space.bilibili.com/{mid}``)."
+
+#: ../../source/supported-identifier-types.rst:20
+#: d71124dfbca84622aa08ac9b8d3de901
+msgid "Example"
+msgstr "Exemple"
+
+#: ../../source/supported-identifier-types.rst:22
+#: cd630b1843694f8f81ad45c30a60de23
+msgid ""
+"Pass the identifier as the target and select its type with ``--id-type``."
+" For example, to look up the QQ number ``10001``:"
+msgstr ""
+"Passez l'identifiant comme cible et précisez son type avec ``--id-type``."
+" Par exemple, pour rechercher le numéro QQ ``10001`` :"
+
+#: ../../source/supported-identifier-types.rst:28
+#: 9f2559fbc479410a8add02b958af9dfd
+msgid ""
+"Maigret resolves the account via the Qzone portrait API and, when found, "
+"extracts the nickname and avatar. Any site whose ``type`` does not match "
+"the given ``--id-type`` is skipped, so a plain ``maigret 10001`` (default"
+" ``username``) will not query QQ."
+msgstr ""
+"Maigret résout le compte via l'API des portraits Qzone et, s'il le "
+"trouve, en extrait le pseudonyme et l'avatar. Tout site dont le ``type`` "
+"ne correspond pas au ``--id-type`` fourni est ignoré : un simple "
+"``maigret 10001`` (``username`` par défaut) n'interrogera donc pas QQ."
+
+#: ../../source/supported-identifier-types.rst:30
+#: 3fe42649f19140f99c779b2a13da004e
+msgid ""
+"Or, to look up the Bilibili user id ``2`` (the ``mid`` from "
+"``space.bilibili.com/2``):"
+msgstr ""
+"Ou, pour rechercher l'identifiant d'utilisateur Bilibili ``2`` (le "
+"``mid`` de ``space.bilibili.com/2``) :"
+
+#: ../../source/supported-identifier-types.rst:36
+#: 7b504dd341e7488eb77881a83c9a55a5
+msgid ""
+"Maigret resolves the account via the Bilibili user-card API and, when "
+"found, extracts the nickname, avatar, signature and follower count."
+msgstr ""
+"Maigret résout le compte via l'API de fiche utilisateur de Bilibili et, "
+"s'il le trouve, en extrait le pseudonyme, l'avatar, la signature et le "
+"nombre d'abonnés."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/tags.po b/docs/source/locale/fr/LC_MESSAGES/tags.po
new file mode 100644
index 00000000..04f42e0c
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/tags.po
@@ -0,0 +1,185 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/tags.rst:4 d0898894c3044d8bb72beefefba4506b
+msgid "Tags"
+msgstr "Tags"
+
+#: ../../source/tags.rst:6 6ca5a94c373f4ffaa82b41e62d2b0351
+msgid ""
+"The use of tags allows you to select a subset of the sites from big "
+"Maigret DB for search."
+msgstr ""
+"Les tags permettent de sélectionner, pour une recherche, un sous-ensemble"
+" de sites dans la grande base de Maigret."
+
+#: ../../source/tags.rst:9 0bf981113d014f9c948857e5b9cf6c12
+msgid "Tags markup is still not stable."
+msgstr "Le balisage par tags n'est pas encore stabilisé."
+
+#: ../../source/tags.rst:11 307d8a38b7d24f3aaca7e9f6d50f9f89
+msgid "There are several types of tags:"
+msgstr "Il existe plusieurs types de tags :"
+
+#: ../../source/tags.rst:13 804c2388c8d44b5da2f728db804e108e
+msgid ""
+"**Country codes**: ``us``, ``jp``, ``br``... (`ISO 3166-1 alpha-2 "
+"`_). A country tag "
+"means that having an account on the site implies a connection to that "
+"country — either origin or residence. The goal is attribution, not "
+"perfect accuracy."
+msgstr ""
+"**Codes pays** : ``us``, ``jp``, ``br``... (`ISO 3166-1 alpha-2 "
+"`_). Un tag pays "
+"signifie qu'avoir un compte sur le site implique un lien avec ce pays, "
+"par origine ou par résidence. Le but est l'attribution, pas une "
+"exactitude parfaite."
+
+#: ../../source/tags.rst:15 6d1b4db6ab784ccc9f97bd39eb839aa7
+msgid ""
+"**Global sites** (GitHub, YouTube, Reddit, Medium, etc.) get **no country"
+" tag** — an account there says nothing about where a person is from."
+msgstr ""
+"**Les sites mondiaux** (GitHub, YouTube, Reddit, Medium, etc.) ne "
+"reçoivent **aucun tag pays** : y avoir un compte ne dit rien de l'origine"
+" d'une personne."
+
+#: ../../source/tags.rst:16 6fa52a5c2b9140e88e8da02992263d89
+msgid ""
+"**Regional/local sites** where an account implies a specific country "
+"**must** have a country tag: ``VK`` → ``ru``, ``Naver`` → ``kr``, "
+"``Zhihu`` → ``cn``."
+msgstr ""
+"**Les sites régionaux ou locaux**, où un compte implique un pays précis, "
+"**doivent** porter un tag pays : ``VK`` → ``ru``, ``Naver`` → ``kr``, "
+"``Zhihu`` → ``cn``."
+
+#: ../../source/tags.rst:17 79797bb380154145a63a54699e0dec22
+msgid ""
+"Multiple country tags are allowed when a service is used predominantly in"
+" a few countries (e.g. ``Xing`` → ``de``, ``eu``)."
+msgstr ""
+"Plusieurs tags pays sont admis lorsqu'un service est majoritairement "
+"utilisé dans quelques pays (par exemple ``Xing`` → ``de``, ``eu``)."
+
+#: ../../source/tags.rst:18 f3b5028f93c8463ba11c209f07a11af0
+msgid ""
+"Do **not** assign country tags based on traffic statistics alone — a site"
+" popular in India by traffic is not \"Indian\" if it is used globally."
+msgstr ""
+"N'attribuez **pas** de tag pays sur la seule base des statistiques de "
+"trafic : un site populaire en Inde en volume de trafic n'est pas « indien"
+" » s'il est utilisé dans le monde entier."
+
+#: ../../source/tags.rst:20 b7bf1e92c0434b75be439d4aaf02c4e6
+msgid ""
+"**Site engines**. Most of them are forum engines now: ``uCoz``, "
+"``vBulletin``, ``XenForo`` et al. Full list of engines stored in the "
+"Maigret database."
+msgstr ""
+"**Moteurs de sites**. La plupart sont aujourd'hui des moteurs de forum : "
+"``uCoz``, ``vBulletin``, ``XenForo`` et consorts. La liste complète des "
+"moteurs est stockée dans la base de Maigret."
+
+#: ../../source/tags.rst:22 2e0e7a897ea647f9b0c21c11323c9e0a
+msgid ""
+"**Sites' subject/type and interests of its users**. Full list of "
+"\"standard\" tags is `present in the source code "
+"`_ only "
+"for a moment."
+msgstr ""
+"**Thématique ou type de site, et centres d'intérêt de ses utilisateurs**."
+" La liste complète des tags « standard » n'est pour l'instant `présente "
+"que dans le code source "
+"`_."
+
+#: ../../source/tags.rst:25 cc5161c0bd4246b69140fad2513e9abc
+msgid "Usage"
+msgstr "Utilisation"
+
+#: ../../source/tags.rst:26 b5a35114e48f4be19013c720f9a0e7c3
+msgid ""
+"``--tags us,jp`` -- search on US and Japanese sites (actually marked as "
+"such in the Maigret database)"
+msgstr ""
+"``--tags us,jp`` -- rechercher sur les sites américains et japonais (ceux"
+" qui sont effectivement marqués comme tels dans la base de Maigret)"
+
+#: ../../source/tags.rst:28 e110dee84ee54cf28f7209fc15c22fba
+msgid "``--tags coding`` -- search on sites related to software development."
+msgstr ""
+"``--tags coding`` -- rechercher sur les sites liés au développement "
+"logiciel."
+
+#: ../../source/tags.rst:30 83d737e40edc4e8ab8225029c4a151e0
+msgid "``--tags ucoz`` -- search on uCoz sites only (mostly CIS countries)"
+msgstr ""
+"``--tags ucoz`` -- rechercher uniquement sur les sites uCoz "
+"(principalement dans les pays de la CEI)"
+
+#: ../../source/tags.rst:33 6da443326d5c41eaaa009020d0f5750a
+msgid "Blacklisting (excluding) tags"
+msgstr "Exclure des tags"
+
+#: ../../source/tags.rst:34 8f43b8871bfb445abe634af4b31416d9
+msgid ""
+"You can exclude sites with certain tags from the search using "
+"``--exclude-tags``:"
+msgstr ""
+"Vous pouvez exclure de la recherche les sites portant certains tags avec "
+"``--exclude-tags`` :"
+
+#: ../../source/tags.rst:36 b988c1bff07d4b55b98971506ca4d460
+msgid ""
+"``--exclude-tags porn,dating`` -- skip all sites tagged with ``porn`` or "
+"``dating``."
+msgstr ""
+"``--exclude-tags porn,dating`` -- ignorer tous les sites marqués ``porn``"
+" ou ``dating``."
+
+#: ../../source/tags.rst:38 81f4ce2351c34ab48895b996506d1bde
+msgid "``--exclude-tags ru`` -- skip all Russian sites."
+msgstr "``--exclude-tags ru`` -- ignorer tous les sites russes."
+
+#: ../../source/tags.rst:40 1d37e3fb745843c4b656a01548e5dde1
+msgid ""
+"You can combine ``--tags`` and ``--exclude-tags`` to fine-tune your "
+"search:"
+msgstr ""
+"Vous pouvez combiner ``--tags`` et ``--exclude-tags`` pour affiner la "
+"recherche :"
+
+#: ../../source/tags.rst:42 54fd1187559b4fb68daca202196ba853
+msgid ""
+"``--tags forum --exclude-tags ru`` -- search on forum sites, but skip "
+"Russian ones."
+msgstr ""
+"``--tags forum --exclude-tags ru`` -- rechercher sur les forums, mais en "
+"ignorant les forums russes."
+
+#: ../../source/tags.rst:44 641c53fa9db44ab5bf6575600be686ce
+msgid ""
+"In the web interface, the tag cloud supports three states per tag: click "
+"once to **include** (green), click again to **exclude** "
+"(dark/strikethrough), and click once more to return to **neutral** (red)."
+msgstr ""
+"Dans l'interface web, le nuage de tags propose trois états par tag : un "
+"clic pour **inclure** (vert), un deuxième pour **exclure** "
+"(sombre/barré), et un troisième pour revenir à l'état **neutre** (rouge)."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/tor-and-proxies.po b/docs/source/locale/fr/LC_MESSAGES/tor-and-proxies.po
new file mode 100644
index 00000000..fe802788
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/tor-and-proxies.po
@@ -0,0 +1,356 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/tor-and-proxies.rst:4 fa6f7546f68f4faaa3ec42a09f34b4d0
+msgid "Tor, I2P, and proxies"
+msgstr "Tor, I2P et proxys"
+
+#: ../../source/tor-and-proxies.rst:6 171191cfd184493b9a244848468f6b79
+msgid ""
+"Maigret can route checks through an HTTP/SOCKS proxy, the Tor network, or"
+" I2P. Three CLI flags cover three distinct goals — knowing which one you "
+"need is the most common stumbling block."
+msgstr ""
+"Maigret peut faire passer ses vérifications par un proxy HTTP/SOCKS, par "
+"le réseau Tor ou par I2P. Trois options de ligne de commande couvrent "
+"trois objectifs distincts, et savoir laquelle il vous faut est le point "
+"de confusion le plus fréquent."
+
+#: ../../source/tor-and-proxies.rst:9 e71e2266acee47639dba1726d2f105b6
+msgid "``--proxy`` vs ``--tor-proxy`` (and ``--i2p-proxy``)"
+msgstr "``--proxy`` ou ``--tor-proxy`` (et ``--i2p-proxy``)"
+
+#: ../../source/tor-and-proxies.rst:11 1b6c77669e314f4781ff5266c321fef0
+msgid ""
+"The most-asked question (see `issue #544 "
+"`_):"
+msgstr ""
+"La question la plus posée (voir l'`issue #544 "
+"`_) :"
+
+#: ../../source/tor-and-proxies.rst:13 98ea5fc1c82a41f9a37b009f0aa4e143
+msgid ""
+"**You want every check to go through Tor** (e.g. you're on Tails OS, or "
+"behind a country-level block, or your IP is rate-limited). → Use "
+"``--proxy``, pointing at your Tor SOCKS port:"
+msgstr ""
+"**Vous voulez que toutes les vérifications passent par Tor** (par exemple"
+" sous Tails OS, derrière un blocage national, ou parce que votre IP est "
+"soumise à une limitation de débit). → Utilisez ``--proxy`` en le pointant"
+" sur votre port SOCKS Tor :"
+
+#: ../../source/tor-and-proxies.rst:19 d0830f7ce17e43c28b7d4508bc43a58f
+msgid ""
+"**You want to reach ``.onion`` sites in the Maigret database**, while the"
+" rest of the run still uses your normal connection. → Use ``--tor-"
+"proxy``:"
+msgstr ""
+"**Vous voulez atteindre les sites ``.onion`` de la base de Maigret**, "
+"tandis que le reste de la recherche continue d'utiliser votre connexion "
+"habituelle. → Utilisez ``--tor-proxy`` :"
+
+#: ../../source/tor-and-proxies.rst:25 6a0a1236378540c38daa0fce6bd37467
+msgid ""
+"``--tor-proxy`` is **only** consulted for sites whose ``url`` is a "
+"``.onion`` host. For every other site Maigret uses your direct connection"
+" (or ``--proxy`` if set). Without ``--tor-proxy``, ``.onion`` sites are "
+"silently skipped."
+msgstr ""
+"``--tor-proxy`` n'est consulté **que** pour les sites dont l'``url`` est "
+"un hôte ``.onion``. Pour tous les autres sites, Maigret utilise votre "
+"connexion directe (ou ``--proxy`` s'il est défini). Sans ``--tor-proxy``,"
+" les sites ``.onion`` sont silencieusement ignorés."
+
+#: ../../source/tor-and-proxies.rst:27 045ad9aabb5041d4a691e23e24da4f1c
+msgid ""
+"The same split applies to ``--i2p-proxy``: it is consulted only for "
+"``.i2p`` hosts, never for clearweb sites."
+msgstr ""
+"Le même partage vaut pour ``--i2p-proxy`` : il n'est consulté que pour "
+"les hôtes ``.i2p``, jamais pour les sites du web classique."
+
+#: ../../source/tor-and-proxies.rst:29 6251510d9e294f96a2009752e4ecab50
+msgid ""
+"Defaults: ``--tor-proxy`` defaults to ``socks5://127.0.0.1:9050`` and "
+"``--i2p-proxy`` to ``http://127.0.0.1:4444``. ``--proxy`` has no default."
+" Maigret does **not** launch ``tor`` or an I2P router for you — start the"
+" daemon first."
+msgstr ""
+"Valeurs par défaut : ``--tor-proxy`` vaut ``socks5://127.0.0.1:9050`` et "
+"``--i2p-proxy`` vaut ``http://127.0.0.1:4444``. ``--proxy`` n'a pas de "
+"valeur par défaut. Maigret ne lance **pas** ``tor`` ni de routeur I2P à "
+"votre place : démarrez le démon d'abord."
+
+#: ../../source/tor-and-proxies.rst:32 12112483f3d34d5e85f17f090d3904e8
+msgid "Tor Browser vs system ``tor``: port numbers"
+msgstr "Tor Browser ou ``tor`` système : les numéros de port"
+
+#: ../../source/tor-and-proxies.rst:34 b90ae276b41d47769726848e88af3694
+msgid "The SOCKS port differs by Tor installation:"
+msgstr "Le port SOCKS dépend de l'installation de Tor :"
+
+#: ../../source/tor-and-proxies.rst:36 fdaa66c468b447cbb88ef4984f8c4831
+msgid ""
+"**System ``tor`` daemon** (``apt install tor``, ``brew install tor``, "
+"Tails) listens on ``9050``."
+msgstr ""
+"**Le démon ``tor`` système** (``apt install tor``, ``brew install tor``, "
+"Tails) écoute sur ``9050``."
+
+#: ../../source/tor-and-proxies.rst:37 66adcfa24d5f40088b638e3f29102dc6
+msgid "**Tor Browser bundle** ships its own ``tor`` listening on ``9150``."
+msgstr ""
+"**Le Tor Browser Bundle** embarque son propre ``tor``, qui écoute sur "
+"``9150``."
+
+#: ../../source/tor-and-proxies.rst:39 38d89ff5ac4849c6b130e35e7de91671
+msgid "If a connection refuses, try the other port:"
+msgstr "Si la connexion est refusée, essayez l'autre port :"
+
+#: ../../source/tor-and-proxies.rst:50 1ad8da514e5e44bfacb06c73b2f577ce
+msgid "A note on results over Tor"
+msgstr "Une remarque sur les résultats via Tor"
+
+#: ../../source/tor-and-proxies.rst:52 561fa718451d47a78eefe40558e75b0b
+msgid ""
+"Most public WAFs (Cloudflare, DDoS-Guard, AWS WAF, Akamai) block Tor exit"
+" nodes by default — usually more aggressively than they block datacenter "
+"IPs. A Tor run typically produces **more UNKNOWNs and fewer CLAIMEDs** "
+"than the same run from a residential connection. This is not a bug in "
+"Maigret; it is the cost of anonymity."
+msgstr ""
+"La plupart des WAF publics (Cloudflare, DDoS-Guard, AWS WAF, Akamai) "
+"bloquent les nœuds de sortie Tor par défaut, en général plus "
+"agressivement que les IP de datacenter. Une recherche via Tor produit "
+"donc typiquement **plus de UNKNOWN et moins de CLAIMED** que la même "
+"recherche depuis une connexion résidentielle. Ce n'est pas un bug de "
+"Maigret, c'est le prix de l'anonymat."
+
+#: ../../source/tor-and-proxies.rst:54 f87daa4aeb08476ca863155f04b8dfc7
+msgid "Recommended flags for a Tor run:"
+msgstr "Options recommandées pour une recherche via Tor :"
+
+#: ../../source/tor-and-proxies.rst:60 74e517aacedc483c98933ce39b49f875
+msgid ""
+"``--timeout 60`` — Tor circuits add 1–3 seconds per request; the default "
+"30 s causes spurious timeouts."
+msgstr ""
+"``--timeout 60`` — les circuits Tor ajoutent 1 à 3 secondes par requête ;"
+" les 30 s par défaut provoquent de faux dépassements de délai."
+
+#: ../../source/tor-and-proxies.rst:61 69b6401b67104be98e8919fec581bfee
+msgid ""
+"``--retries 2`` — retries cover transient circuit failures, which are "
+"common on Tor."
+msgstr ""
+"``--retries 2`` — les nouvelles tentatives couvrent les défaillances "
+"passagères de circuit, fréquentes sur Tor."
+
+#: ../../source/tor-and-proxies.rst:62 3cc986f733604f85a76a529455340dd3
+msgid ""
+"Optional ``-n 20`` — lowering concurrency (default 100) reduces the "
+"chance of exits rate-limiting you."
+msgstr ""
+"Éventuellement ``-n 20`` — baisser la concurrence (100 par défaut) réduit"
+" le risque de se faire limiter par les nœuds de sortie."
+
+#: ../../source/tor-and-proxies.rst:64 21bf124edd304df0aedfbb6f3b19e6f7
+msgid ""
+"If you mainly need to bypass WAFs (rather than to remain anonymous), a "
+"residential proxy will usually outperform Tor by a wide margin. See the "
+"**\"Lots of sites fail / timeout / return 403\"** section in "
+"`TROUBLESHOOTING.md "
+"`_."
+msgstr ""
+"Si votre objectif est surtout de contourner les WAF (et non de rester "
+"anonyme), un proxy résidentiel fera en général bien mieux que Tor. Voir "
+"la section **« Lots of sites fail / timeout / return 403 »** dans "
+"`TROUBLESHOOTING.md "
+"`_."
+
+#: ../../source/tor-and-proxies.rst:67 a6bb212ed1bf46a98733fc79cd456ded
+msgid "Running on Tails OS"
+msgstr "Utilisation sous Tails OS"
+
+#: ../../source/tor-and-proxies.rst:69 c9fcdae23de34d1bafbbb43de5107a6e
+msgid ""
+"Tails forces every outbound connection through Tor at the network layer. "
+"Maigret needs no special configuration to comply — pointing ``--proxy`` "
+"at the Tails Tor daemon is enough:"
+msgstr ""
+"Tails force toutes les connexions sortantes à passer par Tor, au niveau "
+"réseau. Maigret n'a besoin d'aucune configuration particulière pour s'y "
+"conformer : pointer ``--proxy`` sur le démon Tor de Tails suffit :"
+
+#: ../../source/tor-and-proxies.rst:75 0abaf5f98caf4efa9afe2fa2ba92fff6
+msgid "Things that are **not** needed:"
+msgstr "Ce qui n'est **pas** nécessaire :"
+
+#: ../../source/tor-and-proxies.rst:77 9e6309b4249443609a2e011b8d8550ac
+msgid ""
+"``torsocks maigret …`` and ``torify maigret …`` — these wrap libc socket "
+"calls, but Maigret's HTTP client (``aiohttp`` / ``curl_cffi``) bypasses "
+"libc for network I/O, so the wrapper has no effect. Use ``--proxy`` "
+"instead."
+msgstr ""
+"``torsocks maigret …`` et ``torify maigret …`` — ces commandes "
+"enveloppent les appels de sockets de la libc, mais le client HTTP de "
+"Maigret (``aiohttp`` / ``curl_cffi``) contourne la libc pour ses entrées-"
+"sorties réseau : l'enveloppe n'a donc aucun effet. Utilisez ``--proxy`` à"
+" la place."
+
+#: ../../source/tor-and-proxies.rst:78 4621d1bb50734600a8b2a3d438452508
+msgid ""
+"``--tor-proxy`` — on Tails, *everything* must go via Tor (the OS enforces"
+" this), so the niche \"only .onion via Tor\" mode that ``--tor-proxy`` "
+"provides does not apply."
+msgstr ""
+"``--tor-proxy`` — sous Tails, *tout* doit passer par Tor (le système "
+"l'impose), donc le mode de niche « uniquement les .onion via Tor » "
+"qu'offre ``--tor-proxy`` ne s'applique pas."
+
+#: ../../source/tor-and-proxies.rst:81 0c3703841ff84c038c799ef8626734e1
+msgid "Installation over Tor on Tails"
+msgstr "Installation via Tor sous Tails"
+
+#: ../../source/tor-and-proxies.rst:83 fa45ad606e2846afabbe8ccce89ba9b3
+msgid ""
+"``pip`` itself does not know about Tor; on Tails you need ``torsocks`` to"
+" wrap it:"
+msgstr ""
+"``pip`` lui-même ne connaît rien à Tor ; sous Tails, il faut l'envelopper"
+" avec ``torsocks`` :"
+
+#: ../../source/tor-and-proxies.rst:89 c4d8e21e134949c78c785038627b1f0a
+msgid ""
+"After install, the binary lands in ``~/.local/bin/maigret``. If "
+"``maigret: command not found``, either add ``~/.local/bin`` to ``PATH`` "
+"or invoke it as ``python3 -m maigret ``."
+msgstr ""
+"Après l'installation, le binaire se trouve dans ``~/.local/bin/maigret``."
+" Si vous obtenez ``maigret: command not found``, ajoutez ``~/.local/bin``"
+" au ``PATH`` ou lancez-le avec ``python3 -m maigret ``."
+
+#: ../../source/tor-and-proxies.rst:92 32d9f33c67b04ae9b554f2eb53526da9
+msgid "Persisting Maigret across Tails sessions"
+msgstr "Conserver Maigret d'une session Tails à l'autre"
+
+#: ../../source/tor-and-proxies.rst:94 374910a59f7e44898db86c0b2dc6f743
+msgid ""
+"Tails wipes ``~/.local/`` on reboot unless you configure the Persistent "
+"Storage to keep it. This is Tails configuration, not Maigret "
+"configuration — see the official Tails docs:"
+msgstr ""
+"Tails efface ``~/.local/`` à chaque redémarrage, sauf si vous configurez "
+"le stockage persistant pour le conserver. Cela relève de la configuration"
+" de Tails, pas de celle de Maigret : voir la documentation officielle de "
+"Tails."
+
+#: ../../source/tor-and-proxies.rst:96 b55d4cc6ea5f451b905f0d8316bccdaa
+msgid ""
+"`Persistent Storage on Tails "
+" `_"
+msgstr ""
+"`Le stockage persistant sur Tails "
+" `_"
+
+#: ../../source/tor-and-proxies.rst:97 2d87c620f5694824bfa6688c2de9422b
+msgid ""
+"`Configuring Persistent Storage features "
+" `_"
+msgstr ""
+"`Configurer les fonctionnalités du stockage persistant "
+" `_"
+
+#: ../../source/tor-and-proxies.rst:99 3c11ded4586246b99b7a399f0d52cf58
+msgid ""
+"A step-by-step recipe contributed by a user (persisting "
+"``~/.local/lib/python3.9`` and ``~/.local/bin`` and patching ``.bashrc``)"
+" is in `issue #544 "
+"`__."
+" Treat it as a starting point: the Python version and Tails internals "
+"change between Tails releases."
+msgstr ""
+"Une recette pas à pas proposée par un utilisateur (conserver "
+"``~/.local/lib/python3.9`` et ``~/.local/bin``, et adapter ``.bashrc``) "
+"se trouve dans l'`issue #544 "
+"`__."
+" Prenez-la comme point de départ : la version de Python et les rouages "
+"internes de Tails changent d'une version de Tails à l'autre."
+
+#: ../../source/tor-and-proxies.rst:102 fbf222bfd6304e13815575af814fdd3f
+msgid "Reports on Tails — where to save them"
+msgstr "Les rapports sous Tails : où les enregistrer"
+
+#: ../../source/tor-and-proxies.rst:104 50579126fd04472caa715826fe9018ea
+msgid ""
+"The default ``reports/`` directory lives next to the working directory "
+"and is wiped with the amnesiac session. To save reports somewhere "
+"persistent, either pass ``-fo``:"
+msgstr ""
+"Le répertoire ``reports/`` par défaut se trouve à côté du répertoire de "
+"travail et disparaît avec la session amnésique. Pour enregistrer les "
+"rapports à un endroit persistant, passez ``-fo`` :"
+
+#: ../../source/tor-and-proxies.rst:110 51bef7dd6fe648b299e2b01fb58470ed
+msgid ""
+"or set ``\"reports_path\"`` in your ``settings.json`` to a persistent "
+"path. See :doc:`settings`."
+msgstr ""
+"ou définissez ``\"reports_path\"`` dans votre ``settings.json`` avec un "
+"chemin persistant. Voir :doc:`settings`."
+
+#: ../../source/tor-and-proxies.rst:113 30b403ee53ab4f95bc005902e4cdfbf8
+msgid "Programmatic equivalents (Python library)"
+msgstr "Équivalents programmatiques (bibliothèque Python)"
+
+#: ../../source/tor-and-proxies.rst:115 3b01135fb81e45ba8ada55ff186d97e9
+msgid ""
+"The same options are available through the Python API. See :doc:`library-"
+"usage` — the relevant keyword arguments are ``proxy=``, ``tor_proxy=`` "
+"and ``i2p_proxy=``, accepting the same URL formats as the CLI flags."
+msgstr ""
+"Les mêmes options sont disponibles via l'API Python. Voir :doc:`library-"
+"usage` : les arguments nommés correspondants sont ``proxy=``, "
+"``tor_proxy=`` et ``i2p_proxy=``, et ils acceptent les mêmes formats "
+"d'URL que les options de la ligne de commande."
+
+#: ../../source/tor-and-proxies.rst:118 590b68e4e6bf436190e1b915a38a9873
+msgid "See also"
+msgstr "Voir aussi"
+
+#: ../../source/tor-and-proxies.rst:120 de259856ac8948ff9d4f65ba07320707
+msgid ":doc:`command-line-options` — full reference for the three flags."
+msgstr ":doc:`command-line-options` — la référence complète des trois options."
+
+#: ../../source/tor-and-proxies.rst:121 8e7c5aeb11da4c6eb400e7ffb4dd486a
+msgid ""
+"`TROUBLESHOOTING.md "
+"`_ — quick"
+" recipes for ``.onion`` / I2P sites and for WAF-induced 403s."
+msgstr ""
+"`TROUBLESHOOTING.md "
+"`_ — des "
+"recettes rapides pour les sites ``.onion`` / I2P et pour les 403 "
+"provoqués par un WAF."
+
+#: ../../source/tor-and-proxies.rst:122 900071a16a8f4bb18dc8374f5eff6740
+msgid ":doc:`library-usage` — proxy options for embedded use."
+msgstr ":doc:`library-usage` — les options de proxy pour un usage embarqué."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/usage-examples.po b/docs/source/locale/fr/LC_MESSAGES/usage-examples.po
new file mode 100644
index 00000000..0c654f9c
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/usage-examples.po
@@ -0,0 +1,143 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/usage-examples.rst:4 f63f7ddec3f94e128aceb617a25999c6
+msgid "Usage examples"
+msgstr "Exemples d'utilisation"
+
+#: ../../source/usage-examples.rst:6 7fa1788c3e694e36ad28dab71e1b20da
+msgid "You can use Maigret as:"
+msgstr "Vous pouvez utiliser Maigret :"
+
+#: ../../source/usage-examples.rst:8 3146fce50ff449ab95f9382aa0ee3a4e
+msgid "a command line tool: initial and a default mode"
+msgstr "en ligne de commande : le mode initial et par défaut"
+
+#: ../../source/usage-examples.rst:9 b99de81bfb5a487cad6416c4acc3c62b
+msgid ""
+"a `web interface <#web-interface>`_: view the graph with results and "
+"download all report formats on a single page"
+msgstr ""
+"via une `interface web <#web-interface>`_ : afficher le graphe des "
+"résultats et télécharger tous les formats de rapport depuis une seule "
+"page"
+
+#: ../../source/usage-examples.rst:10 bd5f91f517374dbfb04b2858221aabf0
+msgid "a library: integrate Maigret into your own project"
+msgstr "comme bibliothèque : intégrer Maigret à votre propre projet"
+
+#: ../../source/usage-examples.rst:13 2fb65b9f51bf44ed8b03e0f5dc2db402
+msgid "Use Cases"
+msgstr "Cas d'usage"
+
+#: ../../source/usage-examples.rst:16 3406325edcf545cb80589b1aefc01dd4
+msgid ""
+"Search for accounts with username ``machine42`` on top 500 sites (by "
+"default, according to Majestic Million rank) from the Maigret DB."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` sur les"
+" 500 premiers sites (par défaut, selon le classement Majestic Million) de"
+" la base de Maigret."
+
+#: ../../source/usage-examples.rst:22 fb1b3df0e08d4a27a4fdf731dbc96371
+msgid ""
+"Search for accounts with username ``machine42`` on **all sites** from the"
+" Maigret DB."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` sur "
+"**tous les sites** de la base de Maigret."
+
+#: ../../source/usage-examples.rst:29 76e664ed9de14dacad8b986c02ec566d
+msgid ""
+"Maigret will search for accounts on a huge number of sites, and some of "
+"them may return false positive results. At the moment, we are working on "
+"autorepair mode to deliver the most accurate results."
+msgstr ""
+"Maigret recherche des comptes sur un très grand nombre de sites, et "
+"certains d'entre eux peuvent renvoyer des faux positifs. Nous travaillons"
+" actuellement sur un mode de réparation automatique afin de fournir les "
+"résultats les plus précis possible."
+
+#: ../../source/usage-examples.rst:33 9582720f4e424daa8f46de69ec95a43f
+msgid "If you experience many false positives, you can do the following:"
+msgstr "Si vous rencontrez beaucoup de faux positifs, vous pouvez procéder ainsi :"
+
+#: ../../source/usage-examples.rst:35 150ca233315d43f99412c013883038fc
+msgid "Install the last development version of Maigret from GitHub"
+msgstr "Installer la dernière version de développement de Maigret depuis GitHub"
+
+#: ../../source/usage-examples.rst:36 bf9c9afb734f4245b0e5ff0a11cb7dda
+msgid ""
+"Run Maigret with ``--self-check --auto-disable`` flag and agree on "
+"disabling of problematic sites"
+msgstr ""
+"Lancer Maigret avec les options ``--self-check --auto-disable`` et "
+"accepter la désactivation des sites problématiques"
+
+#: ../../source/usage-examples.rst:38 27110026e8bc43bc91e7e4b3f475d788
+msgid ""
+"Search for accounts with username ``machine42`` and generate HTML and PDF"
+" reports."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` et "
+"générer des rapports HTML et PDF."
+
+#: ../../source/usage-examples.rst:44 964877386e19484f860bb041f0238431
+msgid "or"
+msgstr "ou"
+
+#: ../../source/usage-examples.rst:51 092bce4e7bb343d28f76d0e22e6b2b9f
+msgid "Search for accounts with username ``machine42`` on Facebook only."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` sur "
+"Facebook uniquement."
+
+#: ../../source/usage-examples.rst:57 294b7878d0bb406483c31185847d61ae
+msgid ""
+"Extract information from the Steam page by URL and start a search for "
+"accounts with found username ``machine42``."
+msgstr ""
+"Extraire les informations d'une page Steam à partir de son URL, puis "
+"lancer une recherche de comptes avec le nom d'utilisateur ``machine42`` "
+"ainsi trouvé."
+
+#: ../../source/usage-examples.rst:63 f9e86af822e44c17bfbf626ab152ef9e
+msgid ""
+"Search for accounts with username ``machine42`` only on US and Japanese "
+"sites."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` "
+"uniquement sur les sites américains et japonais."
+
+#: ../../source/usage-examples.rst:69 9d16792882d1486f99e7dbcd1aa62a0f
+msgid ""
+"Search for accounts with username ``machine42`` only on sites related to "
+"software development."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` "
+"uniquement sur les sites liés au développement logiciel."
+
+#: ../../source/usage-examples.rst:75 473b81473b344deea48862316675f99a
+msgid ""
+"Search for accounts with username ``machine42`` on uCoz sites only "
+"(mostly CIS countries)."
+msgstr ""
+"Rechercher des comptes portant le nom d'utilisateur ``machine42`` "
+"uniquement sur les sites uCoz (principalement dans les pays de la CEI)."
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/use-cases/crypto.po b/docs/source/locale/fr/LC_MESSAGES/use-cases/crypto.po
new file mode 100644
index 00000000..1c9e717d
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/use-cases/crypto.po
@@ -0,0 +1,563 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/use-cases/crypto.rst:4 ad5968f74ecb4ec89aef75ae544fbc29
+msgid "Cryptocurrency & Web3 Investigations"
+msgstr "Enquêtes cryptomonnaies et Web3"
+
+#: ../../source/use-cases/crypto.rst:6 4e690b83e18b47a695f9367062c40134
+msgid ""
+"Blockchain transactions are public, but the people behind wallets are "
+"not. Maigret helps bridge this gap by finding Web3 accounts tied to a "
+"username, revealing the person behind a pseudonymous crypto persona."
+msgstr ""
+"Les transactions de la blockchain sont publiques, mais pas les personnes "
+"derrière les portefeuilles. Maigret aide à combler cet écart en "
+"retrouvant les comptes Web3 liés à un nom d'utilisateur, et révèle ainsi "
+"la personne derrière une identité crypto pseudonyme."
+
+#: ../../source/use-cases/crypto.rst:9 f73fcb5f2a8a48b89855e0e3f0b9ab93
+msgid "Why it matters"
+msgstr "Pourquoi c'est important"
+
+#: ../../source/use-cases/crypto.rst:11 0b01faa3fff84d91a337f6ec1debd594
+msgid ""
+"Crypto investigations often start with a wallet address or an ENS name "
+"but hit a wall — the blockchain tells you *what* happened, not *who* did "
+"it. A username, however, is reused across platforms. If someone trades on"
+" OpenSea as ``zachxbt`` and posts on Warpcast as ``zachxbt``, Maigret "
+"connects the dots and builds a full profile."
+msgstr ""
+"Les enquêtes crypto partent souvent d'une adresse de portefeuille ou d'un"
+" nom ENS, puis se heurtent à un mur : la blockchain dit *ce qui* s'est "
+"passé, pas *qui* l'a fait. Un nom d'utilisateur, en revanche, est "
+"réutilisé d'une plateforme à l'autre. Si quelqu'un échange sur OpenSea "
+"sous le pseudo ``zachxbt`` et publie sur Warpcast sous ``zachxbt``, "
+"Maigret relie les points et construit un profil complet."
+
+#: ../../source/use-cases/crypto.rst:13 428909a013294e51a223ae633ba9dac0
+msgid "Common scenarios:"
+msgstr "Scénarios courants :"
+
+#: ../../source/use-cases/crypto.rst:15 9c839780b8bc41569e798989b8aeab1c
+msgid ""
+"**Scam attribution.** A rug-pull promoter uses the same alias on Fragment"
+" (Telegram username marketplace), OpenSea, and a personal blog."
+msgstr ""
+"**Attribution d'une arnaque.** Le promoteur d'un rug pull utilise le même"
+" pseudo sur Fragment (la place de marché des noms d'utilisateur "
+"Telegram), sur OpenSea et sur un blog personnel."
+
+#: ../../source/use-cases/crypto.rst:16 b9582bc453a641fbb09ef0a1cc695be6
+msgid ""
+"**Sanctions compliance.** Verifying whether a counterparty's online "
+"footprint matches known sanctioned individuals."
+msgstr ""
+"**Conformité aux sanctions.** Vérifier si l'empreinte en ligne d'une "
+"contrepartie correspond à des personnes connues comme sanctionnées."
+
+#: ../../source/use-cases/crypto.rst:17 03a16ee8ce7e40079d0def9b98ca8af3
+msgid ""
+"**Due diligence.** Before an OTC deal or DAO vote, checking whether the "
+"other party has a consistent online presence or is a freshly created "
+"sockpuppet."
+msgstr ""
+"**Due diligence.** Avant une transaction de gré à gré ou un vote de DAO, "
+"vérifier si l'autre partie a une présence en ligne cohérente ou s'il "
+"s'agit d'une marionnette fraîchement créée."
+
+#: ../../source/use-cases/crypto.rst:18 64d680470eb04e43b8eae25764ed4717
+msgid ""
+"**Stolen funds tracing.** A stolen NFT appears on OpenSea under a new "
+"account — but the username matches a Warpcast profile with real-world "
+"links."
+msgstr ""
+"**Traçage de fonds volés.** Un NFT volé réapparaît sur OpenSea sous un "
+"nouveau compte, mais le nom d'utilisateur correspond à un profil Warpcast"
+" qui comporte des liens vers le monde réel."
+
+#: ../../source/use-cases/crypto.rst:21 21c7efb026774d378ba1f99d2fedf131
+msgid "Supported sites"
+msgstr "Sites pris en charge"
+
+#: ../../source/use-cases/crypto.rst:23 aa04605c201b48328b689aec29b54564
+msgid "Maigret currently checks the following crypto and Web3 platforms:"
+msgstr "Maigret vérifie actuellement les plateformes crypto et Web3 suivantes :"
+
+#: ../../source/use-cases/crypto.rst:29 74d2ab3196234ed0a24bba6f77d7e1a6
+msgid "Site"
+msgstr "Site"
+
+#: ../../source/use-cases/crypto.rst:30 1c327513f9e2490f959352ef7472620e
+msgid "What it reveals"
+msgstr "Ce qu'il révèle"
+
+#: ../../source/use-cases/crypto.rst:31 a37a5624f8664bedb4664d2b7e86e1c0
+msgid "Notes"
+msgstr "Remarques"
+
+#: ../../source/use-cases/crypto.rst:32 e8b649cb3f8c4d66bfbf3b304840d3d4
+msgid "**OpenSea**"
+msgstr "**OpenSea**"
+
+#: ../../source/use-cases/crypto.rst:33 0bf75621ef5e445c8d6e735b28f052b8
+msgid "NFT collections, trading history, profile bio, linked website"
+msgstr ""
+"Collections de NFT, historique des échanges, biographie du profil, site "
+"web associé"
+
+#: ../../source/use-cases/crypto.rst:35 b642c2d480ae4503bbcf961c8e8b5f67
+msgid "**Rarible**"
+msgstr "**Rarible**"
+
+#: ../../source/use-cases/crypto.rst:36 2cf8e4b6305f403f88583da83cd69453
+msgid "NFT marketplace profile, collections, listing history"
+msgstr "Profil de place de marché NFT, collections, historique des mises en vente"
+
+#: ../../source/use-cases/crypto.rst:37 455441ef60704ddfb6c542417e8670ef
+msgid "Complements OpenSea for NFT attribution across marketplaces"
+msgstr "Complète OpenSea pour l'attribution de NFT d'une place de marché à l'autre"
+
+#: ../../source/use-cases/crypto.rst:38 df35b69bc3664e2091b7aa51004eed7a
+msgid "**Zora**"
+msgstr "**Zora**"
+
+#: ../../source/use-cases/crypto.rst:39 bfa1623d071449ea9b10b54231dd1466
+msgid "Zora Network profile, minted NFTs, creator activity"
+msgstr "Profil Zora Network, NFT frappés, activité de créateur"
+
+#: ../../source/use-cases/crypto.rst:40 563ccd10999449e695f04a52cf817e22
+msgid "Ethereum L2 creator platform; useful for on-chain art attribution"
+msgstr ""
+"Plateforme de créateurs sur un L2 Ethereum ; utile pour l'attribution "
+"d'art on-chain"
+
+#: ../../source/use-cases/crypto.rst:41 b6edd130b2d7463488219cef179f7c07
+msgid "**Polymarket**"
+msgstr "**Polymarket**"
+
+#: ../../source/use-cases/crypto.rst:42 4456236df6d64e4b9ea67cd20f27ed47
+msgid "Prediction-market profile, positions, public portfolio P&L"
+msgstr ""
+"Profil sur le marché prédictif, positions, gains et pertes du "
+"portefeuille public"
+
+#: ../../source/use-cases/crypto.rst:43 cc25827172b0419fa04045aab5448eb3
+msgid "Useful for political/financial prediction attribution"
+msgstr "Utile pour l'attribution de prédictions politiques ou financières"
+
+#: ../../source/use-cases/crypto.rst:44 f34a2f9604b14a2a92750483eebddfed
+msgid "**Warpcast** (Farcaster)"
+msgstr "**Warpcast** (Farcaster)"
+
+#: ../../source/use-cases/crypto.rst:45 b4094c34bd824915b7b07cadc1d2325d
+msgid "Decentralized social profile, posts, follower graph, Farcaster ID"
+msgstr ""
+"Profil social décentralisé, publications, graphe d'abonnés, identifiant "
+"Farcaster"
+
+#: ../../source/use-cases/crypto.rst:46 956648fde130495390d546d664d4cde0
+msgid ""
+"Every Farcaster ID maps to an Ethereum address via the on-chain ID "
+"registry"
+msgstr ""
+"Chaque identifiant Farcaster correspond à une adresse Ethereum via le "
+"registre d'identifiants on-chain"
+
+#: ../../source/use-cases/crypto.rst:47 6441dd6494ee4c2981e526fb4cd6ae3f
+msgid "**Fragment**"
+msgstr "**Fragment**"
+
+#: ../../source/use-cases/crypto.rst:48 e7cd915496c648c6a5d3cae77464ae25
+msgid "Telegram username ownership, TON wallet address, purchase date and price"
+msgstr ""
+"Propriété d'un nom d'utilisateur Telegram, adresse de portefeuille TON, "
+"date et prix d'achat"
+
+#: ../../source/use-cases/crypto.rst:49 3915106557874a708db74a66627f5995
+msgid "Valuable for linking Telegram identities to TON wallets"
+msgstr "Précieux pour relier des identités Telegram à des portefeuilles TON"
+
+#: ../../source/use-cases/crypto.rst:50 d70a37c44d6c4c5792604c9b10295974
+msgid "**Paragraph**"
+msgstr "**Paragraph**"
+
+#: ../../source/use-cases/crypto.rst:51 06abf366d32647cdad079565e676c65a
+msgid "Web3 blog/newsletter, ETH wallet address, linked Twitter handle"
+msgstr ""
+"Blog ou newsletter Web3, adresse de portefeuille ETH, compte Twitter "
+"associé"
+
+#: ../../source/use-cases/crypto.rst:52 1782e0619d884ee4ab6b300cdb7bd99e
+msgid "Richest cross-platform data among crypto sites"
+msgstr "Les données inter-plateformes les plus riches parmi les sites crypto"
+
+#: ../../source/use-cases/crypto.rst:53 394ec42393ab49b4950f473012e4003f
+msgid "**Tonometerbot**"
+msgstr "**Tonometerbot**"
+
+#: ../../source/use-cases/crypto.rst:54 ad20409e25f64f0a8fdbf76976afdb35
+msgid "TON wallet balance, subscriber count, NFT collection, rankings"
+msgstr ""
+"Solde du portefeuille TON, nombre d'abonnés, collection de NFT, "
+"classements"
+
+#: ../../source/use-cases/crypto.rst:55 6155483eaa594eb2b7299147ec38be1f
+msgid "TON blockchain analytics"
+msgstr "Analyse de la blockchain TON"
+
+#: ../../source/use-cases/crypto.rst:56 5d08b167816c45629afd8f3c75cb566c
+msgid "**Spatial**"
+msgstr "**Spatial**"
+
+#: ../../source/use-cases/crypto.rst:57 c4bc4d772e534f43848a6badacdde61e
+msgid ""
+"Metaverse profile, linked social accounts (Discord, Twitter, Instagram, "
+"LinkedIn, TikTok)"
+msgstr ""
+"Profil metaverse, comptes sociaux associés (Discord, Twitter, Instagram, "
+"LinkedIn, TikTok)"
+
+#: ../../source/use-cases/crypto.rst:58 35dc8e345fa04e50948bea44b38d905c
+msgid "Rich cross-platform links"
+msgstr "Nombreux liens inter-plateformes"
+
+#: ../../source/use-cases/crypto.rst:59 4df056e2f6fc41faab036e7d982d68cd
+msgid "**Revolut.me**"
+msgstr "**Revolut.me**"
+
+#: ../../source/use-cases/crypto.rst:60 78c7530532aa4477839d9feff980bae3
+msgid ""
+"Payment handle: first/last name, country code, base currency, supported "
+"payment methods"
+msgstr ""
+"Identifiant de paiement : prénom et nom, code pays, devise de référence, "
+"moyens de paiement acceptés"
+
+#: ../../source/use-cases/crypto.rst:61 d3608dbc954b4bff93a1babddfe28cdc
+msgid ""
+"Not strictly Web3, but widely used by crypto OTC traders for fiat off-"
+"ramps; the public API returns structured KYC-adjacent data"
+msgstr ""
+"Pas vraiment du Web3, mais très utilisé par les traders crypto de gré à "
+"gré pour convertir en monnaie fiduciaire ; l'API publique renvoie des "
+"données structurées proches du KYC"
+
+#: ../../source/use-cases/crypto.rst:64 64ea641f9f484d36af8aeeba844aa40b
+msgid "Real-world example: zachxbt"
+msgstr "Un exemple réel : zachxbt"
+
+#: ../../source/use-cases/crypto.rst:66 e8c55d73d1fa41cfbcc66b5df9e8d507
+msgid ""
+"`ZachXBT `_ is a well-known on-chain "
+"investigator. Let's see what Maigret can find from just the username "
+"``zachxbt``:"
+msgstr ""
+"`ZachXBT `_ est un enquêteur on-chain bien "
+"connu. Voyons ce que Maigret trouve à partir du seul nom d'utilisateur "
+"``zachxbt`` :"
+
+#: ../../source/use-cases/crypto.rst:72 10e57caefe734f94b05a25e173bcdefe
+msgid ""
+"Maigret finds 5 accounts and automatically extracts structured data from "
+"each:"
+msgstr ""
+"Maigret trouve 5 comptes et en extrait automatiquement des données "
+"structurées :"
+
+#: ../../source/use-cases/crypto.rst:74 3617b511943a493ab596981f956c9a86
+msgid ""
+"**Fragment** — confirms the Telegram username ``@zachxbt`` is claimed, "
+"reveals the TON wallet address (``EQBisZrk...``), purchase price (10 "
+"TON), and date (January 2023)."
+msgstr ""
+"**Fragment** — confirme que le nom d'utilisateur Telegram ``@zachxbt`` "
+"est pris, révèle l'adresse du portefeuille TON (``EQBisZrk...``), le prix"
+" d'achat (10 TON) et la date (janvier 2023)."
+
+#: ../../source/use-cases/crypto.rst:76 ffb9995d96bb427b8346b03e69940a91
+msgid ""
+"**Paragraph** — the richest result. Returns the real name used on the "
+"platform (``ZachXBT``), bio (``Scam survivor turned 2D investigator``), "
+"an Ethereum wallet address (``0x23dBf066...``), and a linked Twitter "
+"handle (``zachxbt``). The ``wallet_address`` field is especially valuable"
+" — it directly links the pseudonym to an on-chain identity."
+msgstr ""
+"**Paragraph** — le résultat le plus riche. Il renvoie le nom réel utilisé"
+" sur la plateforme (``ZachXBT``), la biographie (``Scam survivor turned "
+"2D investigator``), une adresse de portefeuille Ethereum "
+"(``0x23dBf066...``) et un compte Twitter associé (``zachxbt``). Le champ "
+"``wallet_address`` est particulièrement précieux : il relie directement "
+"le pseudonyme à une identité on-chain."
+
+#: ../../source/use-cases/crypto.rst:78 30bc828de2384a779def798b7e020704
+msgid ""
+"**Warpcast** — Farcaster profile with a Farcaster ID (``fid: 20931``), "
+"profile image, and social graph (33K followers). Every Farcaster ID is "
+"tied to an Ethereum address via the on-chain ID registry, so this is "
+"another on-chain anchor."
+msgstr ""
+"**Warpcast** — profil Farcaster avec un identifiant Farcaster (``fid: "
+"20931``), une photo de profil et un graphe social (33 000 abonnés). "
+"Chaque identifiant Farcaster est lié à une adresse Ethereum via le "
+"registre d'identifiants on-chain : voilà donc un autre point d'ancrage "
+"on-chain."
+
+#: ../../source/use-cases/crypto.rst:80 72082fea4d4a4e3e87496872b0443734
+msgid ""
+"**OpenSea** — NFT marketplace profile with bio (``On-chain sleuth | 10x "
+"rug pull survivor``), avatar (hosted on ``seadn.io`` with an Ethereum "
+"address in the URL path), and a link to an external investigations page."
+msgstr ""
+"**OpenSea** — profil de place de marché NFT avec une biographie (``On-"
+"chain sleuth | 10x rug pull survivor``), un avatar (hébergé sur "
+"``seadn.io``, avec une adresse Ethereum dans le chemin de l'URL) et un "
+"lien vers une page d'enquêtes externe."
+
+#: ../../source/use-cases/crypto.rst:82 ae0b864542004812bea0fbc8152a5d8d
+msgid ""
+"**Hive Blog** — blockchain-based blog account created in March 2025. Low "
+"activity (1 post), but confirms the username is claimed across blockchain"
+" ecosystems."
+msgstr ""
+"**Hive Blog** — compte de blog sur blockchain créé en mars 2025. Peu "
+"d'activité (1 publication), mais cela confirme que le nom d'utilisateur "
+"est pris dans les écosystèmes blockchain."
+
+#: ../../source/use-cases/crypto.rst:84 819b44f6666a4fc0b768b411bcc3e7f5
+msgid "From a single username, Maigret produces:"
+msgstr "À partir d'un seul nom d'utilisateur, Maigret produit :"
+
+#: ../../source/use-cases/crypto.rst:86 b70bb3546f9947bbb20aa33a50b53d75
+msgid ""
+"**2 wallet addresses** — one TON (from Fragment), one Ethereum (from "
+"Paragraph)"
+msgstr ""
+"**2 adresses de portefeuille** — une TON (via Fragment), une Ethereum "
+"(via Paragraph)"
+
+#: ../../source/use-cases/crypto.rst:87 9785a32767ce470284606aa06a490d9f
+msgid "**1 confirmed Twitter handle** — ``zachxbt`` (from Paragraph)"
+msgstr "**1 compte Twitter confirmé** — ``zachxbt`` (via Paragraph)"
+
+#: ../../source/use-cases/crypto.rst:88 e0bcc86d5b8b46b5a197d5ca7724e36d
+msgid "**1 Telegram username** — ``@zachxbt`` (from Fragment)"
+msgstr "**1 nom d'utilisateur Telegram** — ``@zachxbt`` (via Fragment)"
+
+#: ../../source/use-cases/crypto.rst:89 27b0ecce165740a98ced8efa87d8be6c
+msgid "**1 external link** — ``investigations.notion.site`` (from OpenSea)"
+msgstr "**1 lien externe** — ``investigations.notion.site`` (via OpenSea)"
+
+#: ../../source/use-cases/crypto.rst:90 8b3cd61f67004c7bbdb2f543efcb7497
+msgid "**Social graph data** — 33K Farcaster followers, blog activity timestamps"
+msgstr ""
+"**Des données de graphe social** — 33 000 abonnés Farcaster, horodatages "
+"de l'activité du blog"
+
+#: ../../source/use-cases/crypto.rst:92 1ad051a0bb96496ab3f1e712d8020c67
+msgid ""
+"This is enough to pivot into blockchain analysis tools (Etherscan, "
+"Arkham, Nansen) using the wallet addresses, or into social media analysis"
+" using the Twitter handle."
+msgstr ""
+"C'est assez pour rebondir vers des outils d'analyse blockchain "
+"(Etherscan, Arkham, Nansen) grâce aux adresses de portefeuille, ou vers "
+"l'analyse des réseaux sociaux grâce au compte Twitter."
+
+#: ../../source/use-cases/crypto.rst:95 0a44f303252b423d8a1d7cdac7a4a7e2
+msgid "Workflow: from username to wallet"
+msgstr "Méthode : du nom d'utilisateur au portefeuille"
+
+#: ../../source/use-cases/crypto.rst:97 c6611f6f46384343a8bbad6a96c9b7b8
+msgid "**Step 1: Search crypto platforms**"
+msgstr "**Étape 1 : chercher sur les plateformes crypto**"
+
+#: ../../source/use-cases/crypto.rst:103 d64c8d200f3a45219c275796f59be0b7
+msgid "Review the results. Pay attention to:"
+msgstr "Passez les résultats en revue. Regardez en particulier :"
+
+#: ../../source/use-cases/crypto.rst:105 b7062a8925d5403e99ec0445316071de
+msgid ""
+"**Fragment** — if the username is claimed, you get a TON wallet address "
+"directly."
+msgstr ""
+"**Fragment** — si le nom d'utilisateur est pris, vous obtenez directement"
+" une adresse de portefeuille TON."
+
+#: ../../source/use-cases/crypto.rst:106 5c13573ef4c5406081cc741e4ec92221
+msgid ""
+"**Paragraph** — blog profiles often contain an ETH address and a Twitter "
+"handle."
+msgstr ""
+"**Paragraph** — les profils de blog contiennent souvent une adresse ETH "
+"et un compte Twitter."
+
+#: ../../source/use-cases/crypto.rst:107 f5ad2cc976594773894e3e5c07913d3c
+msgid ""
+"**Warpcast** — Farcaster IDs map to Ethereum addresses via the on-chain "
+"registry."
+msgstr ""
+"**Warpcast** — les identifiants Farcaster correspondent à des adresses "
+"Ethereum via le registre on-chain."
+
+#: ../../source/use-cases/crypto.rst:108 41f7062dca4142a78f5b9a421560dd74
+msgid "**OpenSea** — avatar URLs sometimes contain wallet addresses in the path."
+msgstr ""
+"**OpenSea** — les URL d'avatar contiennent parfois des adresses de "
+"portefeuille dans leur chemin."
+
+#: ../../source/use-cases/crypto.rst:110 90b45493a4904b10a8ee0e556e178e44
+msgid "**Step 2: Expand with extracted identifiers**"
+msgstr "**Étape 2 : élargir avec les identifiants extraits**"
+
+#: ../../source/use-cases/crypto.rst:112 24abbd1123d84029b19f16109c85b0d8
+msgid ""
+"Maigret automatically extracts additional identifiers from found profiles"
+" (real names, linked accounts, profile URLs) and recursively searches for"
+" them. This is enabled by default. If Maigret finds a linked Twitter "
+"handle on a Paragraph profile, it will automatically search for that "
+"handle across all sites."
+msgstr ""
+"Maigret extrait automatiquement des identifiants supplémentaires des "
+"profils trouvés (noms réels, comptes associés, URL de profil) et les "
+"recherche à son tour, de façon récursive. Cette fonction est activée par "
+"défaut. Si Maigret trouve un compte Twitter associé sur un profil "
+"Paragraph, il recherchera automatiquement ce compte sur tous les sites."
+
+#: ../../source/use-cases/crypto.rst:114 08463a16d98d46bd9f240ccfb4e04e05
+msgid "**Step 3: Cross-reference with non-crypto platforms**"
+msgstr "**Étape 3 : recouper avec les plateformes non crypto**"
+
+#: ../../source/use-cases/crypto.rst:116 41434769c1ba43a586e9d1511fc64b6e
+msgid ""
+"The real power is connecting crypto personas to mainstream accounts. Drop"
+" the tag filter:"
+msgstr ""
+"La vraie puissance consiste à relier des identités crypto à des comptes "
+"grand public. Retirez le filtre par tag :"
+
+#: ../../source/use-cases/crypto.rst:122 dde1e0066e7f4488aae95c979134e2b1
+msgid ""
+"This checks all 3000+ sites. A match on GitHub, Reddit, or a forum can "
+"reveal the person behind the wallet."
+msgstr ""
+"Cela vérifie plus de 3 000 sites. Une correspondance sur GitHub, sur "
+"Reddit ou sur un forum peut révéler la personne derrière le portefeuille."
+
+#: ../../source/use-cases/crypto.rst:125 6997e5e52cb24fcab99dd0e437adee62
+msgid "Workflow: from wallet to identity"
+msgstr "Méthode : du portefeuille à l'identité"
+
+#: ../../source/use-cases/crypto.rst:127 9386d3fcae5e42ecbda223074e6e6cd0
+msgid ""
+"If you start with a wallet address rather than a username, you can use "
+"complementary tools to get a username first:"
+msgstr ""
+"Si vous partez d'une adresse de portefeuille plutôt que d'un nom "
+"d'utilisateur, des outils complémentaires permettent d'obtenir d'abord un"
+" nom d'utilisateur :"
+
+#: ../../source/use-cases/crypto.rst:129 64b47fd982bc4a35afcf41c4170445e1
+msgid ""
+"**ENS / Unstoppable Domains** — resolve the wallet address to a human-"
+"readable name (``vitalik.eth``). Then search that name in Maigret."
+msgstr ""
+"**ENS / Unstoppable Domains** — résoudre l'adresse du portefeuille en un "
+"nom lisible (``vitalik.eth``). Recherchez ensuite ce nom dans Maigret."
+
+#: ../../source/use-cases/crypto.rst:130 d129a77a233f45ba8454b34f24cdef3d
+msgid ""
+"**Etherscan labels** — check if the address has a public label (exchange,"
+" known entity)."
+msgstr ""
+"**Étiquettes Etherscan** — vérifier si l'adresse porte une étiquette "
+"publique (plateforme d'échange, entité connue)."
+
+#: ../../source/use-cases/crypto.rst:131 f2fdef2540214fc3a9fcc3561c2d9c10
+msgid ""
+"**Fragment** — search the TON wallet address to find which Telegram "
+"usernames it purchased."
+msgstr ""
+"**Fragment** — rechercher l'adresse du portefeuille TON pour savoir quels"
+" noms d'utilisateur Telegram elle a achetés."
+
+#: ../../source/use-cases/crypto.rst:132 abc6d3019c7c4c22865bcb86eb41e7b5
+msgid ""
+"**Arkham Intelligence / Nansen** — blockchain attribution platforms that "
+"may tag the address with a known identity."
+msgstr ""
+"**Arkham Intelligence / Nansen** — des plateformes d'attribution "
+"blockchain, susceptibles d'associer l'adresse à une identité connue."
+
+#: ../../source/use-cases/crypto.rst:134 033a0ba3d36d430283c6a12956018fd5
+msgid "Once you have a username candidate, feed it to Maigret."
+msgstr "Une fois un nom d'utilisateur candidat en main, donnez-le à Maigret."
+
+#: ../../source/use-cases/crypto.rst:137 2ce159d123b14d288c5d33703af6f3bc
+msgid "Tips"
+msgstr "Conseils"
+
+#: ../../source/use-cases/crypto.rst:139 956c475b1ca54dd4a5deadc9977207da
+msgid ""
+"**Username reuse is the #1 signal.** Crypto-native users often reuse "
+"their ENS name (``alice.eth``) or a variation (``alice_eth``, "
+"``aliceeth``) across platforms. Try all variations."
+msgstr ""
+"**La réutilisation du nom d'utilisateur est le signal numéro un.** Les "
+"utilisateurs nés dans la crypto réutilisent souvent leur nom ENS "
+"(``alice.eth``) ou une variante (``alice_eth``, ``aliceeth``) d'une "
+"plateforme à l'autre. Essayez toutes les variantes."
+
+#: ../../source/use-cases/crypto.rst:140 7b8f774e36fe49d5bff1cb2b41795ff2
+msgid ""
+"**Fragment is uniquely valuable** because it directly links Telegram "
+"usernames to TON wallet addresses — a rare on-chain / off-chain bridge."
+msgstr ""
+"**Fragment a une valeur unique**, car il relie directement des noms "
+"d'utilisateur Telegram à des adresses de portefeuille TON : un pont on-"
+"chain / off-chain rare."
+
+#: ../../source/use-cases/crypto.rst:141 04ce594675e048e1b5c68685ad64803a
+msgid ""
+"**Warpcast profiles are Ethereum-native.** Every Farcaster account is "
+"tied to an Ethereum address via the ID registry contract. If you find a "
+"Warpcast profile, you implicitly have a wallet address."
+msgstr ""
+"**Les profils Warpcast sont nativement liés à Ethereum.** Chaque compte "
+"Farcaster est rattaché à une adresse Ethereum via le contrat de registre "
+"d'identifiants. Trouver un profil Warpcast, c'est donc disposer "
+"implicitement d'une adresse de portefeuille."
+
+#: ../../source/use-cases/crypto.rst:142 63a2fb8b549042b59231e844f8564901
+msgid ""
+"**Paragraph often has the richest data** — wallet address, Twitter "
+"handle, bio, and activity timestamps in a single API response."
+msgstr ""
+"**Paragraph offre souvent les données les plus riches** : adresse de "
+"portefeuille, compte Twitter, biographie et horodatages d'activité, le "
+"tout dans une seule réponse d'API."
+
+#: ../../source/use-cases/crypto.rst:143 550dc55e4dd94524b296fbc402354403
+msgid ""
+"**Use** ``--exclude-tags`` **to skip irrelevant sites** when you're "
+"focused on crypto:"
+msgstr ""
+"**Utilisez** ``--exclude-tags`` **pour écarter les sites hors sujet** "
+"lorsque vous vous concentrez sur la crypto :"
+
diff --git a/docs/source/locale/fr/LC_MESSAGES/use-cases/scientists.po b/docs/source/locale/fr/LC_MESSAGES/use-cases/scientists.po
new file mode 100644
index 00000000..8276bc71
--- /dev/null
+++ b/docs/source/locale/fr/LC_MESSAGES/use-cases/scientists.po
@@ -0,0 +1,485 @@
+# French translation of the Maigret documentation.
+# Copyright (C) 2025, soxoj
+# This file is distributed under the same license as the Maigret package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Maigret 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-09-15 17:05+0200\n"
+"PO-Revision-Date: 2026-09-15 17:20+0200\n"
+"Last-Translator: \n"
+"Language: fr\n"
+"Language-Team: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.18.0\n"
+
+#: ../../source/use-cases/scientists.rst:4 ee298635fb4742a48e2945efa81688f8
+msgid "Academic & Research Investigations"
+msgstr "Enquêtes universitaires et scientifiques"
+
+#: ../../source/use-cases/scientists.rst:6 e6975c6d0c6f447a9c6a23b397d56e10
+msgid ""
+"Academic identity has a unique anchor that social-media identity does "
+"not: the **ORCID** (Open Researcher and Contributor ID). Every ORCID is "
+"verified, globally unique, and tied to a confirmed email — a single "
+"confirmed ORCID match between two platforms means the **same human**, "
+"with effectively zero false-positive rate."
+msgstr ""
+"L'identité universitaire dispose d'un point d'ancrage que l'identité des "
+"réseaux sociaux n'a pas : l'**ORCID** (Open Researcher and Contributor "
+"ID). Chaque ORCID est vérifié, unique au monde et rattaché à une adresse "
+"e-mail confirmée. Une seule correspondance d'ORCID confirmée entre deux "
+"plateformes signifie donc qu'il s'agit du **même être humain**, avec un "
+"taux de faux positifs pratiquement nul."
+
+#: ../../source/use-cases/scientists.rst:8 951b76d507194d8c94cf29a7c89354c8
+msgid ""
+"Maigret uses ORCID as a first-class identifier: extract it once from a "
+"username-keyed profile (iNaturalist, GitHub bio, lab homepage), then "
+"pivot into the academic graph (ORCID, OpenAlex, arXiv, DBLP, Scholia) — a"
+" chain of HTTP calls that turns an anonymous handle into a CV with "
+"employer, education, publication list, citation count, co-author graph, "
+"and topical area."
+msgstr ""
+"Maigret traite l'ORCID comme un identifiant de premier rang : extrayez-le"
+" une fois depuis un profil indexé par nom d'utilisateur (iNaturalist, "
+"biographie GitHub, page d'un laboratoire), puis rebondissez dans le "
+"graphe universitaire (ORCID, OpenAlex, arXiv, DBLP, Scholia). Cette "
+"chaîne d'appels HTTP transforme un pseudo anonyme en CV, avec employeur, "
+"formation, liste de publications, nombre de citations, graphe de co-"
+"auteurs et domaines de recherche."
+
+#: ../../source/use-cases/scientists.rst:11 ed48f48ba1f048e5b57a8b0deeaddef5
+msgid "Why it matters"
+msgstr "Pourquoi c'est important"
+
+#: ../../source/use-cases/scientists.rst:13 0707507f77414ba4aa1f1098298d5e61
+msgid ""
+"Most OSINT work on academic targets stalls at the same bottleneck: people"
+" use one alias on a citizen-science site, a different alias on Twitter, a"
+" third in a forum signature, and only their real name on PubMed. "
+"Connecting the personas by hand means trawling Google Scholar, "
+"ResearchGate, university web pages, and old conference programmes. ORCID "
+"short-circuits this entirely — one verified identifier resolves all of "
+"them."
+msgstr ""
+"La plupart des travaux OSINT sur des cibles universitaires butent sur le "
+"même goulot d'étranglement : les gens utilisent un pseudo sur un site de "
+"science participative, un autre sur Twitter, un troisième dans la "
+"signature d'un forum, et leur vrai nom uniquement sur PubMed. Relier ces "
+"identités à la main suppose de ratisser Google Scholar, ResearchGate, les"
+" pages des universités et de vieux programmes de conférences. L'ORCID "
+"court-circuite tout cela : un seul identifiant vérifié les résout toutes."
+
+#: ../../source/use-cases/scientists.rst:15 a21c00e5e60e42458fa6d6a08f0a1d15
+msgid "Common scenarios:"
+msgstr "Scénarios courants :"
+
+#: ../../source/use-cases/scientists.rst:17 0d6ca7debd5d44aea14c0d24101f5e71
+msgid ""
+"**Researcher background check.** Before a collaboration, a preprint "
+"review, or a grant decision — verifying that a claimed h-index, "
+"employment history, and publication count actually match the public ORCID"
+" record."
+msgstr ""
+"**Vérification du parcours d'un chercheur.** Avant une collaboration, la "
+"relecture d'une préimpression ou une décision de financement, vérifier "
+"qu'un indice h annoncé, un parcours professionnel et un nombre de "
+"publications correspondent bien au dossier ORCID public."
+
+#: ../../source/use-cases/scientists.rst:18 8e40cd767dec4332a379f3682699a1c3
+msgid ""
+"**Co-author graph reconstruction.** From a single ORCID, OpenAlex returns"
+" every co-author, their institutions, and topical clusters — useful for "
+"spotting undisclosed conflicts of interest."
+msgstr ""
+"**Reconstitution du graphe de co-auteurs.** À partir d'un seul ORCID, "
+"OpenAlex renvoie tous les co-auteurs, leurs institutions et leurs "
+"regroupements thématiques, ce qui aide à repérer des conflits d'intérêts "
+"non déclarés."
+
+#: ../../source/use-cases/scientists.rst:19 e03c81341117451e99b83d91c7314c2d
+msgid ""
+"**Paper mill / fraud investigation.** When a suspicious paper's authors "
+"share an ORCID-claimed identity, the cross-platform footprint (or absence"
+" of one) is itself evidence."
+msgstr ""
+"**Enquête sur une usine à articles ou une fraude.** Lorsque les auteurs "
+"d'un article suspect partagent une identité revendiquée par un ORCID, "
+"l'empreinte inter-plateformes, ou son absence, constitue en soi un "
+"indice."
+
+#: ../../source/use-cases/scientists.rst:20 ce7f90e5993848f6ba33e6907f0a5ec9
+msgid ""
+"**Pseudonym deanonymisation.** A wildlife photographer posts naturalist "
+"observations under the handle ``kueda``. iNaturalist's public API returns"
+" their ORCID, and one further request reveals their real name, employer "
+"(California Academy of Sciences), education (UC Berkeley), and 700+ "
+"citable observations."
+msgstr ""
+"**Désanonymisation d'un pseudonyme.** Un photographe animalier publie ses"
+" observations naturalistes sous le pseudo ``kueda``. L'API publique "
+"d'iNaturalist renvoie son ORCID, et une requête de plus révèle son vrai "
+"nom, son employeur (California Academy of Sciences), sa formation (UC "
+"Berkeley) et plus de 700 observations citables."
+
+#: ../../source/use-cases/scientists.rst:21 db11da3e39074a36b5765df716326430
+msgid ""
+"**Award / appointment due diligence.** Confirming a Turing-Award claim, a"
+" tenure status, or a society fellowship via the DBLP and ORCID activity "
+"timelines rather than a CV PDF."
+msgstr ""
+"**Due diligence sur une récompense ou une nomination.** Confirmer "
+"l'obtention d'un prix Turing, une titularisation ou une distinction d'une"
+" société savante à partir des chronologies d'activité DBLP et ORCID, "
+"plutôt qu'à partir d'un CV en PDF."
+
+#: ../../source/use-cases/scientists.rst:24 a178ac647726484a84ef53f127734613
+msgid "Supported sites"
+msgstr "Sites pris en charge"
+
+#: ../../source/use-cases/scientists.rst:26 10b6d6aeb0f1409fb0aa1b088a5bc5c7
+msgid ""
+"Maigret currently checks the following ORCID-keyed platforms (use ``--id-"
+"type orcid`` when starting from a bare ORCID, or rely on the recursive "
+"chain when starting from a username):"
+msgstr ""
+"Maigret vérifie actuellement les plateformes indexées par ORCID suivantes"
+" (utilisez ``--id-type orcid`` si vous partez d'un ORCID seul, ou laissez"
+" faire la chaîne récursive si vous partez d'un nom d'utilisateur) :"
+
+#: ../../source/use-cases/scientists.rst:32 3f65871241f84c0e8e101c8537eda85a
+msgid "Site"
+msgstr "Site"
+
+#: ../../source/use-cases/scientists.rst:33 03ff3bfe5ab54bb2979013d8d1c23fc8
+msgid "What it reveals"
+msgstr "Ce qu'il révèle"
+
+#: ../../source/use-cases/scientists.rst:34 804b0a7b47f64aab951de81195af0bc0
+msgid "Notes"
+msgstr "Remarques"
+
+#: ../../source/use-cases/scientists.rst:35 ca39813258694acaaa241fdf366d9e4d
+msgid "**ORCID**"
+msgstr "**ORCID**"
+
+#: ../../source/use-cases/scientists.rst:36 54a63873fa1740008b556fb13f8090f5
+msgid ""
+"Full name, biography, employment, education, researcher URLs (homepages "
+"and social), keywords, country, linked external IDs (Scopus, "
+"ResearcherID, Loop), publication summary, email-verified status"
+msgstr ""
+"Nom complet, biographie, emploi, formation, URL du chercheur (pages "
+"personnelles et réseaux sociaux), mots-clés, pays, identifiants externes "
+"associés (Scopus, ResearcherID, Loop), résumé des publications, statut de"
+" vérification de l'e-mail"
+
+#: ../../source/use-cases/scientists.rst:37 1b41a5076121434e831dfee66091796e
+msgid ""
+"All disciplines — ORCID is a field-agnostic identifier issued to any "
+"researcher."
+msgstr ""
+"Toutes les disciplines : l'ORCID est un identifiant indépendant du "
+"domaine, délivré à tout chercheur."
+
+#: ../../source/use-cases/scientists.rst:38 f97f67a7ee96484fb9eef1e6f0d11ea1
+msgid "**OpenAlex**"
+msgstr "**OpenAlex**"
+
+#: ../../source/use-cases/scientists.rst:39 3c9c15e70646477fa5fb3dc23d7bd5f7
+msgid ""
+"Display name and name alternatives, works count, total citations, "
+"h-index, i10-index, last-known institutions (with country), topical "
+"areas, raw author-name variants from publications"
+msgstr ""
+"Nom affiché et variantes de nom, nombre de travaux, total des citations, "
+"indice h, indice i10, dernières institutions connues (avec le pays), "
+"domaines thématiques, variantes brutes du nom d'auteur issues des "
+"publications"
+
+#: ../../source/use-cases/scientists.rst:40 ce4c81289ac74c9bbacccec349db2df9
+msgid ""
+"All disciplines — indexes works across the entire scholarly literature, "
+"from humanities to medicine."
+msgstr ""
+"Toutes les disciplines : il indexe les travaux de toute la littérature "
+"scientifique, des sciences humaines à la médecine."
+
+#: ../../source/use-cases/scientists.rst:41 f007230daa414d54922bc1025b0e8d90
+msgid "**arXiv**"
+msgstr "**arXiv**"
+
+#: ../../source/use-cases/scientists.rst:42 582078eee6e84c0da02cbd5fbeaf6dea
+msgid "Author preprint listing — paper titles, IDs, dates"
+msgstr ""
+"Liste des préimpressions de l'auteur : titres, identifiants et dates des "
+"articles"
+
+#: ../../source/use-cases/scientists.rst:43 bddc096db3e949eeac716f08857bba0b
+msgid ""
+"Strongly biased toward physics, math, CS (and quantitative biology, "
+"statistics, EE, quantitative finance, economics)."
+msgstr ""
+"Fortement orienté physique, mathématiques et informatique (ainsi que "
+"biologie quantitative, statistiques, génie électrique, finance "
+"quantitative et économie)."
+
+#: ../../source/use-cases/scientists.rst:44 dfeed256081e4cdba98f7a0dc34b62cc
+msgid "**DBLP**"
+msgstr "**DBLP**"
+
+#: ../../source/use-cases/scientists.rst:45 09b26e4280694028b8858f837ed04f9d
+msgid ""
+"Full name, DBLP person ID, paper count, affiliation, awards (e.g. Turing "
+"Award), homepage URLs, links to Google Scholar / ResearchGate / Scopus"
+msgstr ""
+"Nom complet, identifiant DBLP de la personne, nombre d'articles, "
+"affiliation, récompenses (prix Turing, par exemple), URL de pages "
+"personnelles, liens vers Google Scholar / ResearchGate / Scopus"
+
+#: ../../source/use-cases/scientists.rst:46 79307d06313c4a64b193a320dc19e081
+msgid ""
+"Computer science only — a biologist or pure economist will not be in the "
+"index."
+msgstr ""
+"Informatique uniquement : un biologiste ou un économiste pur ne figurera "
+"pas dans l'index."
+
+#: ../../source/use-cases/scientists.rst:47 9f6da096997544caa7cb79b109c3eb9f
+msgid "**Scholia**"
+msgstr "**Scholia**"
+
+#: ../../source/use-cases/scientists.rst:48 813bb08484964990b333ccfdd8cbbfe4
+msgid ""
+"Wikidata QID for the author, linked publications, co-author graph, "
+"employer/affiliation timeline, topical clusters"
+msgstr ""
+"QID Wikidata de l'auteur, publications associées, graphe de co-auteurs, "
+"chronologie des employeurs et affiliations, regroupements thématiques"
+
+#: ../../source/use-cases/scientists.rst:49 a1b58b6ea56a42c1bb357dedd13ca055
+msgid ""
+"All disciplines, but only if the author has been curated in Wikidata — "
+"coverage is broadest for prominent figures (award winners, senior "
+"faculty, deceased researchers)."
+msgstr ""
+"Toutes les disciplines, mais uniquement si l'auteur a été référencé dans "
+"Wikidata ; la couverture est la plus large pour les figures en vue "
+"(lauréats de prix, professeurs de rang élevé, chercheurs décédés)."
+
+#: ../../source/use-cases/scientists.rst:52 de06a749073b46328f9aea93e421fefe
+msgid "Workflow: from username to ORCID"
+msgstr "Méthode : du nom d'utilisateur à l'ORCID"
+
+#: ../../source/use-cases/scientists.rst:54 5891cccad461443091c2e7927af13841
+msgid "**Step 1: Find a profile that publishes ORCID**"
+msgstr "**Étape 1 : trouver un profil qui publie un ORCID**"
+
+#: ../../source/use-cases/scientists.rst:56 c94819f103da4cfc8ec58159de9f585d
+msgid ""
+"The most reliable bridges from a username to an ORCID are platforms whose"
+" users *want* their academic identity discoverable. In practice:"
+msgstr ""
+"Les passerelles les plus fiables entre un nom d'utilisateur et un ORCID "
+"sont les plateformes dont les utilisateurs *souhaitent* que leur identité"
+" universitaire soit trouvable. En pratique :"
+
+#: ../../source/use-cases/scientists.rst:58 af0ebe5051a9413283aa3c86bf2ead8b
+#, python-brace-format
+msgid ""
+"**iNaturalist** — biologists, naturalists, citizen scientists. Public API"
+" ``api.inaturalist.org/v1/users/{username}`` returns the ORCID directly "
+"in the ``orcid`` field. Maigret extracts it automatically."
+msgstr ""
+"**iNaturalist** — biologistes, naturalistes, scientifiques amateurs. "
+"L'API publique ``api.inaturalist.org/v1/users/{username}`` renvoie "
+"directement l'ORCID dans le champ ``orcid``. Maigret l'extrait "
+"automatiquement."
+
+#: ../../source/use-cases/scientists.rst:59 c46df7f429da4704b01deacdada3972a
+#, python-brace-format
+msgid ""
+"**GitHub** — scientists often paste their ORCID URL into the **bio** or "
+"**blog** field on their GitHub profile, or under a *generic* entry in "
+"``/users/{u}/social_accounts``. A pattern like "
+"``orcid\\.org/(\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX])`` matches both "
+"``http://orcid.org/...`` and ``orcid.org/...`` variants."
+msgstr ""
+"**GitHub** — les scientifiques collent souvent l'URL de leur ORCID dans "
+"le champ **bio** ou **blog** de leur profil GitHub, ou dans une entrée "
+"*generic* de ``/users/{u}/social_accounts``. Un motif comme "
+"``orcid\\.org/(\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX])`` capture aussi bien "
+"les variantes ``http://orcid.org/...`` que ``orcid.org/...``."
+
+#: ../../source/use-cases/scientists.rst:60 9aff91d6847f427aab3845da0b17f789
+msgid ""
+"**Lab homepage / institutional bio.** Use ``--parse `` to scrape an "
+"arbitrary page for known identifiers — useful when the target's footprint"
+" lives at ``faculty.example.edu/~jdoe``."
+msgstr ""
+"**Page d'un laboratoire ou biographie institutionnelle.** Utilisez "
+"``--parse `` pour extraire les identifiants connus d'une page "
+"quelconque : utile quand l'empreinte de la cible se trouve à "
+"``faculty.example.edu/~jdoe``."
+
+#: ../../source/use-cases/scientists.rst:62 a4b9e1231c484587ad3ee03658d3f0f1
+msgid "**Step 2: Let the recursive search run**"
+msgstr "**Étape 2 : laisser tourner la recherche récursive**"
+
+#: ../../source/use-cases/scientists.rst:68 60b30eddb42343e4bd9ee036d8b17301
+msgid ""
+"Recursive search is enabled by default. As soon as Maigret extracts an "
+"``orcid`` field from any found profile, it queues an ``--id-type orcid`` "
+"second wave automatically. No manual chaining needed."
+msgstr ""
+"La recherche récursive est activée par défaut. Dès que Maigret extrait un"
+" champ ``orcid`` d'un profil trouvé, il met automatiquement en file "
+"d'attente une deuxième vague en ``--id-type orcid``. Aucun enchaînement "
+"manuel n'est nécessaire."
+
+#: ../../source/use-cases/scientists.rst:70 d7f8ce57148949bd97e19554276d3274
+msgid "**Step 3: Start from a bare ORCID**"
+msgstr "**Étape 3 : partir d'un ORCID seul**"
+
+#: ../../source/use-cases/scientists.rst:72 38d34cdd4316459ca47872c652aa6521
+msgid ""
+"If you already have the ORCID (e.g. from a paper's author footer, a grant"
+" database, or a Wikidata entry):"
+msgstr ""
+"Si vous disposez déjà de l'ORCID (repris du pied de page des auteurs d'un"
+" article, d'une base de données de financements ou d'une fiche Wikidata) "
+":"
+
+#: ../../source/use-cases/scientists.rst:78 f708738f23654018827a8decf9ebe403
+msgid "This bypasses the username-bridge step entirely."
+msgstr "Cela évite complètement l'étape de la passerelle par nom d'utilisateur."
+
+#: ../../source/use-cases/scientists.rst:81 457da1bf6f0f434e9e55a60cfce9f633
+msgid "Workflow: from ORCID to mainstream identity"
+msgstr "Méthode : de l'ORCID à l'identité grand public"
+
+#: ../../source/use-cases/scientists.rst:83 28a7cf74523b4964b3fb48bf8c97ffd4
+msgid ""
+"The ORCID record itself contains the link back to ordinary social "
+"platforms:"
+msgstr ""
+"Le dossier ORCID lui-même contient le chemin de retour vers les "
+"plateformes sociales ordinaires :"
+
+#: ../../source/use-cases/scientists.rst:85 20779e6815804c14b7954df92c053c1e
+msgid ""
+"**ORCID ``researcher-urls``** — a list of self-declared external links. "
+"Typical entries: lab homepage, Twitter/Bluesky/Mastodon profile, personal"
+" blog. These are entered by the researcher and therefore confirmed."
+msgstr ""
+"**Les ``researcher-urls`` d'ORCID** — une liste de liens externes "
+"déclarés par le chercheur. On y trouve typiquement la page du "
+"laboratoire, un profil Twitter/Bluesky/Mastodon ou un blog personnel. "
+"Comme ils sont saisis par le chercheur, ils sont confirmés."
+
+#: ../../source/use-cases/scientists.rst:86 db3d799271fb4908a688ae71a915c16a
+msgid ""
+"**ORCID ``external-identifiers``** — IDs from sibling academic systems "
+"(Scopus Author ID, ResearcherID/Publons, Loop profile). Each unlocks "
+"another extraction pipeline."
+msgstr ""
+"**Les ``external-identifiers`` d'ORCID** — des identifiants issus de "
+"systèmes universitaires voisins (Scopus Author ID, ResearcherID/Publons, "
+"profil Loop). Chacun ouvre une nouvelle chaîne d'extraction."
+
+#: ../../source/use-cases/scientists.rst:87 0fcfe145df09492db565f203dfec1a46
+msgid ""
+"**OpenAlex ``last_known_institutions``** — current employer with country,"
+" ROR ID, and OpenAlex institution ID; useful for pivoting into the "
+"institution's directory."
+msgstr ""
+"**Les ``last_known_institutions`` d'OpenAlex** — l'employeur actuel avec "
+"son pays, son identifiant ROR et son identifiant d'institution OpenAlex ;"
+" utile pour rebondir vers l'annuaire de l'établissement."
+
+#: ../../source/use-cases/scientists.rst:88 2f353ffc031b4ce5acb3693d1994cfb6
+msgid ""
+"**DBLP** ```` **tags** — DBLP records often embed direct links to "
+"Google Scholar, ResearchGate, and personal pages."
+msgstr ""
+"**Les balises** ```` **de DBLP** — les fiches DBLP intègrent souvent"
+" des liens directs vers Google Scholar, ResearchGate et des pages "
+"personnelles."
+
+#: ../../source/use-cases/scientists.rst:89 68839ebbc7fa4b54bdd9f8234a71e7d6
+msgid ""
+"**Scholia ``wikidata_qid``** — once you have a Wikidata QID, the SPARQL "
+"endpoint unlocks the broadest external ID set in any single OSINT system:"
+" VIAF, LCCN, GND, Twitter handle, Mastodon handle, IMDb, GitHub, ORCID, "
+"and ~200 others."
+msgstr ""
+"**Le ``wikidata_qid`` de Scholia** — une fois le QID Wikidata en main, le"
+" point d'accès SPARQL ouvre l'ensemble d'identifiants externes le plus "
+"large de tous les systèmes OSINT : VIAF, LCCN, GND, compte Twitter, "
+"compte Mastodon, IMDb, GitHub, ORCID, et environ deux cents autres."
+
+#: ../../source/use-cases/scientists.rst:92 cda3de64d967460bad46e0cf70ef7881
+msgid "Tips"
+msgstr "Conseils"
+
+#: ../../source/use-cases/scientists.rst:94 399546fd2d2a4aa3a35b86e2ec768d2f
+msgid ""
+"**Email comes from ORCID** — within the academic chain (ORCID, OpenAlex, "
+"arXiv, DBLP, Scholia) it is the only source that returns an email "
+"address, and only when the researcher has marked their primary email "
+"public. The same response also carries ``history.verified-primary-"
+"email``, an ORCID-confirmed flag that means the address was email-"
+"validated at registration. Use this as a strong pivot into email-keyed "
+"lookups (Holehe, HIBP, Gravatar, etc.)."
+msgstr ""
+"**L'e-mail vient d'ORCID.** Dans la chaîne universitaire (ORCID, "
+"OpenAlex, arXiv, DBLP, Scholia), c'est la seule source qui renvoie une "
+"adresse e-mail, et uniquement si le chercheur a rendu publique son "
+"adresse principale. La même réponse porte aussi ``history.verified-"
+"primary-email``, un indicateur confirmé par ORCID qui signifie que "
+"l'adresse a été validée par e-mail lors de l'inscription. C'est un "
+"excellent point de pivot vers les recherches par e-mail (Holehe, HIBP, "
+"Gravatar, etc.)."
+
+#: ../../source/use-cases/scientists.rst:95 4d19a19bbc1e4d7db060191d281c3d16
+msgid ""
+"**Outside the academic chain, GitLab is the dev platform most likely to "
+"leak an email** via its public ``public_email`` field — relevant for "
+"scientists who self-host code on a CERN/research-institute GitLab. "
+"GitHub's REST API does not expose email by default."
+msgstr ""
+"**En dehors de la chaîne universitaire, GitLab est la plateforme de "
+"développement la plus susceptible de laisser fuiter un e-mail**, via son "
+"champ public ``public_email`` : cela concerne les scientifiques qui "
+"hébergent leur code sur le GitLab du CERN ou d'un institut de recherche. "
+"L'API REST de GitHub, elle, n'expose pas l'e-mail par défaut."
+
+#: ../../source/use-cases/scientists.rst:96 1df0af5167e840019bf394062fc398a4
+msgid ""
+"**Compare OpenAlex** ``raw_author_names`` **against the ORCID** ``other-"
+"names``. Discrepancies often expose pre-marriage names, transliterations "
+"from non-Latin scripts, or co-author misattributions worth flagging."
+msgstr ""
+"**Comparez les** ``raw_author_names`` **d'OpenAlex aux** ``other-names`` "
+"**d'ORCID.** Les écarts révèlent souvent des noms de jeune fille, des "
+"translittérations depuis des écritures non latines, ou des attributions "
+"erronées de co-auteurs, qu'il vaut la peine de signaler."
+
+#: ../../source/use-cases/scientists.rst:97 6a915278a67a4998b3ac1e611999893d
+#, python-brace-format
+msgid ""
+"**Anything fed into** ``--id-type orcid`` **must match** "
+"``^\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX]$``. The trailing character may "
+"legitimately be ``X`` (ISO checksum); strip ``https://orcid.org/`` "
+"prefixes before passing the bare ID."
+msgstr ""
+"**Tout ce que vous passez à** ``--id-type orcid`` **doit correspondre à**"
+" ``^\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX]$``. Le dernier caractère peut "
+"légitimement être un ``X`` (somme de contrôle ISO) ; retirez le préfixe "
+"``https://orcid.org/`` avant de passer l'identifiant nu."
+
diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/development.po b/docs/source/locale/zh_CN/LC_MESSAGES/development.po
index fd234b3e..a1e307d9 100644
--- a/docs/source/locale/zh_CN/LC_MESSAGES/development.po
+++ b/docs/source/locale/zh_CN/LC_MESSAGES/development.po
@@ -970,12 +970,12 @@ msgstr "翻译"
msgid ""
"The docs are translated via Sphinx's standard gettext workflow. English "
"``.rst`` files are the source of truth; translations live as ``.po`` "
-"catalogs under ``docs/source/locale//LC_MESSAGES/`` (currently only"
-" ``zh_CN``)."
+"catalogs under ``docs/source/locale//LC_MESSAGES/`` (currently "
+"``zh_CN`` and ``fr``)."
msgstr ""
"文档通过 Sphinx 的标准 gettext 工作流进行翻译。英文 ``.rst`` 文件是事实来源(source of truth);翻译以 "
-"``.po`` 目录形式存放在 ``docs/source/locale//LC_MESSAGES/`` 之下(目前只有 "
-"``zh_CN``)。"
+"``.po`` 目录形式存放在 ``docs/source/locale//LC_MESSAGES/`` 之下(目前有 "
+"``zh_CN`` 和 ``fr``)。"
#: ../../source/development.rst:366 92131512d2e146ebbc98e23c3fb2bb53
msgid ""