feat: added language selection to pattern detail view

This commit is contained in:
2026-07-16 11:43:03 +02:00
parent 55410d675b
commit 32040ca46c
4 changed files with 29 additions and 25 deletions
+2 -5
View File
@@ -18,11 +18,8 @@ msgstr "Save"
msgid "Añadir sección" msgid "Añadir sección"
msgstr "Add section" msgstr "Add section"
msgid "¿Seguro que quieres cargar el patrón guardado? Se perderán los cambios que no hayas guardado." msgid "Ver patrón"
msgstr "Are you sure you want to load the saved pattern? Any unsaved changes will be lost." msgstr "View pattern"
msgid "Cargar"
msgstr "Load"
msgid "Exportar a PDF" msgid "Exportar a PDF"
msgstr "Export to PDF" msgstr "Export to PDF"
+2 -17
View File
@@ -1,8 +1,5 @@
// Guardar/cargar el patrón completo (secciones + personalización de // Guardar el patrón completo (secciones + personalización de página)
// página) contra el backend Django: el estado ya guardado viaja embebido // contra el backend Django, por fetch.
// en la plantilla (ver main.js), así que aquí solo hace falta enviar los
// cambios al guardar, y recargar la página para "cargar" (trae de vuelta
// la última versión guardada en el servidor).
import { serializeSections } from './section-types.js'; import { serializeSections } from './section-types.js';
import { serializePageSettings } from './page-settings.js'; import { serializePageSettings } from './page-settings.js';
@@ -42,15 +39,3 @@ saveBtn.addEventListener('click', async () => {
alert(saveBtn.dataset.errorMessage); alert(saveBtn.dataset.errorMessage);
} }
}); });
const loadBtn = document.getElementById('load-pattern');
loadBtn.addEventListener('click', () => {
// Cargar sustituye todo lo que haya en pantalla sin posibilidad de
// deshacerlo, así que se confirma antes: podría haber cambios sin
// guardar. La "carga" en sí es recargar la página: el propio servidor
// vuelve a embeber la última versión guardada (ver loadInitialPattern()
// en main.js), no hace falta duplicar esa lógica aquí.
if (!confirm(loadBtn.dataset.confirmMessage)) return;
window.location.reload();
});
+6 -2
View File
@@ -35,8 +35,12 @@
<button id="save-pattern" type="button" class="btn btn-sm btn-outline" <button id="save-pattern" type="button" class="btn btn-sm btn-outline"
data-save-url="{% url 'crochet:pattern_save' pattern.uuid %}" data-save-url="{% url 'crochet:pattern_save' pattern.uuid %}"
data-error-message="{% trans 'No se ha podido guardar. Inténtalo de nuevo.' %}">{% trans 'Guardar' %}</button> data-error-message="{% trans 'No se ha podido guardar. Inténtalo de nuevo.' %}">{% trans 'Guardar' %}</button>
<button id="load-pattern" type="button" class="btn btn-sm btn-outline" <!-- Enlace normal, no un botón con JS: solo navega a la vista de
data-confirm-message="{% trans '¿Seguro que quieres cargar el patrón guardado? Se perderán los cambios que no hayas guardado.' %}">{% trans 'Cargar' %}</button> solo lectura (ver PatternDetailView), que se guarda tal cual
desde la última vez que se pulsó "Guardar". target="_blank"
para no perder el editor con sus cambios sin guardar. -->
<a href="{% url 'crochet:pattern_detail' pattern.uuid %}" target="_blank" rel="noopener"
class="btn btn-sm btn-outline">{% trans 'Ver patrón' %}</a>
<button id="export-pdf" type="button" class="btn btn-sm">{% trans 'Exportar a PDF' %}</button> <button id="export-pdf" type="button" class="btn btn-sm">{% trans 'Exportar a PDF' %}</button>
</div> </div>
</header> </header>
+19 -1
View File
@@ -1,4 +1,4 @@
{% load static %} {% load static i18n %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ lang }}"> <html lang="{{ lang }}">
@@ -25,6 +25,24 @@
<body> <body>
<main class="p-4"> <main class="p-4">
<!-- Enlaces normales (sin JS): el tag "language" de i18n activa
temporalmente ese idioma para que "url" resuelva la ruta ya
traducida (ver crochet/urls.py), igual que hace LocaleMiddleware
por petición. no-print para que no aparezca en el PDF exportado
(impresión nativa del navegador sobre esta misma página). -->
<div class="flex justify-end gap-2 mb-4 no-print">
{% if lang != 'es' %}
{% language 'es' %}
<a href="{% url 'crochet:pattern_detail' pattern.uuid %}" class="btn btn-sm btn-outline">Español</a>
{% endlanguage %}
{% endif %}
{% if lang != 'en' %}
{% language 'en' %}
<a href="{% url 'crochet:pattern_detail' pattern.uuid %}" class="btn btn-sm btn-outline">English</a>
{% endlanguage %}
{% endif %}
</div>
<div id="panel-output" class="border border-base-300 rounded-box p-4 max-w-3xl mx-auto" <div id="panel-output" class="border border-base-300 rounded-box p-4 max-w-3xl mx-auto"
style="color: {{ page_settings.textColor }}; background-color: {{ page_settings.bgColor }}; font-family: {{ page_settings.font }}; text-align: {{ page_settings.align }};"> style="color: {{ page_settings.textColor }}; background-color: {{ page_settings.bgColor }}; font-family: {{ page_settings.font }}; text-align: {{ page_settings.align }};">
<div id="panel-output-text" style="font-size: {{ page_settings.fontSize }};"> <div id="panel-output-text" style="font-size: {{ page_settings.fontSize }};">