1use crate::{use_locales_with_options, UseLocalesOptions};
2use leptos::{logging::warn, prelude::*};
3use unic_langid::LanguageIdentifier;
4
5pub fn use_locale<S>(supported: S) -> Signal<LanguageIdentifier>
38where
39 S: IntoIterator,
40 S::Item: AsRef<LanguageIdentifier>,
41{
42 use_locale_with_options(supported, UseLocaleOptions::default())
43}
44
45pub fn use_locale_with_options<S>(
47 supported: S,
48 options: UseLocaleOptions,
49) -> Signal<LanguageIdentifier>
50where
51 S: IntoIterator,
52 S::Item: AsRef<LanguageIdentifier>,
53{
54 let client_locales = use_locales_with_options(options);
55
56 let supported = supported
57 .into_iter()
58 .map(|l| l.as_ref().clone())
59 .collect::<Vec<_>>();
60
61 const EMPTY_ERR_MSG: &str = "Empty supported list. You have to provide at least one locale in the `supported` parameter";
62
63 assert!(!supported.is_empty(), "{}", EMPTY_ERR_MSG);
64
65 Signal::derive(move || {
66 client_locales.with(|client_locales| {
67 let mut supported_iter = supported.iter().peekable();
68
69 let first_supported = *supported_iter.peek().unwrap();
71
72 for client_locale in client_locales {
73 let supported_iter = supported_iter.clone();
74
75 for s in supported_iter {
76 let client_locale = client_locale.parse::<LanguageIdentifier>();
77
78 if let Ok(client_locale) = client_locale {
79 if client_locale.matches(s, true, true) {
80 return (*s).clone();
81 }
82 } else {
83 warn!("Received an invalid LanguageIdentifier")
84 }
85 }
86 }
87
88 (*first_supported).clone()
89 })
90 })
91}
92
93pub type UseLocaleOptions = UseLocalesOptions;