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}