2025-08-22 17:58:13 +02:00
{% extends 'base.html.twig' %}
{% block title %} Pages Wiki non disponibles en français {% endblock %}
{% block body %}
<div class="container mt-4">
{% include 'admin/_wiki_navigation.html.twig' %}
<h1>Pages Wiki non disponibles en français</h1>
<p class="lead">Liste des pages du wiki OSM qui n'ont pas de traduction française, groupées par langue d'origine.</p>
{% if last_updated %}
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> Dernière mise à jour : {{ last_updated | date ( 'd/m/Y H:i' ) }}
</div>
{% endif %}
<div class="card mb-4">
<div class="card-header">
<h2>Statistiques</h2>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-4">
<div class="card text-white bg-primary mb-3">
<div class="card-body">
<h5 class="card-title">Total des pages</h5>
<p class="card-text display-4"> {{ all_pages | length }} </p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card text-white bg-success mb-3">
<div class="card-body">
<h5 class="card-title">Pages en anglais</h5>
<p class="card-text display-4"> {{ grouped_pages [ 'En' ] | default ( [ ] ) | length }} </p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card text-white bg-info mb-3">
<div class="card-body">
<h5 class="card-title">Langues différentes</h5>
<p class="card-text display-4"> {{ grouped_pages | length }} </p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Pages groupées par langue -->
<div class="accordion" id="languageAccordion">
{% for lang_prefix , pages in grouped_pages %}
<div class="accordion-item">
<h2 class="accordion-header" id="heading {{ lang_prefix }} ">
<button class="accordion-button {% if lang_prefix != 'En' %} collapsed {% endif %} " type="button" data-bs-toggle="collapse" data-bs-target="#collapse {{ lang_prefix }} " aria-expanded=" {{ lang_prefix == 'En' ? 'true' : 'false' }} " aria-controls="collapse {{ lang_prefix }} ">
{% if lang_prefix == 'En' %}
<strong class="text-success">Pages en anglais ( {{ pages | length }} )</strong>
{% elseif lang_prefix == 'Other' %}
<strong>Autres pages ( {{ pages | length }} )</strong>
{% else %}
<strong>Pages en {{ lang_prefix }} ( {{ pages | length }} )</strong>
{% endif %}
</button>
</h2>
<div id="collapse {{ lang_prefix }} " class="accordion-collapse collapse {% if lang_prefix == 'En' %} show {% endif %} " aria-labelledby="heading {{ lang_prefix }} " data-bs-parent="#languageAccordion">
<div class="accordion-body">
2025-08-22 23:30:36 +02:00
{% if lang_prefix == 'En' %}
<div class="mb-3">
<button id="copyEnglishTitlesBtn" class="btn btn-outline-primary">
<i class="bi bi-clipboard"></i> Copier les titres au format MediaWiki
</button>
<span id="copyStatus" class="ms-2 text-success" style="display: none;">
<i class="bi bi-check-circle"></i> Copié !
</span>
</div>
{% endif %}
2025-08-22 17:58:13 +02:00
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th>Titre</th>
2025-08-22 23:30:36 +02:00
<th>Score de décrépitude</th>
2025-08-22 17:58:13 +02:00
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for page in pages %}
<tr>
<td>
2025-08-31 23:15:03 +02:00
<div class="d-flex align-items-center">
{% if page .description_img_url is defined and page .description_img_url %}
<div class="me-3">
<img src=" {{ page .description_img_url }} " alt=" {{ page .title }} "
style="max-width: 80px; max-height: 60px; object-fit: contain;">
</div>
{% endif %}
<div>
<strong> {{ page .title }} </strong>
{% if page .is_english %}
<span class="badge bg-success">Priorité</span>
{% endif %}
</div>
</div>
2025-08-22 17:58:13 +02:00
</td>
2025-08-22 23:30:36 +02:00
<td>
{% if page .outdatedness_score is defined %}
<div class="progress" style="height: 20px;">
{% set score_class = page .outdatedness_score > 7 0 ? 'bg-danger' : ( page .outdatedness_score > 4 0 ? 'bg-warning' : 'bg-success' ) %}
<div class="progress-bar {{ score_class }} " role="progressbar"
style="width: {{ page .outdatedness_score }} %;"
aria-valuenow=" {{ page .outdatedness_score }} "
aria-valuemin="0"
aria-valuemax="100">
{{ page .outdatedness_score }}
</div>
</div>
{% else %}
<span class="text-muted">Non disponible</span>
{% endif %}
</td>
2025-08-22 17:58:13 +02:00
<td>
<div class="btn-group" role="group">
<a href=" {{ page .url }} " target="_blank" class="btn btn-sm btn-outline-primary" title="Voir la page originale">
<i class="bi bi-eye"></i> Voir
</a>
{% set fr_url = page .url | replace ( { '/wiki/' : '/wiki/FR:' } ) %}
<a href=" {{ fr_url }} " target="_blank" class="btn btn-sm btn-success" title="Créer la traduction française">
<i class="bi bi-plus-circle"></i> Traduire
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="card mt-4 mb-4">
<div class="card-header">
<h2>À propos des pages non disponibles en français</h2>
</div>
<div class="card-body">
<p>Ces pages sont des contenus du wiki OpenStreetMap qui n'ont pas encore été traduits en français.</p>
<p>Contribuer à la traduction de ces pages permet de :</p>
<ul>
<li>Rendre la documentation OSM plus accessible aux contributeurs francophones</li>
<li>Améliorer la qualité des contributions en français</li>
<li>Faciliter l'apprentissage et l'utilisation d'OpenStreetMap pour les nouveaux utilisateurs</li>
</ul>
<p><strong>Priorité aux pages anglaises :</strong> Les pages commençant par "En:" sont prioritaires car l'anglais est la langue principale du wiki OSM.</p>
</div>
</div>
<div class="mt-3">
<a href=" {{ path ( 'app_admin_wiki' ) }} " class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Retour à la liste des pages wiki
</a>
</div>
</div>
2025-08-22 23:30:36 +02:00
{% endblock %}
{% block javascripts %}
{{ parent ( ) }}
<script>
document.addEventListener('DOMContentLoaded', function() {
const copyButton = document.getElementById('copyEnglishTitlesBtn');
const copyStatus = document.getElementById('copyStatus');
if (copyButton) {
copyButton.addEventListener('click', function() {
// Get all English page titles from the table
const englishSection = document.getElementById('collapseEn');
const titleElements = englishSection.querySelectorAll('tbody tr td:first-child strong');
// Format titles in MediaWiki format
let mediawikiText = '';
2025-08-31 23:15:03 +02:00
const rows = englishSection.querySelectorAll('tbody tr');
rows.forEach(function(row) {
const title = row.querySelector('td:first-child strong').textContent.trim();
const imgElement = row.querySelector('td:first-child img');
if (imgElement) {
const imgSrc = imgElement.getAttribute('src');
mediawikiText += '* [[' + title + ']] - Image: ' + imgSrc + '\n';
} else {
mediawikiText += '* [[' + title + ']]\n';
}
2025-08-22 23:30:36 +02:00
});
// Copy to clipboard
navigator.clipboard.writeText(mediawikiText).then(function() {
// Show success message
copyStatus.style.display = 'inline';
// Hide success message after 3 seconds
setTimeout(function() {
copyStatus.style.display = 'none';
}, 3000);
}).catch(function(err) {
console.error('Erreur lors de la copie: ', err);
alert('Erreur lors de la copie dans le presse-papier. Veuillez réessayer.');
});
});
}
});
</script>
2025-08-22 17:58:13 +02:00
{% endblock %}