1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use crate::defaultstyles::DefaultFormat;
use crate::format::FormatNumberStyle;
use crate::locale::LocalizedValueFormat;
use crate::{
    ValueFormatBoolean, ValueFormatCurrency, ValueFormatDateTime, ValueFormatNumber,
    ValueFormatPercentage, ValueFormatTimeDuration,
};
use icu_locid::{locale, Locale};

pub(crate) struct LocaleEnUs {}

pub(crate) static LOCALE_EN_US: LocaleEnUs = LocaleEnUs {};

impl LocaleEnUs {
    const LOCALE: Locale = locale!("en_US");
}

impl LocalizedValueFormat for LocaleEnUs {
    fn locale(&self) -> Locale {
        LocaleEnUs::LOCALE
    }

    fn boolean_format(&self) -> ValueFormatBoolean {
        let mut v = ValueFormatBoolean::new_localized(DefaultFormat::bool(), Self::LOCALE);
        v.part_boolean().build();
        v
    }

    fn number_format(&self) -> ValueFormatNumber {
        let mut v = ValueFormatNumber::new_localized(DefaultFormat::number(), Self::LOCALE);
        v.part_number().decimal_places(2).build();
        v
    }

    fn percentage_format(&self) -> ValueFormatPercentage {
        let mut v = ValueFormatPercentage::new_localized(DefaultFormat::percent(), Self::LOCALE);
        v.part_number().decimal_places(2).build();
        v.part_text("%").build();
        v
    }

    fn currency_format(&self) -> ValueFormatCurrency {
        let mut v = ValueFormatCurrency::new_localized(DefaultFormat::currency(), Self::LOCALE);
        v.part_currency().locale(Self::LOCALE).symbol("$").build();
        v.part_text(" ").build();
        v.part_number()
            .decimal_places(2)
            .min_decimal_places(2)
            .grouping()
            .build();
        v.part_number()
            .decimal_places(2)
            .min_decimal_places(2)
            .grouping()
            .build();
        v
    }

    fn date_format(&self) -> ValueFormatDateTime {
        let mut v = ValueFormatDateTime::new_localized(DefaultFormat::date(), Self::LOCALE);
        v.part_month().style(FormatNumberStyle::Long).build();
        v.part_text("/").build();
        v.part_day().style(FormatNumberStyle::Long).build();
        v.part_text("/").build();
        v.part_year().style(FormatNumberStyle::Long).build();
        v
    }

    fn datetime_format(&self) -> ValueFormatDateTime {
        let mut v = ValueFormatDateTime::new_localized(DefaultFormat::datetime(), Self::LOCALE);
        v.part_day().style(FormatNumberStyle::Long).build();
        v.part_text(".").build();
        v.part_month().style(FormatNumberStyle::Long).build();
        v.part_text(".").build();
        v.part_year().style(FormatNumberStyle::Long).build();
        v.part_text(" ").build();
        v.part_hours().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_minutes().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_seconds().style(FormatNumberStyle::Long).build();
        v
    }

    fn time_of_day_format(&self) -> ValueFormatDateTime {
        let mut v = ValueFormatDateTime::new_localized(DefaultFormat::time_of_day(), Self::LOCALE);
        v.part_hours().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_minutes().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_seconds().style(FormatNumberStyle::Long).build();
        v.part_text(" ").build();
        v.part_am_pm().build();
        v
    }

    fn time_interval_format(&self) -> ValueFormatTimeDuration {
        let mut v =
            ValueFormatTimeDuration::new_localized(DefaultFormat::time_interval(), Self::LOCALE);
        v.set_truncate_on_overflow(false);

        v.part_hours().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_minutes().style(FormatNumberStyle::Long).build();
        v.part_text(":").build();
        v.part_seconds().style(FormatNumberStyle::Long).build();
        v
    }
}