1use core::ffi::CStr;
4
5use crate::datetime::DateTime;
6use crate::furi::string::FuriString;
7
8use flipperzero_sys as sys;
9
10pub use sys::LocaleMeasurementUnits as MeasurementUnits;
11pub use sys::LocaleMeasurementUnitsImperial as MeasurementUnitsImperial;
12pub use sys::LocaleMeasurementUnitsMetric as MeasurementUnitsMetric;
13
14pub use sys::LocaleTimeFormat as TimeFormat;
15pub use sys::LocaleTimeFormat12h as TimeFormat12h;
16pub use sys::LocaleTimeFormat24h as TimeFormat24h;
17
18pub use sys::LocaleDateFormat as DateFormat;
19pub use sys::LocaleDateFormatDMY as DateFormatDMY;
20pub use sys::LocaleDateFormatMDY as DateFormatMDY;
21pub use sys::LocaleDateFormatYMD as DateFormatYMD;
22
23pub fn measurement_unit() -> MeasurementUnits {
25 unsafe { sys::locale_get_measurement_unit() }
26}
27
28pub fn set_measurement_unit(format: MeasurementUnits) {
30 unsafe { sys::locale_set_measurement_unit(format) }
31}
32
33pub fn fahrenheit_to_celsius(temp_f: f32) -> f32 {
35 unsafe { sys::locale_fahrenheit_to_celsius(temp_f) }
36}
37
38pub fn celsius_to_fahrenheit(temp_c: f32) -> f32 {
40 unsafe { sys::locale_celsius_to_fahrenheit(temp_c) }
41}
42
43pub fn time_format() -> TimeFormat {
45 unsafe { sys::locale_get_time_format() }
46}
47
48pub fn set_time_format(format: TimeFormat) {
50 unsafe { sys::locale_set_time_format(format) }
51}
52
53pub fn format_time(datetime: &DateTime, show_seconds: bool) -> FuriString {
55 format_time_ex(datetime, time_format(), show_seconds)
56}
57
58pub fn format_time_ex(datetime: &DateTime, format: TimeFormat, show_seconds: bool) -> FuriString {
60 let mut string = FuriString::new();
61 unsafe {
62 sys::locale_format_time(
63 string.as_mut_ptr(),
64 datetime as *const _,
65 format,
66 show_seconds,
67 )
68 }
69
70 string
71}
72
73pub fn date_format() -> DateFormat {
75 unsafe { sys::locale_get_date_format() }
76}
77
78pub fn set_date_format(format: DateFormat) {
80 unsafe { sys::locale_set_date_format(format) }
81}
82
83pub fn format_date(datetime: &DateTime) -> FuriString {
85 format_date_ex(datetime, date_format(), c"-")
86}
87
88pub fn format_date_ex(datetime: &DateTime, format: DateFormat, separator: &CStr) -> FuriString {
90 let mut string = FuriString::new();
91 unsafe {
92 sys::locale_format_date(
93 string.as_mut_ptr(),
94 datetime as *const _,
95 format,
96 separator.as_ptr(),
97 )
98 }
99
100 string
101}