🍻 Segunda revista a las traducciones por contexto

This commit is contained in:
Manuel Cillero 2023-05-27 20:43:35 +02:00
parent 0de26a4737
commit 88d6ce2a72
3 changed files with 37 additions and 41 deletions

View file

@ -46,19 +46,15 @@ pub use paste::paste;
pub use static_files::Resource as StaticResource;
pub use tracing_unwrap::ResultExt;
#[allow(unused_imports)]
pub(crate) use futures::executor::block_on as run_now;
pub use pagetop_macros::fn_builder;
pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>;
pub type Handle = u64;
// *************************************************************************************************
// LOCAL.
// *************************************************************************************************
#[allow(unused_imports)]
pub(crate) use futures::executor::block_on as run_now;
// *************************************************************************************************
// APIs PÚBLICAS.
// *************************************************************************************************

View file

@ -136,49 +136,30 @@ pub static LANGID: LazyStatic<&LanguageIdentifier> =
},
);
#[macro_export]
/// Define un conjunto de elementos de localización y funciones locales de traducción.
macro_rules! define_locale {
( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => {
use $crate::locale::*;
static_locale! {
pub static $LOCALES = {
locales: $dir_locales,
$( core_locales: $core_locales, )?
fallback_language: "en-US",
// Elimina las marcas Unicode que delimitan los argumentos.
customise: |bundle| bundle.set_use_isolating(false),
};
}
};
}
pub enum Locale<'a> {
From(&'a Locales),
With(&'a Locales, &'a HashMap<String, FluentValue<'a>>),
Lang(&'a Locales, &'a LanguageIdentifier),
Using(
&'a Locales,
&'a LanguageIdentifier,
&'a Locales,
&'a HashMap<String, FluentValue<'a>>,
),
}
pub fn _t(key: &str, locale: Locale) -> String {
match locale {
Locale::From(locales) => locales.lookup(&LANGID, key).unwrap_or(key.to_string()),
Locale::With(locales, args) => locales
.lookup_with_args(&LANGID, key, args)
.unwrap_or(key.to_string()),
Locale::Lang(locales, langid) => locales.lookup(langid, key).unwrap_or(key.to_string()),
Locale::Using(locales, langid, args) => locales
.lookup_with_args(langid, key, args)
.unwrap_or(key.to_string()),
}
pub fn t(key: &str, locale: Locale) -> String {
translate(key, locale)
}
pub fn _e(key: &str, locale: Locale) -> Markup {
PreEscaped(_t(key, locale))
pub fn e(key: &str, locale: Locale) -> Markup {
PreEscaped(translate(key, locale))
}
#[inline]
pub(crate) fn translate(key: &str, locale: Locale) -> String {
match locale {
Locale::From(locales) => locales.lookup(&LANGID, key),
Locale::With(locales, args) => locales.lookup_with_args(&LANGID, key, args),
Locale::Using(langid, locales, args) => locales.lookup_with_args(langid, key, args),
}
.unwrap_or(key.to_string())
}

View file

@ -87,6 +87,25 @@ macro_rules! define_handle {
};
}
#[macro_export]
/// Define un conjunto de elementos de localización y funciones locales de traducción.
macro_rules! define_locale {
( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => {
use $crate::locale::*;
static_locale! {
pub static $LOCALES = {
locales: $dir_locales,
$( core_locales: $core_locales, )?
fallback_language: "en-US",
// Elimina las marcas Unicode que delimitan los argumentos.
customise: |bundle| bundle.set_use_isolating(false),
};
}
};
}
#[macro_export]
macro_rules! serve_static_files {
( $cfg:ident, $dir:expr, $embed:ident ) => {{