From e68d0b27f09e6e026966c27d8e639f397d2bc8c0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 28 May 2023 12:51:13 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Simplifica=20API=20de?= =?UTF-8?q?=20localizaci=C3=B3n=20para=20documentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-bootsier/src/lib.rs | 10 ++-- pagetop-homedemo/src/lib.rs | 6 +-- pagetop-minimal/src/module/menu.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 4 +- pagetop/src/locale.rs | 69 ++++++++++++++----------- pagetop/src/response/page/definition.rs | 6 ++- pagetop/src/util.rs | 2 +- 9 files changed, 62 insertions(+), 47 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a6b211ff..a2d30ead 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_ADMIN)) + _t("module_name", Locale::From(&LOCALE_ADMIN)) } fn description(&self) -> Option { - Some(t("module_description", Locale::From(&LOCALE_ADMIN))) + Some(_t("module_description", Locale::From(&LOCALE_ADMIN))) } #[rustfmt::skip] diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 0f87b99a..0e7963bc 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -58,15 +58,19 @@ impl ThemeTrait for Bootsier { alt="Caution!"; div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p class="lead" { + (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + } hr class="my-4"; - p { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p { + (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + } a class="btn btn-primary btn-lg" href="/" role="button" { - (t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + (_t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index c8f18fb0..9f60cc89 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_DEMOHOME)) + _t("module_name", Locale::From(&LOCALE_DEMOHOME)) } fn description(&self) -> Option { - Some(t("module_description", Locale::From(&LOCALE_DEMOHOME))) + Some(_t("module_description", Locale::From(&LOCALE_DEMOHOME))) } fn dependencies(&self) -> Vec { @@ -146,7 +146,7 @@ fn about_pagetop() -> Container { format!( "{}", "https://docs.rs/pagetop/latest/pagetop", - t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), + _t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), ), ), )), diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 177e811a..0e0c2d15 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_MENU)) + _t("module_name", Locale::From(&LOCALE_MENU)) } fn description(&self) -> Option { - Some(t("module_description", Locale::From(&LOCALE_MENU))) + Some(_t("module_description", Locale::From(&LOCALE_MENU))) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index cc51d45e..478088c2 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_NODE)) + _t("module_name", Locale::From(&LOCALE_NODE)) } fn description(&self) -> Option { - Some(t("module_description", Locale::From(&LOCALE_NODE))) + Some(_t("module_description", Locale::From(&LOCALE_NODE))) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 1b2e50cb..0bc8a86d 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_USER)) + _t("module_name", Locale::From(&LOCALE_USER)) } fn description(&self) -> Option { - Some(t("module_description", Locale::From(&LOCALE_USER))) + Some(_t("module_description", Locale::From(&LOCALE_USER))) } fn dependencies(&self) -> Vec { diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f97ed3a6..60ac0074 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,4 +1,4 @@ -//! Localización (¿i18n ó l10n?). +//! Localización (L10n). //! //! Proporciona soporte a [Fluent](https://www.projectfluent.org/), un conjunto de especificaciones //! para la localización de aplicaciones, así como implementaciones y buenas prácticas originalmente @@ -16,25 +16,29 @@ //! # Recursos Fluent //! //! PageTop utiliza [fluent-templates](https://docs.rs/fluent-templates/) para integrar durante la -//! compilación los recursos de localización en el binario de la aplicación. Básicamente agrupa -//! todos los archivos de los subdirectorios del directorio *src/locales* que tienen un -//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asigna a su +//! compilación los recursos de localización en el binario de la aplicación. En el siguiente ejemplo +//! agruparía todos los archivos y subdirectorios de *static/locales* que tienen un +//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asignaría a su //! identificador correspondiente: //! //! ```text -//! resources/locales -//! ├── common.ftl -//! ├── en-US -//! │ └── main.ftl -//! ├── es-ES -//! │ └── main.ftl -//! ├── es-MX -//! │ └── main.ftl -//! └── fr -//! └── main.ftl +//! static/locales +//! ├── common.ftl +//! ├── en-US +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-ES +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-MX +//! │ ├── default.ftl +//! │ └── main.ftl +//! └── fr +//! ├── default.ftl +//! └── main.ftl //! ``` //! -//! Ejemplo de un archivo *src/locales/en-US/main.ftl*: +//! Ejemplo de un archivo *static/locales/en-US/main.ftl*: //! //! ```text //! hello-world = Hello world! @@ -50,7 +54,7 @@ //! }. //! ``` //! -//! Ejemplo de un archivo *src/locales/es-ES/main.ftl*: +//! Ejemplo del archivo equivalente *static/locales/es-ES/main.ftl*: //! //! ```text //! hello-world = Hola mundo! @@ -69,36 +73,41 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro -//! [`define_locale!`](crate::define_locale) para integrar fácilmente tus recursos de localización. +//! [`define_locale!`](crate::define_locale) para integrarlos en tu módulo o aplicación. //! -//! Luego sólo tendrás que usar la función `t()` para realizar tus traducciones: +//! Y podrás usar las funciones globales [`_t()`] o [`_e()`] para traducir tus textos: //! //! ``` -//! use pagetop::{args, define_locale, t}; +//! use pagetop::prelude::*; //! -//! define_locale!(LOCALE_SAMPLE, "src/locales"); +//! define_locale!(LOCALE_SAMPLE, "static/locales"); //! //! fn demo() { -//! println!("* {}", l("hello-world", Locale::From(&LOCALE_SAMPLE))); -//! println!("* {}", t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); +//! println!("* {}", _t("hello-world", Locale::From(&LOCALE_SAMPLE))); +//! println!("* {}", _t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); //! //! let args = args![ //! "userName" => "Roberto", //! "photoCount" => 3, //! "userGender" => "male" //! ]; -//! println!("* {}\n", t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); +//! println!("* {}\n", _t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); //! } //! ``` +//! Aunque normalmente usarás el componente [L10n](crate::core::component::L10n) para añadir textos +//! traducibles en las respuestas web según el contexto del renderizado. use crate::html::{Markup, PreEscaped}; use crate::{args, config, trace, LazyStatic}; -pub use fluent_templates; -pub use fluent_templates::fluent_bundle::FluentValue; -pub use fluent_templates::{static_loader as static_locale, Loader, StaticLoader as Locales}; +pub(crate) use unic_langid::{langid, LanguageIdentifier}; -pub use unic_langid::{langid, CharacterDirection, LanguageIdentifier}; +pub use fluent_templates; + +pub(crate) use fluent_templates::StaticLoader as Locales; + +use fluent_templates::fluent_bundle::FluentValue; +use fluent_templates::Loader; use std::collections::HashMap; @@ -130,7 +139,7 @@ pub fn langid_for(language: &str) -> &LanguageIdentifier { config::SETTINGS.app.language, "is not accepted. Using \"en-US\", check the settings file", ); - &*FALLBACK_LANGID + &FALLBACK_LANGID } } } @@ -145,11 +154,11 @@ pub enum Locale<'a> { ), } -pub fn t(key: &str, locale: Locale) -> String { +pub fn _t(key: &str, locale: Locale) -> String { translate(key, locale) } -pub fn e(key: &str, locale: Locale) -> Markup { +pub fn _e(key: &str, locale: Locale) -> Markup { PreEscaped(translate(key, locale)) } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 44567fb2..e13b9f47 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -3,10 +3,12 @@ use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; -use crate::locale::{langid_for, CharacterDirection, LanguageIdentifier}; +use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; use crate::{fn_builder, server}; +use unic_langid::CharacterDirection; + use std::collections::HashMap; type PageTitle = OneComponent; @@ -123,7 +125,7 @@ impl Page { // Page GETTERS. pub fn langid(&self) -> &LanguageIdentifier { - &self.context.langid() + self.context.langid() } pub fn title(&mut self) -> String { diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index fef23386..29906378 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -93,7 +93,7 @@ macro_rules! define_locale { ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - static_locale! { + fluent_templates::static_loader! { pub static $LOCALES = { locales: $dir_locales, $( core_locales: $core_locales, )?