Skip to main content

flipperzero/
locale.rs

1//! Locale handling.
2
3use 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
23/// Get locale measurement units.
24pub fn measurement_unit() -> MeasurementUnits {
25    unsafe { sys::locale_get_measurement_unit() }
26}
27
28/// Set locale measurement units.
29pub fn set_measurement_unit(format: MeasurementUnits) {
30    unsafe { sys::locale_set_measurement_unit(format) }
31}
32
33/// Convert Fahrenheit to Celsius.
34pub fn fahrenheit_to_celsius(temp_f: f32) -> f32 {
35    unsafe { sys::locale_fahrenheit_to_celsius(temp_f) }
36}
37
38/// Convert Celsius to Fahrenheit.
39pub fn celsius_to_fahrenheit(temp_c: f32) -> f32 {
40    unsafe { sys::locale_celsius_to_fahrenheit(temp_c) }
41}
42
43/// Get locale time format.
44pub fn time_format() -> TimeFormat {
45    unsafe { sys::locale_get_time_format() }
46}
47
48/// Set locale time format.
49pub fn set_time_format(format: TimeFormat) {
50    unsafe { sys::locale_set_time_format(format) }
51}
52
53/// Format time to furi string.
54pub fn format_time(datetime: &DateTime, show_seconds: bool) -> FuriString {
55    format_time_ex(datetime, time_format(), show_seconds)
56}
57
58/// Format time to furi string.
59pub 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
73/// Get locale date format.
74pub fn date_format() -> DateFormat {
75    unsafe { sys::locale_get_date_format() }
76}
77
78/// Set locale date format.
79pub fn set_date_format(format: DateFormat) {
80    unsafe { sys::locale_set_date_format(format) }
81}
82
83/// Format date to furi string.
84pub fn format_date(datetime: &DateTime) -> FuriString {
85    format_date_ex(datetime, date_format(), c"-")
86}
87
88/// Format date to furi string.
89pub 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}