recup sources
This commit is contained in:
parent
86622a19ea
commit
65fe2a35f9
155 changed files with 50969 additions and 0 deletions
577
wiki_compare/README.md
Normal file
577
wiki_compare/README.md
Normal file
|
@ -0,0 +1,577 @@
|
|||
# OSM Wiki Compare
|
||||
|
||||
Ce projet contient des scripts pour analyser les pages wiki d'OpenStreetMap, identifier celles qui ont besoin de mises à
|
||||
jour ou de traductions, et publier des suggestions sur Mastodon pour encourager la communauté à contribuer.
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Le projet comprend onze scripts principaux :
|
||||
|
||||
1. **wiki_compare.py** : Récupère les 50 clés OSM les plus utilisées, compare leurs pages wiki en anglais et en
|
||||
français, et identifie celles qui ont besoin de mises à jour.
|
||||
2. **post_outdated_page.py** : Sélectionne aléatoirement une page wiki française qui n'est pas à jour et publie un
|
||||
message sur Mastodon pour suggérer sa mise à jour.
|
||||
3. **suggest_translation.py** : Identifie les pages wiki anglaises qui n'ont pas de traduction française et publie une
|
||||
suggestion de traduction sur Mastodon.
|
||||
4. **propose_translation.py** : Sélectionne une page wiki (par défaut la première) et utilise Ollama avec le modèle
|
||||
"mistral:7b" pour proposer une traduction, qui est sauvegardée dans le fichier outdated_pages.json.
|
||||
5. **suggest_grammar_improvements.py** : Sélectionne une page wiki française (par défaut la première) et utilise grammalecte
|
||||
pour vérifier la grammaire et proposer des améliorations, qui sont sauvegardées dans le fichier outdated_pages.json.
|
||||
6. **detect_suspicious_deletions.py** : Analyse les changements récents du wiki OSM pour détecter les suppressions
|
||||
suspectes (plus de 20 caractères) et les enregistre dans un fichier JSON pour affichage sur le site web.
|
||||
7. **fetch_proposals.py** : Récupère les propositions de tags OSM en cours de vote et les propositions récemment modifiées,
|
||||
et les enregistre dans un fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure
|
||||
pour éviter des requêtes trop fréquentes au serveur wiki.
|
||||
8. **find_untranslated_french_pages.py** : Identifie les pages wiki françaises qui n'ont pas de traduction en anglais
|
||||
et les enregistre dans un fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure.
|
||||
9. **find_pages_unavailable_in_french.py** : Scrape la catégorie des pages non disponibles en français, gère la pagination
|
||||
pour récupérer toutes les pages, les groupe par préfixe de langue et priorise les pages commençant par "En:". Les données
|
||||
sont mises en cache pendant une heure.
|
||||
10. **fetch_osm_fr_groups.py** : Récupère les informations sur les groupes de travail et les groupes locaux d'OSM-FR
|
||||
depuis la section #Pages_des_groupes_locaux et les enregistre dans un fichier JSON pour affichage sur le site web.
|
||||
Les données sont mises en cache pendant une heure.
|
||||
11. **fetch_recent_changes.py** : Récupère les changements récents du wiki OSM pour l'espace de noms français, détecte les pages
|
||||
nouvellement créées qui étaient auparavant dans la liste des pages non disponibles en français, et les enregistre dans un
|
||||
fichier JSON pour affichage sur le site web. Les données sont mises en cache pendant une heure.
|
||||
|
||||
## Installation
|
||||
|
||||
### Prérequis
|
||||
|
||||
- Python 3.6 ou supérieur
|
||||
- Pip (gestionnaire de paquets Python)
|
||||
|
||||
### Dépendances
|
||||
|
||||
Installez les dépendances requises :
|
||||
|
||||
```bash
|
||||
pip install requests beautifulsoup4
|
||||
```
|
||||
|
||||
Pour utiliser le script propose_translation.py, vous devez également installer Ollama :
|
||||
|
||||
1. Installez Ollama en suivant les instructions sur [ollama.ai](https://ollama.ai/)
|
||||
2. Téléchargez le modèle "mistral:7b" :
|
||||
|
||||
```bash
|
||||
ollama pull mistral:7b
|
||||
```
|
||||
|
||||
Pour utiliser le script suggest_grammar_improvements.py, vous devez installer grammalecte :
|
||||
|
||||
```bash
|
||||
pip install grammalecte
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Mastodon API
|
||||
|
||||
Pour publier sur Mastodon, vous devez :
|
||||
|
||||
1. Créer un compte sur une instance Mastodon
|
||||
2. Créer une application dans les paramètres de votre compte pour obtenir un jeton d'accès
|
||||
3. Configurer les scripts avec votre instance et votre jeton d'accès
|
||||
|
||||
Modifiez les constantes suivantes dans les scripts `post_outdated_page.py` et `suggest_translation.py` :
|
||||
|
||||
```python
|
||||
MASTODON_API_URL = "https://mastodon.instance/api/v1/statuses" # Remplacez par votre instance
|
||||
```
|
||||
|
||||
### Variables d'environnement
|
||||
|
||||
Définissez la variable d'environnement suivante pour l'authentification Mastodon :
|
||||
|
||||
```bash
|
||||
export MASTODON_ACCESS_TOKEN="votre_jeton_d_acces"
|
||||
```
|
||||
|
||||
## Utilisation
|
||||
|
||||
### Analyser les pages wiki
|
||||
|
||||
Pour analyser les pages wiki et générer les fichiers de données :
|
||||
|
||||
```bash
|
||||
./wiki_compare.py
|
||||
```
|
||||
|
||||
Cela produira :
|
||||
|
||||
- `top_keys.json` : Les 10 clés OSM les plus utilisées
|
||||
- `wiki_pages.csv` : Informations sur chaque page wiki
|
||||
- `outdated_pages.json` : Pages qui ont besoin de mises à jour
|
||||
- Une sortie console listant les 10 pages wiki qui ont besoin de mises à jour
|
||||
|
||||
### Publier une suggestion de mise à jour
|
||||
|
||||
Pour sélectionner aléatoirement une page française qui n'est pas à jour et publier une suggestion sur Mastodon :
|
||||
|
||||
```bash
|
||||
./post_outdated_page.py
|
||||
```
|
||||
|
||||
Pour simuler la publication sans réellement poster sur Mastodon (mode test) :
|
||||
|
||||
```bash
|
||||
./post_outdated_page.py --dry-run
|
||||
```
|
||||
|
||||
### Suggérer une traduction
|
||||
|
||||
Pour identifier une page anglaise sans traduction française et publier une suggestion sur Mastodon :
|
||||
|
||||
```bash
|
||||
./suggest_translation.py
|
||||
```
|
||||
|
||||
Pour simuler la publication sans réellement poster sur Mastodon (mode test) :
|
||||
|
||||
```bash
|
||||
./suggest_translation.py --dry-run
|
||||
```
|
||||
|
||||
### Proposer une traduction avec Ollama
|
||||
|
||||
Pour sélectionner une page wiki (par défaut la première du fichier outdated_pages.json) et générer une proposition de traduction avec Ollama :
|
||||
|
||||
```bash
|
||||
./propose_translation.py
|
||||
```
|
||||
|
||||
Pour traduire une page spécifique en utilisant sa clé :
|
||||
|
||||
```bash
|
||||
./propose_translation.py --page type
|
||||
```
|
||||
|
||||
Note : Ce script nécessite que Ollama soit installé et exécuté localement avec le modèle "mistral:7b" disponible. Pour installer Ollama, suivez les instructions sur [ollama.ai](https://ollama.ai/). Pour télécharger le modèle "mistral:7b", exécutez :
|
||||
|
||||
```bash
|
||||
ollama pull mistral:7b
|
||||
```
|
||||
|
||||
Le script enregistre la traduction proposée dans la propriété "proposed_translation" de l'entrée correspondante dans le fichier outdated_pages.json.
|
||||
|
||||
### Suggérer des améliorations grammaticales avec grammalecte
|
||||
|
||||
Pour sélectionner une page wiki française (par défaut la première avec une version française) et générer des suggestions d'amélioration grammaticale avec grammalecte :
|
||||
|
||||
```bash
|
||||
./suggest_grammar_improvements.py
|
||||
```
|
||||
|
||||
Pour vérifier une page spécifique en utilisant sa clé :
|
||||
|
||||
```bash
|
||||
./suggest_grammar_improvements.py --page type
|
||||
```
|
||||
|
||||
Note : Ce script nécessite que grammalecte soit installé. Pour l'installer, exécutez :
|
||||
|
||||
```bash
|
||||
pip install grammalecte
|
||||
```
|
||||
|
||||
Le script enregistre les suggestions grammaticales dans la propriété "grammar_suggestions" de l'entrée correspondante dans le fichier outdated_pages.json. Ces suggestions sont ensuite utilisées par Symfony dans le template pour afficher des corrections possibles sur la version française de la page dans une section dédiée.
|
||||
|
||||
### Détecter les suppressions suspectes
|
||||
|
||||
Pour analyser les changements récents du wiki OSM et détecter les suppressions suspectes :
|
||||
|
||||
```bash
|
||||
./detect_suspicious_deletions.py
|
||||
```
|
||||
|
||||
Pour afficher les suppressions détectées sans les enregistrer dans un fichier (mode test) :
|
||||
|
||||
```bash
|
||||
./detect_suspicious_deletions.py --dry-run
|
||||
```
|
||||
|
||||
### Récupérer les propositions de tags
|
||||
|
||||
Pour récupérer les propositions de tags OSM en cours de vote et récemment modifiées :
|
||||
|
||||
```bash
|
||||
./fetch_proposals.py
|
||||
```
|
||||
|
||||
Pour forcer la mise à jour des données même si le cache est encore frais :
|
||||
|
||||
```bash
|
||||
./fetch_proposals.py --force
|
||||
```
|
||||
|
||||
Pour afficher les propositions sans les enregistrer dans un fichier (mode test) :
|
||||
|
||||
```bash
|
||||
./fetch_proposals.py --dry-run
|
||||
```
|
||||
|
||||
### Trouver les pages françaises sans traduction anglaise
|
||||
|
||||
Pour identifier les pages wiki françaises qui n'ont pas de traduction en anglais :
|
||||
|
||||
```bash
|
||||
./find_untranslated_french_pages.py
|
||||
```
|
||||
|
||||
Pour forcer la mise à jour des données même si le cache est encore frais :
|
||||
|
||||
```bash
|
||||
./find_untranslated_french_pages.py --force
|
||||
```
|
||||
|
||||
Pour afficher les pages sans les enregistrer dans un fichier (mode test) :
|
||||
|
||||
```bash
|
||||
./find_untranslated_french_pages.py --dry-run
|
||||
```
|
||||
|
||||
### Trouver les pages non disponibles en français
|
||||
|
||||
Pour identifier les pages wiki qui n'ont pas de traduction française, groupées par langue d'origine :
|
||||
|
||||
```bash
|
||||
./find_pages_unavailable_in_french.py
|
||||
```
|
||||
|
||||
Pour forcer la mise à jour des données même si le cache est encore frais :
|
||||
|
||||
```bash
|
||||
./find_pages_unavailable_in_french.py --force
|
||||
```
|
||||
|
||||
Pour afficher les pages sans les enregistrer dans un fichier (mode test) :
|
||||
|
||||
```bash
|
||||
./find_pages_unavailable_in_french.py --dry-run
|
||||
```
|
||||
|
||||
### Récupérer les groupes OSM-FR
|
||||
|
||||
Pour récupérer les informations sur les groupes de travail et les groupes locaux d'OSM-FR :
|
||||
|
||||
```bash
|
||||
./fetch_osm_fr_groups.py
|
||||
```
|
||||
|
||||
Pour forcer la mise à jour des données même si le cache est encore frais :
|
||||
|
||||
```bash
|
||||
./fetch_osm_fr_groups.py --force
|
||||
```
|
||||
|
||||
Pour afficher les groupes sans les enregistrer dans un fichier (mode test) :
|
||||
|
||||
```bash
|
||||
./fetch_osm_fr_groups.py --dry-run
|
||||
```
|
||||
|
||||
## Automatisation
|
||||
|
||||
Vous pouvez automatiser l'exécution de ces scripts à l'aide de cron pour publier régulièrement des suggestions de mises
|
||||
à jour et de traductions, ainsi que pour maintenir à jour les données affichées sur le site web.
|
||||
|
||||
Exemple de configuration cron pour publier des suggestions et mettre à jour les données :
|
||||
|
||||
```
|
||||
# Publier des suggestions sur Mastodon
|
||||
0 10 * * 1 cd /chemin/vers/wiki_compare && ./wiki_compare.py && ./post_outdated_page.py
|
||||
0 10 * * 4 cd /chemin/vers/wiki_compare && ./wiki_compare.py && ./suggest_translation.py
|
||||
|
||||
# Mettre à jour les données pour le site web (toutes les 6 heures)
|
||||
0 */6 * * * cd /chemin/vers/wiki_compare && ./detect_suspicious_deletions.py
|
||||
0 */6 * * * cd /chemin/vers/wiki_compare && ./fetch_proposals.py
|
||||
0 */6 * * * cd /chemin/vers/wiki_compare && ./find_untranslated_french_pages.py
|
||||
0 */6 * * * cd /chemin/vers/wiki_compare && ./find_pages_unavailable_in_french.py
|
||||
0 */6 * * * cd /chemin/vers/wiki_compare && ./fetch_osm_fr_groups.py
|
||||
|
||||
# Récupérer les changements récents et détecter les pages nouvellement créées (toutes les heures)
|
||||
0 * * * * cd /chemin/vers/wiki_compare && ./fetch_recent_changes.py
|
||||
```
|
||||
|
||||
Note : Les scripts de mise à jour des données pour le site web intègrent déjà une vérification de fraîcheur du cache (1 heure),
|
||||
mais la configuration cron ci-dessus permet de s'assurer que les données sont régulièrement mises à jour même en cas de problème
|
||||
temporaire avec les scripts.
|
||||
|
||||
## Structure des données
|
||||
|
||||
### top_keys.json
|
||||
|
||||
Contient les 10 clés OSM les plus utilisées avec leur nombre d'utilisations :
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"key": "building",
|
||||
"count": 459876543
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### wiki_pages.csv
|
||||
|
||||
Contient des informations sur chaque page wiki :
|
||||
|
||||
```
|
||||
key,language,url,last_modified,sections,word_count
|
||||
building,en,https://wiki.openstreetmap.org/wiki/Key:building,2023-05-15,12,3500
|
||||
building,fr,https://wiki.openstreetmap.org/wiki/FR:Key:building,2022-01-10,10,2800
|
||||
...
|
||||
```
|
||||
|
||||
### outdated_pages.json
|
||||
|
||||
Contient des informations détaillées sur les pages qui ont besoin de mises à jour :
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"key": "building",
|
||||
"reason": "French page outdated by 491 days",
|
||||
"en_page": {},
|
||||
"fr_page": {},
|
||||
"date_diff": 491,
|
||||
"word_diff": 700,
|
||||
"section_diff": 2,
|
||||
"priority": 250.5,
|
||||
"proposed_translation": "Texte de la traduction proposée...",
|
||||
"grammar_suggestions": [
|
||||
{
|
||||
"paragraph": 1,
|
||||
"start": 45,
|
||||
"end": 52,
|
||||
"type": "ACCORD",
|
||||
"message": "Accord avec le nom : « bâtiments » est masculin pluriel.",
|
||||
"suggestions": ["grands"],
|
||||
"context": "...les grandes bâtiments de la ville..."
|
||||
},
|
||||
{
|
||||
"paragraph": 3,
|
||||
"start": 120,
|
||||
"end": 128,
|
||||
"type": "CONJUGAISON",
|
||||
"message": "Conjugaison erronée. Accord avec « ils ».",
|
||||
"suggestions": ["peuvent"],
|
||||
"context": "...les bâtiments peut être classés..."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"reason": "French page missing",
|
||||
"en_page": {},
|
||||
"fr_page": null,
|
||||
"date_diff": 0,
|
||||
"word_diff": 4200,
|
||||
"section_diff": 15,
|
||||
"priority": 100
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### suspicious_deletions.json
|
||||
|
||||
Contient des informations sur les suppressions suspectes détectées dans les changements récents du wiki OSM :
|
||||
|
||||
```json
|
||||
{
|
||||
"last_updated": "2025-08-22T15:03:03.616532",
|
||||
"deletions": [
|
||||
{
|
||||
"page_title": "FR:Key:roof:shape",
|
||||
"page_url": "https://wiki.openstreetmap.org/wiki/FR:Key:roof:shape",
|
||||
"deletion_size": -286,
|
||||
"timestamp": "22 août 2025 à 14:15",
|
||||
"user": "RubenKelevra",
|
||||
"comment": "Suppression de contenu obsolète"
|
||||
},
|
||||
{
|
||||
"page_title": "FR:Key:sport",
|
||||
"page_url": "https://wiki.openstreetmap.org/wiki/FR:Key:sport",
|
||||
"deletion_size": -240,
|
||||
"timestamp": "21 août 2025 à 09:30",
|
||||
"user": "Computae",
|
||||
"comment": "Mise à jour de la documentation"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### proposals.json
|
||||
|
||||
Contient des informations sur les propositions de tags OSM en cours de vote et récemment modifiées :
|
||||
|
||||
```json
|
||||
{
|
||||
"last_updated": "2025-08-22T15:09:49.905332",
|
||||
"voting_proposals": [
|
||||
{
|
||||
"title": "Proposal:Man made=ceremonial gate",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Man_made%3Dceremonial_gate",
|
||||
"status": "Voting",
|
||||
"type": "voting"
|
||||
},
|
||||
{
|
||||
"title": "Proposal:Developer",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Developer",
|
||||
"status": "Voting",
|
||||
"type": "voting"
|
||||
}
|
||||
],
|
||||
"recent_proposals": [
|
||||
{
|
||||
"title": "Proposal:Landuse=brownfield",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/Proposal:Landuse=brownfield",
|
||||
"last_modified": "22 août 2025 à 10:45",
|
||||
"modified_by": "MapperUser",
|
||||
"type": "recent"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### untranslated_french_pages.json
|
||||
|
||||
Contient des informations sur les pages wiki françaises qui n'ont pas de traduction en anglais :
|
||||
|
||||
```json
|
||||
{
|
||||
"last_updated": "2025-08-22T16:30:15.123456",
|
||||
"untranslated_pages": [
|
||||
{
|
||||
"title": "FR:Key:building:colour",
|
||||
"key": "Key:building:colour",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/FR:Key:building:colour",
|
||||
"has_translation": false
|
||||
},
|
||||
{
|
||||
"title": "FR:Tag:amenity=bicycle_repair_station",
|
||||
"key": "Tag:amenity=bicycle_repair_station",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/FR:Tag:amenity=bicycle_repair_station",
|
||||
"has_translation": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### pages_unavailable_in_french.json
|
||||
|
||||
Contient des informations sur les pages wiki qui n'ont pas de traduction française, groupées par langue d'origine :
|
||||
|
||||
```json
|
||||
{
|
||||
"last_updated": "2025-08-22T17:15:45.123456",
|
||||
"grouped_pages": {
|
||||
"En": [
|
||||
{
|
||||
"title": "En:Key:building:colour",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/En:Key:building:colour",
|
||||
"language_prefix": "En",
|
||||
"is_english": true,
|
||||
"priority": 1
|
||||
}
|
||||
],
|
||||
"De": [
|
||||
{
|
||||
"title": "De:Tag:highway=residential",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/De:Tag:highway=residential",
|
||||
"language_prefix": "De",
|
||||
"is_english": false,
|
||||
"priority": 0
|
||||
}
|
||||
],
|
||||
"Other": [
|
||||
{
|
||||
"title": "Tag:amenity=bicycle_repair_station",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/Tag:amenity=bicycle_repair_station",
|
||||
"language_prefix": "Other",
|
||||
"is_english": false,
|
||||
"priority": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"all_pages": [
|
||||
{
|
||||
"title": "En:Key:building:colour",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/En:Key:building:colour",
|
||||
"language_prefix": "En",
|
||||
"is_english": true,
|
||||
"priority": 1
|
||||
},
|
||||
{
|
||||
"title": "De:Tag:highway=residential",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/De:Tag:highway=residential",
|
||||
"language_prefix": "De",
|
||||
"is_english": false,
|
||||
"priority": 0
|
||||
},
|
||||
{
|
||||
"title": "Tag:amenity=bicycle_repair_station",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/Tag:amenity=bicycle_repair_station",
|
||||
"language_prefix": "Other",
|
||||
"is_english": false,
|
||||
"priority": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### osm_fr_groups.json
|
||||
|
||||
Contient des informations sur les groupes de travail et les groupes locaux d'OSM-FR :
|
||||
|
||||
```json
|
||||
{
|
||||
"last_updated": "2025-08-22T16:45:30.789012",
|
||||
"working_groups": [
|
||||
{
|
||||
"name": "Groupe Bâtiments",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/France/OSM-FR/Groupes_de_travail/B%C3%A2timents",
|
||||
"description": "Groupe de travail sur la cartographie des bâtiments",
|
||||
"category": "Cartographie",
|
||||
"type": "working_group"
|
||||
}
|
||||
],
|
||||
"local_groups": [
|
||||
{
|
||||
"name": "Groupe local de Paris",
|
||||
"url": "https://wiki.openstreetmap.org/wiki/France/Paris",
|
||||
"description": "Groupe local des contributeurs parisiens",
|
||||
"type": "local_group"
|
||||
}
|
||||
],
|
||||
"umap_url": "https://umap.openstreetmap.fr/fr/map/groupes-locaux-openstreetmap_152488"
|
||||
}
|
||||
```
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Problèmes courants
|
||||
|
||||
1. **Erreur d'authentification Mastodon** : Vérifiez que la variable d'environnement `MASTODON_ACCESS_TOKEN` est
|
||||
correctement définie et que le jeton est valide.
|
||||
|
||||
2. **Erreur de chargement des fichiers JSON** : Assurez-vous d'exécuter `wiki_compare.py` avant les autres scripts pour
|
||||
générer les fichiers de données nécessaires.
|
||||
|
||||
3. **Aucune page à mettre à jour ou à traduire** : Il est possible que toutes les pages soient à jour ou traduites.
|
||||
Essayez d'augmenter le nombre de clés analysées en modifiant la valeur `limit` dans la fonction `fetch_top_keys` de
|
||||
`wiki_compare.py`.
|
||||
|
||||
### Journalisation
|
||||
|
||||
Tous les scripts utilisent le module `logging` pour enregistrer les informations d'exécution. Par défaut, les logs sont
|
||||
affichés dans la console. Pour les rediriger vers un fichier, modifiez la configuration de logging dans chaque script.
|
||||
|
||||
## Contribution
|
||||
|
||||
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request pour améliorer ces scripts.
|
||||
|
||||
## Licence
|
||||
|
||||
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
|
Loading…
Add table
Add a link
Reference in a new issue