Formatters

For interpolation, every variables (other than count for ranges) are expected to be of type impl IntoView + Clone + 'static.

But some values have different ways to be represented based on the locale:

  • Number
  • Date
  • Time
  • List

You can specify the kind of value you are going to supply like this:

{
  "key": "{{ var, formatter }}"
}

Some of the formatters can take arguments to better suits the format you need:

{
  "key": "{{ var, formatter(arg_name: value; arg_name2: value; ...) }}"
}

If an argument has a default value, not supplying that argument will make that arg take the default value.

Here are all the formatters:

Number

{
  "number_formatter": "{{ num, number }}"
}

Will format the number based on the locale. This makes the variable needed to be impl leptos_i18n::formatting::NumberFormatterInputFn, which is automatically implemented for impl Fn() -> T + Clone + 'static where T: leptos_i18n::formatting::IntoFixedDecimal. IntoFixedDecimal is a trait to turn a value into a fixed_decimal::FixedDecimal, which is a type used by icu to format numbers. That trait is currently implemented for:

  • FixedDecimal
  • usize
  • u8
  • u16
  • u32
  • u64
  • u128
  • isize
  • i8
  • i16
  • i32
  • i64
  • i128
  • f32 *
  • f64 *

* Is implemented for convenience, but uses FixedDecimal::try_from_f64 with the floating precision; you may want to use your own.

The formatter itself doesn’t provide formatting options such as maximum significant digits, but those can be customized through FixedDecimal before being passed to the formatter.

Enable the "format_nums" feature to use the number formatter.

Arguments

There is one argument at the moment for the number formatter: grouping_strategy, which is based on icu::decimal::options::GroupingStrategy, that can take 4 values:

  • auto (default)
  • never
  • always
  • min2

Example

use crate::i18n::*;

let i18n = use_i18n();

let num = move || 100_000;

t!(i18n, number_formatter, num);

Currency (experimental)

{
  "currency_formatter": "{{ num, currency }}"
}

Will format the currency based on the locale. The variable should be the same as number.

Enable the "format_currency" feature to use the number formatter.

Arguments

There are two arguments at the moment for the currency formatter: width and country_code, which are based on icu_experimental::dimension::currency::options::Width and icu_experimental::dimension::currency::formatter::CountryCode.

width values:

  • short (default)
  • narrow

country_code value should be a currency code, such as USD or EUR. The USD is the default value.

Example

use crate::i18n::*;

let i18n = use_i18n();

let num = move || 100_000;

t!(i18n, currency_formatter, num);

Date

{
  "date_formatter": "{{ date_var, date }}"
}

Will format the date based on the locale. This makes the variable needed to be impl leptos_i18n::formatting::DateFormatterInputFn, which is automatically implemented for impl Fn() -> T + Clone + 'static where T: leptos_i18n::formatting::IntoIcuDate. IntoIcuDate is a trait to turn a value into a impl icu::datetime::input::DateInput, which is a trait used by icu to format dates. The IntoIcuDate trait is currently implemented for T: DateInput<Calendar = AnyCalendar>. You can use icu::datetime::{Date, DateTime}, or implement that trait for anything you want.

Enable the "format_datetime" feature to use the date formatter.

Arguments

There is one argument at the moment for the date formatter: date_length, which is based on icu::datetime::options::length::Date, that can take 4 values:

  • full
  • long
  • medium (default)
  • short
{
  "short_date_formatter": "{{ date_var, date(date_length: short) }}"
}

Example

use crate::i18n::*;
use leptos_i18n::reexports::icu::calendar::Date;

let i18n = use_i18n();

let date_var = move || Date::try_new_iso_date(1970, 1, 2).unwrap().to_any();

t!(i18n, date_formatter, date_var);

Time

{
  "time_formatter": "{{ time_var, time }}"
}

Will format the time based on the locale. This makes the variable needed to be impl leptos_i18n::formatting::TimeFormatterInputFn, which is automatically implemented for impl Fn() -> T + Clone + 'static where T: leptos_i18n::formatting::IntoIcuTime. IntoIcuTime is a trait to turn a value into a impl icu::datetime::input::TimeInput, which is a trait used by icu to format time. The IntoIcuTime trait is currently implemented for T: IsoTimeInput. You can use icu::datetime::{Time, DateTime}, or implement that trait for anything you want.

Enable the "format_datetime" feature to use the time formatter.

Arguments

There is one argument at the moment for the time formatter: time_length, which is based on icu::datetime::options::length::Time, that can take 4 values:

  • full
  • long
  • medium
  • short (default)
{
  "full_time_formatter": "{{ time_var, time(time_length: full) }}"
}

Example

use crate::i18n::*;
use leptos_i18n::reexports::icu::calendar::Date;

let i18n = use_i18n();

let time_var = move || Time::try_new(14, 34, 28, 0).unwrap();

t!(i18n, time_formatter, time_var);

DateTime

{
  "datetime_formatter": "{{ datetime_var, datetime }}"
}

Will format the datetime based on the locale. This makes the variable needed to be impl leptos_i18n::formatting::DateTimeFormatterInputFn, which is automatically implemented for impl Fn() -> T + Clone + 'static where T: leptos_i18n::formatting::IntoIcuDateTime. IntoIcuDateTime is a trait to turn a value into a impl icu::datetime::input::DateTimeInput which is a trait used by icu to format datetimes. The IntoIcuDateTime trait is currently implemented for T: DateTimeInput<Calendar = AnyCalendar>. You can use icu::datetime::DateTime, or implement that trait for anything you want.

Enable the "format_datetime" feature to use the datetime formatter.

Arguments

There are two arguments at the moment for the datetime formatter: date_length and time_length that behave exactly the same as the one above.

{
  "short_date_long_time_formatter": "{{ datetime_var, datetime(date_length: short; time_length: full) }}"
}

Example

use crate::i18n::*;
use leptos_i18n::reexports::icu::calendar::DateTime;

let i18n = use_i18n();

let datetime_var = move || {
    let date = Date::try_new_iso_date(1970, 1, 2).unwrap().to_any();
    let time = Time::try_new(14, 34, 28, 0).unwrap();
    DateTime::new(date, time)
};

t!(i18n, datetime_formatter, datetime_var);

List

{
  "list_formatter": "{{ list_var, list }}"
}

Will format the list based on the locale. This makes the variable needed to be impl leptos_i18n::formatting::ListFormatterInputFn, which is automatically implemented for impl Fn() -> T + Clone + 'static where T: leptos_i18n::formatting::WriteableList. WriteableList is a trait to turn a value into an impl Iterator<Item = impl writeable::Writeable>.

Enable the "format_list" feature to use the list formatter.

Arguments

There are two arguments at the moment for the list formatter: list_type and list_length.

list_type takes 3 possible values:

  • and
  • or
  • unit (Default)

list_length takes 3 possible values:

  • wide (default)
  • short
  • narrow

See Intl.ListFormat documentation. icu is used to do the formatting, but I found the Mozilla doc to have more details.

{
  "short_and_list_formatter": "{{ list_var, list(list_type: and; list_length: short) }}"
}

Example

use crate::i18n::*;

let i18n = use_i18n();

let list_var = move || ["A", "B", "C"];

t!(i18n, list_formatter, list_var);