[][src]Macro i18n_embed_fl::fl

fl!() { /* proc-macro */ }

A macro to obtain localized messages, and check the message_id and arguments at compile time.

Compile time checks are performed using the fallback_language specified in the current crate's i18n.toml confiration file.

This macro supports three different calling syntaxes which are explained in the following sections.

No Arguments

This example is not tested
fl!(loader: FluentLanguageLoader, "message_id")

This is the simplest form of the fl!() macro, just obtaining a message with no arguments. The message_id should be specified as a literal string, and is checked at compile time.

Example

use i18n_embed::{
    fluent::{fluent_language_loader, FluentLanguageLoader},
    LanguageLoader,
};
use i18n_embed_fl::fl;
use rust_embed::RustEmbed;

#[derive(RustEmbed)]
#[folder = "i18n/"]
struct Localizations;

let loader: FluentLanguageLoader = fluent_language_loader!();
loader
    .load_languages(&Localizations, &[loader.fallback_language()])
    .unwrap();

// Invoke the fl!() macro to obtain the translated message, and
// check the message id compile time.
assert_eq!("Hello World!", fl!(loader, "hello-world"));

Individual Arguments

This example is not tested
fl!(
    loader: FluentLanguageLoader,
    "message_id",
    arg1 = value,
    arg2 = "value",
    arg3 = function(),
    ...
)

This form of the fl!() macro allows individual arguments to be specified in the form key = value after the message_id. key needs to be a valid literal argument name, and value can be any expression that resolves to a type that implements Into<FluentValue>. The keys will be checked at compile time to ensure that they match the arguments specified in original fluent message.

Example

let calc_james = || "James".to_string();
pretty_assertions::assert_eq!(
    "Hello \u{2068}Bob\u{2069} and \u{2068}James\u{2069}!",
    // Invoke the fl!() macro to obtain the translated message, and
    // check the message id, and arguments at compile time.
    fl!(loader, "hello-arg-2", name1 = "Bob", name2 = calc_james())
);

Arguments Hashmap

This example is not tested
fl!(
    loader: FluentLanguageLoader,
    "message_id",
    args: HashMap<
        S where S: Into<Cow<'a, str>> + Clone,
        T where T: Into<FluentValue>> + Clone>
)

With this form of the fl!() macro, arguments can be specified at runtime using a HashMap, using the same signature as in FluentLanguageLoader::get_args(). When using this method of specifying argments, they are not checked at compile time.

Example

use std::collections::HashMap;

let mut args: HashMap<&str, &str> = HashMap::new();
args.insert("name", "Bob");

assert_eq!("Hello \u{2068}Bob\u{2069}!", fl!(loader, "hello-arg", args));