qualiwiki/templates/admin/wiki_pages_unavailable_in_french.html.twig
2025-09-01 18:28:23 +02:00

215 lines
No EOL
11 KiB
Twig

{% 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">
{% 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 %}
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th>Titre</th>
<th>Score de décrépitude</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for page in pages %}
<tr>
<td>
<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>
</td>
<td>
{% if page.outdatedness_score is defined %}
<div class="progress" style="height: 20px;">
{% set score_class = page.outdatedness_score > 70 ? 'bg-danger' : (page.outdatedness_score > 40 ? '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>
<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>
{% 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 = '';
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';
}
});
// 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>
{% endblock %}