From b9d9cdf6016738024d50b31321c8761bcd913e51 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 26 Jul 2026 09:55:27 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Ajustes=20menores=20en=20rutas?= =?UTF-8?q?=20y=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añade `Route::try_resolve()` y `RoutePath::is_empty()` para omitir atributos HTML opcionales cuando la ruta resultante está vacía. - Renombra `Locale::configured_langid()` a `try_langid()` (convención `try_*` para Option). - Reordena include_locales! y otros cambios menores. --- src/core/component/route.rs | 9 +++++++++ src/html/assets/stylesheet.rs | 2 +- src/html/route_path.rs | 6 ++++++ src/locale/definition.rs | 2 +- src/locale/l10n.rs | 4 ++-- src/locale/request.rs | 6 +++--- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/core/component/route.rs b/src/core/component/route.rs index 8e563329..6636c687 100644 --- a/src/core/component/route.rs +++ b/src/core/component/route.rs @@ -144,6 +144,15 @@ impl Route { pub fn resolve(&self, cx: &Context) -> RoutePath { (self.0)(cx) } + + /// Como [`resolve()`](Self::resolve), pero devuelve `None` cuando la ruta calculada está vacía. + /// + /// Útil para atributos HTML opcionales (por ejemplo `href`) que no deben renderizarse si la + /// ruta resultante no tiene contenido. + pub fn try_resolve(&self, cx: &Context) -> Option { + let route = self.resolve(cx); + (!route.is_empty()).then_some(route) + } } impl fmt::Debug for Route { diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index f0f6ca63..35e547ac 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -19,7 +19,7 @@ enum Source { Inline(CowStr, Box String + Send + Sync>), } -/// Define el medio objetivo para la hoja de estilos. +/// Define el medio objetivo para una hoja de estilos. /// /// Permite especificar en qué contexto se aplica el CSS, adaptándose a diferentes dispositivos o /// situaciones de impresión. diff --git a/src/html/route_path.rs b/src/html/route_path.rs index 95aab33a..041a0628 100644 --- a/src/html/route_path.rs +++ b/src/html/route_path.rs @@ -97,6 +97,12 @@ impl RoutePath { crate::util::url_looks_external(&self.path) } + /// Indica si la ruta no tiene *path* ni parámetros, es decir, si su representación textual + /// sería una cadena vacía. + pub fn is_empty(&self) -> bool { + self.path.is_empty() && self.query.is_empty() + } + // **< RoutePath HELPERS >********************************************************************** // Codifica un valor para su uso seguro como parte de una *query string* según RFC 3986: los diff --git a/src/locale/definition.rs b/src/locale/definition.rs index e9dfe9fd..1b754e13 100644 --- a/src/locale/definition.rs +++ b/src/locale/definition.rs @@ -170,7 +170,7 @@ impl Locale { /// Devuelve el identificador de idioma configurado explícitamente, si es válido. /// /// Si no se ha configurado un idioma por defecto o el valor no es válido, devuelve `None`. - pub fn configured_langid() -> Option<&'static LanguageIdentifier> { + pub fn try_langid() -> Option<&'static LanguageIdentifier> { *CONFIG_LANGID } diff --git a/src/locale/l10n.rs b/src/locale/l10n.rs index 66f20dc5..02b255f5 100644 --- a/src/locale/l10n.rs +++ b/src/locale/l10n.rs @@ -3,6 +3,8 @@ use crate::{AutoDefault, CowStr, include_locales}; use super::{LangId, Locale}; +include_locales!(LOCALES_PAGETOP); + use fluent_templates::Loader; use fluent_templates::StaticLoader as Locales; @@ -10,8 +12,6 @@ use std::collections::HashMap; use std::fmt; -include_locales!(LOCALES_PAGETOP); - /// Operación de localización a realizar. /// /// * `None` - No se aplica ninguna localización. diff --git a/src/locale/request.rs b/src/locale/request.rs index 53e4e032..7f5167f0 100644 --- a/src/locale/request.rs +++ b/src/locale/request.rs @@ -29,13 +29,13 @@ impl RequestLocale { /// - [`LangNegotiation::Full`](crate::global::LangNegotiation::Full) determina el idioma en /// este orden: /// 1. Parámetro de *query* `?lang=...`, si existe y corresponde a un idioma soportado. - /// 2. [`Locale::configured_langid()`], si la aplicación tiene un idioma por defecto válido. + /// 2. [`Locale::try_langid()`], si la aplicación tiene un idioma por defecto válido. /// 3. Cabecera `Accept-Language`, si puede resolverse con [`Locale::resolve()`]. /// 4. Idioma de respaldo. /// /// - [`LangNegotiation::NoQuery`](crate::global::LangNegotiation::NoQuery) descarta el uso del /// parámetro `?lang=...` y determina el idioma en este orden: - /// 1. [`Locale::configured_langid()`], si la aplicación tiene un idioma por defecto válido. + /// 1. [`Locale::try_langid()`], si la aplicación tiene un idioma por defecto válido. /// 2. Cabecera `Accept-Language`, si puede resolverse con [`Locale::resolve()`]. /// 3. Idioma de respaldo. /// @@ -56,7 +56,7 @@ impl RequestLocale { Locale::default_langid() } global::LangNegotiation::Full | global::LangNegotiation::NoQuery => { - if let Some(default) = Locale::configured_langid() { + if let Some(default) = Locale::try_langid() { default } else { // Sin idioma por defecto, se evalúa la cabecera `Accept-Language`.