Skip to main content

embedded_i18n/
lib.rs

1#![no_std]
2
3extern crate alloc;
4
5#[cfg(feature = "std")]
6extern crate std;
7
8mod range;
9mod time;
10
11pub use range::*;
12pub use time::*;
13
14pub use embedded_i18n_macros::translate;
15
16const DEFAULT_LOCALE: &str = "en";
17const DEFAULT_FALLBACK_LOCALE: &str = "en";
18
19pub const fn get_locale() -> &'static str {
20    match option_env!("EMBEDDED_I18N_LOCALE") {
21        Some(locale) => locale,
22        None => DEFAULT_LOCALE,
23    }
24}
25
26pub const fn get_fallback_locale() -> &'static str {
27    match option_env!("EMBEDDED_I18N_FALLBACK") {
28        Some(locale) => locale,
29        None => DEFAULT_FALLBACK_LOCALE,
30    }
31}
32
33#[cfg(feature = "std")]
34pub fn get_locale_build() -> std::string::String {
35    use std::string::ToString;
36
37    match std::env::var("EMBEDDED_I18N_LOCALE") {
38        Ok(locale) => locale,
39        Err(_) => DEFAULT_LOCALE.to_string(),
40    }
41}
42
43#[cfg(feature = "std")]
44pub fn get_fallback_locale_build() -> std::string::String {
45    use std::string::ToString;
46
47    match std::env::var("EMBEDDED_I18N_FALLBACK") {
48        Ok(locale) => locale,
49        Err(_) => DEFAULT_FALLBACK_LOCALE.to_string(),
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn default_locale_is_en() {
59        assert_eq!(get_locale(), "en");
60    }
61
62    #[test]
63    fn default_fallback_is_en() {
64        assert_eq!(get_fallback_locale(), "en");
65    }
66
67    #[test]
68    fn get_locale_ranges_supported_locales() {
69        for locale in &[
70            "en", "fr", "de", "es", "it", "pt", "nl", "pl", "ru", "ja", "zh",
71        ] {
72            assert!(
73                get_locale_ranges(locale).is_some(),
74                "{} should have ranges",
75                locale
76            );
77        }
78    }
79
80    #[test]
81    fn get_locale_ranges_unsupported_locale() {
82        assert!(get_locale_ranges("unsupported").is_none());
83        assert!(get_locale_ranges("xx").is_none());
84        assert!(get_locale_ranges("").is_none());
85    }
86
87    #[cfg(feature = "std")]
88    #[test]
89    fn get_locale_build_default() {
90        let locale = get_locale_build();
91        assert_eq!(locale, "en");
92    }
93
94    #[cfg(feature = "std")]
95    #[test]
96    fn get_fallback_locale_build_default() {
97        let fallback = get_fallback_locale_build();
98        assert_eq!(fallback, "en");
99    }
100
101    #[cfg(feature = "std")]
102    #[test]
103    fn get_locale_build_with_env() {
104        let previous = std::env::var("EMBEDDED_I18N_LOCALE");
105        unsafe { std::env::set_var("EMBEDDED_I18N_LOCALE", "fr") };
106        assert_eq!(get_locale_build(), "fr");
107        match previous {
108            Ok(val) => unsafe { std::env::set_var("EMBEDDED_I18N_LOCALE", val) },
109            Err(_) => unsafe { std::env::remove_var("EMBEDDED_I18N_LOCALE") },
110        }
111    }
112
113    #[cfg(feature = "std")]
114    #[test]
115    fn get_fallback_locale_build_with_env() {
116        let previous = std::env::var("EMBEDDED_I18N_FALLBACK");
117        unsafe { std::env::set_var("EMBEDDED_I18N_FALLBACK", "de") };
118        assert_eq!(get_fallback_locale_build(), "de");
119        match previous {
120            Ok(val) => unsafe { std::env::set_var("EMBEDDED_I18N_FALLBACK", val) },
121            Err(_) => unsafe { std::env::remove_var("EMBEDDED_I18N_FALLBACK") },
122        }
123    }
124
125    #[test]
126    fn translate_macro_is_reexported() {
127        let _ = translate!("greeting");
128    }
129}