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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183

/// Like [gettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! gettext {
    ($($arg:tt)*) => ($crate::gettext(std::fmt::format(format_args!($($arg)*))))
}

/// Like [dgettext](fn.dgettext.html), but allows for formatting.
#[macro_export]
macro_rules! dgettext {
    ($domain:expr, $string:expr, $($string_names:ident = $string_values:expr),*) => ($crate::dgettext($domain, &format!($string, $( $string_names = $string_values ),*)));
}

/// Like [dcgettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! dcgettext {
    ($domain:expr, $category:expr, $string:expr, $($string_names:ident = $string_values:expr),*,) => ($crate::dcgettext($domain, &format!($string, $( $string_names = $string_values ),*), $category));
}

/// Like [ngettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! ngettext {
    ($singular:expr, $($singular_names:ident = $singular_values:expr),*, $plural:expr, $($plural_names:ident = $plural_values:expr),*, $n:expr) => ($crate::ngettext(format!($singular, $( $singular_names = $singular_values ),*), format!($plural, $( $plural_names = $plural_values ),*), $n));
}

/// Like [dngettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! dngettext {
    ($domain:expr, $singular:expr, $($singular_names:ident = $singular_values:expr),*, $plural:expr, $($plural_names:ident = $plural_values:expr),*, $n:expr) => ($crate::dngettext($domain, &format!($singular, $( $singular_names = $singular_values ),*), &format!($plural, $( $plural_names = $plural_values ),*), $n));
}

/// Like [dcngettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! dcngettext {
    ($domain:expr, $singular:expr, $($singular_names:ident = $singular_values:expr),*, $plural:expr, $($plural_names:ident = $plural_values:expr),*, $n:expr, $category:expr) => ($crate::dcngettext($domain, &format!($singular, $( $singular_names = $singular_values ),*), &format!($plural, $( $plural_names = $plural_values ),*), $n, $category));
}

/// Like [pgettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! pgettext {
    ($ctx:expr, $s:expr, $($s_names:ident = $s_values:expr),*) => ($crate::pgettext($ctx, &format!($s, $( $s_names = $s_values ),*)));
}

/// Like [npgettext](fn.gettext.html), but allows for formatting.
#[macro_export]
macro_rules! npgettext {
    ($ctx:expr, $singular:expr, $($singular_names:ident = $singular_values:expr),*, $plural:expr, $($plural_names:ident = $plural_values:expr),*, $n:expr) => ($crate::npgettext($ctx, &format!($singular, $( $singular_names = $singular_values ),*), &format!($plural, $( $plural_names = $plural_values ),*), $n));
}

#[cfg(test)]
mod test {
    use crate::*;

    #[test]
    fn test_gettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");
        textdomain("hellorust");

        assert_eq!(gettext!("Hello, {name}!", name = "world"), "Hello, world!");
    }

    #[test]
    fn test_ngettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");
        textdomain("hellorust");

        assert_eq!(
            ngettext!(
                "Hello, {name}!",
                name = "world",
                "Hello, {names}!",
                names = "worlds",
                2
            ),
            "Hello, worlds!"
        );
    }

    #[test]
    fn test_pgettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");
        textdomain("hellorust");

        assert_eq!(
            "Hello, world!",
            pgettext!("context", "Hello, {name}!", name = "world")
        );
    }

    #[test]
    fn test_npgettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");
        textdomain("hellorust");

        assert_eq!(
            "Hello, worlds!",
            npgettext!(
                "context",
                "Hello, {name}!",
                name = "world",
                "Hello, {names}!",
                names = "worlds",
                2
            )
        );
    }

    #[test]
    fn test_dgettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");

        assert_eq!(
            "Hello, world!",
            dgettext!("hellorust", "Hello, {name}!", name = "world")
        );
    }

    #[test]
    fn test_dcgettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");

        assert_eq!(
            "Hello, world!",
            dcgettext!(
                "hellorust",
                LocaleCategory::LcAll,
                "Hello, {name}!",
                name = "world",
            )
        );
    }

    #[test]
    fn test_dcngettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");

        assert_eq!(
            "Hello, World!",
            dcngettext!(
                "hellorust",
                "Hello, {name}!",
                name = "World",
                "Hello, {names}!",
                names = "Worlds",
                1,
                LocaleCategory::LcAll
            )
        )
    }

    #[test]
    fn test_dngettext_macro() {
        setlocale(LocaleCategory::LcAll, "en_US.UTF-8");

        bindtextdomain("hellorust", "/usr/local/share/locale");

        assert_eq!(
            "Hello, World!",
            dngettext!(
                "hellrust",
                "Hello, {name}!",
                name = "World",
                "Hello, {names}!",
                names = "Worlds",
                1
            )
        )
    }
}