diff --git a/i18n-build/src/lib.rs b/i18n-build/src/lib.rs index 464fe29..f7940c8 100644 --- a/i18n-build/src/lib.rs +++ b/i18n-build/src/lib.rs @@ -74,7 +74,7 @@ mod localize_feature { #[derive(RustEmbed)] #[folder = "i18n/mo"] - struct Translations; + pub struct Translations; lazy_static! { static ref LANGUAGE_LOADER: GettextLanguageLoader = gettext_language_loader!(); @@ -85,7 +85,7 @@ mod localize_feature { /// Obtain a [Localizer](i18n_embed::Localizer) for localizing this library. /// /// ⚠️ *This API requires the following crate features to be activated: `localize`.* - pub fn localizer() -> DefaultLocalizer<'static> { + pub fn localizer() -> DefaultLocalizer<'static, Translations, GettextLanguageLoader> { DefaultLocalizer::new(&*LANGUAGE_LOADER, &TRANSLATIONS) } } diff --git a/i18n-embed/examples/desktop-bin/src/main.rs b/i18n-embed/examples/desktop-bin/src/main.rs index 2c8c3e1..7509d44 100644 --- a/i18n-embed/examples/desktop-bin/src/main.rs +++ b/i18n-embed/examples/desktop-bin/src/main.rs @@ -1,10 +1,10 @@ use std::time::Duration; use i18n_embed::{ - fluent::FluentLanguageLoader, DefaultLocalizer, DesktopLanguageRequester, I18nAssets, - Localizer, RustEmbedNotifyAssets, + fluent::FluentLanguageLoader, DefaultLocalizer, DesktopLanguageRequester, Localizer, + RustEmbedNotifyAssets, }; -use library_fluent::{hello_world, localizer, LocalizationsEmbed, LOCALIZATIONS}; +use library_fluent::{hello_world, localizer, LocalizationsEmbed}; fn main() { env_logger::init(); diff --git a/i18n-embed/examples/library-fluent/Cargo.toml b/i18n-embed/examples/library-fluent/Cargo.toml index b80a801..66ddddc 100644 --- a/i18n-embed/examples/library-fluent/Cargo.toml +++ b/i18n-embed/examples/library-fluent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -i18n-embed = { workspace = true, features = ["fluent-system"] } +i18n-embed = { workspace = true, features = ["fluent-system", "autoreload"] } i18n-embed-fl = { workspace = true } once_cell = { workspace = true } rust-embed = { workspace = true } diff --git a/i18n-embed/examples/library-fluent/src/lib.rs b/i18n-embed/examples/library-fluent/src/lib.rs index c303e88..bbdde41 100644 --- a/i18n-embed/examples/library-fluent/src/lib.rs +++ b/i18n-embed/examples/library-fluent/src/lib.rs @@ -1,6 +1,6 @@ use i18n_embed::{ fluent::{fluent_language_loader, FluentLanguageLoader}, - DefaultLocalizer, I18nAssets, LanguageLoader, Localizer, RustEmbedNotifyAssets, + DefaultLocalizer, LanguageLoader, RustEmbedNotifyAssets, }; use i18n_embed_fl::fl; use once_cell::sync::Lazy; diff --git a/i18n-embed/examples/library-fluent/tests/with_localizer.rs b/i18n-embed/examples/library-fluent/tests/with_localizer.rs index 830a8d6..13f4eed 100644 --- a/i18n-embed/examples/library-fluent/tests/with_localizer.rs +++ b/i18n-embed/examples/library-fluent/tests/with_localizer.rs @@ -1,3 +1,4 @@ +use i18n_embed::{LanguageLoader, Localizer}; use library_fluent::{hello_world, localizer}; use std::collections::HashSet; @@ -9,7 +10,7 @@ use std::iter::FromIterator; fn test_available_languages() { let localizer = localizer(); assert_eq!( - &localizer.language_loader().fallback_language().to_string(), + &localizer.language_loader.fallback_language().to_string(), "en" ); diff --git a/i18n-embed/src/assets.rs b/i18n-embed/src/assets.rs index eef2e4c..e5cd222 100644 --- a/i18n-embed/src/assets.rs +++ b/i18n-embed/src/assets.rs @@ -207,6 +207,9 @@ fn notify_watcher( } /// An entity that watches for changes to localization resources. +/// +/// NOTE: Currently we rely in the implicit [`Drop`] implementation to remove file system watches, +/// in the future ther may be new methods added to this trait. pub trait Watcher {} #[cfg(feature = "autoreload")] @@ -309,6 +312,7 @@ impl AssetsMultiplexor { } } +#[allow(dead_code)] // We rely on the Drop implementation of the Watcher to remove the file system watch. struct Watchers(Vec>); impl Watcher for Watchers {} diff --git a/i18n-embed/src/lib.rs b/i18n-embed/src/lib.rs index d67f7fa..8e71ecb 100644 --- a/i18n-embed/src/lib.rs +++ b/i18n-embed/src/lib.rs @@ -557,7 +557,7 @@ where impl<'a, ASSETS, LOADER> DefaultLocalizer<'a, ASSETS, LOADER> { /// Create a new [DefaultLocalizer](DefaultLocalizer). - pub fn new(i18n_assets: &'a ASSETS, language_loader: &'a LOADER) -> Self { + pub fn new(language_loader: &'a LOADER, i18n_assets: &'a ASSETS) -> Self { Self { i18n_assets, language_loader, diff --git a/i18n-embed/tests/loader.rs b/i18n-embed/tests/loader.rs index 5ed7c6f..f863f23 100644 --- a/i18n-embed/tests/loader.rs +++ b/i18n-embed/tests/loader.rs @@ -20,7 +20,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); pretty_assertions::assert_eq!("Hello World Localization!", loader.get("hello-world")); } @@ -31,7 +31,7 @@ mod fluent { let en_gb: LanguageIdentifier = "en-GB".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_gb]).unwrap(); + loader.load_languages(&Localizations, &[en_gb]).unwrap(); pretty_assertions::assert_eq!("Hello World Localisation!", loader.get("hello-world")); pretty_assertions::assert_eq!("only US", loader.get("only-us")); } @@ -44,9 +44,7 @@ mod fluent { let en_gb: LanguageIdentifier = "en-GB".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader - .load_languages(&Localizations, &[&ru, &en_gb]) - .unwrap(); + loader.load_languages(&Localizations, &[ru, en_gb]).unwrap(); pretty_assertions::assert_eq!("Привет Мир Локализация!", loader.get("hello-world")); pretty_assertions::assert_eq!("only GB", loader.get("only-gb")); pretty_assertions::assert_eq!("only US", loader.get("only-us")); @@ -60,7 +58,7 @@ mod fluent { let ru: LanguageIdentifier = "ru".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); let args = maplit::hashmap! { "userName" => "Tanya" @@ -76,7 +74,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); pretty_assertions::assert_eq!("World (US version)!", loader.get_attr("with-attr", "attr")); } @@ -86,7 +84,7 @@ mod fluent { let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let en_gb: LanguageIdentifier = "en-GB".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_gb]).unwrap(); + loader.load_languages(&Localizations, &[en_gb]).unwrap(); let args = maplit::hashmap! { "name" => "Joe Doe" }; @@ -103,7 +101,7 @@ mod fluent { let ru: LanguageIdentifier = "ru".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); assert!(loader.has("only-ru-args")); assert!(loader.has("only-us")); @@ -115,7 +113,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); loader.set_use_isolating(false); let args = maplit::hashmap! { "thing" => "thing" @@ -129,7 +127,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); let args = maplit::hashmap! { "thing" => "thing" }; @@ -142,7 +140,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); let msg = loader.get("multi-line"); assert_eq!( @@ -158,7 +156,7 @@ mod fluent { setup(); let ru: LanguageIdentifier = "ru".parse().unwrap(); let loader = FluentLanguageLoader::new("test", ru.clone()); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); let msg = loader.get("multi-line"); assert_eq!( @@ -174,7 +172,7 @@ mod fluent { setup(); let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let loader = FluentLanguageLoader::new("test", en_us.clone()); - loader.load_languages(&Localizations, &[&en_us]).unwrap(); + loader.load_languages(&Localizations, &[en_us]).unwrap(); let args = maplit::hashmap! { "argOne" => "1", @@ -197,7 +195,7 @@ mod fluent { setup(); let ru: LanguageIdentifier = "ru".parse().unwrap(); let loader = FluentLanguageLoader::new("test", ru.clone()); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); let args = maplit::hashmap! { "argOne" => "1", @@ -224,13 +222,13 @@ mod fluent { let loader = FluentLanguageLoader::new("test", en_us); loader - .load_languages(&Localizations, &[&ru, &en_gb]) + .load_languages(&Localizations, &[ru.clone(), en_gb]) .unwrap(); - let msg = loader.select_languages(&[&ru]).get("only-ru"); + let msg = loader.select_languages(&[ru.clone()]).get("only-ru"); assert_eq!("только русский", msg); - let msg = loader.select_languages(&[&ru]).get("only-gb"); + let msg = loader.select_languages(&[ru]).get("only-gb"); assert_eq!("only GB (US Version)", msg); } @@ -243,7 +241,7 @@ mod fluent { let loader = FluentLanguageLoader::new("test", en_us); loader - .load_languages(&Localizations, &[&ru, &en_gb]) + .load_languages(&Localizations, &[ru.clone(), en_gb]) .unwrap(); let args = maplit::hashmap! { @@ -252,7 +250,7 @@ mod fluent { }; let msg = loader - .select_languages(&[&ru]) + .select_languages(&[ru]) .get_args("multi-line-args", args); assert_eq!( "Это многострочное сообщение с параметрами.\n\n\ @@ -273,13 +271,15 @@ mod fluent { let loader = FluentLanguageLoader::new("test", en_us); loader - .load_languages(&Localizations, &[&ru, &en_gb]) + .load_languages(&Localizations, &[ru.clone(), en_gb.clone()]) .unwrap(); - let msg = loader.select_languages(&[&ru, &en_gb]).get("only-gb"); + let msg = loader + .select_languages(&[ru.clone(), en_gb.clone()]) + .get("only-gb"); assert_eq!("only GB", msg); - let msg = loader.select_languages(&[&ru, &en_gb]).get("only-us"); + let msg = loader.select_languages(&[ru, en_gb]).get("only-us"); assert_eq!("only US", msg); } @@ -292,7 +292,7 @@ mod fluent { let loader = FluentLanguageLoader::new("test", en_us); loader - .load_languages(&Localizations, &[&ru, &en_gb]) + .load_languages(&Localizations, &[ru.clone(), en_gb.clone()]) .unwrap(); let args = maplit::hashmap! { @@ -300,12 +300,12 @@ mod fluent { }; let msg = loader - .select_languages(&[&ru]) + .select_languages(&[ru.clone()]) .get_args("only-gb-args", args.clone()); assert_eq!("Hello \u{2068}username\u{2069}! (US Version)", msg); let msg = loader - .select_languages(&[&ru, &en_gb]) + .select_languages(&[ru, en_gb]) .get_args("only-gb-args", args.clone()); assert_eq!("Hello \u{2068}username\u{2069}!", msg); } @@ -357,10 +357,10 @@ mod gettext { let ru: LanguageIdentifier = "ru".parse().unwrap(); let en: LanguageIdentifier = "en".parse().unwrap(); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); // It should replace the ru with en - loader.load_languages(&Localizations, &[&en]).unwrap(); + loader.load_languages(&Localizations, &[en]).unwrap(); pretty_assertions::assert_eq!("only en", tr("only en")); pretty_assertions::assert_eq!("only ru", tr("only ru")); @@ -376,7 +376,7 @@ mod gettext { let ru: LanguageIdentifier = "ru".parse().unwrap(); assert!(Localizations::get("ru/i18n_embed.mo").is_some()); - loader.load_languages(&Localizations, &[&ru]).unwrap(); + loader.load_languages(&Localizations, &[ru]).unwrap(); pretty_assertions::assert_eq!("только ру", tr("only ru")); pretty_assertions::assert_eq!("only en", tr("only en")); diff --git a/src/main.rs b/src/main.rs index 9b5aec5..f10724d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,8 +4,7 @@ use i18n_build::run; use i18n_config::Crate; use i18n_embed::{ gettext::{gettext_language_loader, GettextLanguageLoader}, - DefaultLocalizer, DesktopLanguageRequester, I18nAssets, LanguageLoader, LanguageRequester, - Localizer, + DefaultLocalizer, DesktopLanguageRequester, LanguageLoader, LanguageRequester, Localizer, }; use lazy_static::lazy_static; use rust_embed::RustEmbed; @@ -76,8 +75,8 @@ fn main() -> Result<()> { env_logger::init(); let mut language_requester = DesktopLanguageRequester::new(); - let cargo_i18n_localizer = - DefaultLocalizer::new(&*LANGUAGE_LOADER, &TRANSLATIONS as &dyn I18nAssets); + let cargo_i18n_localizer: DefaultLocalizer<'static, _, _> = + DefaultLocalizer::new(&*LANGUAGE_LOADER, &TRANSLATIONS); let cargo_i18n_localizer_rc = Arc::new(cargo_i18n_localizer); let i18n_build_localizer_rc = Arc::new(i18n_build::localizer());