From 5e29e7358e942ced236f24a284b6e263d95af478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Thu, 27 Jun 2024 11:34:14 +0200 Subject: [PATCH] Accept configuration conditional checks directly for most `leptos_fluent!` parameters (#176) --- CHANGELOG.md | 20 +- Cargo.lock | 24 +-- book/src/faqs.md | 14 ++ book/src/leptos_fluent.md | 14 ++ examples/csr-minimal/src/lib.rs | 4 + leptos-fluent-macros/src/lib.rs | 274 +++++++++++++++++++++++----- leptos-fluent-macros/src/loader.rs | 282 +++++++++++++++++++++++++---- 7 files changed, 537 insertions(+), 95 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4499914..dacbdc5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## Unreleased - [0.1.6] +## 2024-06-27 - [0.1.6] ### New features @@ -11,6 +11,22 @@ - Add `flag` field to `leptos_fluent::Language` storing emoji flag automatic discovered for each language identifier with a country code. +### Bug fixes + +- Accept [configuration conditional checks] directly in most macro parameters: + + ```rust + leptos_fluent! {{ + // ... + #[cfg(debug_assertions)] + initial_language_from_url_param: true, + #[cfg(debug_assertions)] + set_language_to_url_param: true, + }} + ``` + +[configuration conditional checks]: https://doc.rust-lang.org/rust-by-example/attribute/cfg.html + ## 2024-06-26 - [0.1.5] ### New features @@ -321,7 +337,7 @@ version to `0.1` during installation. - Added all ISO-639-1 and ISO-639-2 languages. -[0.1.6]: https://github.com/mondeja/leptos-fluent/compare/v0.1.5...master +[0.1.6]: https://github.com/mondeja/leptos-fluent/compare/v0.1.5...v0.1.6 [0.1.5]: https://github.com/mondeja/leptos-fluent/compare/v0.1.4...v0.1.5 [0.1.4]: https://github.com/mondeja/leptos-fluent/compare/v0.1.3...v0.1.4 [0.1.3]: https://github.com/mondeja/leptos-fluent/compare/v0.1.2...v0.1.3 diff --git a/Cargo.lock b/Cargo.lock index 2662274a..f3604a34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -549,9 +549,9 @@ checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" [[package]] name = "cc" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b" +checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" dependencies = [ "jobserver", "libc", @@ -879,9 +879,9 @@ checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" @@ -1232,9 +1232,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.19.8" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b664491bc77ab55daa6714a592cdbe1a55e28abec09cb50e87689b90de456ff4" +checksum = "39650279f135469465018daae0ba53357942a5212137515777d5fdca74984a44" dependencies = [ "bitflags", "futures-channel", @@ -1254,9 +1254,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.19.8" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d405205a405182f95e637710850a8e82f25ba01fdd6baebc82dabeaf0883376" +checksum = "4429b0277a14ae9751350ad9b658b1be0abb5b54faa5bcdf6e74a3372582fad7" dependencies = [ "heck", "proc-macro-crate", @@ -2887,9 +2887,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", @@ -3250,9 +3250,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] diff --git a/book/src/faqs.md b/book/src/faqs.md index 6f20d96a..8c957acf 100644 --- a/book/src/faqs.md +++ b/book/src/faqs.md @@ -156,6 +156,20 @@ pub fn App() -> impl IntoView { fn LanguageSelector() -> impl IntoView { ... } ``` +### How to get values of `leptos_fluent!` macro at runtime? + +Use `provide_meta_context` at the macro initialization and get them +with the method `I18n::meta`: + +```rust +let i18n = leptos_fluent! {{ + // ... + provide_meta_context: true, +}}; + +println!("Macro parameters: {:?}", i18n.meta().unwrap()); +``` + [``]: https://docs.rs/leptos/latest/leptos/fn.For.html [`leptos_fluent::SsrHtmlTag`]: https://docs.rs/leptos-fluent/latest/leptos_fluent/fn.SsrHtmlTag.html [`leptos_fluent::Language`]: https://docs.rs/leptos-fluent/latest/leptos_fluent/struct.Language.html diff --git a/book/src/leptos_fluent.md b/book/src/leptos_fluent.md index 11d959e1..15d9c133 100644 --- a/book/src/leptos_fluent.md +++ b/book/src/leptos_fluent.md @@ -605,6 +605,20 @@ leptos_fluent! {{ }} ``` +### `provide_meta_context` + +Provide the macro meta information at runtime as a context. +Get it using `I18n::meta`: + +```rust +let i18n = leptos_fluent! {{ + // ... + provide_meta_context: true, +}}; + +println!("Macro parameters: {:?}", i18n.meta().unwrap()); +``` + [`fluent_templates::static_loader!`]: https://docs.rs/fluent-templates/latest/fluent_templates/macro.static_loader.html [`once_cell:sync::Lazy`]: https://docs.rs/once_cell/latest/once_cell/sync/struct.Lazy.html [`` attribute]: https://developer.mozilla.org/es/docs/Web/HTML/Global_attributes/lang diff --git a/examples/csr-minimal/src/lib.rs b/examples/csr-minimal/src/lib.rs index 6618a88f..3881618f 100644 --- a/examples/csr-minimal/src/lib.rs +++ b/examples/csr-minimal/src/lib.rs @@ -15,6 +15,10 @@ pub fn App() -> impl IntoView { translations: [TRANSLATIONS], locales: "./locales", check_translations: "./src/**/*.rs", + #[cfg(debug_assertions)] + initial_language_from_url_param: true, + #[cfg(debug_assertions)] + set_language_to_url_param: true, }}; view! { } diff --git a/leptos-fluent-macros/src/lib.rs b/leptos-fluent-macros/src/lib.rs index a07b91ba..c5f43b21 100644 --- a/leptos-fluent-macros/src/lib.rs +++ b/leptos-fluent-macros/src/lib.rs @@ -92,66 +92,95 @@ pub fn leptos_fluent( core_locales_path, check_translations, provide_meta_context, + provide_meta_context_exprpath, sync_html_tag_lang_bool, sync_html_tag_lang_expr, + sync_html_tag_lang_exprpath, sync_html_tag_dir_bool, sync_html_tag_dir_expr, + sync_html_tag_dir_exprpath, initial_language_from_url_param_bool, initial_language_from_url_param_expr, + initial_language_from_url_param_exprpath, url_param_str, url_param_expr, + url_param_exprpath, initial_language_from_url_param_to_localstorage_bool, initial_language_from_url_param_to_localstorage_expr, + initial_language_from_url_param_to_localstorage_exprpath, initial_language_from_url_param_to_cookie_bool, initial_language_from_url_param_to_cookie_expr, + initial_language_from_url_param_to_cookie_exprpath, set_language_to_url_param_bool, set_language_to_url_param_expr, + set_language_to_url_param_exprpath, localstorage_key_str, localstorage_key_expr, initial_language_from_localstorage_bool, initial_language_from_localstorage_expr, + initial_language_from_localstorage_exprpath, initial_language_from_localstorage_to_cookie_bool, initial_language_from_localstorage_to_cookie_expr, + initial_language_from_localstorage_to_cookie_exprpath, set_language_to_localstorage_bool, set_language_to_localstorage_expr, + set_language_to_localstorage_exprpath, initial_language_from_navigator_bool, initial_language_from_navigator_expr, + initial_language_from_navigator_exprpath, initial_language_from_navigator_to_localstorage_bool, initial_language_from_navigator_to_localstorage_expr, + initial_language_from_navigator_to_localstorage_exprpath, initial_language_from_navigator_to_cookie_bool, initial_language_from_navigator_to_cookie_expr, + initial_language_from_navigator_to_cookie_exprpath, initial_language_from_accept_language_header_bool, initial_language_from_accept_language_header_expr, cookie_name_str, cookie_name_expr, + cookie_name_exprpath, cookie_attrs_str, cookie_attrs_expr, + cookie_attrs_exprpath, initial_language_from_cookie_bool, initial_language_from_cookie_expr, + initial_language_from_cookie_exprpath, initial_language_from_cookie_to_localstorage_bool, initial_language_from_cookie_to_localstorage_expr, + initial_language_from_cookie_to_localstorage_exprpath, set_language_to_cookie_bool, set_language_to_cookie_expr, + set_language_to_cookie_exprpath, #[cfg(feature = "system")] initial_language_from_system_bool, #[cfg(feature = "system")] initial_language_from_system_expr, #[cfg(feature = "system")] + initial_language_from_system_exprpath, + #[cfg(feature = "system")] initial_language_from_system_to_data_file_bool, #[cfg(feature = "system")] initial_language_from_system_to_data_file_expr, #[cfg(feature = "system")] + initial_language_from_system_to_data_file_exprpath, + #[cfg(feature = "system")] set_language_to_data_file_bool, #[cfg(feature = "system")] set_language_to_data_file_expr, #[cfg(feature = "system")] + set_language_to_data_file_exprpath, + #[cfg(feature = "system")] initial_language_from_data_file_bool, #[cfg(feature = "system")] initial_language_from_data_file_expr, #[cfg(feature = "system")] + initial_language_from_data_file_exprpath, + #[cfg(feature = "system")] data_file_key_str, #[cfg(feature = "system")] data_file_key_expr, + #[cfg(feature = "system")] + data_file_key_exprpath, } = syn::parse_macro_input!(input as I18nLoader); let n_languages = languages.len(); @@ -177,9 +206,15 @@ pub fn leptos_fluent( #[cfg(feature = "system")] let data_file_key = match data_file_key_str { - Some(ref lit) => quote! { #lit }, + Some(ref lit) => match data_file_key_exprpath { + Some(path) => quote! { #path{#lit} }, + None => quote! { #lit }, + }, None => match data_file_key_expr { - Some(ref expr) => quote! { #expr }, + Some(ref expr) => match data_file_key_exprpath { + Some(path) => quote! { #path{#expr} }, + None => quote! { #expr }, + }, None => quote! { "leptos-fluent" }, }, }; @@ -187,8 +222,8 @@ pub fn leptos_fluent( // discover from system language (desktop apps) #[cfg(all(feature = "system", not(feature = "ssr")))] let initial_language_from_system_quote = { - let initial_language_from_system_to_data_file_quote = - match initial_language_from_system_to_data_file_bool { + let initial_language_from_system_to_data_file_quote = { + let quote = match initial_language_from_system_to_data_file_bool { Some(ref lit) => match lit.value { true => quote! { if !#data_file_key.is_empty() { @@ -213,6 +248,12 @@ pub fn leptos_fluent( }, }; + match initial_language_from_system_to_data_file_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + let effect_quote = quote! { if let Ok(l) = ::leptos_fluent::current_locale() { lang = ::leptos_fluent::l( @@ -226,7 +267,7 @@ pub fn leptos_fluent( } }; - match initial_language_from_system_bool { + let quote = match initial_language_from_system_bool { Some(ref lit) => match lit.value { true => quote! { if lang.is_none() { @@ -243,6 +284,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_system_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -251,16 +297,19 @@ pub fn leptos_fluent( #[cfg(all(feature = "system", feature = "ssr"))] { + _ = data_file_key_exprpath; _ = initial_language_from_system_bool; _ = initial_language_from_system_expr; + _ = initial_language_from_system_exprpath; _ = initial_language_from_system_to_data_file_bool; _ = initial_language_from_system_to_data_file_expr; + _ = initial_language_from_system_to_data_file_exprpath; } #[cfg(feature = "system")] let sync_language_with_data_file_quote = { - let set_language_to_data_file_quote = - match set_language_to_data_file_bool { + let set_language_to_data_file_quote = { + let quote = match set_language_to_data_file_bool { Some(ref lit) => match lit.value { true => quote! { #data_file_key }, false => quote! { "" }, @@ -277,6 +326,12 @@ pub fn leptos_fluent( }, }; + match set_language_to_data_file_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + let effect_quote = quote! { ::leptos::create_effect(move |_| { if #set_language_to_data_file_quote.is_empty() { @@ -310,8 +365,8 @@ pub fn leptos_fluent( #[cfg(all(feature = "system", not(feature = "ssr")))] let initial_language_from_data_file_quote = { - let initial_language_from_data_file_quote = - match initial_language_from_data_file_bool { + let initial_language_from_data_file_quote = { + let quote = match initial_language_from_data_file_bool { Some(ref lit) => match lit.value() { true => quote! { #data_file_key }, false => quote! { "" }, @@ -328,6 +383,12 @@ pub fn leptos_fluent( }, }; + match initial_language_from_data_file_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + let effect_quote = quote! { if #initial_language_from_data_file_quote.is_empty() { return; @@ -365,6 +426,7 @@ pub fn leptos_fluent( { _ = initial_language_from_data_file_bool; _ = initial_language_from_data_file_expr; + _ = initial_language_from_data_file_exprpath; } #[cfg(not(feature = "ssr"))] @@ -383,7 +445,7 @@ pub fn leptos_fluent( }); }; - match sync_html_tag_lang_bool { + let quote = match sync_html_tag_lang_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -396,6 +458,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match sync_html_tag_lang_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -405,6 +472,7 @@ pub fn leptos_fluent( { _ = sync_html_tag_lang_bool; _ = sync_html_tag_lang_expr; + _ = sync_html_tag_lang_exprpath; } #[cfg(not(feature = "ssr"))] @@ -423,7 +491,7 @@ pub fn leptos_fluent( }); }; - match sync_html_tag_dir_bool { + let quote = match sync_html_tag_dir_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -436,6 +504,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match sync_html_tag_dir_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -445,12 +518,19 @@ pub fn leptos_fluent( { _ = sync_html_tag_dir_bool; _ = sync_html_tag_dir_expr; + _ = sync_html_tag_dir_exprpath; } let url_param = match url_param_str { - Some(ref lit) => quote! { #lit }, + Some(ref lit) => match url_param_exprpath { + Some(path) => quote! { #path{#lit} }, + None => quote! { #lit }, + }, None => match url_param_expr { - Some(ref expr) => quote! { #expr }, + Some(ref expr) => match url_param_exprpath { + Some(path) => quote! { #path{#expr} }, + None => quote! { #expr }, + }, None => quote! { "lang" }, }, }; @@ -473,7 +553,7 @@ pub fn leptos_fluent( }); }; - match set_language_to_localstorage_bool { + let quote = match set_language_to_localstorage_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -486,6 +566,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match set_language_to_localstorage_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -495,18 +580,30 @@ pub fn leptos_fluent( all(feature = "ssr", feature = "axum") ))] let cookie_name = match cookie_name_str { - Some(ref lit) => quote! { #lit }, + Some(ref lit) => match cookie_name_exprpath { + Some(path) => quote! { #path{#lit} }, + None => quote! { #lit }, + }, None => match cookie_name_expr { - Some(ref expr) => quote! { #expr }, + Some(ref expr) => match cookie_name_exprpath { + Some(path) => quote! { #path{#expr} }, + None => quote! { #expr }, + }, None => quote! { "lf-lang" }, }, }; #[cfg(not(feature = "ssr"))] let cookie_attrs = match cookie_attrs_str { - Some(ref lit) => quote! { #lit }, + Some(ref lit) => match cookie_attrs_exprpath { + Some(path) => quote! { #path{#lit} }, + None => quote! { #lit }, + }, None => match cookie_attrs_expr { - Some(ref expr) => quote! { #expr }, + Some(ref expr) => match cookie_attrs_exprpath { + Some(path) => quote! { #path{#expr} }, + None => quote! { #expr }, + }, None => quote! { "" }, }, }; @@ -525,8 +622,8 @@ pub fn leptos_fluent( let hydrate_rerender_quote = quote! {}; #[cfg(not(feature = "ssr"))] - let set_to_localstorage_quote = - match initial_language_from_url_param_to_localstorage_bool { + let set_to_localstorage_quote = { + let quote = match initial_language_from_url_param_to_localstorage_bool { Some(ref lit) => match lit.value { true => quote! { ::leptos_fluent::localstorage::set( @@ -551,9 +648,15 @@ pub fn leptos_fluent( } }; + match initial_language_from_url_param_to_localstorage_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + #[cfg(not(feature = "ssr"))] - let set_to_cookie_quote = - match initial_language_from_url_param_to_cookie_bool { + let set_to_cookie_quote = { + let quote = match initial_language_from_url_param_to_cookie_bool { Some(ref lit) => match lit.value { true => quote! { ::leptos_fluent::cookie::set( @@ -578,12 +681,20 @@ pub fn leptos_fluent( }, }; + match initial_language_from_url_param_to_cookie_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + #[cfg(feature = "ssr")] { _ = initial_language_from_url_param_to_localstorage_bool; _ = initial_language_from_url_param_to_localstorage_expr; + _ = initial_language_from_url_param_to_localstorage_exprpath; _ = initial_language_from_url_param_to_cookie_bool; _ = initial_language_from_url_param_to_cookie_expr; + _ = initial_language_from_url_param_to_cookie_exprpath; } #[cfg(not(feature = "ssr"))] @@ -659,19 +770,33 @@ pub fn leptos_fluent( ))] let parse_language_from_url_quote = quote! {}; - match initial_language_from_url_param_bool { + let quote = match initial_language_from_url_param_bool { Some(ref lit) => match lit.value { true => parse_language_from_url_quote, false => quote! {}, }, None => match initial_language_from_url_param_expr { - Some(ref expr) => quote! { - if #expr { - #parse_language_from_url_quote + Some(ref expr) => { + match parse_language_from_url_quote.is_empty() { + true => quote! {}, + false => quote! { + if #expr { + #parse_language_from_url_quote + } + }, } - }, + } None => quote! {}, }, + }; + + match initial_language_from_url_param_exprpath { + Some(ref path) => { + quote! { + #path{#quote} + } + } + None => quote, } }; @@ -685,8 +810,9 @@ pub fn leptos_fluent( ); }; - let initial_language_from_localstorage_to_cookie_quote = - match initial_language_from_localstorage_to_cookie_bool { + let initial_language_from_localstorage_to_cookie_quote = { + let quote = match initial_language_from_localstorage_to_cookie_bool + { Some(ref lit) => match lit.value { true => set_cookie_quote, false => quote! {}, @@ -702,6 +828,12 @@ pub fn leptos_fluent( }, }; + match initial_language_from_localstorage_to_cookie_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, + } + }; + let localstorage_get_quote = quote! { if let Some(l) = ::leptos_fluent::localstorage::get(#localstorage_key) { @@ -716,7 +848,7 @@ pub fn leptos_fluent( } }; - match initial_language_from_localstorage_bool { + let quote = match initial_language_from_localstorage_bool { Some(ref lit) => match lit.value { true => quote! { if lang.is_none() { @@ -733,6 +865,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_localstorage_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -740,8 +877,10 @@ pub fn leptos_fluent( { _ = initial_language_from_localstorage_bool; _ = initial_language_from_localstorage_expr; + _ = initial_language_from_localstorage_exprpath; _ = initial_language_from_localstorage_to_cookie_bool; _ = initial_language_from_localstorage_to_cookie_expr; + _ = initial_language_from_localstorage_to_cookie_exprpath; } let sync_language_with_url_param_quote = { @@ -754,7 +893,7 @@ pub fn leptos_fluent( }); }; - match set_language_to_url_param_bool { + let quote = match set_language_to_url_param_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -767,6 +906,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match set_language_to_url_param_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -780,7 +924,7 @@ pub fn leptos_fluent( ); }; - match initial_language_from_navigator_to_localstorage_bool { + let quote = match initial_language_from_navigator_to_localstorage_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -795,6 +939,11 @@ pub fn leptos_fluent( None => quote! {}, } } + }; + + match initial_language_from_navigator_to_localstorage_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -807,7 +956,7 @@ pub fn leptos_fluent( ); }; - match initial_language_from_navigator_to_cookie_bool { + let quote = match initial_language_from_navigator_to_cookie_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -820,6 +969,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_navigator_to_cookie_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -842,7 +996,7 @@ pub fn leptos_fluent( } }; - match initial_language_from_navigator_bool { + let quote = match initial_language_from_navigator_bool { Some(ref lit) => match lit.value { true => quote! { if lang.is_none() { @@ -859,6 +1013,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_navigator_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -866,10 +1025,13 @@ pub fn leptos_fluent( { _ = initial_language_from_navigator_bool; _ = initial_language_from_navigator_expr; + _ = initial_language_from_navigator_exprpath; _ = initial_language_from_navigator_to_localstorage_bool; _ = initial_language_from_navigator_to_localstorage_expr; + _ = initial_language_from_navigator_to_localstorage_exprpath; _ = initial_language_from_navigator_to_cookie_bool; _ = initial_language_from_navigator_to_cookie_expr; + _ = initial_language_from_navigator_to_cookie_exprpath; } // Accept-Language header @@ -981,7 +1143,8 @@ pub fn leptos_fluent( ); }; - match initial_language_from_cookie_to_localstorage_bool { + let quote = match initial_language_from_cookie_to_localstorage_bool + { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -995,6 +1158,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_cookie_to_localstorage_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -1008,7 +1176,7 @@ pub fn leptos_fluent( } }; - match initial_language_from_cookie_bool { + let quote = match initial_language_from_cookie_bool { Some(ref lit) => match lit.value { true => quote! { if lang.is_none() { @@ -1025,15 +1193,14 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match initial_language_from_cookie_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; - #[cfg(feature = "ssr")] - { - _ = initial_language_from_cookie_to_localstorage_bool; - _ = initial_language_from_cookie_to_localstorage_expr; - } - #[cfg(not(feature = "ssr"))] let sync_language_with_cookie_quote = { let effect_quote = quote! { @@ -1046,7 +1213,7 @@ pub fn leptos_fluent( }); }; - match set_language_to_cookie_bool { + let quote = match set_language_to_cookie_bool { Some(ref lit) => match lit.value { true => effect_quote, false => quote! {}, @@ -1059,6 +1226,11 @@ pub fn leptos_fluent( }, None => quote! {}, }, + }; + + match set_language_to_cookie_exprpath { + Some(ref path) => quote! { #path{#quote} }, + None => quote, } }; @@ -1066,10 +1238,16 @@ pub fn leptos_fluent( { _ = initial_language_from_cookie_bool; _ = initial_language_from_cookie_expr; + _ = initial_language_from_cookie_exprpath; + _ = initial_language_from_cookie_to_localstorage_bool; + _ = initial_language_from_cookie_to_localstorage_expr; + _ = initial_language_from_cookie_to_localstorage_exprpath; _ = cookie_attrs_str; _ = cookie_attrs_expr; + _ = cookie_attrs_exprpath; _ = set_language_to_cookie_bool; _ = set_language_to_cookie_expr; + _ = set_language_to_cookie_exprpath; } // Actix @@ -1356,7 +1534,8 @@ pub fn leptos_fluent( } } }; - quote! { + + let quote = quote! { const meta: ::leptos_fluent::LeptosFluentMeta = ::leptos_fluent::LeptosFluentMeta { locales: #locales_path, core_locales: #core_locales_quote, @@ -1386,6 +1565,13 @@ pub fn leptos_fluent( #system_quote }; ::leptos::provide_context::<::leptos_fluent::LeptosFluentMeta>(meta); + }; + + match provide_meta_context_exprpath { + Some(ref path) => quote! { + #path{#quote}; + }, + None => quote, } } false => quote! {}, diff --git a/leptos-fluent-macros/src/loader.rs b/leptos-fluent-macros/src/loader.rs index 4362ccaa..147391b6 100644 --- a/leptos-fluent-macros/src/loader.rs +++ b/leptos-fluent-macros/src/loader.rs @@ -161,19 +161,11 @@ impl Parse for Translations { } } -fn format_exprpath(expr: &syn::Expr, k: &syn::Ident) -> String { - expr.to_token_stream() - .to_string() - .strip_suffix(&format!(" {k}")) - .unwrap() - .to_string() -} - fn exprpath_not_supported_error_message( - expr: &syn::Expr, + expr: &proc_macro2::TokenStream, k: &syn::Ident, ) -> String { - let exprpath_str = format_exprpath(expr, k); + let exprpath_str = expr.to_string(); format!( concat!( "The parameter '{}' of", @@ -183,7 +175,7 @@ fn exprpath_not_supported_error_message( "```rust\n", "{} {{ - let {}_dyn = ...; + let {}_dyn = {{ ... }}; }} leptos_fluent! {{ @@ -216,82 +208,128 @@ pub(crate) struct I18nLoader { pub(crate) core_locales_path: Option, pub(crate) check_translations: Option, pub(crate) provide_meta_context: bool, + pub(crate) provide_meta_context_exprpath: Option, pub(crate) sync_html_tag_lang_bool: Option, pub(crate) sync_html_tag_lang_expr: Option, + pub(crate) sync_html_tag_lang_exprpath: Option, pub(crate) sync_html_tag_dir_bool: Option, pub(crate) sync_html_tag_dir_expr: Option, + pub(crate) sync_html_tag_dir_exprpath: Option, pub(crate) url_param_str: Option, pub(crate) url_param_expr: Option, + pub(crate) url_param_exprpath: Option, pub(crate) initial_language_from_url_param_bool: Option, pub(crate) initial_language_from_url_param_expr: Option, + pub(crate) initial_language_from_url_param_exprpath: + Option, pub(crate) initial_language_from_url_param_to_localstorage_bool: Option, pub(crate) initial_language_from_url_param_to_localstorage_expr: Option, + pub(crate) initial_language_from_url_param_to_localstorage_exprpath: + Option, pub(crate) initial_language_from_url_param_to_cookie_bool: Option, pub(crate) initial_language_from_url_param_to_cookie_expr: Option, + pub(crate) initial_language_from_url_param_to_cookie_exprpath: + Option, pub(crate) set_language_to_url_param_bool: Option, pub(crate) set_language_to_url_param_expr: Option, + pub(crate) set_language_to_url_param_exprpath: + Option, pub(crate) localstorage_key_str: Option, pub(crate) localstorage_key_expr: Option, pub(crate) initial_language_from_localstorage_bool: Option, pub(crate) initial_language_from_localstorage_expr: Option, + pub(crate) initial_language_from_localstorage_exprpath: + Option, pub(crate) initial_language_from_localstorage_to_cookie_bool: Option, pub(crate) initial_language_from_localstorage_to_cookie_expr: Option, + pub(crate) initial_language_from_localstorage_to_cookie_exprpath: + Option, pub(crate) set_language_to_localstorage_bool: Option, pub(crate) set_language_to_localstorage_expr: Option, + pub(crate) set_language_to_localstorage_exprpath: + Option, pub(crate) initial_language_from_navigator_bool: Option, pub(crate) initial_language_from_navigator_expr: Option, + pub(crate) initial_language_from_navigator_exprpath: + Option, pub(crate) initial_language_from_navigator_to_localstorage_bool: Option, pub(crate) initial_language_from_navigator_to_localstorage_expr: Option, + pub(crate) initial_language_from_navigator_to_localstorage_exprpath: + Option, pub(crate) initial_language_from_navigator_to_cookie_bool: Option, pub(crate) initial_language_from_navigator_to_cookie_expr: Option, + pub(crate) initial_language_from_navigator_to_cookie_exprpath: + Option, pub(crate) initial_language_from_accept_language_header_bool: Option, pub(crate) initial_language_from_accept_language_header_expr: Option, pub(crate) cookie_name_str: Option, pub(crate) cookie_name_expr: Option, + pub(crate) cookie_name_exprpath: Option, pub(crate) cookie_attrs_str: Option, pub(crate) cookie_attrs_expr: Option, + pub(crate) cookie_attrs_exprpath: Option, pub(crate) initial_language_from_cookie_bool: Option, pub(crate) initial_language_from_cookie_expr: Option, + pub(crate) initial_language_from_cookie_exprpath: + Option, pub(crate) initial_language_from_cookie_to_localstorage_bool: Option, pub(crate) initial_language_from_cookie_to_localstorage_expr: Option, + pub(crate) initial_language_from_cookie_to_localstorage_exprpath: + Option, pub(crate) set_language_to_cookie_bool: Option, pub(crate) set_language_to_cookie_expr: Option, + pub(crate) set_language_to_cookie_exprpath: + Option, #[cfg(feature = "system")] pub(crate) initial_language_from_system_bool: Option, #[cfg(feature = "system")] pub(crate) initial_language_from_system_expr: Option, #[cfg(feature = "system")] + pub(crate) initial_language_from_system_exprpath: + Option, + #[cfg(feature = "system")] pub(crate) initial_language_from_system_to_data_file_bool: Option, #[cfg(feature = "system")] pub(crate) initial_language_from_system_to_data_file_expr: Option, #[cfg(feature = "system")] + pub(crate) initial_language_from_system_to_data_file_exprpath: + Option, + #[cfg(feature = "system")] pub(crate) set_language_to_data_file_bool: Option, #[cfg(feature = "system")] pub(crate) set_language_to_data_file_expr: Option, #[cfg(feature = "system")] + pub(crate) set_language_to_data_file_exprpath: + Option, + #[cfg(feature = "system")] pub(crate) initial_language_from_data_file_bool: Option, #[cfg(feature = "system")] pub(crate) initial_language_from_data_file_expr: Option, #[cfg(feature = "system")] + pub(crate) initial_language_from_data_file_exprpath: + Option, + #[cfg(feature = "system")] pub(crate) data_file_key_str: Option, #[cfg(feature = "system")] pub(crate) data_file_key_expr: Option, + #[cfg(feature = "system")] + pub(crate) data_file_key_exprpath: Option, } impl Parse for I18nLoader { @@ -309,56 +347,89 @@ impl Parse for I18nLoader { let mut check_translations: Option = None; let mut sync_html_tag_lang_bool: Option = None; let mut sync_html_tag_lang_expr: Option = None; + let mut sync_html_tag_lang_exprpath: Option = + None; let mut sync_html_tag_dir_bool: Option = None; let mut sync_html_tag_dir_expr: Option = None; + let mut sync_html_tag_dir_exprpath: Option = + None; let mut url_param_str: Option = None; let mut url_param_expr: Option = None; + let mut url_param_exprpath: Option = None; let mut initial_language_from_url_param_bool: Option = None; let mut initial_language_from_url_param_expr: Option = None; + let mut initial_language_from_url_param_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_url_param_to_localstorage_bool: Option< syn::LitBool, > = None; let mut initial_language_from_url_param_to_localstorage_expr: Option< syn::Expr, > = None; + let mut initial_language_from_url_param_to_localstorage_exprpath: Option = + None; let mut initial_language_from_url_param_to_cookie_bool: Option< syn::LitBool, > = None; let mut initial_language_from_url_param_to_cookie_expr: Option< syn::Expr, > = None; + let mut initial_language_from_url_param_to_cookie_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut set_language_to_url_param_bool: Option = None; let mut set_language_to_url_param_expr: Option = None; + let mut set_language_to_url_param_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut localstorage_key_str: Option = None; let mut localstorage_key_expr: Option = None; let mut initial_language_from_localstorage_bool: Option = None; let mut initial_language_from_localstorage_expr: Option = None; + let mut initial_language_from_localstorage_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_localstorage_to_cookie_bool: Option< syn::LitBool, > = None; let mut initial_language_from_localstorage_to_cookie_expr: Option< syn::Expr, > = None; + let mut initial_language_from_localstorage_to_cookie_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut set_language_to_localstorage_bool: Option = None; let mut set_language_to_localstorage_expr: Option = None; + let mut set_language_to_localstorage_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_navigator_bool: Option = None; let mut initial_language_from_navigator_expr: Option = None; + let mut initial_language_from_navigator_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_navigator_to_localstorage_bool: Option< syn::LitBool, > = None; let mut initial_language_from_navigator_to_localstorage_expr: Option< syn::Expr, > = None; + let mut initial_language_from_navigator_to_localstorage_exprpath: Option = + None; let mut initial_language_from_navigator_to_cookie_bool: Option< syn::LitBool, > = None; let mut initial_language_from_navigator_to_cookie_expr: Option< syn::Expr, > = None; + let mut initial_language_from_navigator_to_cookie_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_accept_language_header_bool: Option< syn::LitBool, > = None; @@ -367,23 +438,39 @@ impl Parse for I18nLoader { > = None; let mut cookie_name_str: Option = None; let mut cookie_name_expr: Option = None; + let mut cookie_name_exprpath: Option = None; let mut cookie_attrs_str: Option = None; let mut cookie_attrs_expr: Option = None; + let mut cookie_attrs_exprpath: Option = None; let mut initial_language_from_cookie_bool: Option = None; let mut initial_language_from_cookie_expr: Option = None; + let mut initial_language_from_cookie_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut initial_language_from_cookie_to_localstorage_bool: Option< syn::LitBool, > = None; let mut initial_language_from_cookie_to_localstorage_expr: Option< syn::Expr, > = None; + let mut initial_language_from_cookie_to_localstorage_exprpath: Option< + proc_macro2::TokenStream, + > = None; let mut set_language_to_cookie_bool: Option = None; let mut set_language_to_cookie_expr: Option = None; + let mut set_language_to_cookie_exprpath: Option< + proc_macro2::TokenStream, + > = None; + #[cfg(feature = "system")] let mut initial_language_from_system_bool: Option< syn::LitBool, > = None; #[cfg(feature = "system")] + let mut initial_language_from_system_exprpath: Option< + proc_macro2::TokenStream, + > = None; + #[cfg(feature = "system")] let mut initial_language_from_system_expr: Option = None; #[cfg(feature = "system")] let mut initial_language_from_system_to_data_file_bool: Option< @@ -394,10 +481,18 @@ impl Parse for I18nLoader { syn::Expr, > = None; #[cfg(feature = "system")] + let mut initial_language_from_system_to_data_file_exprpath: Option< + proc_macro2::TokenStream, + > = None; + #[cfg(feature = "system")] let mut set_language_to_data_file_bool: Option = None; #[cfg(feature = "system")] let mut set_language_to_data_file_expr: Option = None; #[cfg(feature = "system")] + let mut set_language_to_data_file_exprpath: Option< + proc_macro2::TokenStream, + > = None; + #[cfg(feature = "system")] let mut initial_language_from_data_file_bool: Option< syn::LitBool, > = None; @@ -405,12 +500,21 @@ impl Parse for I18nLoader { let mut initial_language_from_data_file_expr: Option< syn::Expr, > = None; + #[cfg(feature = "system")] + let mut initial_language_from_data_file_exprpath: Option< + proc_macro2::TokenStream, + > = None; + let mut data_file_key_str: Option = None; let mut data_file_key_expr: Option = None; + let mut data_file_key_exprpath: Option = None; let mut provide_meta_context: Option = None; + let mut provide_meta_context_exprpath: Option< + proc_macro2::TokenStream, + > = None; while !fields.is_empty() { - let mut exprpath: Option = None; + let mut exprpath: Option = None; let k; if fields.peek(syn::Ident) && fields.peek2(syn::Token![:]) { k = fields.parse::()?; @@ -421,8 +525,18 @@ impl Parse for I18nLoader { let span = expr.span(); let string = expr.to_token_stream().to_string(); let ident = &string.split(' ').last().unwrap(); - exprpath = Some(expr); k = syn::Ident::new(ident, span); + + let new_expr_stream = + expr.to_token_stream().into_iter().collect::>(); + // except last element + let except_last = new_expr_stream + .iter() + .take(new_expr_stream.len() - 1) + .cloned(); + exprpath = Some(proc_macro2::TokenStream::from_iter( + except_last.into_iter(), + )); } else { return Err(syn::Error::new( expr.span(), @@ -465,7 +579,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + sync_html_tag_lang_exprpath.clone_from(&exprpath); + } } else if k == "sync_html_tag_dir" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -475,7 +591,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + sync_html_tag_dir_exprpath.clone_from(&exprpath); + } } else if k == "url_param" { if let Some(err) = parse_litstr_or_expr_param( &fields, @@ -485,7 +603,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + url_param_exprpath.clone_from(&exprpath); + } } else if k == "initial_language_from_url_param" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -495,7 +615,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_url_param_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_url_param_to_localstorage" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -505,7 +628,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_url_param_to_localstorage_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_url_param_to_cookie" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -515,7 +641,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_url_param_to_cookie_exprpath + .clone_from(&exprpath); + } } else if k == "set_language_to_url_param" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -525,7 +654,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + set_language_to_url_param_exprpath.clone_from(&exprpath); + } } else if k == "localstorage_key" { if let Some(err) = parse_litstr_or_expr_param( &fields, @@ -545,7 +676,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_localstorage_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_localstorage_to_cookie" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -555,7 +689,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_localstorage_to_cookie_exprpath + .clone_from(&exprpath); + } } else if k == "set_language_to_localstorage" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -565,7 +702,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + set_language_to_localstorage_exprpath.clone_from(&exprpath); + } } else if k == "initial_language_from_navigator" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -575,7 +714,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_navigator_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_navigator_to_localstorage" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -585,7 +727,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_navigator_to_localstorage_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_navigator_to_cookie" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -595,7 +740,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_navigator_to_cookie_exprpath + .clone_from(&exprpath); + } } else if k == "initial_language_from_accept_language_header" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -615,7 +763,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + cookie_name_exprpath.clone_from(&exprpath); + } } else if k == "cookie_attrs" { if let Some(err) = parse_litstr_or_expr_param( &fields, @@ -625,7 +775,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + cookie_attrs_exprpath.clone_from(&exprpath); + } } else if k == "initial_language_from_cookie" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -635,7 +787,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_cookie_exprpath.clone_from(&exprpath); + } } else if k == "initial_language_from_cookie_to_localstorage" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -645,7 +799,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_cookie_to_localstorage_exprpath + .clone_from(&exprpath); + } } else if k == "set_language_to_cookie" { if let Some(err) = parse_litbool_or_expr_param( &fields, @@ -655,7 +812,9 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + set_language_to_cookie_exprpath.clone_from(&exprpath); + } } else if k == "initial_language_from_system" { #[cfg(feature = "system")] { @@ -667,7 +826,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_system_exprpath + .clone_from(&exprpath); + } } #[cfg(not(feature = "system"))] @@ -692,7 +854,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_data_file_exprpath + .clone_from(&exprpath); + } } #[cfg(not(feature = "system"))] @@ -717,7 +882,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + initial_language_from_system_to_data_file_exprpath + .clone_from(&exprpath); + } } #[cfg(not(feature = "system"))] @@ -742,7 +910,10 @@ impl Parse for I18nLoader { ) { return Err(err); } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + set_language_to_data_file_exprpath + .clone_from(&exprpath); + } } #[cfg(not(feature = "system"))] @@ -767,10 +938,18 @@ impl Parse for I18nLoader { return Err(err); } } - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + data_file_key_exprpath.clone_from(&exprpath); + } + #[cfg(not(feature = "system"))] + { + _ = data_file_key_exprpath; + } } else if k == "provide_meta_context" { provide_meta_context = Some(fields.parse()?); - exprpath_not_supported!(exprpath, k); + if exprpath.is_some() { + provide_meta_context_exprpath.clone_from(&exprpath); + } } else { return Err(syn::Error::new( k.span(), @@ -973,66 +1152,95 @@ impl Parse for I18nLoader { Some(x) => x.value, None => false, }, + provide_meta_context_exprpath, sync_html_tag_lang_bool, sync_html_tag_lang_expr, + sync_html_tag_lang_exprpath, sync_html_tag_dir_bool, sync_html_tag_dir_expr, + sync_html_tag_dir_exprpath, url_param_str, url_param_expr, + url_param_exprpath, initial_language_from_url_param_bool, initial_language_from_url_param_expr, + initial_language_from_url_param_exprpath, initial_language_from_url_param_to_localstorage_bool, initial_language_from_url_param_to_localstorage_expr, + initial_language_from_url_param_to_localstorage_exprpath, initial_language_from_url_param_to_cookie_bool, initial_language_from_url_param_to_cookie_expr, + initial_language_from_url_param_to_cookie_exprpath, set_language_to_url_param_bool, set_language_to_url_param_expr, + set_language_to_url_param_exprpath, localstorage_key_str, localstorage_key_expr, initial_language_from_localstorage_bool, initial_language_from_localstorage_expr, + initial_language_from_localstorage_exprpath, initial_language_from_localstorage_to_cookie_bool, initial_language_from_localstorage_to_cookie_expr, + initial_language_from_localstorage_to_cookie_exprpath, set_language_to_localstorage_bool, set_language_to_localstorage_expr, + set_language_to_localstorage_exprpath, initial_language_from_navigator_bool, initial_language_from_navigator_expr, + initial_language_from_navigator_exprpath, initial_language_from_navigator_to_localstorage_bool, initial_language_from_navigator_to_localstorage_expr, + initial_language_from_navigator_to_localstorage_exprpath, initial_language_from_navigator_to_cookie_bool, initial_language_from_navigator_to_cookie_expr, + initial_language_from_navigator_to_cookie_exprpath, initial_language_from_accept_language_header_bool, initial_language_from_accept_language_header_expr, cookie_name_str, cookie_name_expr, + cookie_name_exprpath, cookie_attrs_str, cookie_attrs_expr, + cookie_attrs_exprpath, initial_language_from_cookie_bool, initial_language_from_cookie_expr, + initial_language_from_cookie_exprpath, initial_language_from_cookie_to_localstorage_bool, initial_language_from_cookie_to_localstorage_expr, + initial_language_from_cookie_to_localstorage_exprpath, set_language_to_cookie_bool, set_language_to_cookie_expr, + set_language_to_cookie_exprpath, #[cfg(feature = "system")] initial_language_from_system_bool, #[cfg(feature = "system")] initial_language_from_system_expr, #[cfg(feature = "system")] + initial_language_from_system_exprpath, + #[cfg(feature = "system")] initial_language_from_system_to_data_file_bool, #[cfg(feature = "system")] initial_language_from_system_to_data_file_expr, #[cfg(feature = "system")] + initial_language_from_system_to_data_file_exprpath, + #[cfg(feature = "system")] set_language_to_data_file_bool, #[cfg(feature = "system")] set_language_to_data_file_expr, #[cfg(feature = "system")] + set_language_to_data_file_exprpath, + #[cfg(feature = "system")] initial_language_from_data_file_bool, #[cfg(feature = "system")] initial_language_from_data_file_expr, #[cfg(feature = "system")] + initial_language_from_data_file_exprpath, + #[cfg(feature = "system")] data_file_key_str, #[cfg(feature = "system")] data_file_key_expr, + #[cfg(feature = "system")] + data_file_key_exprpath, }) } }